梯度下降優化算法
寫這篇博客其實是爲了記錄所讀的這篇論文的筆記An overview of gradient descent optimization algorithms
Batch gradient descent
他每次爲整個數據集計算梯度,然後進行一次更新。
for i in range(nb_epochs):
params_grad = evaluate_gradient(loss_function, data, params)
params = params - learning_rate * params_grad
Stochastic gradient descent(SGD)
他對於每個樣本都會計算一次梯度,然後進行一次更新。
for i in range(nb_epochs):
np.random.shuffle(data)
for example in data:
params_grad = evaluate_gradient(loss_function, example, params)
params = params - learning_rate * params_grad
SGD 因爲更新比較頻繁,會造成 cost function 有嚴重的震盪
Mini-batch gradient descent
MBGD每一次梯度更新是作用於一小批樣本n,n取50~256,收斂更穩定。
for i in range(nb_epochs):
np.random.shuffle(data)
for batch in get_batches(data, batch_size=50):
params_grad = evaluate_gradient(loss_function, batch, params)
params = params - learning_rate * params_grad
Momentum
在當前更新向量中加入了上一次梯度更新因子,γ(伽馬)的值一般設爲0.9左右.
加入的這一項,可以使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢,這樣就可以加快收斂並減小震盪。
Adagrad
g _t,i 爲t 時刻參數 θ_i 的梯度
如果是普通的 SGD, 那麼 θ_i 在每一時刻的梯度更新公式爲:
對於每個參數、時間,都對應不同的學習率
G_t,ii是個對角矩陣,元素G_t,ii表示到t時刻爲止參數 θ_i所有梯度的平方和,E(不好意思這個不知道怎麼打也不知道怎麼讀[捂臉])是平滑參數,避免出現除0的情況。
其中 η 一般取 0.01。
Adagrad 的優點是減少了學習率的手動調節。它的缺點是分母會不斷積累,這樣學習率就會收縮並最終會變得非常小。
RMSprop
RMSprop 是 Geoff Hinton 提出的一種自適應學習率方法。
RMSprop 爲了解決 Adagrad 學習率急劇下降問題的。
Hinton 建議設定 γ 爲 0.9, 學習率 η 爲 0.001。
Adam
這個算法是另一種計算每個參數的自適應學習率的方法。
除了像 Adadelta 和 RMSprop 一樣存儲了過去梯度的平方 vt 的指數衰減平均值 ,也像 momentum 一樣保持了過去梯度 mt 的指數衰減平均值:
建議 β1 = 0.9,β2 = 0.999,ϵ = 10e−8
實踐表明,Adam 比其他適應性學習方法效果要好。