cs231n課程筆記:神經(jīng)網(wǎng)絡(luò)(三)

筆記參考:https://zhuanlan.zhihu.com/p/21407711?refer=intelligentunit
感謝原作者的翻譯!豁辉!
非原創(chuàng),禁止轉(zhuǎn)載本文


內(nèi)容列表:

  • 1 梯度檢查
  • 2 合理性(Sanity)檢查
  • 3 檢查學(xué)習(xí)過程
    • 3.1 損失函數(shù)
    • 3.2 訓(xùn)練集與驗(yàn)證集準(zhǔn)確率
    • 3.3 權(quán)重:更新比例
    • 3.4 每層的激活數(shù)據(jù)與梯度分布
    • 3.5 可視化
  • 4 參數(shù)更新
    • 4.1 一階(隨機(jī)梯度下降)方法舀患,動(dòng)量方法徽级,Nesterov動(dòng)量方法
    • 4.2 學(xué)習(xí)率退火
    • 4.3 二階方法
    • 4.4 逐參數(shù)適應(yīng)學(xué)習(xí)率方法(Adagrad,RMSProp)
  • 5 超參數(shù)調(diào)優(yōu)
  • 6 評(píng)價(jià)
    • 模型集成
  • 7 總結(jié)
  • 拓展引用

1. 梯度檢查

理論上將進(jìn)行梯度檢查很簡單聊浅,就是簡單地把解析梯度和數(shù)值計(jì)算梯度進(jìn)行比較餐抢。然而從實(shí)際操作層面上來說现使,這個(gè)過程更加復(fù)雜且容易出錯(cuò)。下面是一些提示旷痕、技巧和需要仔細(xì)注意的事情:

(1)使用中心化公式碳锈。
在使用有限差值近似來計(jì)算數(shù)值梯度的時(shí)候,常見的公式是:

其中 h 是一個(gè)很小的數(shù)字欺抗,在實(shí)踐中近似為1e-5售碳。在實(shí)踐中證明,使用中心化公式效果更好:

該公式在檢查梯度的每個(gè)維度的時(shí)候绞呈,會(huì)要求計(jì)算兩次損失函數(shù)(所以計(jì)算資源的耗費(fèi)也是兩倍)贸人,但是梯度的近似值會(huì)準(zhǔn)確很多。要理解這一點(diǎn)报强,對(duì) f(x + h)f(x - h) 使用泰勒展開灸姊,可以看到第一個(gè)公式的誤差近似 O(h),第二個(gè)公式的誤差近似 O(h2)(是個(gè)二階近似)秉溉。

(2)使用相對(duì)誤差來比較力惯。
比較數(shù)值梯度 f'n 和解析梯度 f'a 的細(xì)節(jié)有哪些?如何得知此兩者不匹配召嘶?你可能會(huì)傾向于監(jiān)測它們的差的絕對(duì)值 |f'n - f'a| 或者差的平方值父晶,然后定義該值如果超過某個(gè)規(guī)定閾值,就判斷梯度實(shí)現(xiàn)失敗弄跌。然而該思路是有問題的甲喝。想想,假設(shè)這個(gè)差值是1e-4铛只,如果兩個(gè)梯度值在1.0左右埠胖,這個(gè)差值看起來就很合適,可以認(rèn)為兩個(gè)梯度是匹配的淳玩。然而如果梯度值是1e-5或者更低直撤,那么1e-4就是非常大的差距,梯度實(shí)現(xiàn)肯定就是失敗的了蜕着。因此谋竖,使用相對(duì)誤差總是更合適一些:

上式考慮了差值占兩個(gè)梯度絕對(duì)值的比例。注意通常相對(duì)誤差公式只包含兩個(gè)式子中的一個(gè)(任意一個(gè)均可)承匣,但是我更傾向取兩個(gè)式子的最大值或者取兩個(gè)式子的和蓖乘。這樣做是為了防止在其中一個(gè)式子為0時(shí),公式分母為0(這種情況韧骗,在ReLU中是經(jīng)常發(fā)生的)嘉抒。然而,還必須注意兩個(gè)式子都為零且通過梯度檢查的情況袍暴。在實(shí)踐中:

  • 相對(duì)誤差 > 1e-2:通常就意味著梯度可能出錯(cuò)众眨。

  • 1e-2 > 相對(duì)誤差 > 1e-4:要對(duì)這個(gè)值感到不舒服才行握牧。

  • 1e-4 > 相對(duì)誤差:這個(gè)值的相對(duì)誤差對(duì)于有不可導(dǎo)點(diǎn)的目標(biāo)函數(shù)是OK的。但如果目標(biāo)函數(shù)中沒有kink(使用tanh和softmax)娩梨,那么相對(duì)誤差值還是太高沿腰。

  • 1e-7或者更小:好結(jié)果狈定,可以高興一把了颂龙。

