如何優(yōu)化深度學(xué)習(xí)模型
點(diǎn)擊上方“小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
本文轉(zhuǎn)自:磐創(chuàng)AI
看過(guò)了各式各樣的教程之后,你現(xiàn)在已經(jīng)了解了神經(jīng)網(wǎng)絡(luò)的工作原理,并且也搭建了貓狗識(shí)別器。你嘗試做了了一個(gè)不錯(cuò)的字符級(jí)RNN。你離建立終端只差一個(gè)pip install tensorflow命令了對(duì)嗎?大錯(cuò)特錯(cuò)。

深度學(xué)習(xí)的一個(gè)非常重要的步驟是找到正確的超參數(shù),超參數(shù)是模型無(wú)法學(xué)習(xí)的。
在本文中,我將向你介紹一些最常見(jiàn)的(也是重要的)超參數(shù),這些參數(shù)是你抵達(dá)Kaggle排行榜#1的必經(jīng)之路。此外,我還將向你展示一些強(qiáng)大的算法,可以幫助你明智地選擇超參數(shù)。
超參數(shù)就像是模型的調(diào)節(jié)旋鈕。
如果您將AV接收機(jī)設(shè)置為立體聲,那么配備低音揚(yáng)聲器的7.1級(jí)杜比全景聲(Dolby Atmos)家庭影院系統(tǒng)將對(duì)你毫無(wú)用處,盡管它的超低音揚(yáng)聲器可以產(chǎn)生低于人耳可聽(tīng)范圍的聲音。

同樣,如果你將超參數(shù)關(guān)閉,帶有萬(wàn)億參數(shù)的inception_v3網(wǎng)絡(luò)甚至不會(huì)讓你在MNIST數(shù)據(jù)集上測(cè)試通過(guò)。
所以現(xiàn)在,讓我們?nèi)缓笤趯W(xué)會(huì)如何調(diào)“旋鈕”之前先看看這些“旋鈕”。
學(xué)習(xí)率可以說(shuō)是最重要的超參數(shù),粗略地說(shuō),它可以控制神經(jīng)網(wǎng)絡(luò)“學(xué)習(xí)”的速度。
那么,為什么我們不把學(xué)習(xí)率設(shè)置得非常大,體驗(yàn)飆車(chē)的樂(lè)趣呢?

事情不是那么簡(jiǎn)單。請(qǐng)記住,在深度學(xué)習(xí)中,我們的目標(biāo)是盡量最小化損失函數(shù)。如果學(xué)習(xí)率太高,我們的損失函數(shù)將開(kāi)始在某點(diǎn)來(lái)回震蕩,不會(huì)收斂。

如果學(xué)習(xí)率太小,模型將花費(fèi)太長(zhǎng)時(shí)間來(lái)收斂,如上所述。
由于本文側(cè)重于超參數(shù)優(yōu)化,我不打算解釋動(dòng)量的概念。但簡(jiǎn)而言之,動(dòng)量常數(shù)可以被認(rèn)為是在損失函數(shù)表面滾動(dòng)的球的質(zhì)量。
球越重,下落越快。但如果它太重,它可能會(huì)卡住或超過(guò)目標(biāo)。
如果你了解這個(gè)概念,我會(huì)直接帶你去看Amar Budhiraja關(guān)于丟棄(dropout)的文章。

