https://github.com/hsmyy/zhihuzhuanlan/blob/master/momentum.ipynb
1、梯度下降法
加大梯度下降的步長
繼續加大步長
2、動量更新
Momentum改進自SGD算法,讓每一次的參數更新方向不僅僅取決於當前位置的梯度,還受到上一次參數更新方向的影響。
v = mu * v - learning_rate * dx # integrate velocity
x += v # integrate position
3、NAG
如果預到的地點梯度比較大,更新就比較快,如果梯度比較小就更新比較慢
- x_ahead = x + mu * v 通過上一次的動量v估計本次的位置,
- v = mu * v - learning_rate * d x_ahead 通過估計的位置計算梯度,
- x += v
4、Adagrad
cache += dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
這個方法其實是動態更新學習率的方法,其中cache將每個梯度的平方和相加,而更新學習率的本質是,如果求得梯度距離越大,那麼學習率就變慢,而eps是一個平滑的過程,取值通常在(10^-4~10^-8 之間)
gt,i=∇θJ(θi)是目標函數對參數的梯度,ϵ是平滑項,防止除零操作,一般取值1e−8
Adagrad的一大優勢時可以避免手動調節學習率,比如設置初始的缺省學習率爲0.01,然後就不管它,另其在學習的過程中自己變化。當然它也有缺點,就是它計算時要在分母上計算梯度平方的和,由於所有的參數平法必爲正數,這樣就造成在訓練的過程中,分母累積的和會越來越大。
5、RMSprop
cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
6、Adam
m = beta1*m + (1-beta1)*dx
v = beta2*v + (1-beta2)*(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)