李宏毅深度學習筆記 https://datawhalechina.github.io/leeml-notes
李宏毅深度學習視頻 https://www.bilibili.com/video/BV1JE411g7XF
普通的梯度下降法

學習率\(\eta\)是個超參數需要人工調整,但是手工調整比較麻煩
普通方法可能出現的問題

學習率太小(藍色的線),下降慢,迭代次數多
學習率太大(綠色的線),下降快,但是太快容易在極優值附近振盪
學習率特別大(黃色的線),直接越過了極優值
如何改善可能出現的問題
想法:隨着迭代次數增加,讓學習率變小
- 初始迭代時,使用較大的學習率加速下降
- 迭代幾次后,減小學習率防止振盪和越過
可以使用式子:\(\large \eta^t=\frac{\eta}{\sqrt{t+1}}\),\(t\)增加,\(\eta^t\)減小
當然,對每個參數都要使用不同的學習率,這樣效果會更好,AdaGrad是這種思想的一種簡單算法
AdaGrad算法

每個參數的學習率都把它除上之前微分的均方根,\(\sigma^t\)是每個參數的所有偏微分的均方根
舉個例子:

Adagrad 式子可化簡(都有\(\sqrt{t+1}\))

Adagrad 里的問題

Adagrad 中,梯度越大,說明步伐越大,但分母里梯度越大,又說明步伐越小,這里不是會有矛盾嗎?
直觀解釋

分子變大,分母變小,那分子式變化程度很大,造成反差的效果
正式的解釋

\(\large -\frac{b}{2a}\)不是等於0,這里只是說明是一個最小值點,對\(x\)求微分,那么只有\(x\)在變動
初始點\(x\)坐標為\(x_0\)時,最佳的變動范圍是\(x_0\)到最低點的距離\(|x_0+\frac{b}{2a}|\) (注意是\(x\)軸上的變動),可以寫成\(\large |\frac{2ax_0+b}{2a}|\) ,剛好\(|2ax_0+b|\) 是微分在初始點的絕對值。如果步伐和微分成正比,那么這個步伐就比較好。
畫圖說明下,為什么是橫軸上的距離

A點斜率是\(\frac{BD}{AB}\), A點微分為\(\lim \limits_{AB\rightarrow0}\frac{CB}{AB}\),梯度其實是和\(\Delta x\)反向的,因為只有一個參數\(x\),所以\(\Delta x\)就是\(AB\),那么其實梯度的方向是在\(x\)軸上的
以上說明梯度越大,點離最低點越遠
梯度越大,點離最低點越遠在多參數上是不成立的

只考慮參數 \(w_1\),是圖中藍色的線;只考慮參數 \(w_2\),就像圖中綠色的線
\(c\)點梯度比\(a\)大,但是\(c\)距離最低點更近
其實最佳距離中還有個分母\(2a\),是\(y\)的二次微分

那么最好的step就要考慮二次微分

進一步回到Adagrad

分母\(\sqrt{\sum\limits_{i=0}^t (g^i)^2}\) 是在模擬二次微分,因為計算二次微分在實際問題中是開銷很大的
