ADADELTA- AN ADAPTIVE LEARNING RATE METHOD

ADADELTA:一種學習率自調整方法

摘要

針對梯度下降算法提出了一種新型的適用於高維情況下學習率設置方法,稱之爲ADADELTA。這種方法僅僅使用一階導數信息,具有良好的動態適應性,並且與原始隨機梯度下降算法相比具有更小的計算開銷。這種方法不需要人工調節學習率而且對噪聲梯度信息、不同模型結構、不同的數據模式以及超參數(某個參數是隨機變量時,該參數的分佈中的參數就是超參數,即參數的參數)的選擇表現出較強的魯棒性。我們在同一臺電腦上進行MNIST數字識別以及在分佈式環境中對一個大規模的聲音數據庫進行語音識別,與其他方法相比,我們的方法得到了更好的結果。

1.介紹

很多機器學習方法的目的都是不斷更新參數集合x 來優化目標函數f(x) 。它們通常包含很多迭代程序用來求出Δx 。我們用xt 表示t 時刻的 x ,那麼這個簡單的更新規則爲

xt+1=xt+Δxt(1)

在文中我們認爲,梯度gt 的負方向就是下降最快的方向,梯度下降算法就是依靠這個方向來優化目標函數的。這個一般性的方法可以用來更新任何可以求導的參數,即:
Δxt=ηgt(2)

其中gt 表示參數在t 時刻的梯度=f(xt)xt , η 是學習率,學習率控制着每次在負梯度的方向上走多少。隨機梯度下降算法(SGD, stochastic gradient descent)的做法是對於每一個樣本或者從數據集中隨機選出的一批樣本都計算一次梯度,然後把該梯度的負方向作爲當前最小化成本函數的估計方向。對於梯度下降算法需要選擇學習率的超參數。
設置學習率通常要不斷調整,而較好的學習率一般是手動設置的。 學習率設置的過高會使得系統發散,但選擇的過小又會使學習過程變慢。對於很多問題而言,選擇一個好的學習率更像是藝術而不是科學。
這項工作試圖通過引入新的“動態學習率”來減輕原先需要反覆選擇學習率的重複任務。這種方法在每個維度上計算時只需要一階導數信息,並且在每次在梯度下降的迭代計算時只增加額外少量計算量。另外,這種方法用到了一些超參數,但是我們發現這些超參數的選擇對結果影響不大。這種方法的優點如下:
  • 不需要人工設置學習率。
  • 對超參數不敏感。
  • 每維有單獨的動態學習率。
  • 能減小梯度下降算法的計算量。
  • 對於大梯度、噪聲和不同結構有較好的魯棒性。

2.相關工作

梯度下降算法有很多改進方法,在這些改進方法中最強的就是牛頓的方法(Newton’method),它需要用到成本函數(cost function)的二階導數信息:

Δxt=H1tgt(3)

其中,H1t 在第 t 次迭代中二階導數Hessian矩陣的轉置。由此可以求出二次問題的最佳步長,但不幸的是在實際中我們無法對大模型進行這樣的計算。因此,又提出了一些既可以改善一階導數信息的使用又能近似於二階導數信息的方法。

2.1 學習率的退火算法

在梯度下降算法的每一次迭代中,很多人嘗試用啓發式算法來預估一個好的學習率。他們試着在合適的時候加快學習的速度,在局部極小值附近則降低學習速度。我們將在後面探討這些問題。
當梯度下降的成本函數的極小值附近時,這個參數會圍着這個極小值來回震盪。一種解決方法是通過減小學習率來減緩參數的更新,這可以在驗證準確率達到平穩時手動完成。另外,還有人提出通過查學習率表來完成學習率的自動退火,這種方法基於已經有多少數據已經訓練完了,這是一種典型的通過增加額外的超參數來控制學習率下降快慢的方法。

2.2 對每維求一階導方法

上面討論的啓發式退火算法對所有維度的參數僅僅更新一個全局學習率。因爲每維的參數向量與整體成本函數之間的關係可能完全不同,因此能夠抵消這種不同的每維學習率通常性能更好。

2.2.1 增加動量項

一種對每個維度都加速的方法是動量方法。這是一種非常簡單的對SGD的擴展方法,已經成功應用了數十年。動量方法的核心思想是在梯度方向一致的地方加速,在梯度方向不斷改變的地方減速。這種方法是通過追蹤指數下降的過去的參數來完成的:

Δxt=ρΔxt1ηgt(4)

其中ρ 是一個常數,它控制着以前的參數下降的快慢。這種方法對SGD給出了一種直觀的改善,特別是對於像一些又長有窄的山谷一樣的複雜的成本函數面時更爲有效。儘管沿着山谷方向的梯度要比橫跨山谷方向的梯度要小的多,但因爲沿着山谷方向的梯度方向是一致的,因此動量項能加快其學習速度。在SGD中,由於沿着山谷方向的梯度的模很小,因此沿着山谷方向的速度很慢,並且每個維度都共用同一個固定的全局學習率,很難進行加速。這時選擇一個較大的學習率有助於跨越山谷獲得較大的參數更新,但可能會導致橫跨山谷的來回震盪。當使用加入動量項時這種震盪會減弱,因爲梯度不斷改變會使得動量項減慢程序跨越山谷的速度。由於這種情況發生在每個維度上,因此沿着山谷的方向不會受影響。

2.2.2 ADAGRAD

最近有一種叫ADAGRAD的一階方法在分佈式環境下執行大規模學習任務時表現優異。這種方法僅僅使用一階方法但表現出了一些二階方法的特性。他的更新規則是:

Δxt=ηtτ=1g2τgt(5)

