一、Adagrad簡介
Adagrad (Adaptive Gradient) 是一種優化演算法,它在梯度下降 (Gradient Descent) 優化演算法的基礎上進行了改進。與傳統的梯度下降演算法對所有參數使用相同的學習率相比,Adagrad 演算法根據參數的歷史梯度信息為每個參數分配不同的學習率。
Adagrad 演算法都是針對每個維度分別進行的學習率和參數更新。在梯度 $g$ 非常稀疏時,Adagrad 可能會過分放大稀疏維度的學習率,產生不好的更新。為了解決這個問題,可以嘗試使用RMSprop或Adam演算法。
二、Adagrad的工作原理
Adagrad演算法的思路是為了讓這些被更新的參數,其生成的梯度加權和方差更接近於1,即是讓學習率為可自適應的。Adagrad演算法的公式如下:
cache += gradient ** 2
theta -= learning_rate * gradient / (np.sqrt(cache) + epsilon)
在上述演算法中,$cache$ 數組是一個累加參數梯度平方的歷史記錄。在每個時間步長 $t$,參數向量 $f$ 的 $i$ 個維度上的梯度是 $g_{t, i}$。然後將 $g_{t, i}$ 平方並將其添加到 $cache_{t,i}$ 中。
既然掌握了$cache$ , 那麼接下來,我們需要計算在每一個輪次下t時刻得到的$gradient$(梯度)的調整值,以輸入到參數theta。這裡引用一個公式, 參數theta的調整值就等於使用學習率除以參數梯度平方與一個負數偏移量的平方根的乘積,也就是:
theta -= learning_rate * gradient / (np.sqrt(cache) + epsilon)
學習率是一個常數,在這裡,我們將其保留為變數$learning rate$。縮放參數是由平方根項給出的,它反映了過去梯度值變化的歷史。這個數學方程可以讓我們創建一個學習率,它可根據已經計算的梯度的平均值進行自適應。為了避免除以零的錯誤,公式中使用了一個 $\epsilon$ 方差的絕對值偏移量,通常將其設置為 $1e-8$。
三、Adagrad的實現
實現Adagrad演算法,我們需要擁有許多項目依賴項,諸如NumPy、Matplotlib,還有其他一些用於繪製 loss 和被訓練的model的包。下面是一份可用於訓練神經網路的Adagrad優化器的完整代碼,該代碼使用 Python 和的MXNet庫:
import mxnet as mx
# 運行Adagrad優化器
def adagrad(d, g, theta, learning_rate = 0.01, epsilon = 1e-8):
# 梯度平方和歷史的累加和,
# 每一個維度上更新步伐隨著時間變化
# 標量值epsilon是為了處理虧數
cache = 0
cache += g**2 %>%
# 更新權重
theta -= learning_rate * g / (mx.nd.sqrt(cache) + epsilon)
return theta
四、Adagrad的優缺點
優點:
1. 在小批量和遭遇非常稀疏的數據集的情況下, Adagrad 很有用。在這些情況下, Adagrad 可以分配不同的權重來模型的一部分輸入特徵
2. Adagrad 非常易於使用,唯一需要調整的參數是 $learning rate$,可以通過交叉驗證獲得最佳參數。
缺點:
1. AdaGrad 演算法的學習率在訓練過程中會不斷減小,因此可能會導致演算法提前收斂。在某些情況下,學習率會減小到如此小的程度,以至於模型不再學習。這通常被稱為「過早停止」(early stopping)問題。
2. 當循環次數增加時,更新很慢,因為 $epsilon$ 會使所有學習率變得很小
五、總結
Adagrad 優化演算法是優化神經網路的重要工具。藉助Adagrad演算法可以更好地使用神經網路來進行預測,而且特別適用於稀疏數據。Adagrad 具有良好的收斂速度,易於使用,但缺點是需要掌控好參數設置,防止出現過早停止的問題。
通過學習並掌握Adagrad演算法的工作原理和代碼實現方法,應該可以為更好地使用Adagrad優化演算法的神經網路帶來更多的便利。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/286160.html