要知道的是網(wǎng)絡(luò)的深度越深,相對(duì)誤差就越高纽什。所以如果你是在對(duì)一個(gè)10層網(wǎng)絡(luò)的輸入數(shù)據(jù)做梯度檢查措嵌,那么1e-2的相對(duì)誤差值可能就OK了,因?yàn)檎`差一直在累積芦缰。相反企巢,如果一個(gè)可微函數(shù)的相對(duì)誤差值是1e-2,那么通常說明梯度實(shí)現(xiàn)不正確让蕾。

(3)保持在浮點(diǎn)數(shù)的有效范圍浪规。
建議通讀《What Every Computer Scientist Should Konw About Floating-Point Artthmetic》一文,該文將闡明你可能犯的錯(cuò)誤探孝,促使你寫下更加細(xì)心的代碼笋婿。例如,在神經(jīng)網(wǎng)絡(luò)中顿颅,在一個(gè)批量的數(shù)據(jù)上對(duì)損失函數(shù)進(jìn)行歸一化是很常見的缸濒。但是,如果每個(gè)數(shù)據(jù)點(diǎn)的梯度很小粱腻,然后又用數(shù)據(jù)點(diǎn)的數(shù)量去除庇配,就使得數(shù)值更小,這反過來會(huì)導(dǎo)致更多的數(shù)值問題绍些。這就是我為什么總是會(huì)把原始的解析梯度和數(shù)值梯度數(shù)據(jù)打印出來捞慌,確保用來比較的數(shù)字的值不是過小(通常絕對(duì)值小于1e-10就絕對(duì)讓人擔(dān)心)遇革。如果確實(shí)過小卿闹,可以使用一個(gè)常數(shù)暫時(shí)將損失函數(shù)的數(shù)值范圍擴(kuò)展到一個(gè)更“好”的范圍揭糕,在這個(gè)范圍中浮點(diǎn)數(shù)變得更加致密萝快。比較理想的是1.0的數(shù)量級(jí)上,即當(dāng)浮點(diǎn)數(shù)指數(shù)為0時(shí)著角。

(4)目標(biāo)函數(shù)的不可導(dǎo)點(diǎn)(kinks)揪漩。在進(jìn)行梯度檢查時(shí),一個(gè)導(dǎo)致不準(zhǔn)確的原因是不可導(dǎo)點(diǎn)問題吏口。不可導(dǎo)點(diǎn)是指目標(biāo)函數(shù)不可導(dǎo)的部分奄容,由ReLU(max(0, x))等函數(shù)冰更,或SVM損失预鬓,Maxout神經(jīng)元等引入纹因。考慮當(dāng) x = -1e6 的時(shí)候贵扰,對(duì)ReLU函數(shù)進(jìn)行梯度檢查戈盈。因?yàn)?x < 0奠衔,所以解析梯度在該點(diǎn)的梯度為0。然而塘娶,在這里數(shù)值梯度會(huì)突然計(jì)算出一個(gè)非零的梯度值归斤,因?yàn)?f(x + h) 可能越過了不可導(dǎo)點(diǎn)(例如:如果 h > 1e-6 ),導(dǎo)致了一個(gè)非零的結(jié)果刁岸。你可能會(huì)認(rèn)為這是一個(gè)極端的案例脏里,但實(shí)際上這種情況很常見。例如虹曙,一個(gè)用CIFAR-10訓(xùn)練的SVM中迫横,因?yàn)橛?0,000個(gè)樣本,且根據(jù)目標(biāo)函數(shù)每個(gè)樣本產(chǎn)生9個(gè)式子根吁,所以包含有450,000個(gè) max(0, x) 式子员淫。而一個(gè)用SVM進(jìn)行分類的神經(jīng)網(wǎng)絡(luò)因?yàn)椴捎昧薘eLU,還會(huì)有更多的不可導(dǎo)點(diǎn)击敌。

注意介返,在計(jì)算損失的過程中是可以知道不可導(dǎo)點(diǎn)有沒有被越過的。在具有 max(x, y) 形式的函數(shù)中持續(xù)跟蹤所有“贏家”的身份沃斤,就可以實(shí)現(xiàn)這一點(diǎn)圣蝎。其實(shí)就是看在前向傳播時(shí),到底 x 和 y 誰更大衡瓶。如果在計(jì)算 f(x + h) 和 f(x - h) 的時(shí)候徘公,至少有一個(gè)“贏家”的身份變了,那就說明不可導(dǎo)點(diǎn)被越過了哮针,數(shù)值梯度會(huì)不準(zhǔn)確关面。

(5)使用少量數(shù)據(jù)點(diǎn)。解決上面的不可導(dǎo)點(diǎn)問題的一個(gè)辦法是使用更少的數(shù)據(jù)點(diǎn)十厢。因?yàn)楹胁豢蓪?dǎo)點(diǎn)的損失函數(shù)(例如:因?yàn)槭褂昧薘eLU或者邊緣損失等函數(shù))的數(shù)據(jù)點(diǎn)越少等太,不可導(dǎo)點(diǎn)就越少,所以在計(jì)算有限差值近似時(shí)越過不可導(dǎo)點(diǎn)的幾率就越小蛮放。還有缩抡,如果你的梯度檢查對(duì)2-3個(gè)數(shù)據(jù)點(diǎn)都有效,那么基本上對(duì)整個(gè)批量數(shù)據(jù)進(jìn)行梯度檢查也是沒問題的包颁。所以使用很少量的數(shù)據(jù)點(diǎn)瞻想,能讓梯度檢查更迅速高效压真。

(6)謹(jǐn)慎設(shè)置步長h。在實(shí)踐中h并不是越小越好蘑险,因?yàn)楫?dāng) h 特別小的時(shí)候滴肿,就可能就會(huì)遇到數(shù)值精度問題。有時(shí)候如果梯度檢查無法進(jìn)行佃迄,可以試試將 h 調(diào)到1e-4或者1e-6嘴高,然后突然梯度檢查可能就恢復(fù)正常。這篇維基百科文章中有一個(gè)圖表和屎,其x軸為 h 值拴驮,y軸為數(shù)值梯度誤差。

(7)在操作的特性模式中梯度檢查柴信。有一點(diǎn)必須要認(rèn)識(shí)到:梯度檢查是在參數(shù)空間中的一個(gè)特定(往往還是隨機(jī)的)的單獨(dú)點(diǎn)進(jìn)行的套啤。即使是在該點(diǎn)上梯度檢查成功了,也不能馬上確保全局上梯度的實(shí)現(xiàn)都是正確的随常。還有潜沦,一個(gè)隨機(jī)的初始化可能不是參數(shù)空間最優(yōu)代表性的點(diǎn),這可能導(dǎo)致進(jìn)入某種病態(tài)的情況绪氛,即梯度看起來是正確實(shí)現(xiàn)了唆鸡,實(shí)際上并沒有。例如枣察,SVM使用小數(shù)值權(quán)重初始化争占,就會(huì)把一些接近于0的得分分配給所有的數(shù)據(jù)點(diǎn),而梯度將會(huì)在所有的數(shù)據(jù)點(diǎn)上展現(xiàn)出某種模式序目。一個(gè)不正確實(shí)現(xiàn)的梯度也許依然能夠產(chǎn)生出這種模式臂痕,但是不能泛化到更具代表性的操作模式,比如在一些的得分比另一些得分更大的情況下就不行猿涨。因此為了安全起見握童,最好讓網(wǎng)絡(luò)學(xué)習(xí)(“預(yù)熱”)一小段時(shí)間,等到損失函數(shù)開始下降的之后再進(jìn)行梯度檢查叛赚。在第一次迭代就進(jìn)行梯度檢查的危險(xiǎn)就在于澡绩,此時(shí)可能正處在不正常的邊界情況,從而掩蓋了梯度沒有正確實(shí)現(xiàn)的事實(shí)俺附。

(8)不要讓正則化吞沒數(shù)據(jù)肥卡。通常損失函數(shù)是數(shù)據(jù)損失和正則化損失的和(例如L2對(duì)權(quán)重的懲罰)。需要注意的危險(xiǎn)是正則化損失可能吞沒掉數(shù)據(jù)損失昙读,在這種情況下梯度主要來源于正則化部分(正則化部分的梯度表達(dá)式通常簡單很多)召调。這樣就會(huì)掩蓋掉數(shù)據(jù)損失梯度的不正確實(shí)現(xiàn)膨桥。因此蛮浑,推薦先關(guān)掉正則化對(duì)數(shù)據(jù)損失做單獨(dú)檢查唠叛,然后對(duì)正則化做單獨(dú)檢查。對(duì)于正則化的單獨(dú)檢查可以是修改代碼沮稚,去掉其中數(shù)據(jù)損失的部分艺沼,也可以提高正則化強(qiáng)度,確認(rèn)其效果在梯度檢查中是無法忽略的蕴掏,這樣不正確的實(shí)現(xiàn)就會(huì)被觀察到了障般。

(9)記得關(guān)閉隨機(jī)失活(dropout)和數(shù)據(jù)擴(kuò)張(augmentation)。在進(jìn)行梯度檢查時(shí)盛杰,記得關(guān)閉網(wǎng)絡(luò)中任何不確定的效果的操作挽荡,比如隨機(jī)失活,隨機(jī)數(shù)據(jù)擴(kuò)展等即供。不然它們會(huì)在計(jì)算數(shù)值梯度的時(shí)候?qū)е戮薮笳`差定拟。關(guān)閉這些操作不好的一點(diǎn)是無法對(duì)它們進(jìn)行梯度檢查(例如隨機(jī)失活的反向傳播實(shí)現(xiàn)可能有錯(cuò)誤)。因此逗嫡,一個(gè)更好的解決方案就是在計(jì)算 f(x + h) 和 f(x - h) 前強(qiáng)制增加一個(gè)特定的隨機(jī)種子青自,在計(jì)算解析梯度時(shí)也同樣如此。