但我們做一個(gè)快速?gòu)?fù)習(xí),dropout是Geoff Hinton提出的一種正則化技術(shù),它將神經(jīng)網(wǎng)絡(luò)中的激活函數(shù)隨機(jī)地設(shè)置為0,概率為p。這有助于防止神經(jīng)網(wǎng)絡(luò)過(guò)擬合數(shù)據(jù)而不是學(xué)習(xí)它。
p是一個(gè)超參數(shù)。
另一個(gè)(最近的)想法是使神經(jīng)網(wǎng)絡(luò)的架構(gòu)本身成為一個(gè)超參數(shù)。
雖然我們通常不會(huì)讓機(jī)器弄清楚我們模型的架構(gòu)(否則AI研究人員會(huì)丟失他們的工作),但是神經(jīng)架構(gòu)搜索(Neural Architecture Search)等一些新技術(shù)已經(jīng)實(shí)現(xiàn)了這個(gè)想法并取得了不同程度的成功。
如果你聽(tīng)說(shuō)過(guò)AutoML,那么Google基本上就是這樣做的:將所有內(nèi)容都設(shè)置為超參數(shù),然后扔大量TPU在這個(gè)問(wèn)題上讓它自行解決。
但是對(duì)于我們絕大多數(shù)只想在黑色星期五銷(xiāo)售之后用經(jīng)濟(jì)型機(jī)器分類(lèi)貓狗的人來(lái)說(shuō),現(xiàn)在是時(shí)候該弄清楚如何使這些深度學(xué)習(xí)模型真正起作用了。
網(wǎng)格搜索
這是獲得良好超參數(shù)的最簡(jiǎn)單方法。它實(shí)際上就是暴力解決。
算法:從一組給定的超參數(shù)中嘗試一堆超參數(shù),看看哪種方法效果最好。
優(yōu)點(diǎn):五年級(jí)學(xué)生都很容易實(shí)現(xiàn),而且可以輕松并行化。
缺點(diǎn):正如你可能猜到的那樣,它的計(jì)算成本非常高(因?yàn)樗斜┝λ惴ǘ际侨绱耍?/span>
我是否應(yīng)該使用它:可能不會(huì)。網(wǎng)格搜索非常低效。即使你想保持簡(jiǎn)單,你也最好使用隨機(jī)搜索。
正如它的本意,隨機(jī)搜索。完全隨機(jī)化。
算法:在一些超參數(shù)空間上從均勻分布中嘗試一堆隨機(jī)超參數(shù),看看哪種方法效果最好。
優(yōu)點(diǎn):可以輕松并行化。就像網(wǎng)格搜索一樣簡(jiǎn)單,但性能稍好一點(diǎn),如下圖所示:

缺點(diǎn):雖然它提供了比網(wǎng)格搜索更好的性能,但它仍然只是計(jì)算密集型。
我是否應(yīng)該使用它:如果瑣碎的并行化和簡(jiǎn)單性是最重要的,那就去吧。但是,如果你愿意花費(fèi)時(shí)間和精力,那么通過(guò)使用貝葉斯優(yōu)化,你的模型效果將大大提升。
與我們迄今為止看到的其他方法不同,貝葉斯優(yōu)化使用了算法的先前迭代的知識(shí)。使用網(wǎng)格搜索和隨機(jī)搜索,每個(gè)超參數(shù)猜測(cè)都是獨(dú)立的。但是,使用貝葉斯方法,每次我們選擇并嘗試不同的超參數(shù)時(shí),表現(xiàn)都在一點(diǎn)點(diǎn)提升。

(如果我告訴了你,深度學(xué)習(xí)不過(guò)是貝葉斯而已)
貝葉斯超參數(shù)調(diào)整背后的想法歷史悠久且細(xì)節(jié)豐富。所以為了避免太多坑,我會(huì)在這里給你一個(gè)要點(diǎn)。但如果你感興趣,一定要仔細(xì)閱讀高斯過(guò)程和貝葉斯優(yōu)化。
請(qǐng)記住,我們使用這些超參數(shù)調(diào)整算法的原因是,單獨(dú)實(shí)際評(píng)估多個(gè)超參數(shù)選擇是不可行的。例如,假設(shè)我們想要手動(dòng)找到一個(gè)好的學(xué)習(xí)率。這將涉及設(shè)置學(xué)習(xí)率,訓(xùn)練模型,評(píng)估它,選擇不同的學(xué)習(xí)率,再次訓(xùn)練你從頭開(kāi)始模型,重新評(píng)估它,并繼續(xù)循環(huán)。
問(wèn)題是,“訓(xùn)練你的模型”可能需要幾天時(shí)間(取決于問(wèn)題的復(fù)雜性)才能完成。因此,在會(huì)議提交截止日期之前,您只能?chē)L試一些學(xué)習(xí)率。而你知道什么,你甚至沒(méi)有開(kāi)始設(shè)置動(dòng)量。糟糕極了。

