2014-Adam與隨機梯度優化#
案件摘要#
2014 年,Diederik Kingma 與 Jimmy Ba 在 arXiv 上發表《Adam: A Method for Stochastic Optimization》(後於 ICLR 2015 發表),提出一個同時利用一階與二階動量的自適應優化器。這樁案子的謎題是:為什麼梯度下降在深度神經網路上如此難以調校——同一個學習率,對某些參數太大、對另一些太小?Adam 的破案手法是讓每個參數「記住」自己梯度的移動平均與變異尺度,並據此自動縮放步長。這個想法承襲 Polyak 的動量、AdaGrad 的自適應學習率與 Hinton 未正式發表的 RMSprop,最終成為深度學習的預設優化器。
前因 -- 為什麼會有這個案子#
- 2012 年 AlexNet 以深度神經網路橫掃 ImageNet,掀起深度學習浪潮;訓練百萬級參數的網路,優化器的品質直接決定成敗。
- 傳統 SGD 只有一個全域學習率,無法適應不同參數的梯度尺度:在稀疏特徵(如詞向量 embedding)上梯度極小、步長形同停滯;在別的參數上又可能震盪發散。
- Polyak 早在 1964 年就提出動量法(momentum):累積歷史梯度方向,像滾動的球一樣穿越峽谷地形,抑制振盪、加速收斂。
- Duchi 等人 2011 年的 AdaGrad 讓每個參數除以自身歷史梯度平方和,首次實現「自適應學習率」;但平方和不斷累積,導致學習率衰減過快,訓練後期幾乎停止前進。
- Hinton 在 2012 年 Coursera 課程講義中提出 RMSprop:把累積和改成指數移動平均,解決 AdaGrad 的衰減問題——但始終未正式發表,成為一樁「口述傳統」的懸案。
- Kingma 與 Ba 把這些碎片拼合:動量(一階)+ RMSprop 式尺度估計(二階)+ 偏誤修正,就是 Adam。
線索與推理 -- 數學式、程式、理論#
線索一:SGD 的基礎與學習率困境#
隨機梯度下降沿負梯度方向更新參數:
問題在 \(\eta\) 必須全域共用:若損失面在不同參數方向上有極不相同的曲率(狹長峽谷),單一 \(\eta\) 無論怎麼調都顧此失彼。
線索二:動量 -- 梯度的指數移動平均(一階動量)#
Polyak 的動量法累積過往梯度:
\(v_t\) 本質上是梯度的指數移動平均,提供「慣性」:一致的梯度方向被放大、反覆震盪的方向被抵消,從而在峽谷地形中大幅加速。
線索三:自適應尺度 -- 二階動量#
RMSprop / Adam 的二階動量估計每個參數梯度的平均平方(變異尺度):
更新時每個參數除以自己的梯度尺度,讓步長對梯度大小不敏感:
梯度長期很小的參數(稀疏特徵)得到相對放大的有效學習率,這正是 AdaGrad 想做但做過頭的事——指數移動平均讓 \(s_t\) 不會無限累積,衰減問題解決。
線索四:Adam 的偏誤修正(破案時刻)#
Adam 的關鍵細節:初始 \(m_0 = s_0 = 0\) 會使早期的 \(m_t, s_t\) 嚴重低估(偏向零),導致初期步長失真。Kingma 與 Ba 的破案時刻是用時間指數做偏誤修正:
由於 \(1-\beta_1^t \to 1\) ,修正只在早期起作用、隨時間自動消失,使估計在整個訓練過程中近似無偏。就是這個小小的除法,讓 Adam 在各種任務上開箱即用、極少需要調參。
線索五:收斂性的理論缺陷(翻案插曲)#
Adam 原論文的收斂證明有漏洞:Reddi 等人 2018 年提出反例,顯示 Adam 在某些凸問題上可收斂到次優解,並提出修正版 AMSGrad(對 \(s_t\) 取歷史最大值)。實務上 Adam 依舊強勁,但這樁「翻案」揭示了理論與實務的落差。
程式:Python 實作 Adam(對照 SGD / 動量 / Adam 的收斂路徑)#
import numpy as np
def grad(w): # 狹長峽谷:x 方向平緩、y 方向陡峭
return np.array([0.1 * w[0], 5.0 * w[1]])
def optimize(method, lr=0.3, steps=120, beta1=0.9, beta2=0.999, eps=1e-8):
w = np.array([8.0, 8.0])
m, s = np.zeros(2), np.zeros(2)
path = [w.copy()]
for t in range(1, steps + 1):
g = grad(w)
if method == "sgd":
update = lr * g
elif method == "momentum":
m = beta1 * m + g
update = lr * m
elif method == "adam":
m = beta1 * m + (1 - beta1) * g
s = beta2 * s + (1 - beta2) * g * g
m_hat = m / (1 - beta1 ** t) # 偏誤修正
s_hat = s / (1 - beta2 ** t)
update = lr * m_hat / (np.sqrt(s_hat) + eps)
w = w - update
path.append(w.copy())
return np.array(path)
for method in ["sgd", "momentum", "adam"]:
path = optimize(method)
final = path[-1]
loss = 0.05 * final[0] ** 2 + 2.5 * final[1] ** 2
print(f"{method:>9}: 終點 = ({final[0]:.4f}, {final[1]:.4f}), 損失 = {loss:.6f}")
執行後可見:SGD 在陡峭的 y 方向劇烈震盪、前進緩慢;動量稍好但仍受峽谷拖累;Adam 靠二階動量自動縮放各方向步長,路徑平順地收斂到原點附近。## 結案 -- 後果與影響
- Adam 迅速成為深度學習的預設優化器,原論文引用超過十萬次,是優化器史上的分水嶺。
- GPT、BERT 等大型語言模型的訓練皆以 Adam 為基礎;AdamW(Loshchilov & Hutter, 2017)修正了 weight decay 與自適應學習率混用的偏差,成為 LLM 時代的事實標準。
- 「每個參數自適應步長」的思想被標準化,衍生出 AMSGrad、NAdam、RAdam 等一整族優化器;優化器本身成為深度學習工程的核心議題(學習率排程、warmup、混合精度訓練皆圍繞 Adam 生態發展)。
- Reddi 2018 的收斂反例留下未竟之案:自適應優化器的完整理論至今仍在追索,理論與實務的張力成為這個領域持續研究的動力。
關鍵人物與文獻#
- Diederik Kingma 與 Jimmy Ba:Adam 兩位作者(當時分別為 Amsterdam、Toronto 大學博士生,Ba 師承 Hinton)。
- Geoffrey Hinton:RMSprop 提出者(2012 課程講義,未正式發表)。
- 關鍵文獻:
- Kingma, D. P., & Ba, J. (2015). Adam: A Method for Stochastic Optimization. ICLR 2015.(arXiv:1412.6980, 2014)
- Duchi, J., Hazan, E., & Singer, Y. (2011). Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. Journal of Machine Learning Research, 12, 2121-2159.
- Polyak, B. T. (1964). Some Methods of Speeding Up the Convergence of Iteration Methods. USSR Computational Mathematics and Mathematical Physics, 4(5), 1-17.
- Reddi, S. J., Kale, S., & Kumar, S. (2018). On the Convergence of Adam and Beyond. ICLR 2018.
- Loshchilov, I., & Hutter, F. (2019). Decoupled Weight Decay Regularization. ICLR 2019.(AdamW, arXiv:1711.05101)