(10)檢查少量的維度驱证。在實(shí)際中延窜,梯度可以有上百萬的參數(shù),在這種情況下只能檢查其中一些維度然后假設(shè)其他維度是正確的抹锄。注意****:確認(rèn)在所有不同的參數(shù)中都抽取一部分來梯度檢查逆瑞。在某些應(yīng)用中,為了方便伙单,人們將所有的參數(shù)放到一個(gè)巨大的參數(shù)向量中呆万。在這種情況下,例如偏置就可能只占用整個(gè)向量中的很小一部分车份,所以不要隨機(jī)地從向量中取維度谋减,一定要把這種情況考慮到,確保所有參數(shù)都收到了正確的梯度扫沼。

2. 學(xué)習(xí)之前:合理性檢查的提示與技巧

在進(jìn)行費(fèi)時(shí)費(fèi)力的最優(yōu)化之前出爹,最好進(jìn)行一些合理性檢查:

  • 尋找特定情況的正確損失值。在使用小參數(shù)進(jìn)行初始化時(shí)缎除,確保得到的損失值與期望一致严就。最好先單獨(dú)檢查數(shù)據(jù)損失(讓正則化強(qiáng)度為0)。例如器罐,對(duì)于一個(gè)跑CIFAR-10的Softmax分類器梢为,一般期望它的初始損失值是2.302,這是因?yàn)槌跏紩r(shí)預(yù)計(jì)每個(gè)類別的概率是0.1(因?yàn)橛?0個(gè)類別),然后Softmax損失值正確分類的負(fù)對(duì)數(shù)概率:-ln(0.1)=2.302铸董。對(duì)于Weston Watkins SVM祟印,假設(shè)所有的邊界都被越過(因?yàn)樗械姆种刀冀茷榱悖該p失值是9(因?yàn)閷?duì)于每個(gè)錯(cuò)誤分類粟害,邊界值是1)蕴忆。如果沒看到這些損失值,那么初始化中就可能有問題悲幅。

  • 第二個(gè)合理性檢查:提高正則化強(qiáng)度時(shí)導(dǎo)致?lián)p失值變大套鹅。

  • 對(duì)小數(shù)據(jù)子集過擬合。最后也是最重要的一步汰具,在整個(gè)數(shù)據(jù)集進(jìn)行訓(xùn)練之前卓鹿,嘗試在一個(gè)很小的數(shù)據(jù)集上進(jìn)行訓(xùn)練(比如20個(gè)數(shù)據(jù)),然后確保能到達(dá)0的損失值留荔。進(jìn)行這個(gè)實(shí)驗(yàn)的時(shí)候减牺,最好讓正則化強(qiáng)度為0,不然它會(huì)阻止得到0的損失存谎。除非能通過這一個(gè)正常性檢查拔疚,不然進(jìn)行整個(gè)數(shù)據(jù)集訓(xùn)練是沒有意義的。但是注意既荚,能對(duì)小數(shù)據(jù)集進(jìn)行過擬合并不代表萬事大吉稚失,依然有可能存在不正確的實(shí)現(xiàn)。比如恰聘,因?yàn)槟承╁e(cuò)誤句各,數(shù)據(jù)點(diǎn)的特征是隨機(jī)的,這樣算法也可能對(duì)小數(shù)據(jù)進(jìn)行過擬合晴叨,但是在整個(gè)數(shù)據(jù)集上跑算法的時(shí)候凿宾,就沒有任何泛化能力。

3. 檢查整個(gè)學(xué)習(xí)過程

在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時(shí)候兼蕊,應(yīng)該跟蹤多個(gè)重要數(shù)值初厚。這些數(shù)值輸出的圖表是觀察訓(xùn)練進(jìn)程的一扇窗口,是直觀理解不同的超參數(shù)設(shè)置效果的工具孙技,從而知道如何修改超參數(shù)以獲得更高效的學(xué)習(xí)過程产禾。

在下面的圖表中,x軸通常都是表示周期(epochs)單位牵啦,該單位衡量了在訓(xùn)練中每個(gè)樣本數(shù)據(jù)都被觀察過次數(shù)的期望(一個(gè)周期意味著每個(gè)樣本數(shù)據(jù)都被觀察過了一次)亚情。相較于迭代次數(shù)(iterations),一般更傾向跟蹤周期哈雏,這是因?yàn)榈螖?shù)與數(shù)據(jù)的批尺寸(batchsize)有關(guān)楞件,而批尺寸的設(shè)置又可以是任意的衫生。

3.1 損失函數(shù)

訓(xùn)練期間第一個(gè)要跟蹤的數(shù)值就是損失值,它在前向傳播時(shí)對(duì)每個(gè)獨(dú)立的批數(shù)據(jù)進(jìn)行計(jì)算土浸。下圖展示的是隨著損失值隨時(shí)間的變化罪针,尤其是曲線形狀會(huì)給出關(guān)于學(xué)習(xí)率設(shè)置的情況:

左圖展示了不同的學(xué)習(xí)率的效果。過低的學(xué)習(xí)率導(dǎo)致算法的改善是線性的栅迄。高一些的學(xué)習(xí)率會(huì)看起來呈幾何指數(shù)下降,更高的學(xué)習(xí)率會(huì)讓損失值很快下降皆怕,但是接著就停在一個(gè)不好的損失值上(綠線)毅舆。這是因?yàn)樽顑?yōu)化的“能量”太大,參數(shù)在混沌中隨機(jī)震蕩愈腾,不能最優(yōu)化到一個(gè)很好的點(diǎn)上憋活。
右圖顯示了一個(gè)典型的隨時(shí)間變化的損失函數(shù)值,在CIFAR-10數(shù)據(jù)集上面訓(xùn)練了一個(gè)小的網(wǎng)絡(luò)虱黄,這個(gè)損失函數(shù)值曲線看起來比較合理(雖然可能學(xué)習(xí)率有點(diǎn)小悦即,但是很難說),而且指出了批數(shù)據(jù)的數(shù)量可能有點(diǎn)太谐髀摇(因?yàn)閾p失值的噪音很大)辜梳。

損失值的震蕩程度和批尺寸(batch size)有關(guān),當(dāng)批尺寸為1泳叠,震蕩會(huì)相對(duì)較大作瞄。當(dāng)批尺寸就是整個(gè)數(shù)據(jù)集時(shí)震蕩就會(huì)最小,因?yàn)槊總€(gè)梯度更新都是單調(diào)地優(yōu)化損失函數(shù)(除非學(xué)習(xí)率設(shè)置得過高)危纫。

有的研究者喜歡用對(duì)數(shù)域?qū)p失函數(shù)值作圖宗挥。因?yàn)閷W(xué)習(xí)過程一般都是采用指數(shù)型的形狀,圖表就會(huì)看起來更像是能夠直觀理解的直線种蝶,而不是呈曲棍球一樣的曲線狀契耿。還有,如果多個(gè)交叉驗(yàn)證模型在一個(gè)圖上同時(shí)輸出圖像螃征,它們之間的差異就會(huì)比較明顯搪桂。