算法:貝葉斯方法試圖建立一個(gè)函數(shù)(更準(zhǔn)確地說(shuō),是關(guān)于可能函數(shù)的概率分布),用于估計(jì)模型對(duì)于某個(gè)超參數(shù)選擇的好壞程度。通過(guò)使用這種近似函數(shù)(在文獻(xiàn)中稱(chēng)為代理函數(shù)),您不必在設(shè)置、訓(xùn)練、評(píng)估的循環(huán)上花費(fèi)太多時(shí)間,因?yàn)槟憧梢詢(xún)?yōu)化代理函數(shù)的超參數(shù)。
例如,假設(shè)我們想要最小化此函數(shù)(將其視為模型損失函數(shù)的代理):

代理函數(shù)來(lái)自于高斯過(guò)程(注意:還有其他方法來(lái)模擬代理函數(shù),但我將使用高斯過(guò)程)。就像我提到的那樣,我不會(huì)做任何數(shù)學(xué)上的重要推導(dǎo),但是所有關(guān)于貝葉斯和高斯的討論歸結(jié)為:

公式看上去很復(fù)雜。但是,讓我們?cè)囍斫馑?/span>
左側(cè)告訴你涉及概率分布(假設(shè)存在P)。在括號(hào)內(nèi)看,我們可以看到它是P的概率分布,這是一個(gè)任意的函數(shù)。為什么?請(qǐng)記住,我們正在定義所有可能函數(shù)的概率分布,而不僅僅是特定函數(shù)。本質(zhì)上,左側(cè)表示將超參數(shù)映射到模型的度量的真實(shí)函數(shù)(如驗(yàn)證準(zhǔn)確性,對(duì)數(shù)似然,測(cè)試錯(cuò)誤率等)的概率為Fn(X),給定一些樣本數(shù)據(jù)Xn等于右側(cè)的式子。
現(xiàn)在我們有了優(yōu)化函數(shù),就開(kāi)始進(jìn)行優(yōu)化吧。
以下是在開(kāi)始優(yōu)化過(guò)程之前高斯過(guò)程的樣子?

在利用兩個(gè)數(shù)據(jù)點(diǎn)迭代之前的高斯過(guò)程。
使用你最喜歡的優(yōu)化器(大佬們一般喜歡最大化預(yù)期改善),但其實(shí)只需跟著信號(hào)(或梯度)引導(dǎo),你還沒(méi)有反應(yīng)過(guò)來(lái)的時(shí)候就已經(jīng)得到局部最小值。
經(jīng)過(guò)幾次迭代后,高斯過(guò)程在近似目標(biāo)函數(shù)方面變得更好:

在利用兩個(gè)數(shù)據(jù)點(diǎn)迭代三次之后的高斯過(guò)程。
無(wú)論你使用哪種方法,你現(xiàn)在都找到了代理函數(shù)最小化時(shí)的參數(shù)。那些最小化代理函數(shù)的參數(shù)居然是最優(yōu)超參數(shù)(的估計(jì))哦!好極了。
最終結(jié)果應(yīng)如下所示:

在利用兩個(gè)數(shù)據(jù)點(diǎn)迭代七次之后的高斯過(guò)程。
使用這些“最佳”超參數(shù)你的神經(jīng)網(wǎng)絡(luò)上進(jìn)行訓(xùn)練,你應(yīng)該會(huì)看到一些改進(jìn)。但是,你也可以使用這些新信息重新一次又一次地重做整個(gè)貝葉斯優(yōu)化過(guò)程。你可以想跑多少次這一貝葉斯循環(huán)就跑多少次,但還是要謹(jǐn)慎行事。你實(shí)際上在“跑錢(qián)”。你不要忘了AWS又不是免費(fèi)的。
優(yōu)點(diǎn):貝葉斯優(yōu)化比網(wǎng)格搜索和隨機(jī)搜索提供更好的結(jié)果。
缺點(diǎn):并行化并不容易。
我應(yīng)該使用它嗎:在大多數(shù)情況下,是的!唯一的例外是如果:
你是一個(gè)深度學(xué)習(xí)專(zhuān)家,你不需要一個(gè)微不足道的近似算法幫忙。
你擁有龐大的計(jì)算資源,并可以大規(guī)模并行化網(wǎng)格搜索和隨機(jī)搜索。
如果你是一個(gè)頻率論者/反貝葉斯統(tǒng)計(jì)書(shū)呆子。
我們到目前為止看到的所有方法有一個(gè)隱含主題:自動(dòng)化機(jī)器學(xué)習(xí)工程師的活兒。這確實(shí)很有用很厲害——直到你的老板聽(tīng)說(shuō)了之后決定用4個(gè)RTX Titan卡取代你。呵呵。你本應(yīng)該堅(jiān)持用手動(dòng)搜索的。

