隨機梯度下降的 Adam 方法如何工作?
我熟悉用於訓練神經網絡的基本梯度下降算法。我已經閱讀了提議 Adam: ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION的論文。
雖然我肯定有一些見解(至少),但總體而言,這篇論文對我來說似乎太高了。例如,成本函數通常是許多不同函數的總和,因此必須進行大量計算以優化其值;隨機梯度下降 - 據我了解的主題 - 僅為這些函數的子集計算優化。對我來說,不清楚 Adam 是如何做到這一點的,以及為什麼這會導致整個訓練錯誤的減少.
我認為 Adam 通過考慮之前的梯度來更新它的梯度。他們稱之為利用動量?這種勢頭究竟是什麼?根據論文第二頁的算法,它是某種移動平均線,比如對“規則”梯度的第一和第二時刻的一些估計?
實際上,我懷疑 Adam 可以使用更大的有效步長來降低梯度,從而降低訓練誤差與隨機近似的結合。因此,生成的更新向量應該在空間維度上“跳躍”更多,而不是像普通梯度下降算法那樣描述一些曲線。
有人可以解開亞當如何工作的神秘面紗嗎?尤其是它是如何收斂的,特別是為什麼亞當的方法有效以及究竟有什麼好處?
Adam 論文說:“……許多目標函數由在不同數據子樣本處評估的子函數的總和組成;在這種情況下,可以通過對各個子函數採取梯度步驟來提高優化效率……”在這裡,他們只是意味著目標函數是訓練樣例誤差的總和,訓練可以在單個樣例或小批量上進行。這與隨機梯度下降 (SGD) 中的相同,因為參數更新更頻繁,所以它比批量訓練更有效地解決大規模問題。
至於亞當為什麼工作,它使用了一些技巧。
這些技巧之一是動量,它可以提供更快的收斂速度。想像一個目標函數,它的形狀像一個狹長的峽谷,逐漸向最小值傾斜。假設我們想使用梯度下降來最小化這個函數。如果我們從峽谷壁上的某個點開始,負梯度將指向下降最陡的方向,即主要朝向峽谷底部。這是因為峽谷壁比峽谷逐漸向最小值傾斜的坡度要陡峭得多。如果學習率(即步長)很小,我們可以下降到峽谷底部,然後沿著它向最小值移動。但是,進展會很慢。我們可以提高學習率,但這不會改變步驟的方向。在這種情況下,我們會越過峽谷底部並最終落到對面的牆上。然後,我們將重複這種模式,在牆壁之間擺動,同時緩慢地向最小值前進。在這種情況下,動量可以提供幫助。
動量只是意味著將先前更新的一部分添加到當前更新中,以便在特定方向複合重複更新;我們積聚動力,朝著這個方向越來越快地前進。在峽谷的情況下,我們會在最小值的方向上建立動量,因為所有更新都在那個方向上有一個分量。相比之下,在峽谷壁上來回移動需要不斷地反轉方向,因此動量將有助於抑制這些方向的振盪。
Adam 使用的另一個技巧是為每個參數自適應地選擇一個單獨的學習率。通常接收較小或較不頻繁更新的參數使用 Adam 接收較大的更新(反之亦然)。在適當的學習率因參數而異的情況下,這可以加快學習速度。例如,在深度網絡中,梯度在早期層會變小,因此增加相應參數的學習率是有意義的。這種方法的另一個好處是,因為學習率是自動調整的,手動調整變得不那麼重要了。標準 SGD 需要對學習率進行仔細調整(可能還有在線調整),但對於 Adam 和相關方法而言,情況並非如此。仍然需要選擇超參數,
相關方法:
Momentum 通常與標準 SGD 一起使用。改進的版本稱為 Nesterov 動量或 Nesterov 加速梯度。對每個參數使用自動調整學習率的其他方法包括:Adagrad、RMSprop 和 Adadelta。RMSprop 和 Adadelta 解決了 Adagrad 可能導致學習停止的問題。Adam 類似於具有動量的 RMSprop。Nadam 修改 Adam 以使用 Nesterov 動量而不是經典動量。
參考資料:
金馬和巴(2014)。亞當:一種隨機優化方法。
古德費羅等人。(2016 年)。深度學習,第 8 章。
Geoff Hinton 課程的幻燈片
多扎特(2016 年)。將 Nesterov Momentum 融入 Adam。