有時(shí)候損失函數(shù)看起來很有意思:lossfunctions.tumblr.com

3.2 訓(xùn)練集和驗(yàn)證集準(zhǔn)確率

在訓(xùn)練分類器的時(shí)候盯滚,需要跟蹤的第二重要的數(shù)值是驗(yàn)證集和訓(xùn)練集的準(zhǔn)確率锅棕。這個(gè)圖表能夠展現(xiàn)知道模型過擬合的程度:

在訓(xùn)練集準(zhǔn)確率和驗(yàn)證集準(zhǔn)確率中間的空隙指明了模型過擬合的程度。在圖中淌山,藍(lán)色的驗(yàn)證集曲線顯示相較于訓(xùn)練集裸燎,驗(yàn)證集的準(zhǔn)確率低了很多,這就說明模型有很強(qiáng)的過擬合泼疑。遇到這種情況德绿,就應(yīng)該增大正則化強(qiáng)度(更強(qiáng)的L2權(quán)重懲罰,更多的隨機(jī)失活等)或收集更多的數(shù)據(jù)。另一種可能就是驗(yàn)證集曲線和訓(xùn)練集曲線如影隨形移稳,這種情況說明你的模型容量還不夠大:應(yīng)該通過增加參數(shù)數(shù)量讓模型容量更大些蕴纳。

3.3 權(quán)重更新比例

最后一個(gè)應(yīng)該跟蹤的量是權(quán)重中更新值的數(shù)量和全部值的數(shù)量之間的比例。注意:是更新的个粱,而不是原始梯度(比如古毛,在普通sgd中就是梯度乘以學(xué)習(xí)率)。需要對(duì)每個(gè)參數(shù)集的更新比例進(jìn)行單獨(dú)的計(jì)算和跟蹤都许。一個(gè)經(jīng)驗(yàn)性的結(jié)論是這個(gè)比例應(yīng)該在1e-3左右稻薇。如果更低,說明學(xué)習(xí)率可能太小胶征,如果更高塞椎,說明學(xué)習(xí)率可能太高。下面是具體例子:

# 假設(shè)參數(shù)向量為W睛低,其梯度向量為dW
param_scale = np.linalg.norm(W.ravel())
update = -learning_rate*dW # 簡單SGD更新
update_scale = np.linalg.norm(update.ravel())
W += update # 實(shí)際更新
print update_scale / param_scale # 要得到1e-3左右

相較于跟蹤最大和最小值案狠,有研究者更喜歡計(jì)算和跟蹤梯度的范式及其更新。這些矩陣通常是相關(guān)的钱雷,也能得到近似的結(jié)果骂铁。

3.4 每層的激活數(shù)據(jù)及梯度分布

一個(gè)不正確的初始化可能讓學(xué)習(xí)過程變慢,甚至徹底停止罩抗。還好从铲,這個(gè)問題可以比較簡單地診斷出來。其中一個(gè)方法是輸出網(wǎng)絡(luò)中所有層的激活數(shù)據(jù)和梯度分布的柱狀圖澄暮。直觀地說名段,就是如果看到任何奇怪的分布情況,那都不是好兆頭泣懊。比如伸辟,對(duì)于使用tanh的神經(jīng)元,我們應(yīng)該看到激活數(shù)據(jù)的值在整個(gè)[-1,1]區(qū)間中都有分布馍刮。如果看到神經(jīng)元的輸出全部是0信夫,或者全都飽和了往-1和1上跑,那肯定就是有問題了卡啰。

3.5 可視化

最后静稻,如果數(shù)據(jù)是圖像像素?cái)?shù)據(jù),那么把第一層特征可視化會(huì)有幫助:

將神經(jīng)網(wǎng)絡(luò)第一層的權(quán)重可視化的例子匈辱。左圖中的特征充滿了噪音振湾,這暗示了網(wǎng)絡(luò)可能出現(xiàn)了問題:網(wǎng)絡(luò)沒有收斂,學(xué)習(xí)率設(shè)置不恰當(dāng)亡脸,正則化懲罰的權(quán)重過低押搪。右圖的特征不錯(cuò)树酪,平滑,干凈而且種類繁多大州,說明訓(xùn)練過程進(jìn)行良好续语。

4. 參數(shù)更新

一旦能使用反向傳播計(jì)算解析梯度,梯度就能被用來進(jìn)行參數(shù)更新了厦画。進(jìn)行參數(shù)更新有好幾種方法疮茄,接下來都會(huì)進(jìn)行討論。

深度網(wǎng)絡(luò)的最優(yōu)化是現(xiàn)在非掣睿活躍的研究領(lǐng)域力试。本節(jié)將重點(diǎn)介紹一些公認(rèn)有效的常用的技巧,這些技巧都是在實(shí)踐中會(huì)遇到的购裙。我們將簡要介紹這些技巧的直觀概念懂版,但不進(jìn)行細(xì)節(jié)分析鹃栽。對(duì)于細(xì)節(jié)感興趣的讀者躏率,我們提供了一些拓展閱讀。

4.1 隨機(jī)梯度下降及各種更新方法

普通更新民鼓。最簡單的更新形式是沿著負(fù)梯度方向改變參數(shù)(因?yàn)樘荻戎赶虻氖巧仙较蜣敝ィ俏覀兺ǔOM钚』瘬p失函數(shù))。假設(shè)有一個(gè)參數(shù)向量x及其梯度dx丰嘉,那么最簡單的更新的形式是:

# 普通更新
x += - learning_rate * dx

其中l(wèi)earning_rate是一個(gè)超參數(shù)夯到,它是一個(gè)固定的常量。當(dāng)在整個(gè)數(shù)據(jù)集上進(jìn)行計(jì)算時(shí)饮亏,只要學(xué)習(xí)率足夠低耍贾,總是能在損失函數(shù)上得到非負(fù)的進(jìn)展。

動(dòng)量(Momentum)更新是另一個(gè)方法路幸,這個(gè)方法在深度網(wǎng)絡(luò)上幾乎總能得到更好的收斂速度荐开。該方法可以看成是從物理角度上對(duì)于最優(yōu)化問題得到的啟發(fā)。損失值可以理解為是山的高度(因此高度勢能是 U = mgh简肴,所以有 U ∝ h )晃听。用隨機(jī)數(shù)字初始化參數(shù)等同于在某個(gè)位置給質(zhì)點(diǎn)設(shè)定初始速度為0。這樣最優(yōu)化過程可以看做是模擬參數(shù)向量(即質(zhì)點(diǎn))在地形上滾動(dòng)的過程砰识。

因?yàn)樽饔糜谫|(zhì)點(diǎn)的力與梯度的潛在能量( F = - ▽U )有關(guān)能扒,質(zhì)點(diǎn)所受的力就是損失函數(shù)的(負(fù))梯度。還有辫狼,因?yàn)?F = ma初斑,所以在這個(gè)觀點(diǎn)下(負(fù))梯度與質(zhì)點(diǎn)的加速度是成比例的。注意這個(gè)理解和上面的隨機(jī)梯度下降(SGD)是不同的膨处,在普通版本中越平,梯度直接影響位置频蛔。而在這個(gè)版本的更新中,物理觀點(diǎn)建議梯度只是影響速度秦叛,然后速度再影響位置:

