adam调参
?
微調 ?
#阿爾法"learning_rate": 3e-5,#學習率衰減"weight_decay": 0.1,
// "weight_decay": 0.01,"clip_grad": 2,"batch_size": 30,"epoch_num": 1,"min_epoch_num": 1,"patience": 0.02,"patience_num": 3,"epsilon": 10e-8 # 防止除以零
如果不是微調 學習率和學習率的衰減率 都要增大 https://juejin.im/entry/5983115f6fb9a03c50227fd4
深度學習最常用的算法:Adam優化算法
閱讀 15278 收藏 7 2017-08-03 原文鏈接:dataunion.org從帶寬擴展到丟包隱藏,實時音頻中的 AIjuejin.im
深度學習常常需要大量的時間和機算資源進行訓練,這也是困擾深度學習算法開發的重大原因。雖然我們可以采用分布式并行訓練加速模型的學習,但所需的計算資源并沒有絲毫減少。而唯有需要資源更少、令模型收斂更快的最優化算法,才能從根本上加速機器的學習速度和效果,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|?≤?α。
總結
- 上一篇: [Pytorch]基于混和精度的模型加速
- 下一篇: PyTorch-Adam优化算法原理,公