完整講解與原文對照 / Full explanation and source comparison
動機:一個學習率管不了所有維度
在深度學習中,學習率通常手動設定後再隨訓練調整。但不同參數維度的梯度大小往往差異很大——某些維度梯度一直很大,某些則長期很小。若用同一個全局學習率,大梯度維度可能步幅過大、小梯度維度則幾乎不動。AdaGrad(Adaptive Gradient)[18] 的解法很直覺:為每個維度各自維護一個學習率。
更新規則(式 (37)–(39))
AdaGrad 的參數更新寫成(式 (37)):
w(k+1):=w(k)−η(k)G−1∇fi(w(k)),
其中 G 是 (d×d) 對角矩陣,第 (j,j) 元素為(式 (38)):
G(j,j):=ε+τ=0∑k(∇jfiτ(w(τ)))2.
ε≥0 確保數值穩定,iτ 是第 τ 次迭代抽到的樣本索引,∇jfiτ 是梯度的第 j 分量。
代入後,逐維度的簡化形式(式 (39))更清楚:
wj(k+1):=wj(k)−ε+∑τ=0k(∇jfiτ(w(τ)))2η(k)∇fj(wj(k)).
核心機制:累積梯度平方 → 逐維衰減
AdaGrad 累積歷史梯度資訊——對每個維度 j,把過去所有迭代的梯度平方加總起來。效果是:
- 梯度長期偏大的維度:分母 ε+∑(∇j)2 越來越大 → 有效學習率越來越小(被「壓制」)。
- 梯度長期偏小的維度:分母較小 → 有效學習率相對較大(被「放大」)。
這確保了各維度的更新步幅趨於平衡,讓長期被忽略的維度也能得到足夠的更新。
優點與隱憂
AdaGrad 的優點是對稀疏特徵特別友好——罕見但重要的特徵維度會得到較大的有效學習率。但累積和只增不減,長期訓練後所有維度的有效學習率都會趨近 0,可能導致過早停止學習。這個問題正是下一節 RMSProp 要解決的。
教授祕笈:AdaGrad——誰跑得兇誰被勒韁,活躍維度被罰小步
同學,KP-9 剛講完:一個全局步長 η 等於幫整座山規定同一種跨步。問題是,深網的參數不是一匹馬,是一排馬——有的維度梯度長期很大(狂奔),有的幾乎沒動(慢跑)。同一個 η,狂奔的會衝過頭,慢跑的原地踏步。主線比喻就一個:勒韁。AdaGrad 看誰過去跑得兇,就把那一維的韁繩勒緊——活躍維度被罰小步,安靜維度反而鬆一點,讓各維齊步。
先把任務講成一句人話
一句話:別再用同一個學習率管所有維度;把每個維度歷史梯度的平方累加起來當分母,跑得兇的有效步長自動變小。
鷹架式:先直覺,再符號
為什麼需要它?因為「大梯度維度」跟「小梯度維度」對同一個 η 的體感完全不同:前者一步像跨條河,後者一步像挪一公分。AdaGrad 的解法很土、但有效——每個維度自己記一本帳:把過去所有梯度平方加起來。帳越厚,分母越大,有效學習率 η/分母 越小。稀疏、罕見、但重要的特徵(長期梯度小)會得到較大的有效學習率,這也是它對稀疏資料特別友善的原因。
符號逐個拆(式 (37)–(39))
更新寫成(式 (37)):
w(k+1):=w(k)−η(k)G−1∇fi(w(k)).
G 是 d×d 對角矩陣,第 (j,j) 個元素是(式 (38)):
G(j,j):=ε+τ=0∑k(∇jfiτ(w(τ)))2.
ε≥0 是防止分母為 0 的小墊片;iτ 是第 τ 步抽到的樣本;∇j 是梯度的第 j 個分量。對角元素互不干擾,所以這不是在算 Hessian,只是逐維度各自開根號累加。
拆成單一維度(式 (39))更清楚:
wj(k+1):=wj(k)−ε+∑τ=0k(∇jfiτ)2η(k)∇jf(w(k)).
分母裡那個和只增不減——這是優點(活躍維度被壓制),也是後面要講的隱憂。
真的算一遍:兩匹馬,三步之後步幅一樣
取 η=0.2、ε=0(數字乾淨;實務會留一點 ε)。活躍維度 A 的歷史梯度是 3,4,12;安靜維度 B 是剛好小十倍的 0.3,0.4,1.2。看「有效學習率」η/∑g2,以及用最後一筆梯度算出的實際步幅。
| 維度 | 歷史梯度 | ∑g2 | ∑g2 | 有效學習率 η/⋅ | 步幅(有效學習率 × 最後一筆 g) |
| A 活躍(狂奔) | 3,4,12 | 9+16+144=169 | 13 | 0.2/13≈0.0154 | 0.0154×12≈0.185 |
| B 安靜(慢跑) | 0.3,0.4,1.2 | 0.09+0.16+1.44=1.69 | 1.3 | 0.2/1.3≈0.154 | 0.154×1.2≈0.185 |
A 的當前梯度是 B 的十倍,但有效學習率被勒成 B 的十分之一,兩匹馬最後跨出的步幅都是 0.185。這就是「活躍維度被罰小步」的數字版:罰的不是「不准動」,是把韁繩勒緊,讓大梯度不要把參數甩飛。
再看長期隱憂。若某一維每步梯度都是 1、η=1、ε=0,有效學習率是 1/k:
| 累積步數 k | k | 有效學習率 |
| 1 | 1 | 1.000 |
| 100 | 10 | 0.100 |
| 10000 | 100 | 0.010 |
帳只會越記越厚,韁繩只會越勒越緊,最後所有維度的有效學習率都趨近 0——過早停止學習。這正是 KP-11 的 RMSProp 要拆掉的那根刺。
先留一個反轉
直覺會說:「梯度大的維度比較重要,應該給它更大的學習率,讓它學快一點。」AdaGrad 做的剛好相反:梯度長期偏大的維度,有效學習率被壓小。原因不是討厭重要維度,而是那些維度已經走很遠了,再給大步會震盪;真正缺更新的,是那些幾乎沒被梯度光顧過的安靜維度。勒的是韁繩,不是把馬打死。
換個場景,自己找出同一條路
把「維度」換成「課堂發言」。話多的學生(活躍維度)被老師限時發言(有效學習率變小),話少的被點名多講一點。各維更新步幅才會趨於平衡。
自己算一題:η=0.5、ε=0,某維歷史梯度為 6,8。有效學習率是多少?若當前梯度仍是 8,步幅是多少?(提示:∑g2=36+64=100。)
大家最容易在這裡搞混
第一,「G 是 Hessian」。錯。G 只是梯度平方累加再開根號的對角矩陣,沒有二階導數。第二,「ε 是動量或學習率」。錯。ε 只是墊在分母裡防止除以零。第三,「AdaGrad 可以無限訓下去」。錯。累積和只增不減,長期有效學習率趨近 0,可能過早停學。
跨知識點掛勾
KP-2、KP-9 都還在用「一個全局 η」;AdaGrad 把 η 拆成「每維一個有效值」。KP-5 的動量是平滑方向;AdaGrad 是縮放步幅——兩件不同的事。KP-11 會把「永不遺忘的累加」改成會遺忘的指數平均,並加上動量,變成 Adam。
換句話重述
AdaGrad 為每個維度累積梯度平方當分母:活躍維度被勒韁、罰小步,安靜維度獲較大有效學習率。優點是稀疏特徵走得動;隱憂是帳只增不減,最後大家都走不動。
一句話收尾: 誰跑得兇誰被勒韁——活躍維度罰小步,齊步了,卻也可能把韁勒死。