# 動(dòng)量更新
v = mu * v - learning_rate * dx # 與速度融合
x += v # 與位置融合

在這里引入了一個(gè)初始化為0的變量v和一個(gè)超參數(shù)mu晦溪。說得不恰當(dāng)一點(diǎn),這個(gè)變量(mu)在最優(yōu)化的過程中被看做動(dòng)量(一般值設(shè)為0.9)挣跋,但其物理意義與摩擦系數(shù)更一致三圆。這個(gè)變量有效地抑制了速度,降低了系統(tǒng)的動(dòng)能避咆,不然質(zhì)點(diǎn)在山底永遠(yuǎn)不會(huì)停下來舟肉。通過交叉驗(yàn)證,這個(gè)參數(shù)通常設(shè)為[0.5,0.9,0.95,0.99]中的一個(gè)查库。和學(xué)習(xí)率隨著時(shí)間退火(下文有討論)類似路媚,動(dòng)量隨時(shí)間變化的設(shè)置有時(shí)能略微改善最優(yōu)化的效果,其中動(dòng)量在學(xué)習(xí)過程的后階段會(huì)上升樊销。一個(gè)典型的設(shè)置是剛開始將動(dòng)量設(shè)為0.5而在后面的多個(gè)周期(epoch)中慢慢提升到0.99整慎。

通過動(dòng)量更新,參數(shù)向量會(huì)在任何有持續(xù)梯度的方向上增加速度围苫。

Nesterov動(dòng)量與普通動(dòng)量有些許不同裤园,最近變得比較流行。在理論上對(duì)于凸函數(shù)它能得到更好的收斂剂府,在實(shí)踐中也確實(shí)比標(biāo)準(zhǔn)動(dòng)量表現(xiàn)更好一些拧揽。

Nesterov動(dòng)量的核心思路是,當(dāng)參數(shù)向量位于某個(gè)位置 x 時(shí)腺占,觀察上面的動(dòng)量更新公式可以發(fā)現(xiàn)淤袜,動(dòng)量部分(忽視帶梯度的第二個(gè)部分)會(huì)通過 mu * v 稍微改變參數(shù)向量。因此衰伯,如果要計(jì)算梯度铡羡,那么可以將未來的近似位置 x + mu * v 看做是“向前看”,這個(gè)點(diǎn)在我們一會(huì)兒要停止的位置附近嚎研。因此蓖墅,計(jì)算 x + mu * v 的梯度而不是“舊”位置x的梯度就有意義了。

也就是說临扮,添加一些注釋后论矾,實(shí)現(xiàn)代碼如下:

x_ahead = x + mu * v
# 計(jì)算dx_ahead(在x_ahead處的梯度,而不是在x處的梯度)
v = mu * v - learning_rate * dx_ahead
x += v

然而在實(shí)踐中杆勇,人們更喜歡和普通SGD或上面的動(dòng)量方法一樣簡單的表達(dá)式贪壳。通過對(duì)x_ahead = x + mu * v使用變量變換進(jìn)行改寫是可以做到的,然后用x_ahead而不是x來表示上面的更新蚜退。也就是說闰靴,實(shí)際存儲(chǔ)的參數(shù)向量總是向前一步的那個(gè)版本彪笼。x_ahead的公式(將其重新命名為x)就變成了:

v_prev = v # 存儲(chǔ)備份
v = mu * v - learning_rate * dx # 速度更新保持不變
x += -mu * v_prev + (1 + mu) * v # 位置更新變了形式  

??怎么推出來上面這步的?

對(duì)于NAG(Nesterov's Accelerated Momentum)的來源和數(shù)學(xué)公式推導(dǎo)蚂且,我們推薦以下的拓展閱讀:

4.2 學(xué)習(xí)率退火

在訓(xùn)練深度網(wǎng)絡(luò)的時(shí)候泵肄,讓學(xué)習(xí)率隨著時(shí)間退火通常是有幫助的∈缫恚可以這樣理解:如果學(xué)習(xí)率很高腐巢,系統(tǒng)的動(dòng)能就過大,參數(shù)向量就會(huì)無規(guī)律地跳動(dòng)玄括,不能夠穩(wěn)定到損失函數(shù)更深更窄的部分去冯丙。知道什么時(shí)候開始衰減學(xué)習(xí)率是有技巧的:慢慢減小它,可能在很長時(shí)間內(nèi)只能是浪費(fèi)計(jì)算資源地看著它混沌地跳動(dòng)遭京,實(shí)際進(jìn)展很少胃惜。但如果快速地減少它,系統(tǒng)可能過快地失去能量洁墙,不能到達(dá)原本可以到達(dá)的最好位置蛹疯。通常戒财,實(shí)現(xiàn)學(xué)習(xí)率退火有3種方式:

  • 隨步數(shù)衰減:每進(jìn)行幾個(gè)周期就根據(jù)一些因素降低學(xué)習(xí)率热监。典型的值是每過5個(gè)周期就將學(xué)習(xí)率減少一半,或者每20個(gè)周期減少到之前的0.1饮寞。這些數(shù)值的設(shè)定是嚴(yán)重依賴具體問題和模型的選擇的孝扛。在實(shí)踐中可能看見這么一種經(jīng)驗(yàn)做法:使用一個(gè)固定的學(xué)習(xí)率來進(jìn)行訓(xùn)練的同時(shí)觀察驗(yàn)證集錯(cuò)誤率,每當(dāng)驗(yàn)證集錯(cuò)誤率停止下降幽崩,就乘以一個(gè)常數(shù)(比如0.5)來降低學(xué)習(xí)率苦始。

  • 指數(shù)衰減。數(shù)學(xué)公式是 α = α0e-kt 慌申,其中 α0 , k 是超參數(shù)陌选, t 是迭代次數(shù)(也可以使用周期作為單位)。

  • 1/t衰減的數(shù)學(xué)公式是 α = α0/(1 + kt)蹄溉,其中 α0 , k 是超參數(shù)咨油,t是迭代次數(shù)。

在實(shí)踐中柒爵,我們發(fā)現(xiàn)隨步數(shù)衰減的隨機(jī)失活(dropout)更受歡迎役电,因?yàn)樗褂玫某瑓?shù)(衰減系數(shù)和以周期為時(shí)間單位的步數(shù))比 k 更有解釋性。最后棉胀,如果你有足夠的計(jì)算資源法瑟,可以讓衰減更加緩慢一些冀膝,讓訓(xùn)練時(shí)間更長些。

4.3 二階方法

在深度網(wǎng)絡(luò)背景下霎挟,第二類常用的最優(yōu)化方法是基于牛頓法的窝剖,其迭代如下:

這里 Hf(x)Hessian矩陣,它是函數(shù)的二階偏導(dǎo)數(shù)的平方矩陣酥夭。 ▽f(x) 是梯度向量枯芬,這和梯度下降中一樣。直觀理解上采郎,Hessian矩陣描述了損失函數(shù)的局部曲率千所,從而使得可以進(jìn)行更高效的參數(shù)更新。具體來說蒜埋,就是乘以Hessian轉(zhuǎn)置矩陣可以讓最優(yōu)化過程在曲率小的時(shí)候大步前進(jìn)淫痰,在曲率大的時(shí)候小步前進(jìn)。需要重點(diǎn)注意的是整份,在這個(gè)公式中是沒有學(xué)習(xí)率這個(gè)超參數(shù)的待错,這相較于一階方法是一個(gè)巨大的優(yōu)勢。