不過(guò)不要擔(dān)心啊,還是有些關(guān)于讓研究者少干點(diǎn)活但是多拿點(diǎn)錢(qián)的活躍研究呢。其中一個(gè)效果非常好的想法是學(xué)習(xí)率范圍測(cè)試,據(jù)我所知,這首先出現(xiàn)在Leslie Smith的論文中。
這篇論文實(shí)際上是關(guān)于一種隨時(shí)間調(diào)度(改變)學(xué)習(xí)率的方法。LR(Learning Rate,學(xué)習(xí)率)范圍測(cè)試只是個(gè)作者一不小心遺落在一旁的大寶貝。
當(dāng)你使用那種學(xué)習(xí)速率可以從最小值取到最大值的學(xué)習(xí)速率計(jì)劃時(shí)(例如循環(huán)學(xué)習(xí)速率或具有熱重啟動(dòng)的隨機(jī)梯度下降),作者建議在每次迭代之后將學(xué)習(xí)速率從小數(shù)值線性增加到大數(shù)值(例如,1e-7到1e-1),評(píng)估每次迭代時(shí)的損失,并在對(duì)數(shù)刻度上繪制損失(或測(cè)試誤差,或準(zhǔn)確度)與學(xué)習(xí)率的關(guān)系。你的圖像看起來(lái)應(yīng)該是這樣的:

如圖所示,你可以設(shè)置學(xué)習(xí)率在最小和最大學(xué)習(xí)率之間變化,這可以通過(guò)在圖像上肉眼觀察最陡梯度區(qū)域來(lái)找到。
Colab Notebook上畫(huà)的LR范圍測(cè)試圖(CIFAR10上訓(xùn)練的DenseNet):
Colab Notebook
https://colab.research.google.com/gist/iyaja/988df5818fd887cc7542074ea2bfb74e/fastai-imagefolder-playground.ipynb

在CIFAR10數(shù)據(jù)集上訓(xùn)練的DenseNet 201的學(xué)習(xí)率范圍測(cè)試
根據(jù)經(jīng)驗(yàn),如果你沒(méi)有做任何花哨的學(xué)習(xí)率安排的話,那么只需將你的恒定學(xué)習(xí)率設(shè)置為低于繪圖上最小值的數(shù)量級(jí)即可。在這種情況下大約就是1e-2。
這種方法最酷地方在于,它很好用很省時(shí)省心省計(jì)算力,它幾乎不需要任何額外的計(jì)算。
其他算法——即網(wǎng)格搜索、隨機(jī)搜索和貝葉斯優(yōu)化——要求你運(yùn)行與訓(xùn)練良好神經(jīng)網(wǎng)絡(luò)目標(biāo)相關(guān)的整個(gè)項(xiàng)目。LR范圍測(cè)試只是執(zhí)行簡(jiǎn)單定期的訓(xùn)練循環(huán),并保持跟蹤一些變量。
以下是使用最佳學(xué)習(xí)速率時(shí)大致可以獲得的收斂速度(來(lái)自Notebook的示例):
Notebook
https://colab.research.google.com/gist/iyaja/ef385db236775f881af0056d1ae8c477/kernel303b922372-2.ipynb

