數值最佳化

Adam 優化器(Adam optimizer)

/ AD-um /

想像你在一片地形上下降,有些方向是陡峭的懸崖、有些幾乎是平坦的平原,而你對斜率只有一種帶雜訊、抖動的感覺。你會希望沿平坦方向大步邁進、下懸崖時謹慎小步,並藉由記住近期斜率來撫平抖動。Adam 正是同時做到這三件事的優化器:逐方向的自適應步長加上動量平滑——這也是它成為訓練神經網路預設主力的原因。

Adam(自適應矩估計)對迷你批次梯度 g_k 保有兩個移動平均。第一矩 m_k = beta_1 * m_{k-1} + (1 - beta_1) * g_k 是梯度的平滑平均(動量,通常 beta_1 = 0.9)。第二矩 v_k = beta_2 * v_{k-1} + (1 - beta_2) * g_k^2 是梯度平方的逐座標平滑平均(通常 beta_2 = 0.999)。在一個修正它們冷啟動偏差的步驟之後(m-hat = m_k / (1 - beta_1^k),v-hat 同理),更新為 x_{k+1} = x_k - alpha * m-hat / (sqrt(v-hat) + epsilon)。除以 sqrt(v-hat) 是關鍵:若某座標的梯度一向又大又不穩,它就被縮小;若一向又小又穩,則實際上被放大——一種自動的逐參數學習率。那個 epsilon(約 1e-8)只是防止除以零。

Adam 之所以重要,是因為它對深度學習那種雜亂、非凸、高維、有雜訊的目標開箱即用、表現良好,所需的學習率調校遠少於樸素 SGD,並能優雅應付各參數間尺度差異極大的梯度。誠實的提醒是真實的:Adam 的自適應性並未讓它可證明地優於調校良好的 SGD——在許多視覺任務上,帶動量的 SGD 泛化得一樣好或更好,且 Adam 原始的收斂證明有個瑕疵後來被修補(AMSGrad),而 AdamW 變體修正了權重衰減與自適應縮放的交互作用。儘管有逐座標縮放,它也不是曲率(二階)方法——它沒有真正的海森資訊——而在光滑確定性問題上,L-BFGS 這類真正的擬牛頓法收斂快得多。Adam 的主場是大規模隨機訓練,而非古典光滑最佳化。

訓練一個網路,其中一個權重的梯度約 100、另一個約 0.001,樸素 SGD 用單一學習率不是讓前者爆掉、就是讓後者龜爬。Adam 把每個除以它自己近期梯度的均方根,於是兩者都以合理的逐座標步調移動——正是這份自適應讓單一 alpha 能跨越尺度懸殊的參數運作。

動量,加上依近期梯度大小做的逐座標縮放。

Adam 是方便的預設、而非普遍更優的方法:調校良好的帶動量 SGD 往往泛化得一樣好或更好,視覺任務尤甚。儘管有逐座標縮放,它不帶真正的曲率資訊,所以在光滑確定性問題上 L-BFGS 勝過它;請用 AdamW(解耦的權重衰減)、而非樸素的 L2 配 Adam。

又稱
adaptive moment estimationAdamAdamW自適應矩估計Adam 法