這裏,分母計算了以前所有時刻基於每個維度的偏置和全局學習率的梯度的範數。
與之前不同的是,這裏有調節全局學習率的地方,並且每個維度都有自己的動態學習率。動態學習率與梯度的幅值成反比,梯度越大學習率越小,梯度越小學習率越大。它有一個非常好的特性,就像一個二階方法一樣,它隨着時間的推移在各個維度上的速度會趨於一致。這使得它非常適合訓練深度網絡,因爲深度網絡的不同層的梯度的尺度通常是不同數量級。因此,對於最優學習率應該考慮到這一點。此外,分母中的梯度和與退火算法有相同的效果,都會隨着時間的推移減少學習率。由於ADAGRAD沒有考慮梯度的幅值,所以這種方法會對參數的初值和相對應的梯度敏感。如果初始梯度很大,在剩餘的學習率將會變得很小。當然,可以通過增大全局學習率來解決這個問題,所以這使得ADAGRAD的學習率的選擇變得很難。因爲隨着分母上梯度的平方不斷積累,學習率會隨着訓練持續減小,最終會減小到零而導致訓練停止。我們的ADADELTA方法有助於克服這種對超參數的選擇的敏感性,同時能夠避免學習率的持續下降。

2.3 使用二階信息的方法

上面的方法僅僅使用了梯度和進化函數來優化目標函數,而二階方法比如牛頓法或擬牛頓法則使用了Hessian矩陣,或者使用一些近似方法。雖然這些方法能夠提供額外的曲率信息,但精確計算二階導數卻使得計算開銷很大。
對於大模型,整個Hessian矩陣的二階導數的計算量非常大。因此Becker和LecCun提出了一種對Hessian矩陣對角近似計算方法。這種對角陣計算方法需要額外前向傳播和後向傳播的計算,使得計算量比SGD增加了一倍。Hessian的對角陣diag(H) 被計算完後,更新規則可以被寫爲:

Δxt=1|diag(Ht)|+μgt(6)

其中,Hessian矩陣對角陣的絕對值用來保證永遠跟隨梯度的負方向,μ 是一個很小的常數,用來改善Hessian在小曲率區域的條件。
最近,Schaul等人又提出了一種方法。這種方法包含3Hessian矩陣的對角陣,和ADAGRAD形式很像,用來減輕手動設置學習率的繁瑣。它的更新公式爲:
Δxt=1|diag(Ht)|E[gtw:t]2E[g2tw:t]gt(7)

其中E[gtw:t] 是前w 個梯度的期望值,E[g2tw:t] 是同樣寬爲w 的窗口下梯度平方的期望值。Schaul等人還對窗口值w 提出一種啓發式算法。

3. ADADELTA 方法

本文提出的方法源自於ADAGRAD,主要是爲了改善這個方法的兩大缺陷:1)隨着訓練學習率逐漸減小。2)需要人工選擇全局學習率。我們注意到我們的方法和Schaul等人的方法有些相似之處,兩者比較如下:
在ADAGRAD方法中,分母從開始訓練就對每一次迭代進行累加。每一個表達式都是正的,隨着不斷的累加,其和也不斷的變大,使得每個維度上的學習率不斷減小。多次迭代後,學習率會變得非常小。

3.1. 思想1:用窗口限制累加

不直接累加所有的梯度的平方,而是用一個寬度爲w 的窗口限制累加的歷史梯度(即用w 代替t ,其中t 指的是ADAGRAD中當前第t 次迭代)。在窗口限制累加情況下,ADAGRAD中的分母就不會被累加到無窮大,這就變成了用最近幾個的梯度來做局部預估。這就保證了若干次迭代之後學習能繼續進行。
因爲直接存儲w 個梯度的平方率有些低,因此把求和換成梯度平方的均值,我們的方法與直接計算相比計算量指數下降。假設在t 時刻的平均值爲E[g2]t ,然後我們只需計算:

E[g2]t=ρE[g2]t1+(1ρ)g2t(8)

其中ρ 是下降常數,和我們在動量方法中用的很像。在參數更新的時候我們需要計算出它的平方根,所以這就變成了求直到時間t 前的梯度平方的均方根(RMS,root mean square):
RMS[g]t=E[g2]t+ϵ(9)

其中加入常數ϵ 是爲了改善上式作爲分母的條件(如避免分母爲0等)。至此,我們可以得出更新規則爲:
Δxt=ηRMS[g]t(10)
算法 1 計算ADADELTA在t+1 時刻的值
需要:下降率ρ ,常數ϵ
需要:初始參數x1
    初始化求和變量E[g2]0=0,E[Δx2]0=0
for t=1:T
    計算梯度:gt
    累加梯度:E[g2]t=ρE[g2]t1+(1ρ)g2t
    計算更新值:Δxt=RMS[Δx]t1RMS[g]tgt
    累加更新值:E[Δx2]t=ρE[Δx2]t1+(1ρ)Δx2t
    應用更新:xt+1=xt+Δxt
end for

3.2. 思想2:帶Hessian逼近的正確修正單元

當提到更新參數Δx 時,不得不提到x ,它們應該是相匹配。假設某個參數有對應有一些更新單元,那麼這些參數發生改變時,它們的更新單元也應該響應改變。在SGD,動量法,ADAGRAD中這不是問題。在SGD和動量法中,更新單元只和梯度有關,與參數無關:

units of Δxunits of gfx1units of x(11)

注: log 一階導數正比於1x

假設成本函數f 沒有單位,ADAGRAD同樣沒有正確的單位,因爲更新包含了梯度的比率,因而更新沒有單位。
相對比而言,使用Hessian或者Hessian逼近法等二階信息的方法,比如牛頓法,可以在參數更新中修正單位:

ΔxH1gfx2fx2units of x(12)

注:log 二階導數正比於1x1x1x=x

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章