然而上述更新方法很難運(yùn)用到實(shí)際的深度學(xué)習(xí)應(yīng)用中去烈评,這是因?yàn)橛?jì)算(以及求逆)Hessian矩陣操作非常耗費(fèi)時(shí)間和空間火俄。舉例來說,假設(shè)一個(gè)有一百萬個(gè)參數(shù)的神經(jīng)網(wǎng)絡(luò)讲冠,其Hessian矩陣大小就是[1,000,000 x 1,000,000]瓜客,將占用將近3,725GB的內(nèi)存。這樣竿开,各種各樣的-牛頓法就被發(fā)明出來用于近似轉(zhuǎn)置Hessian矩陣谱仪。在這些方法中最流行的是L-BFGS,該方法使用隨時(shí)間的梯度中的信息來隱式地近似(也就是說整個(gè)矩陣是從來沒有被計(jì)算的)否彩。

然而疯攒,即使解決了存儲(chǔ)空間的問題,L-BFGS應(yīng)用的一個(gè)巨大劣勢是需要對(duì)整個(gè)訓(xùn)練集進(jìn)行計(jì)算列荔,而整個(gè)訓(xùn)練集一般包含幾百萬的樣本敬尺。和小批量隨機(jī)梯度下降(mini-batch SGD)不同,讓L-BFGS在小批量上運(yùn)行起來是很需要技巧贴浙,同時(shí)也是研究熱點(diǎn)砂吞。

實(shí)踐。在深度學(xué)習(xí)和卷積神經(jīng)網(wǎng)絡(luò)中悬而,使用L-BFGS之類的二階方法并不常見呜舒。相反,基于(Nesterov的)動(dòng)量更新的各種隨機(jī)梯度下降方法更加常用笨奠,因?yàn)樗鼈兏雍唵吻胰菀讛U(kuò)展袭蝗。

參考資料:

  • Large Scale Distributed Deep Networks 一文來自谷歌大腦團(tuán)隊(duì)唤殴,比較了在大規(guī)模數(shù)據(jù)情況下L-BFGS和SGD算法的表現(xiàn)。

  • SFO算法想要把SGD和L-BFGS的優(yōu)勢結(jié)合起來到腥。

4.4 逐參數(shù)適應(yīng)學(xué)習(xí)率方法

前面討論的所有方法都是對(duì)學(xué)習(xí)率進(jìn)行全局地操作朵逝,并且對(duì)所有的參數(shù)都是一樣的。學(xué)習(xí)率調(diào)參是很耗費(fèi)計(jì)算資源的過程乡范,所以很多工作投入到發(fā)明能夠適應(yīng)性地對(duì)學(xué)習(xí)率調(diào)參的方法配名,甚至是逐個(gè)參數(shù)適應(yīng)學(xué)習(xí)率調(diào)參。很多這些方法依然需要其他的超參數(shù)設(shè)置晋辆,但是其觀點(diǎn)是這些方法對(duì)于更廣范圍的超參數(shù)比原始的學(xué)習(xí)率方法有更良好的表現(xiàn)渠脉。在本小節(jié)我們會(huì)介紹一些在實(shí)踐中可能會(huì)遇到的常用適應(yīng)算法:
Adagrad是一個(gè)由Duchi等提出的適應(yīng)性學(xué)習(xí)率算法

# 假設(shè)有梯度和參數(shù)向量x
cache += dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)

注意,變量cache的尺寸和梯度矩陣的尺寸是一樣的瓶佳,還跟蹤了每個(gè)參數(shù)的梯度的平方和芋膘。這個(gè)一會(huì)兒將用來歸一化參數(shù)更新步長,歸一化是逐元素進(jìn)行的霸饲。注意为朋,接收到高梯度值的權(quán)重更新的效果被減弱,而接收到低梯度值的權(quán)重的更新效果將會(huì)增強(qiáng)厚脉。有趣的是平方根的操作非常重要习寸,如果去掉,算法的表現(xiàn)將會(huì)糟糕很多傻工。用于平滑的式子eps(一般設(shè)為1e-4到1e-8之間)是防止出現(xiàn)除以0的情況霞溪。Adagrad的一個(gè)缺點(diǎn)是涛漂,在深度學(xué)習(xí)中單調(diào)的學(xué)習(xí)率被證明通常過于激進(jìn)且過早停止學(xué)習(xí)。

RMSprop鼓拧。是一個(gè)非常高效荸恕,但沒有公開發(fā)表的適應(yīng)性學(xué)習(xí)率方法。有趣的是租漂,每個(gè)使用這個(gè)方法的人在他們的論文中都引用自Geoff Hinton的Coursera課程的第六課的第29頁P(yáng)PT。這個(gè)方法用一種很簡單的方式修改了Adagrad方法,讓它不那么激進(jìn)臂容,單調(diào)地降低了學(xué)習(xí)率。具體說來根蟹,就是它使用了一個(gè)梯度平方的滑動(dòng)平均:

cache =  decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)

在上面的代碼中脓杉,decay_rate是一個(gè)超參數(shù),常用的值是[0.9,0.99,0.999]简逮。其中x+=和Adagrad中是一樣的球散,但是cache變量是不同的。因此散庶,RMSProp仍然是基于梯度的大小來對(duì)每個(gè)權(quán)重的學(xué)習(xí)率進(jìn)行修改蕉堰,這同樣效果不錯(cuò)凌净。但是和Adagrad不同,其更新不會(huì)讓學(xué)習(xí)率單調(diào)變小屋讶。

Adam冰寻。Adam是最近才提出的一種更新方法,它看起來像是RMSProp的動(dòng)量版皿渗。簡化的代碼是下面這樣:

m = beta1*m + (1-beta1)*dx
v = beta2*v + (1-beta2)*(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)

注意這個(gè)更新方法看起來真的和RMSProp很像斩芭,除了使用的是平滑版的梯度m,而不是用的原始梯度向量dx乐疆。論文中推薦的參數(shù)值eps = 1e-8, beta1 = 0.9, beta2 = 0.999划乖。在實(shí)際操作中,我們推薦Adam作為默認(rèn)的算法挤土,一般而言跑起來比RMSProp要好一點(diǎn)迁筛。但是也可以試試SGD + Nesterov動(dòng)量。完整的Adam更新算法也包含了一個(gè)偏置(bias)矯正機(jī)制耕挨,因?yàn)?strong>m,v兩個(gè)矩陣初始為0细卧,在沒有完全熱身之前存在偏差,需要采取一些補(bǔ)償措施筒占。建議讀者可以閱讀論文查看細(xì)節(jié)贪庙,或者課程的PPT。

拓展閱讀:

譯者注:上圖原文中為動(dòng)圖止邮,知乎專欄不支持動(dòng)圖,知友可點(diǎn)擊原文鏈接查看奏窑。

