日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现

發布時間:2025/3/12 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

神經網絡的SGD、Momentum、AdaGrad、Adam最優化方法及其python實現

    • 一、SGD
    • 二、Momentum-動量
    • 三、AdaGrad
    • 四、Adam

一、SGD

右邊的值更新左邊的值,每次更新朝著梯度方向前進一小步。

class SGD:"""隨機梯度下降法(Stochastic Gradient Descent)"""def __init__(self, lr=0.01):self.lr = lrdef update(self, params, grads):for key in params.keys():params[key] -= self.lr * grads[key]

二、Momentum-動量

SGD實現簡單,有些問題可能沒有效果,比如f(x,y)=(1/20)x^ 2 +y ^2

SGD低效的根本原因:梯度的方向沒有指向最小值的方向。如果函數形狀非均向,如呈現延伸狀,搜索路徑就非常低效,有可能呈現z字形移動。

Momentum-動量方法公式:

v表示物體在梯度方向受的力,αv作用是讓物體逐漸減速(α小于1,常數,如0.9之類的數)。

動量法的好處,x軸方向受力小,但是每一次梯度變化的方向不變,速度方向不變,一直在這個方向受力,往那個方向走的速度會加速。但是y軸受到正反方向的力,他們會抵消,讓y不穩定,因此和SGD相比,能更快的向x軸方向靠近。

簡的來說,SGD的話就是他y方向梯度大,步子跨的猛的話就z形了,動量的目的是梯度大的那塊,邁步子時候讓它考慮到上一次的步子是往哪走的。如果相反方向走的話,其實是抵消了一部分v,這樣的話如果步子跨得猛,他也得少一點步子。如下圖所示,對于f(x,y)=(1/20)x^ 2 +y ^2用SGD的話,m想走到y,它在y軸搖擺的厲害,但是,用動量,y軸搖擺抵消了,而且x軸速度還增加了,多好。

class Momentum:"""Momentum SGD"""def __init__(self, lr=0.01, momentum=0.9):self.lr = lrself.momentum = momentumself.v = Nonedef update(self, params, grads):if self.v is None:self.v = {}for key, val in params.items(): self.v[key] = np.zeros_like(val)for key in params.keys():self.v[key] = self.momentum*self.v[key] - self.lr*grads[key] params[key] += self.v[key]

三、AdaGrad

h保存了梯度的平方和,圓圈就表示矩陣相乘。

由于乘上根號h分之1,參數的元素中,變動較大的元素的學習率將變小。

這是一種學習率衰減的手法,梯度下降太快了,山谷太陡峭了,那我就讓你走的步子減小,這樣一來,你不容易直接一步跨倆山峰(山峰是啥懂得都懂,嘿嘿)。

class AdaGrad:"""AdaGrad"""def __init__(self, lr=0.01):self.lr = lrself.h = Nonedef update(self, params, grads):if self.h is None:self.h = {}for key, val in params.items():self.h[key] = np.zeros_like(val)for key in params.keys():self.h[key] += grads[key] * grads[key]params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)

四、Adam

結合了Momentum和AdaGrad方法。

看代碼去吧

很多人喜歡用Adam哦

class Adam:"""Adam (http://arxiv.org/abs/1412.6980v8)"""def __init__(self, lr=0.001, beta1=0.9, beta2=0.999):self.lr = lrself.beta1 = beta1self.beta2 = beta2self.iter = 0self.m = Noneself.v = Nonedef update(self, params, grads):if self.m is None:self.m, self.v = {}, {}for key, val in params.items():self.m[key] = np.zeros_like(val)self.v[key] = np.zeros_like(val)self.iter += 1lr_t = self.lr * np.sqrt(1.0 - self.beta2**self.iter) / (1.0 - self.beta1**self.iter) for key in params.keys():#self.m[key] = self.beta1*self.m[key] + (1-self.beta1)*grads[key]#self.v[key] = self.beta2*self.v[key] + (1-self.beta2)*(grads[key]**2)self.m[key] += (1 - self.beta1) * (grads[key] - self.m[key])self.v[key] += (1 - self.beta2) * (grads[key]**2 - self.v[key])params[key] -= lr_t * self.m[key] / (np.sqrt(self.v[key]) + 1e-7)#unbias_m += (1 - self.beta1) * (grads[key] - self.m[key]) # correct bias#unbisa_b += (1 - self.beta2) * (grads[key]*grads[key] - self.v[key]) # correct bias#params[key] += self.lr * unbias_m / (np.sqrt(unbisa_b) + 1e-7)

總結

以上是生活随笔為你收集整理的神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。