【AI初识境】为了围剿SGD大家这些年想过的那十几招
文章首發(fā)于微信公眾號(hào)《有三AI》
【AI初識(shí)境】為了圍剿SGD大家這些年想過的那十幾招
這是《AI初識(shí)境》第7篇,這次我們說說常用的優(yōu)化算法。所謂初識(shí),就是對(duì)相關(guān)技術(shù)有基本了解,掌握了基本的使用方法。
深度學(xué)習(xí)框架目前基本上都是使用一階的梯度下降算法及其變種進(jìn)行優(yōu)化,在此基礎(chǔ)上也發(fā)展出了很多的改進(jìn)算法。另外,近年來二階的優(yōu)化算法也開始慢慢被研究起來。
今天就來說說神經(jīng)網(wǎng)絡(luò)的優(yōu)化相關(guān)的內(nèi)容。
作者&編輯? | 言有三
?
1 優(yōu)化簡述
深度學(xué)習(xí)模型的優(yōu)化是一個(gè)非凸優(yōu)化問題,這是與凸優(yōu)化問題對(duì)應(yīng)的。
對(duì)于凸優(yōu)化來說,任何局部最優(yōu)解即為全局最優(yōu)解。用貪婪算法或梯度下降法都能收斂到全局最優(yōu)解,損失曲面如下。
而非凸優(yōu)化問題則可能存在無數(shù)個(gè)局部最優(yōu)點(diǎn),損失曲面如下,可以看出有非常多的極值點(diǎn),有極大值也有極小值。
除了極大極小值,還有一類值為“鞍點(diǎn)”,簡單來說,它就是在某一些方向梯度下降,另一些方向梯度上升,形狀似馬鞍,如下圖紅點(diǎn)就是鞍點(diǎn)。
對(duì)于深度學(xué)習(xí)模型的優(yōu)化來說,鞍點(diǎn)比局部極大值點(diǎn)或者極小值點(diǎn)帶來的問題更加嚴(yán)重。
目前常用的優(yōu)化方法分為一階和二階,這里的階對(duì)應(yīng)導(dǎo)數(shù),一階方法只需要一階導(dǎo)數(shù),二階方法需要二階導(dǎo)數(shù)。
常用的一階算法就是:隨機(jī)梯度下降SGD及其各類變種了。
常用的二階算法就是:牛頓法等。
我們這里主要還是說一階方法,二階方法因?yàn)橛?jì)算量的問題,現(xiàn)在還沒有被廣泛地使用。
?
2 梯度下降算法
本文目標(biāo)不是為了從零開始講清楚優(yōu)化算法,所以有些細(xì)節(jié)和基礎(chǔ)就略過。
梯度下降算法,即通過梯度的反方向來進(jìn)行優(yōu)化,批量梯度下降(Batch gradient descent)用公式表述如下:
寫成偽代碼如下:
for i in range(nb_epochs):
????params_grad = evaluate_gradient(loss_function, data, params)?
????params = params - learning_rate * params_grad
上面的梯度下降算法用到了數(shù)據(jù)集所有的數(shù)據(jù),這在解決實(shí)際問題時(shí)通常是不可能,想想Imagenet1000有100G以上的圖像,內(nèi)存裝不下,速度也很慢。
我們需要在線能夠?qū)崟r(shí)計(jì)算,于是一次取一個(gè)樣本,就有了隨機(jī)梯度下降(Stochastic gradient descent),簡稱sgd。
公式如下:
寫成偽代碼如下:
for i in range(nb_epochs):?
? ? np.random.shuffle(data)
? ? for example in data:
????????params_grad = evaluate_gradient(loss_function , example , params)?
????????params = params - learning_rate * params_grad
sgd方法缺點(diǎn)很明顯,梯度震蕩,所以就有了后來大家常用的小批量梯度下降算法(Mini-batch gradient descent)。
偽代碼如下:
for i in range(nb_epochs):?
????np.random.shuffle(data)
????for batch in get_batches(data, batch_size=50):
????????params_grad = evaluate_gradient(loss_function, batch, params)?
????????params = params - learning_rate * params_grad
下面我們要形成共識(shí),說sgd算法,實(shí)際上指的就是mini-batch gradient descent算法,沒有人會(huì)去一次拿整個(gè)數(shù)據(jù)集或者一個(gè)樣本進(jìn)行優(yōu)化。
當(dāng)然還是要總結(jié)一下SGD算法的毛病。
(1) 學(xué)習(xí)率大小和策略選擇困難,想必動(dòng)手經(jīng)驗(yàn)豐富的自然懂。
(2) 學(xué)習(xí)率不夠智能,對(duì)參數(shù)的各個(gè)維度一視同仁。
(3) 同時(shí)面臨局部極值和鞍點(diǎn)的問題。
?
3 梯度下降算法改進(jìn)
1 Momentum 動(dòng)量法
在所有的改進(jìn)算法中,我覺得真正最有用的就是它。
前面說了梯度下降算法是按照梯度的反方向進(jìn)行參數(shù)更新,但是剛開始的時(shí)候梯度不穩(wěn)定呀,方向改變是很正常的,梯度就是抽瘋了似的一下正一下反,導(dǎo)致做了很多無用的迭代。
而動(dòng)量法做的很簡單,相信之前的梯度。如果梯度方向不變,就越發(fā)更新的快,反之減弱當(dāng)前梯度。
畫成圖就是這樣。
效果對(duì)比就這意思。
2 Nesterov accelerated gradient法 ,簡稱NAG算法??
仍然是動(dòng)量法,只是它要求這個(gè)下降更加智能。
既然動(dòng)量法已經(jīng)把前一次的梯度和當(dāng)前梯度融合,那何不更進(jìn)一步,直接先按照前一次梯度方向更新一步將它作為當(dāng)前的梯度,看下面的式子就明白了。
?
如上圖,自己領(lǐng)會(huì)。nesterov的好處就是,當(dāng)梯度方向快要改變的時(shí)候,它提前獲得了該信息,從而減弱了這個(gè)過程,再次減少了無用的迭代。
3 Adagrad法
思路很簡單,不同的參數(shù)是需要不同的學(xué)習(xí)率的,有的要慢慢學(xué),有的要快快學(xué),所以就給了一個(gè)權(quán)重咯,而且是用了歷史上所有的梯度幅值。
4 Adadelta與Rmsprop
Adagrad用了所有的梯度,問題也就來了,累加的梯度幅值是越來越大的。導(dǎo)致學(xué)習(xí)率前面的乘因子越來越小,后來就學(xué)不動(dòng)了呀。
Adadelta就只是動(dòng)了一丟丟小心思,用移動(dòng)平均的方法計(jì)算累加梯度,只累加了一個(gè)窗口的梯度,而且計(jì)算方法也更有效。
并且,將學(xué)習(xí)率用前一時(shí)刻參數(shù)的平方根來代替,最終更新算法變成了這樣。
?
RMSprop方法的不同就在于分子上還是使用學(xué)習(xí)率η而不是Adadelta中的
這個(gè)方法在Hinton的課程中使用,沒有發(fā)表成論文,畢竟有Adadelta了沒有發(fā)表必要。
5 Adam方法
Adam算法可能是除了SGD算法之外大家最熟悉的了,無腦使用,不需調(diào)參。
Adam對(duì)梯度的一階和二階都進(jìn)行了估計(jì)與偏差修正,使用梯度的一階矩估計(jì)和二階矩估計(jì)來動(dòng)態(tài)調(diào)整每個(gè)參數(shù)的學(xué)習(xí)率。
看出來了吧,與Adadelta和Rmsprop如出一轍,與Momentum SGD也頗為相似。上面的式子根據(jù)梯度對(duì)參數(shù)更新的幅度進(jìn)行了動(dòng)態(tài)調(diào)整,所以Adam對(duì)學(xué)習(xí)率沒有那么敏感。
Adam每次迭代參數(shù)的學(xué)習(xí)步長都有一個(gè)確定的范圍,不會(huì)因?yàn)楹艽蟮奶荻葘?dǎo)致很大的學(xué)習(xí)步長,參數(shù)的值比較穩(wěn)定,但是它也并非真的是參數(shù)不敏感的,學(xué)習(xí)率在訓(xùn)練的后期可仍然可能不穩(wěn)定導(dǎo)致無法收斂到足夠好的值,泛化能力較差,這在文[3]中有非常詳細(xì)的研究,后面也會(huì)簡單說一下。
6 AdaMax
將Adam使用的二階矩變成更高階,就成了Adamax算法。
?
7 Nadam法
Nag加上Adam,就成了Nadam方法,即帶有動(dòng)量項(xiàng)的Adam,所以形式也很簡單,如下,可以將其分別與Adam算法和NAG算法的式子比較看看。
8?AMSgrad方法
ICLR 2018最佳論文提出了AMSgrad方法,研究人員觀察到Adam類的方法之所以會(huì)不能收斂到好的結(jié)果,是因?yàn)樵趦?yōu)化算法中廣泛使用的指數(shù)衰減方法會(huì)使得梯度的記憶時(shí)間太短。
在深度學(xué)習(xí)中,每一個(gè)mini-batch對(duì)結(jié)果的優(yōu)化貢獻(xiàn)是不一樣的,有的產(chǎn)生的梯度特別有效,但是也一視同仁地被時(shí)間所遺忘。
具體的做法是使用過去平方梯度的最大值來更新參數(shù),而不是指數(shù)平均。
9 Adafactor方法
Adam算法有兩個(gè)參數(shù),beta1和beta2,相關(guān)研究表明beta2的值對(duì)收斂結(jié)果有影響,如果較低,衰減太大容易不收斂,反之就容易收斂不穩(wěn)定。Adafactor是通過給beta1和beta2本身也增加了一個(gè)衰減。?
beta2的值剛開始是0,之后隨著時(shí)間的增加而逼近預(yù)設(shè)值。
10 Adabound方法
上面說了,beta2的值造成Adam算法有可能不收斂或者不穩(wěn)定而找不到全局最優(yōu)解,落實(shí)到最后的優(yōu)化參數(shù)那就是不穩(wěn)定和異常(過大或者過小)的學(xué)習(xí)率。Adabound采用的解決問題的方式就非常的簡單了,那就是限制最大和最小值范圍,約束住學(xué)習(xí)率的大小。
ηl(t)和ηu(t)分別是一個(gè)隨著時(shí)間單調(diào)遞增和遞減的函數(shù),最后兩者收斂到同一個(gè)值。
說了這么多,對(duì)上面各種方法從一個(gè)鞍點(diǎn)開始優(yōu)化,表現(xiàn)如何的預(yù)期效果圖如下,參考文[1]。
理論上,就是上面這樣的。文章作者會(huì)告訴你對(duì)于數(shù)據(jù)稀疏的問題,用自適應(yīng)學(xué)習(xí)率算法就好了,而且使用人家推薦的參數(shù)就好。其中,Adam會(huì)最佳。
?
4 總結(jié)
4.1 改進(jìn)方法是否都比SGD算法強(qiáng)?
上面說了這么多理論,分析起來頭頭是道,各種改進(jìn)版本似乎各個(gè)碾壓SGD算法。但是否真的如此。筆者曾經(jīng)做過一個(gè)簡單的實(shí)驗(yàn),結(jié)果如下。
所有方法都采用作者們的默認(rèn)配置,并且進(jìn)行了參數(shù)調(diào)優(yōu),不好的結(jié)果就不拿出來了。
-
nesterov方法,與sgd算法同樣的配置。
-
adam算法,m1=0.9,m2=0.999,lr=0.001。
-
rms算法,rms_decay=0.9,lr=0.001。
-
adagrad,adadelta學(xué)習(xí)率不敏感。
看起來好像都不如SGD算法,實(shí)際上這是一個(gè)很普遍的現(xiàn)象,各類開源項(xiàng)目和論文[3-4]都能夠印證這個(gè)結(jié)論。
總體上來說,改進(jìn)方法降低了調(diào)參工作量,只要能夠達(dá)到與精細(xì)調(diào)參的SGD相當(dāng)?shù)男阅?#xff0c;就很有意義了,這也是Adam流行的原因。但是,改進(jìn)策略帶來的學(xué)習(xí)率和步長的不穩(wěn)定還是有可能影響算法的性能,因此這也是一個(gè)研究的方向,不然哪來這么多Adam的變種呢。
4.2 二階方法研究的怎么樣了呢?
二階的方法因?yàn)槭褂昧藢?dǎo)數(shù)的二階信息,因此其優(yōu)化方向更加準(zhǔn)確,速度也更快,這是它的優(yōu)勢(shì)。
但是它的劣勢(shì)也極其明顯,使用二階方法通常需要直接計(jì)算或者近似估計(jì)Hessian 矩陣,一階方法一次迭代更新復(fù)雜度為O(N),二階方法就是O(N*N),深層神經(jīng)網(wǎng)絡(luò)中變量實(shí)在是太多了,搞不動(dòng)的。
不過,還是有研究者去研究的。比如東京工業(yè)大學(xué)和NVIDIA在[5]中使用的K-FAC方法,用1024塊Tesla V100豪無人性地在10分鐘內(nèi)把ImageNet在35個(gè)epoch內(nèi)訓(xùn)練到75%的top-1精度。K-FAC已經(jīng)在CNN的訓(xùn)練中很常用了,感興趣的可以去了解。
其他的二階方法筆者也關(guān)注到了一些,以后等有了比較多穩(wěn)定靠譜的研究,再來分享把。
[1] Ruder S. An overview of gradient descent optimization algorithms[J]. arXiv preprint arXiv:1609.04747, 2016.
[2]?Reddi S J, Kale S, Kumar S. On the convergence of adam and beyond[J]. 2018.
[3] Bottou L, Curtis F E, Nocedal J. Optimization methods for large-scale machine learning[J]. Siam Review, 2018, 60(2): 223-311.
[4]?Keskar N S, Socher R. Improving generalization performance by switching from adam to sgd[J]. arXiv preprint arXiv:1712.07628, 2017.
[5]?Osawa K, Tsuji Y, Ueno Y, et al. Second-order Optimization Method for Large Mini-batch: Training ResNet-50 on ImageNet in 35 Epochs[J]. arXiv preprint arXiv:1811.12019, 2018.
如果想了解更多,歡迎關(guān)注知乎。
?
總結(jié)
其實(shí)大家不要緊張,一般做項(xiàng)目先上Adam試試,不行再換。等到了優(yōu)化方法對(duì)項(xiàng)目起關(guān)鍵作用的時(shí)候,說明你可能已經(jīng)比較牛逼了,那還擔(dān)心什么呢?
下期預(yù)告:深度學(xué)習(xí)中的池化方法。
?
轉(zhuǎn)載文章請(qǐng)后臺(tái)聯(lián)系
侵權(quán)必究
比如網(wǎng)絡(luò)loss不正常,怎么調(diào)都不管用。
比如訓(xùn)練好好的,測(cè)試就是結(jié)果不對(duì)。
bug天天有,深度學(xué)習(xí)算法工程師遇到的特別多,如果你想交流更多,就來有三AI知識(shí)星球?qū)崟r(shí)提問交流吧,大咖眾多,總有能解決你問題的。
初識(shí)境界到此基本就結(jié)束了,這一系列是為大家奠定扎實(shí)的深度學(xué)習(xí)基礎(chǔ),希望學(xué)習(xí)完后大家能有收獲。
AI白身境系列完整閱讀:
第一期:【AI白身境】深度學(xué)習(xí)從棄用windows開始
第二期:【AI白身境】Linux干活三板斧,shell、vim和git
第三期:【AI白身境】學(xué)AI必備的python基礎(chǔ)
第四期:【AI白身境】深度學(xué)習(xí)必備圖像基礎(chǔ)
第五期:【AI白身境】搞計(jì)算機(jī)視覺必備的OpenCV入門基礎(chǔ)
第六期:【AI白身境】只會(huì)用Python?g++,CMake和Makefile了解一下
第七期:【AI白身境】學(xué)深度學(xué)習(xí)你不得不知的爬蟲基礎(chǔ)
第八期:?【AI白身境】深度學(xué)習(xí)中的數(shù)據(jù)可視化
第九期:【AI白身境】入行AI需要什么數(shù)學(xué)基礎(chǔ):左手矩陣論,右手微積分
第十期:【AI白身境】一文覽盡計(jì)算機(jī)視覺研究方向
第十一期:【AI白身境】AI+,都加在哪些應(yīng)用領(lǐng)域了
第十二期:【AI白身境】究竟誰是paper之王,全球前10的計(jì)算機(jī)科學(xué)家
AI初識(shí)境系列完整閱讀
第一期:【AI初識(shí)境】從3次人工智能潮起潮落說起
第二期:【AI初識(shí)境】從頭理解神經(jīng)網(wǎng)絡(luò)-內(nèi)行與外行的分水嶺
第三期:【AI初識(shí)境】近20年深度學(xué)習(xí)在圖像領(lǐng)域的重要進(jìn)展節(jié)點(diǎn)
第四期:【AI初識(shí)境】激活函數(shù):從人工設(shè)計(jì)到自動(dòng)搜索
第五期:【AI初識(shí)境】什么是深度學(xué)習(xí)成功的開始?參數(shù)初始化
第六期:【AI初識(shí)境】深度學(xué)習(xí)模型中的Normalization,你懂了多少?
第七期:【AI初識(shí)境】為了圍剿SGD大家這些年想過的那十幾招
第八期:【AI初識(shí)境】被Hinton,DeepMind和斯坦福嫌棄的池化,到底是什么?
第九期:【AI初識(shí)境】如何增加深度學(xué)習(xí)模型的泛化能力
第十期:【AI初識(shí)境】深度學(xué)習(xí)模型評(píng)估,從圖像分類到生成模型
第十一期:【AI初識(shí)境】深度學(xué)習(xí)中常用的損失函數(shù)有哪些?
第十二期:【AI初識(shí)境】給深度學(xué)習(xí)新手開始項(xiàng)目時(shí)的10條建議
感謝各位看官的耐心閱讀,不足之處希望多多指教。后續(xù)內(nèi)容將會(huì)不定期奉上,歡迎大家關(guān)注有三公眾號(hào) 有三AI!
總結(jié)
以上是生活随笔為你收集整理的【AI初识境】为了围剿SGD大家这些年想过的那十几招的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【AI初识境】深度学习模型中的Norma
- 下一篇: 【AI初识境】被Hinton,DeepM