上面的動(dòng)畫可以幫助你理解學(xué)習(xí)的動(dòng)態(tài)過程导披。左邊是一個(gè)損失函數(shù)的等高線圖,上面跑的是不同的最優(yōu)化算法埃唯。注意基于動(dòng)量的方法出現(xiàn)了射偏了的情況撩匕,使得最優(yōu)化過程看起來像是一個(gè)球滾下山的樣子。右邊展示了一個(gè)馬鞍狀的最優(yōu)化地形墨叛,其中對(duì)于不同維度它的曲率不同(一個(gè)維度下降另一個(gè)維度上升)止毕。注意SGD很難突破對(duì)稱性,一直卡在頂部漠趁。而RMSProp之類的方法能夠看到馬鞍方向有很低的梯度扁凛。因?yàn)樵赗MSProp更新方法中的分母項(xiàng),算法提高了在該方向的有效學(xué)習(xí)率闯传,使得RMSProp能夠繼續(xù)前進(jìn)谨朝。圖片版權(quán):Alec Radford

5. 超參數(shù)調(diào)優(yōu)

我們已經(jīng)看到,訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)會(huì)遇到很多超參數(shù)設(shè)置字币。神經(jīng)網(wǎng)絡(luò)最常用的設(shè)置有:

  • 初始學(xué)習(xí)率荚孵。

  • 學(xué)習(xí)率衰減方式(例如一個(gè)衰減常量)。

  • 正則化強(qiáng)度(L2懲罰纬朝,隨機(jī)失活強(qiáng)度)收叶。

但是也可以看到,還有很多相對(duì)不那么敏感的超參數(shù)共苛。比如在逐參數(shù)適應(yīng)學(xué)習(xí)方法中判没,對(duì)于動(dòng)量及其時(shí)間表的設(shè)置等。在本節(jié)中將介紹一些額外的調(diào)參要點(diǎn)和技巧:

實(shí)現(xiàn)隅茎。更大的神經(jīng)網(wǎng)絡(luò)需要更長的時(shí)間去訓(xùn)練澄峰,所以調(diào)參可能需要幾天甚至幾周。記住這一點(diǎn)很重要辟犀,因?yàn)檫@會(huì)影響你設(shè)計(jì)代碼的思路俏竞。一個(gè)具體的設(shè)計(jì)是用仆程序持續(xù)地隨機(jī)設(shè)置參數(shù)然后進(jìn)行最優(yōu)化。在訓(xùn)練過程中堂竟,仆程序會(huì)對(duì)每個(gè)周期后驗(yàn)證集的準(zhǔn)確率進(jìn)行監(jiān)控魂毁,然后向文件系統(tǒng)寫下一個(gè)模型的記錄點(diǎn)(記錄點(diǎn)中有各種各樣的訓(xùn)練統(tǒng)計(jì)數(shù)據(jù),比如隨著時(shí)間的損失值變化等)出嘹,這個(gè)文件系統(tǒng)最好是可共享的席楚。在文件名中最好包含驗(yàn)證集的算法表現(xiàn),這樣就能方便地查找和排序了税稼。然后還有一個(gè)主程序烦秩,它可以啟動(dòng)或者結(jié)束計(jì)算集群中的仆程序,有時(shí)候也可能根據(jù)條件查看仆程序寫下的記錄點(diǎn)郎仆,輸出它們的訓(xùn)練統(tǒng)計(jì)數(shù)據(jù)等只祠。

比起交叉驗(yàn)證最好使用一個(gè)驗(yàn)證集。在大多數(shù)情況下扰肌,一個(gè)尺寸合理的驗(yàn)證集可以讓代碼更簡單抛寝,不需要用幾個(gè)數(shù)據(jù)集來交叉驗(yàn)證。你可能會(huì)聽到人們說他們“交叉驗(yàn)證”一個(gè)參數(shù)狡耻,但是大多數(shù)情況下墩剖,他們實(shí)際是使用的一個(gè)驗(yàn)證集。

超參數(shù)范圍夷狰。在對(duì)數(shù)尺度上進(jìn)行超參數(shù)搜索。例如郊霎,一個(gè)典型的學(xué)習(xí)率應(yīng)該看起來是這樣:learning_rate = 10 ** uniform(-6, 1)沼头。也就是說,我們從標(biāo)準(zhǔn)分布中隨機(jī)生成了一個(gè)數(shù)字,然后讓它成為10的階數(shù)进倍。對(duì)于正則化強(qiáng)度土至,可以采用同樣的策略。直觀地說猾昆,這是因?yàn)閷W(xué)習(xí)率和正則化強(qiáng)度都對(duì)于訓(xùn)練的動(dòng)態(tài)進(jìn)程有乘的效果陶因。例如:當(dāng)學(xué)習(xí)率是0.001的時(shí)候,如果對(duì)其固定地增加0.01垂蜗,那么對(duì)于學(xué)習(xí)進(jìn)程會(huì)有很大影響楷扬。然而當(dāng)學(xué)習(xí)率是10的時(shí)候,影響就微乎其微了贴见。這就是因?yàn)閷W(xué)習(xí)率乘以了計(jì)算出的梯度烘苹。因此,比起加上或者減少某些值片部,思考學(xué)習(xí)率的范圍是乘以或者除以某些值更加自然镣衡。但是有一些參數(shù)(比如隨機(jī)失活)還是在原始尺度上進(jìn)行搜索(例如:dropout=uniform(0,1))。

隨機(jī)搜索優(yōu)于網(wǎng)格搜索档悠。Bergstra和Bengio在文章Random Search for Hyper-Parameter Optimization中說“隨機(jī)選擇比網(wǎng)格化的選擇更加有效”廊鸥,而且在實(shí)踐中也更容易實(shí)現(xiàn)。

對(duì)于邊界上的最優(yōu)值要小心辖所。這種情況一般發(fā)生在你在一個(gè)不好的范圍內(nèi)搜索超參數(shù)(比如學(xué)習(xí)率)的時(shí)候黍图。比如,假設(shè)我們使用learning_rate = 10 ** uniform(-6,1)來進(jìn)行搜索奴烙。一旦我們得到一個(gè)比較好的值助被,一定要確認(rèn)你的值不是出于這個(gè)范圍的邊界上,不然你可能錯(cuò)過更好的其他搜索范圍切诀。

從粗到細(xì)地分階段搜索揩环。在實(shí)踐中,先進(jìn)行初略范圍(比如10 ** [-6, 1])搜索幅虑,然后根據(jù)好的結(jié)果出現(xiàn)的地方丰滑,縮小范圍進(jìn)行搜索。進(jìn)行粗搜索的時(shí)候倒庵,讓模型訓(xùn)練一個(gè)周期就可以了褒墨,因?yàn)楹芏喑瑓?shù)的設(shè)定會(huì)讓模型沒法學(xué)習(xí),或者突然就爆出很大的損失值擎宝。第二個(gè)階段就是對(duì)一個(gè)更小的范圍進(jìn)行搜索郁妈,這時(shí)可以讓模型運(yùn)行5個(gè)周期,而最后一個(gè)階段就在最終的范圍內(nèi)進(jìn)行仔細(xì)搜索绍申,運(yùn)行很多次周期噩咪。

