0 - 引入
簡單的梯度下降等優化算法存在一個問題:目標函數自變量的每一個元素在相同時間步都使用同一個學習率來迭代,如果存在如下圖的情況(不同自變量的梯度值有較大差別時候),存在如下問題:
- 選擇較小的學習率會使得梯度較大的自變量迭代過慢
- 選擇較大的學習率會使得梯度較小的自變量迭代發散
因此,自然而然想到,要解決這一問題,不同自變量應該根據梯度的不同有不同的學習率。本篇介紹的幾種優化算法都是基於這個思想的。
1 - AdaGrad算法
使用一個小批量隨機梯度$g_t$按元素平方的累加變量$s_t$,在時間步0,AdaGrad將$s_0$中每個元素初始化為0,其更新公式為:
$$s_t\leftarrow s_{t-1}+g_t\odot g_t$$
$$x_t\leftarrow x_{t-1}-\frac{\eta}{\sqrt{s_t+\epsilon}}\odot g_t$$
其中$\odot$是按元素相乘,$\eta$是學習率,$\epsilon$是為了維持數值穩定性而添加的常數(如$10^{-6}$)。
2 - RMSProp算法
由於AdaGrad算法的機制,導致每個元素的學習率在迭代過程中只能降低或者不變,因此很可能出現早期迭代到不好的極值點之后,由於學習率太小而無法沖出這個極值點導致最后收斂到的解不優,為了解決這一問題,RMSProp是基於AdaGrad算法做了一點小修改,其更新公式為:
$$s_t\leftarrow \gamma s_{t-1}+(1-\gamma)g_t\odot g_t$$
$$x_t\leftarrow x_{t-1}-\frac{\eta}{\sqrt{s_t+\epsilon}}\odot g_t$$
其中,$\eta$是學習率,$\epsilon$是為了維持數值穩定性而添加的常數(如$10^{-6}$)。另外,比AdaGrad多了超參數$\gamma\in [0, 1)$,$s_t$可以看作是最近$\frac{1}{(1-\gamma)}$個時間步的小批量隨機梯度平方項的加權平均,從而使得每個元素的學習率在迭代過程中不再一直降低或者不變。具體可以理解為:
- 如果最近的時間步梯度平方加權累積較小,說明梯度較小,那么學習率會增加
- 如果最近的時間步梯度平方加權累計較大,說明梯度較大,那么學習率會減小
有了如上機制,可以使得收斂穩定的同時,有一定幾率沖出不優解,而使得最后收斂結果和開始的迭代表現相關性降低。
3 - AdaDelta算法
AdaDelta算法和RMSProp算法一樣,使用小批量隨機梯度$g_t$按元素平方的指數加權移動平均變量$s_t$,在時間步為0時,所有元素被初始化為0,其更新公式為:
$$s_t\leftarrow \rho s_{t-1}+(1-\rho)g_t\odot g_t$$
$$g_{t}^{'} \leftarrow \sqrt{\frac{\Delta x_{t-1}+\epsilon }{s_t+\epsilon}}\odot g_t$$
$$x_t\leftarrow t_{t-1}-g_{t}^{'}$$
$$\Delta x_t\leftarrow \rho \Delta x_{t-1} + (1-\rho)g_{t}^{'}\odot g_{t}^{'}$$
其中,$\epsilon$是為了維持數值穩定性而添加的常數(如$10^{-5}$)。另外,AdaDelta算法沒有學習率這個超參,而是通過$\Delta x_t$來記錄自變量變化量$g_t^'$按元素平方的指數加權移動平均,如果不考慮$\epsilon$的影響,AdaDelta算法跟RMSProp算法的不同之處在於使用$\sqrt{\Delta x_{t-1}}$來替代學習率$\eta$。
4 - Adam算法
Adam算法使用了動量變量$v_t$和RMSProp算法中小批量隨機梯度按元素平方的指數加權移動平均變量$s_t$,並在時間步0將它們中的每個元素初始化為0。其更新公式為:
$$v_t\leftarrow \beta_1 v_{t-1} + (1-\beta_1)g_t$$
$$s_t\leftarrow \beta_2 s_{t-1} + (1-\beta_2)g_t \odot g_t$$
$$\hat{v_t}\leftarrow \frac{v_t}{1-\beta^t_1}$$
$$\hat{s_t}\leftarrow \frac{s_t}{1-\beta^t_2}$$
$$g_t^{'}\leftarrow \frac{\eta \hat{v_t}}{\sqrt{\hat{s_t}}+\epsilon}$$
$$x_t\leftarrow x_{t-1}-g_t^{'}$$
其中,$\eta$是學習率,$\epsilon$是為了維持數值穩定性而添加的常數(如$10^{-8}$),超參數$\beta_1\in [0, 1)$建議設為0.9,超參數$\beta_2\in [0, 1)$建議設為0.999。
5 - 總結
綜上分析,可以得出如下幾個結論:
- AdaGrad、RMSProp、AdaDelta和Adam幾個優化算法,目標函數自變量中每個元素都分別擁有自己的學習率;
- AdaGrad目標函數自變量中各個元素的學習率只能保持下降或者不變,因此當學習率在迭代早期降得較快且當前解依然不佳時,由於后期學習率過小,可能較難找到一個有用的解;
- RMSProp和AdaDelta算法都是解決AdaGrad上述缺點的改進版本,本質思想都是利用最近的時間步的小批量隨機梯度平方項的加權平均來降低學習率,從而使得學習率不是單調遞減的(當最近梯度都較小的時候能夠變大)。不同的是,RMSProp算法還是保留了傳統的學習率超參數,可以顯式指定。而AdaDelta算法沒有顯式的學習率超參數,而是通過$\Delta x$做運算來間接代替學習率;
- Adam算法可以看成是RMSProp算法和動量法的結合。
6 - 參考資料
http://zh.d2l.ai/chapter_optimization/adagrad.html
http://zh.d2l.ai/chapter_optimization/rmsprop.html