梯度下降
用來尋找極小值。通過向負梯度方向逼近。
用於在神經網絡模型中進行權重更新,即在一個方向上更新和調整模型的參數,來最小化損失函數。
反向傳播
先在前向傳播中計算輸入信號的乘積及其對應的權重,然後將非線性激活函數作用於這些乘積的總和。
然後,在網絡的反向傳播過程中回傳相關誤差,使用梯度下降更新權重值,通過計算誤差函數E相對於權重參數W的梯度,在損失函數梯度的相反方向上更新權重參數。
隨機梯度下降
(SGD, Stochastic Gradient Descent)
- 初始化參數、學習速率
- 循環,直到獲得一個極小值:
- 對訓練集進行隨機排列
- 每次計算一個樣本的梯度,而不是整個訓練集
- 傳統的批量梯度下降將計算整個數據集梯度,但只會進行一次更新,因此在處理大型數據集時速度很慢且難以控制,存在冗餘的權重更新,甚至導致內存溢出。而SGD通過每次只取一個樣本來進行梯度下降,避免了這個問題。
- 問題:每次僅用一個樣本進行頻繁的參數更新,可能導致目標函數值震盪比較厲害
小批量梯度下降 (Mini-Batch gradient descent)
- 對數據進行連續的批量抽樣,選取batch_size個樣本
- 通過計算圖或神經網絡將數據進行前向傳播,計算損失
- 通過反向傳播來計算梯度
- 用這些梯度來更新參數
對每個批次中的n個訓練樣本,只執行一次更新。
- 可以減少參數更新的波動,最終得到效果更好和更穩定的收斂。
- 還可以使用最新的深層學習庫中通用的矩陣優化方法,使計算小批量數據的梯度更加高效。
- 在訓練神經網絡時,通常都會選擇小批量梯度下降算法。
優化算法
動量法(Momentum)
SGD在目標函數的“峽谷”處常出現震盪難以快速收斂的問題。在參數更新中,動量會對指向相同方向的維度對應的參數進行持續更新,約束梯度方向總是改變的維度參數,儘可能引導損失函數向“谷底”收斂。
Nesterov accelerated gradient(NAG)
NAG則在動量法的基礎上引入了”預測“的功能,對下一個位置的走向做一個初步的預估。避免走過頭而遠離了最優解。
Adagrad
在訓練的過程中,不斷地更新、累加每一步的梯度的平方和。
grad_squared = 0
while True:
dx = compute_gradient(x)
grad_squared += dx * dx
x -= learning_rate * dx / (np.sqrt(grad_squared) + 1e-7)
通過參數來調整合適的學習率η,對稀疏參數進行大幅更新、對頻繁參數進行小幅更新。因此,Adagrad方法非常適合處理稀疏數據。
學習速率在一直降低。在凸函數中,在接近極值點時,逐漸降低學習速率,這是很好的表現;然而,在凹函數中,這樣會在一個局部極值點時被困住。
AdaDelta
是AdaGrad的延伸方法,解決其學習率衰減的問題。
讓平方梯度乘以一個衰減率(通常是0.9),按照一定比率逐漸下降
RMSProp
解決學習率衰減的問題。
Adam
(Adaptive Moment Estimation)
進一步的改進,結合了上述各自的優點。
能計算每個參數的自適應學習率。
所以說,使用Adam就對了~
first_moment = 0
second_moment = 0
for t in range(num_iterations):
dx = compute_gradient(x)
first_moment = beta1 * first_moment + (1 - beta1) * dx #usually, beta1
second_moment = beta2 * second_moment + (1 - beta2) * dx * dx
first_unbias = first_moment / (1 - beta1 ** t) # bias correction
second_unbias = second_moment / (1 - beta2 ** t) # bias correction
x -= learning_rate * first_unbias / (np.sqrt(second_unbias) + 1e-7)
通常,可以設置 beta1 = 0.9, beta2 = 0.999, learning rate = 1e-3 or 5e-4
beta1: 一階矩估計的指數衰減率
beta2:二階矩估計的指數衰減率