貝葉斯超參數(shù)最優(yōu)化是一整個(gè)研究領(lǐng)域顾彰,主要是研究在超參數(shù)空間中更高效的導(dǎo)航算法。其核心的思路是在不同超參數(shù)設(shè)置下查看算法性能時(shí)胃碾,要在探索和使用中進(jìn)行合理的權(quán)衡涨享。基于這些模型仆百,發(fā)展出很多的庫厕隧,比較有名的有: Spearmint, SMAC, 和Hyperopt。然而俄周,在卷積神經(jīng)網(wǎng)絡(luò)的實(shí)際使用中吁讨,比起上面介紹的先認(rèn)真挑選的一個(gè)范圍,然后在該范圍內(nèi)隨機(jī)搜索的方法栈源,這個(gè)方法還是差一些挡爵。這里有更詳細(xì)的討論。

6. 評(píng)價(jià)

模型集成

在實(shí)踐的時(shí)候甚垦,有一個(gè)總是能提升神經(jīng)網(wǎng)絡(luò)幾個(gè)百分點(diǎn)準(zhǔn)確率的辦法茶鹃,就是在訓(xùn)練的時(shí)候訓(xùn)練幾個(gè)獨(dú)立的模型,然后在測試的時(shí)候平均它們預(yù)測結(jié)果艰亮。集成的模型數(shù)量增加闭翩,算法的結(jié)果也單調(diào)提升(但提升效果越來越少)。還有模型之間的差異度越大迄埃,提升效果可能越好疗韵。進(jìn)行集成有以下幾種方法:

  • 同一個(gè)模型,不同的初始化侄非。使用交叉驗(yàn)證來得到最好的超參數(shù)蕉汪,然后用最好的參數(shù)來訓(xùn)練不同初始化條件的模型。這種方法的風(fēng)險(xiǎn)在于多樣性只來自于不同的初始化條件逞怨。

  • 在交叉驗(yàn)證中發(fā)現(xiàn)最好的模型者疤。使用交叉驗(yàn)證來得到最好的超參數(shù),然后取其中最好的幾個(gè)(比如10個(gè))模型來進(jìn)行集成叠赦。這樣就提高了集成的多樣性驹马,但風(fēng)險(xiǎn)在于可能會(huì)包含不夠理想的模型。在實(shí)際操作中除秀,這樣操作起來比較簡單糯累,在交叉驗(yàn)證后就不需要額外的訓(xùn)練了。

  • 一個(gè)模型設(shè)置多個(gè)記錄點(diǎn)册踩。如果訓(xùn)練非常耗時(shí)泳姐,那就在不同的訓(xùn)練時(shí)間對(duì)網(wǎng)絡(luò)留下記錄點(diǎn)(比如每個(gè)周期結(jié)束),然后用它們來進(jìn)行模型集成棍好。很顯然仗岸,這樣做多樣性不足允耿,但是在實(shí)踐中效果還是不錯(cuò)的借笙,這種方法的優(yōu)勢是代價(jià)比較小扒怖。

  • 在訓(xùn)練的時(shí)候跑參數(shù)的平均值。和上面一點(diǎn)相關(guān)的业稼,還有一個(gè)也能得到1-2個(gè)百分點(diǎn)的提升的小代價(jià)方法盗痒,這個(gè)方法就是在訓(xùn)練過程中,如果損失值相較于前一次權(quán)重出現(xiàn)指數(shù)下降時(shí)低散,就在內(nèi)存中對(duì)網(wǎng)絡(luò)的權(quán)重進(jìn)行一個(gè)備份俯邓。這樣你就對(duì)前幾次循環(huán)中的網(wǎng)絡(luò)狀態(tài)進(jìn)行了平均。你會(huì)發(fā)現(xiàn)這個(gè)“平滑”過的版本的權(quán)重總是能得到更少的誤差熔号。直觀的理解就是目標(biāo)函數(shù)是一個(gè)碗狀的稽鞭,你的網(wǎng)絡(luò)在這個(gè)周圍跳躍,所以對(duì)它們平均一下引镊,就更可能跳到中心去朦蕴。

模型集成的一個(gè)劣勢就是在測試數(shù)據(jù)的時(shí)候會(huì)花費(fèi)更多時(shí)間。最近Geoff Hinton在“Dark Knowledge”上的工作很有啟發(fā):其思路是通過將集成似然估計(jì)納入到修改的目標(biāo)函數(shù)中弟头,從一個(gè)好的集成中抽出一個(gè)單獨(dú)模型吩抓。

7. 總結(jié)

訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)需要:

  • 利用小批量數(shù)據(jù)對(duì)實(shí)現(xiàn)進(jìn)行梯度檢查,還要注意各種錯(cuò)誤赴恨。

  • 進(jìn)行合理性檢查疹娶,確認(rèn)初始損失值是合理的,在小數(shù)據(jù)集上能得到100%的準(zhǔn)確率伦连。

  • 在訓(xùn)練時(shí)雨饺,跟蹤損失函數(shù)值,訓(xùn)練集和驗(yàn)證集準(zhǔn)確率惑淳,如果愿意额港,還可以跟蹤更新的參數(shù)量相對(duì)于總參數(shù)量的比例(一般在1e-3左右),然后如果是對(duì)于卷積神經(jīng)網(wǎng)絡(luò)汛聚,可以將第一層的權(quán)重可視化锹安。

  • 推薦的兩個(gè)更新方法是SGD+Nesterov動(dòng)量方法,或者Adam方法倚舀。

  • 隨著訓(xùn)練進(jìn)行學(xué)習(xí)率衰減叹哭。比如,在固定多少個(gè)周期后讓學(xué)習(xí)率減半痕貌,或者當(dāng)驗(yàn)證集準(zhǔn)確率下降的時(shí)候风罩。

  • 使用隨機(jī)搜索(不要用網(wǎng)格搜索)來搜索最優(yōu)的超參數(shù)。分階段從粗(比較寬的超參數(shù)范圍訓(xùn)練1-5個(gè)周期)到細(xì)(窄范圍訓(xùn)練很多個(gè)周期)地來搜索舵稠。

  • 進(jìn)行模型集成來獲得額外的性能提高超升。

拓展閱讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乾闰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盈滴,更是在濱河造成了極大的恐慌涯肩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巢钓,死亡現(xiàn)場離奇詭異病苗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)症汹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門硫朦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人背镇,你說我怎么就攤上這事咬展。” “怎么了芽世?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵挚赊,是天一觀的道長。 經(jīng)常有香客問我济瓢,道長荠割,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任旺矾,我火速辦了婚禮蔑鹦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箕宙。我一直安慰自己嚎朽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布柬帕。 她就那樣靜靜地躺著哟忍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陷寝。 梳的紋絲不亂的頭發(fā)上锅很,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音凤跑,去河邊找鬼爆安。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仔引,可吹牛的內(nèi)容都是我干的扔仓。 我是一名探鬼主播褐奥,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼翘簇!你這毒婦竟也來了撬码?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤缘揪,失蹤者是張志新(化名)和其女友劉穎耍群,沒想到半個(gè)月后义桂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體找筝,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年慷吊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袖裕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溉瓶,死狀恐怖急鳄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堰酿,我是刑警寧澤疾宏,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站触创,受9級(jí)特大地震影響坎藐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哼绑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一岩馍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抖韩,春花似錦蛀恩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至席揽,卻和暖如春顽馋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背驹尼。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工趣避, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人新翎。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓程帕,卻偏偏與公主長得像住练,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子愁拭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容