最佳學(xué)習(xí)率擬合的模型的損失與batch大小圖
LR范圍測(cè)試已經(jīng)由fast.ai團(tuán)隊(duì)實(shí)施過(guò)了。你一定要看看他們實(shí)現(xiàn)LR范圍測(cè)試的庫(kù)(他們稱(chēng)之為學(xué)習(xí)速率查找器)以及許多其他算法。
如果你有興趣,這兒還有一個(gè)純pytorch編寫(xiě)的notebook實(shí)現(xiàn)了上述功能。這可能會(huì)幫助你更好地了解幕后訓(xùn)練流程:
https://colab.research.google.com/gist/iyaja/f9fc63ef65b6cc74409dc635c2d80861/hyperparameter-optimization-pytorch.ipynb

當(dāng)然,所有這些算法——盡管它們都很好——并不總是在實(shí)踐中起作用。在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)還有許多其他因素需要考慮,例如你將如何預(yù)處理數(shù)據(jù),定義模型,你還需要真的搞定足夠跑這一整個(gè)流程的計(jì)算力。
Nanonets提供易于使用的API來(lái)訓(xùn)練和部署自定義深度學(xué)習(xí)模型。它能負(fù)責(zé)所有的繁重工作,包括數(shù)據(jù)擴(kuò)充,轉(zhuǎn)移學(xué)習(xí),以及超參數(shù)優(yōu)化!
Nanonets在其龐大的GPU集群上使用貝葉斯搜索來(lái)找到正確的超參數(shù)集,你壓根不用擔(dān)心得在最新的顯卡上再大花一筆錢(qián)啦。
一旦找到最佳模型,Nanonets就會(huì)把它放在云端,以便你使用其Web界面測(cè)試模型,或使用兩行代碼將其集成到你的程序中。
跟不完美模型說(shuō)拜拜吧。
在本文中,我們討論了超參數(shù)和一些優(yōu)化它們的方法。但這一切意味著什么?
隨著人們?cè)絹?lái)越努力地使AI技術(shù)民主化,自動(dòng)超參數(shù)調(diào)整可能是朝著正確方向邁出的一步。它允許像你我這樣的普通人在沒(méi)有數(shù)學(xué)博士學(xué)位的情況下構(gòu)建厲害的深度學(xué)習(xí)應(yīng)用程序。
雖然你可能會(huì)認(rèn)為,讓模型重度依賴(lài)于計(jì)算立會(huì)導(dǎo)致只有那些能夠承受如此計(jì)算力的人群獲得最好的模型,但像AWS和Nanonets這樣的云服務(wù)有助于實(shí)現(xiàn)我們普通民眾對(duì)強(qiáng)大機(jī)器計(jì)算力的訪問(wèn)、使深度學(xué)習(xí)更容易普及。
但更重要的是,我們真正在這里做什么——用數(shù)學(xué)來(lái)解決更多的數(shù)學(xué)。這很有意思,不僅因?yàn)槁?tīng)起來(lái)很酷炫啦,還因?yàn)樗娴暮苋菀妆诲e(cuò)誤解釋。

從打孔卡和excel表時(shí)代,到我們”優(yōu)化優(yōu)化函數(shù)的函數(shù)以?xún)?yōu)化函數(shù)“的時(shí)代,我們已經(jīng)走過(guò)了漫長(zhǎng)的道路。但是,我們依然無(wú)法建造能夠自己“思考”的機(jī)器。
這一點(diǎn)都不令人沮喪,因?yàn)槿绻祟?lèi)用這么少的東西就能夠做到這個(gè)高度的話,當(dāng)我們的愿景變成我們實(shí)際可以看到的東西時(shí),想象一下未來(lái)會(huì)怎樣吧!
我們坐在一張襯墊網(wǎng)椅上,盯著一個(gè)空白的終端屏幕——每個(gè)按鍵都能給我們一個(gè)可以擦干凈磁盤(pán)的sudo指令。
我們會(huì)整天坐在那里一動(dòng)不動(dòng)——因?yàn)橄乱粋€(gè)重大突破和我們可能只差一條pip install哦。
相關(guān)報(bào)道:
https://blog.nanonets.com/hyperparameter-optimization/
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱(chēng)+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

