梯度下降是優(yōu)化神經網絡和機器機器學習算法的首選優(yōu)化方法跛璧。本文重度參考SEBASTIAN RUDER的文章。對于英文比較好的同學請直接閱讀原文。本文只為個人的學習總結,難免有所欠缺和不足镐依。
一、梯度下降變種
根據訓練數(shù)據集的大小,梯度下降有三種變體僻他,但是本質是一樣的,不一樣的是每次使用多少條樣本腊尚。如果內存一次可以計算所有樣本的梯度吨拗,稱為:批梯度下降(Batch gradient descent);如果內存一次只允許一個樣本婿斥,稱為:隨機梯度下降(Stochastic gradient descent)劝篷;大部分時候,內存一次是可以計算部分樣本的民宿,稱為:最小批梯度下降(Mini-batch gradient descent)娇妓。三種變體的數(shù)據表達如下:
1.1批梯度下降(Vanilla gradient descent,又稱Batch gradient descent)
1.2隨機梯度下降(Stochastic gradient descent)
1.3最小批梯度下降(Mini-batch gradient descent)
注意,在其他地方并沒對上述三種變體做嚴格區(qū)別勘高,統(tǒng)稱為SGD(隨機梯度下降)峡蟋,下文其余部分,我們也不加區(qū)分华望,統(tǒng)稱為SGD
二蕊蝗、梯度下降的幾種優(yōu)化方法
傳統(tǒng)的梯度下降法不能保證一個很好的收斂,而且有一些挑戰(zhàn)需要被解決赖舟。
- 選擇這個合適的學習率是比較困難的蓬戚。特別是對一個新的模型和新數(shù)據集時候,我們是不知道選擇什么樣的學習率是合適的宾抓。只能不斷的去嘗試子漩。
- 學習率調度算法可以在訓練的過程中去調整模型的學習率。模型一開始的時候可以使用大一點的學習率石洗,后面再使用小一點的學習率去微調模型幢泼。更好的方法是一開始也用一個小的學習率去warm-up訓練,讓參數(shù)先適應數(shù)據集讲衫。但是無論哪種學習率調度算法都需要預先定義調度算法缕棵,這種方法也是沒有辦法很好的適應模型的特征的、
- 對每一個參數(shù)都使用同樣的學習率是不合適的涉兽。對于稀疏的數(shù)據或者特征非常不均衡的數(shù)據招驴。最好是使用不同學習率學習不同頻率的特征。
- 另外的挑戰(zhàn)是對于高階非凸的損失函數(shù)枷畏,往往會陷于局部極值點别厘。還有一種鞍點的情況,模型也是很難學習的拥诡。此時損失函數(shù)在各個方向的梯度接近于0触趴。SGD是很難逃脫與鞍點或者局部極值點的氮发。
針對上面的一些問題,慢慢出現(xiàn)了一些針對梯度下降的優(yōu)化方法雕蔽。
在介紹SGD變種之前折柠。先給出各個變種的一般范式。后天的各個變種優(yōu)化方法都離不開這個范式批狐。
(1)計算目標函數(shù)關于參數(shù)的梯度
(2)根據歷史梯度計算一階和二階動量(二階指的是梯度的平方)
(3)更新模型參數(shù)
2.1 動量法(Momentum)
做一個簡單的推導扇售。
發(fā)現(xiàn),參數(shù)每次的更新量為之前的梯度和乘以一個常量嚣艇。下圖坐標是樸樹SGD的圖示承冰,右邊是加上動量的SGD圖示。發(fā)現(xiàn)在水平方向得到了加速食零,在豎直方向得到了收斂困乒。所以如果之前1到t-1時刻的梯度方向比較一致,那么加了動量的SGD會在這個方向加速贰谣;如果之前時刻的梯度方向不太一致娜搂,或者說抖動的比較厲害;那么加了動量的SGD會在這個方向減速吱抚,也就是以更小的速度更新參數(shù)百宇。
Adagrad
SGD、SGD-M都是相同的學習率更新參數(shù)秘豹。但是對于高頻出現(xiàn)的特征我們希望用更小的學習率更新參數(shù)携御。所以提出了自適應梯度更新方法Adagrad。Adagrad對于低頻出現(xiàn)的特征我們希望用更大的學習率更新參數(shù)既绕。所以在稀疏數(shù)據的場景下Adagrad表現(xiàn)較好啄刹。Adagrad中的ada是adapt(自適應)的意思
其中表示過去所有時刻梯度平方和,注意分母是帶根號的凄贩,不帶根號效果會很差誓军。
缺點:分母會越來越大,導致最后的學習率是無窮小的值疲扎。這樣模型就學不到東西了谭企。
RMSprop
從表達是可以看出RMSprop是為了解決Adagrad中學習率會越來越小的問題。RMSprop處理使用之前的累計額梯度平方和還使用了當前時刻的梯度平方评肆。這樣就會防止學習率越來越小。
Adam
Adam可以認為是RMSprop和Momentum的結合非区。
其中
由于都是趨向于1的數(shù)瓜挽,所以開始時刻趨向于0的一端,導致一開始的時候梯度很小征绸。所以作者Adam對上面的公式做了偏差矯正(bias-corrected)久橙。公式如下
即在原來的基礎上除以俄占。 那么, 隨著t的變大,趨向于1淆衷。即趨向于缸榄。
最終參數(shù)更新表達如下:
所以理論上Adam優(yōu)化方法是比較好的優(yōu)化方法。即加了動量祝拯,針對不同參數(shù)又使用了不同的學習率甚带。當時在目前很多開源的代碼中,很多了大佬還是使用了SGD-M方法佳头,并沒有使用Adam鹰贵。關于這一點歡迎大家一起討論。
放一張經典的圖