參數更新方法

代碼實現

https://github.com/hsmyy/zhihuzhuanlan/blob/master/momentum.ipynb

1、梯度下降法

clipboard

加大梯度下降的步長

clipboard[1]

繼續加大步長


2、動量更新

Momentum改進自SGD算法,讓每一次的參數更新方向不僅僅取決於當前位置的梯度,還受到上一次參數更新方向的影響。

v = mu * v - learning_rate * dx # integrate velocity 

x += v # integrate position 

clipboard[3]

3、NAG

如果預到的地點梯度比較大,更新就比較快,如果梯度比較小就更新比較慢

  1. x_ahead = x + mu * v   通過上一次的動量v估計本次的位置,
  1. v = mu * v - learning_rate * d x_ahead  通過估計的位置計算梯度,
  2. x += v 

clipboard[4]

4、Adagrad

cache += dx**2 

x += - learning_rate * dx / (np.sqrt(cache) + eps)

這個方法其實是動態更新學習率的方法,其中cache將每個梯度的平方和相加,而更新學習率的本質是,如果求得梯度距離越大,那麼學習率就變慢,而eps是一個平滑的過程,取值通常在(10^-4~10^-8 之間)

clipboard[5]

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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章