深度學習最常用的演算法:Adam優化演算法
深度學習常常需要大量的時間和機算資源進行訓練,這也是困擾深度學習演算法開發的重大原因。雖然我們可以採用分散式並行訓練加速模型的學習,但所需的計算資源並沒有絲毫減少。而唯有需要資源更少、令模型收斂更快的最優化演算法,才能從根本上加速機器的學習速度和效果,Adam 演算法正為此而生!
Adam 優化演算法是隨機梯度下降演算法的擴充套件式,近來其廣泛用於深度學習應用中,尤其是計算機視覺和自然語言處理等任務。本文分為兩部分,前一部分簡要介紹了 Adam 優化演算法的特性和其在深度學習中的應用,後一部分從 Adam 優化演算法的原論文出發,詳細解釋和推導了它的演算法過程和更新規則。我們希望讀者在讀完兩部分後能瞭解掌握以下幾點:
Adam 演算法是什麼,它為優化深度學習模型帶來了哪些優勢。
Adam 演算法的原理機制是怎麼樣的,它與相關的 AdaGrad 和 RMSProp 方法有什麼區別。
Adam 演算法應該如何調參,它常用的配置引數是怎麼樣的。
Adam 的實現優化的過程和權重更新規則
Adam 的初始化偏差修正的推導
Adam 的擴充套件形式:AdaMax
什麼是 Adam 優化演算法?
Adam 是一種可以替代傳統隨機梯度下降過程的一階優化演算法,它能基於訓練資料迭代地更新神經網路權重。Adam 最開始是由 OpenAI 的 Diederik Kingma 和多倫多大學的 Jimmy Ba 在提交到 2015 年 ICLR 論文(Adam: A Method for Stochastic Optimization)中提出的。本文前後兩部分都基於該論文的論述和解釋。
首先該演算法名為「Adam」,其並不是首字母縮寫,也不是人名。它的名稱來源於適應性矩估計(adaptive moment estimation)。在介紹這個演算法時,原論文列舉了將 Adam 優化演算法應用在非凸優化問題中所獲得的優勢:
直截了當地實現
高效的計算
所需記憶體少
梯度對角縮放的不變性(第二部分將給予證明)
適合解決含大規模資料和引數的優化問題
適用於非穩態(non-stationary)目標
適用於解決包含很高噪聲或稀疏梯度的問題
超引數可以很直觀地解釋,並且基本上只需極少量的調參
Adam 優化演算法的基本機制
Adam 演算法和傳統的隨機梯度下降不同。隨機梯度下降保持單一的學習率(即 alpha)更新所有的權重,學習率在訓練過程中並不會改變。而 Adam 通過計算梯度的一階矩估計和二階矩估計而為不同的引數設計獨立的自適應性學習率。
Adam 演算法的提出者描述其為兩種隨機梯度下降擴充套件式的優點集合,即:
適應性梯度演算法(AdaGrad)為每一個引數保留一個學習率以提升在稀疏梯度(即自然語言和計算機視覺問題)上的效能。
均方根傳播(RMSProp)基於權重梯度最近量級的均值為每一個引數適應性地保留學習率。這意味著演算法在非穩態和線上問題上有很有優秀的效能。
Adam 演算法同時獲得了 AdaGrad 和 RMSProp 演算法的優點。Adam 不僅如 RMSProp 演算法那樣基於一階矩均值計算適應性引數學習率,它同時還充分利用了梯度的二階矩均值(即有偏方差/uncentered variance)。具體來說,演算法計算了梯度的指數移動均值(exponential moving average),超引數 beta1 和 beta2 控制了這些移動均值的衰減率。
移動均值的初始值和 beta1、beta2 值接近於 1(推薦值),因此矩估計的偏差接近於 0。該偏差通過首先計算帶偏差的估計而後計算偏差修正後的估計而得到提升。如果對具體的實現細節和推導過程感興趣,可以繼續閱讀該第二部分和原論文。
Adam 演算法的高效性
Adam 在深度學習領域內是十分流行的演算法,因為它能很快地實現優良的結果。經驗性結果證明 Adam 演算法在實踐中效能優異,相對於其他種類的隨機優化演算法具有很大的優勢。
在原論文中,作者經驗性地證明了 Adam 演算法的收斂性符合理論性的分析。Adam 演算法可以在 MNIST 手寫字元識別和 IMDB 情感分析資料集上應用優化 logistic 迴歸演算法,也可以在 MNIST 資料集上應用於多層感知機演算法和在 CIFAR-10 影象識別資料集上應用於卷積神經網路。他們總結道:「在使用大型模型和資料集的情況下,我們證明了 Adam 優化演算法在解決區域性深度學習問題上的高效性。」
Adam 優化演算法和其他優化演算法在多層感知機模型中的對比
事實上,Insofar、RMSprop、Adadelta 和 Adam 演算法都是比較類似的優化演算法,他們都在類似的情景下都可以執行地非常好。但是 Adam 演算法的偏差修正令其在梯度變得稀疏時要比 RMSprop 演算法更快速和優秀。Insofar 和 Adam 優化演算法基本是最好的全域性選擇。同樣在 CS231n 課程中,Adam 演算法也推薦作為預設的優化演算法。
雖然 Adam 演算法在實踐中要比 RMSProp 更加優秀,但同時我們也可以嘗試 SGD+Nesterov 動量來作為 Adam 的替代。即我們通常推薦在深度學習模型中使用 Adam 演算法或 SGD+Nesterov 動量法。
Adam 的引數配置
alpha:同樣也稱為學習率或步長因子,它控制了權重的更新比率(如 0.001)。較大的值(如 0.3)在學習率更新前會有更快的初始學習,而較小的值(如 1.0E-5)會令訓練收斂到更好的效能。
beta1:一階矩估計的指數衰減率(如 0.9)。
beta2:二階矩估計的指數衰減率(如 0.999)。該超引數在稀疏梯度(如在 NLP 或計算機視覺任務中)中應該設定為接近 1 的數。
epsilon:該引數是非常小的數,其為了防止在實現中除以零(如 10E-8)。
另外,學習率衰減同樣可以應用到 Adam 中。原論文使用衰減率 alpha = alpha/sqrt(t) 在 logistic 迴歸每個 epoch(t) 中都得到更新。
Adam 論文建議的引數設定:
測試機器學習問題比較好的預設引數設定為:alpha=0.001、beta1=0.9、beta2=0.999 和 epsilon=10E−8。
我們也可以看到流行的深度學習庫都採用了該論文推薦的引數作為預設設定。
TensorFlow:learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08.
Keras:lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0.
Blocks:learning_rate=0.002, beta1=0.9, beta2=0.999, epsilon=1e-08, decay_factor=1.
Lasagne:learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08
Caffe:learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08
MxNet:learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8
Torch:learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8
在第一部分中,我們討論了 Adam 優化演算法在深度學習中的基本特性和原理:
Adam 是一種在深度學習模型中用來替代隨機梯度下降的優化演算法。
Adam 結合了 AdaGrad 和 RMSProp 演算法最優的效能,它還是能提供解決稀疏梯度和噪聲問題的優化方法。
Adam 的調參相對簡單,預設引數就可以處理絕大部分的問題。
而接下來的第二部分我們可以從原論文出發具體展開 Adam 演算法的過程和更新規則等。
論文:Adam: A Method for Stochastic Optimization
我們提出了 Adam 演算法,即一種對隨機目標函式執行一階梯度優化的演算法,該演算法基於適應性低階矩估計。Adam 演算法很容易實現,並且有很高的計算效率和較低的記憶體需求。Adam 演算法梯度的對角縮放(diagonal rescaling)具有不變性,因此很適合求解帶有大規模資料或引數的問題。該演算法同樣適用於解決大噪聲和稀疏梯度的非穩態(non-stationary)問題。超引數可以很直觀地解釋,並只需要少量調整。本論文還討論了 Adam 演算法與其它一些相類似的演算法。我們分析了 Adam 演算法的理論收斂性,並提供了收斂率的區間,我們證明收斂速度在線上凸優化框架下達到了最優。經驗結果也展示了 Adam 演算法在實踐上比得上其他隨機優化方法。最後,我們討論了 AdaMax,即一種基於無窮範數(infinity norm)的 Adam 變體。
如上演算法所述,在確定了引數α、β1、β2 和隨機目標函式 f(θ) 之後,我們需要初始化引數向量、一階矩向量、二階矩向量和時間步。然後當引數θ沒有收斂時,迴圈迭代地更新各個部分。即時間步 t 加 1、更新目標函式在該時間步上對引數θ所求的梯度、更新偏差的一階矩估計和二階原始矩估計,再計算偏差修正的一階矩估計和偏差修正的二階矩估計,然後再用以上計算出來的值更新模型的引數θ。
2. 演算法
上圖虛擬碼為展現了 Adam 演算法的基本步驟。假定 f(θ) 為噪聲目標函式:即關於引數θ可微的隨機標量函式。我們對怎樣減少該函式的期望值比較感興趣,即對於不同引數θ,f 的期望值 E[f(θ)]。其中 f1(θ), …, , fT (θ) 表示在隨後時間步 1, …, T 上的隨機函式值。這裡的隨機性來源於隨機子樣本(小批量)上的評估和固有的函式噪聲。而 表示 ft(θ) 關於θ的梯度,即在實踐步驟 t 下 ft 對θ的偏導數向量。
該演算法更新梯度的指數移動均值(mt)和平方梯度(vt),而引數 β1、β2 ∈ [0, 1) 控制了這些移動均值(moving average)指數衰減率。移動均值本身使用梯度的一階矩(均值)和二階原始矩(有偏方差)進行估計。然而因為這些移動均值初始化為 0 向量,所以矩估計值會偏差向 0,特別是在初始時間步中和衰減率非常小(即β接近於 1)的情況下是這樣的。但好訊息是,初始化偏差很容易抵消,因此我們可以得到偏差修正(bias-corrected)的估計 mt hat 和 vt hat。
注意演算法的效率可以通過改變計算順序而得到提升,例如將虛擬碼最後三行迴圈語句替代為以下兩個:
2.1 Adam 的更新規則
Adam 演算法更新規則的一個重要特徵就是它會很謹慎地選擇步長的大小。假定ε=0,則在時間步 t 和引數空間上的有效下降步長為有效下降步長有兩個上確界:即在情況下,有效步長的上確界滿足和其他情況下滿足 |∆t| ≤ α。第一種情況只有在極其稀疏的情況下才會發生:即梯度除了當前時間步不為零外其他都為零。而在不那麼稀疏的情況下,有效步長將會變得更小。當
時,我們有,因此可以得出上確界 |∆t| < α。在更通用的場景中,因為 |E[g]/ p E[g^2]| ≤ 1,我們有 。每一個時間步的有效步長在引數空間中的量級近似受限於步長因子α,即。這個可以理解為在當前引數值下確定一個置信域,因此其要優於沒有提供足夠資訊的當前梯度估計。這正可以令其相對簡單地提前知道α正確的範圍。
對於許多機器學習模型來說,我們知道好的最優狀態是在引數空間內的集合域上有極高的概率。這並不罕見,例如我們可以在引數上有一個先驗分佈。因為α確定了引數空間內有效步長的量級(即上確界),我們常常可以推斷出α的正確量級,而最優解也可以從θ0 開始通過一定量的迭代而達到。我們可以將稱之為信噪比(signal-to-noise ratio/SNR)。如果 SNR 值較小,那麼有效步長∆t 將接近於 0,目標函式也將收斂到極值。這是非常令人滿意的屬性,因為越小的 SNR 就意味著演算法對方向 是否符合真實梯度方向存在著越大的不確定性。例如,SNR 值在最優解附近趨向於 0,因此也會在引數空間有更小的有效步長:即一種自動退火(automatic annealing)的形式。有效步長∆t 對於梯度縮放來說仍然是不變數,我們如果用因子 c 重縮放(rescaling)梯度 g,即相當於用因子 c 重縮放 和用因子 c^2 縮放,而在計算信噪比時縮放因子會得到抵消:
3 初始化偏差修正
正如本論文第二部分演算法所述,Adam 利用了初始化偏差修正項。本部分將由二階矩估計推匯出這一偏差修正項,一階矩估計的推導完全是相似的。首先我們可以求得隨機目標函式 f 的梯度,然後我們希望能使用平方梯度(squared gradient)的指數移動均值和衰減率β2 來估計它的二階原始矩(有偏方差)。令 g1, …, gT 為時間步序列上的梯度,其中每個梯度都服從一個潛在的梯度分佈 gt ∼ p(gt)。現在我們初始化指數移動均值 v0=0(零向量),而指數移動均值在時間步 t 的更新可表示為: 其中 gt^2 表示 Hadamard 積 gt⊙gt,即對應元素之間的乘積。同樣我們可以將其改寫為在前面所有時間步上只包含梯度和衰減率的函式,即消去 v:
我們希望知道時間步 t 上指數移動均值的期望值 E[vt] 如何與真實的二階矩相關聯,所以我們可以對這兩個量之間的偏差進行修正。下面我們同時對錶達式(1)的左邊和右邊去期望,即如下所示:
如果真實二階矩 E[g 2 i ] 是靜態的(stationary),那麼ζ = 0。否則 ζ 可以保留一個很小的值,這是因為我們應該選擇指數衰減率 β1 以令指數移動均值分配很小的權重給梯度。所以初始化均值為零向量就造成了只留下了 (1 − βt^2 ) 項。我們因此在演算法 1 中除以了ζ項以修正初始化偏差。
在稀疏矩陣中,為了獲得一個可靠的二階矩估計,我們需要選擇一個很小的 β2 而在許多梯度上取均值。然而正好是這種小β2 值的情況導致了初始化偏差修正的缺乏,因此也就令初始化步長過大。
4. 收斂性分析
本論文使用了 Zinkevich 2003 年提出的線上學習框架分析了 Adam 演算法的收斂性。
5. 相關研究工作
與 Adam 演算法有直接聯絡的優化方法是 RMSProp (Tieleman & Hinton, 2012; Graves, 2013) 和 AdaGrad (Duchi et al., 2011)。
6 試驗
圖 1:在 MNIST 圖片集和有 1 萬條詞袋(BoW)特徵向量的 IMDB 電影評論資料集上訓練帶有負對數似然函式的 Logistic 迴歸。
圖 2:在 MNIST 圖片資料集上訓練多層神經網路。(a)圖是使用了 dropout 隨機正則化的神經網路。(b)圖是使用確定性損失函式的神經網路。
圖 3:卷積神經網路的訓練損失。左圖表示前三個 epoch 的訓練損失,右圖表示所有 45 個 epoch 上的訓練損失。
圖 4:在變分自編碼器(VAE)中帶偏差修正項(紅色)和沒有偏差修正項(綠色)的損失對比。
7 擴充套件
7.1 ADAMAX
在 Adam 中,單個權重的更新規則是將其梯度與當前和過去梯度的 L^2 範數(標量)成反比例縮放。而我們可以將基於 L^2 範數的更新規則泛化到基於 L^p 範數的更新規則中。雖然這樣的變體會因為 p 的值較大而在數值上變得不穩定,但是在特例中,我們令 p → ∞會得出一個極其穩定和簡單的演算法(見演算法 2)。現在我們將推導這個演算法,在使用 L^p 範數情況下,時間 t 下的步長和 vt^(1/p) 成反比例變化。
注意這裡的衰減項等價地為 β2^p,而不是 β2。現在令 p → ∞,並定義
然後有:
該表示式就對應相當於極其簡單的迭代公式:
其中初始值 u0 = 0。注意這裡十分便利,在該情況下我們不需要修正初始化偏差。同樣 AdaMax 引數更新的量級要比 Adam 更簡單,即|∆t| ≤ α。