|
在這節(jié)課中,主要講述了神經(jīng)網(wǎng)絡(luò)的檢查事項(xiàng)(例如梯度檢查,合理性檢查和學(xué)習(xí)過(guò)程中對(duì)損失函數(shù)、權(quán)重、每層的激活函數(shù)與梯度分布等的檢查等)和神經(jīng)網(wǎng)絡(luò)的參數(shù)調(diào)優(yōu)實(shí)現(xiàn)方法(例如:隨機(jī)梯度下降方法,動(dòng)量方法,學(xué)習(xí)率退火方法等等) -----------第一部分:檢查事項(xiàng)---------- 梯度檢查:課中提出當(dāng)使用有限差值來(lái)近似計(jì)算數(shù)值梯度的時(shí)候,下面的公式方法是不可行的:
而在實(shí)際中常使用下面的中心化梯度計(jì)算公式:
公式2的結(jié)果要比公式1更準(zhǔn)確,公式1的誤差近似為O(h),第二個(gè)公式的誤差近似為O(h^2),
另外,在進(jìn)行誤差比較時(shí),應(yīng)該使用下面的相對(duì)誤差比較法:
公式3比較誤差時(shí)是計(jì)算的兩者的差值占兩個(gè)梯度絕對(duì)值較大值(分母取的是兩個(gè)梯度絕對(duì)值的最大值)的比例,分母也可以是兩個(gè)梯度絕對(duì)值的和。這樣做可以防止當(dāng)其中一個(gè)梯度等于0時(shí),分母為0的情況(這種情況在ReLU中經(jīng)常發(fā)生),所以還需要注意當(dāng)兩個(gè)梯度都為零時(shí)并且通過(guò)了梯度檢查的情況。老師給出了在實(shí)踐中的幾種情形:
在多層神經(jīng)網(wǎng)絡(luò)中,誤差時(shí)逐層累積的。對(duì)于一個(gè)可微分函數(shù),如果誤差為1e-2,通常就是梯度計(jì)算出錯(cuò)了。 另外,梯度檢查時(shí)所用的數(shù)值精度也會(huì)影響到結(jié)果,例如,可能出現(xiàn)使用單精度數(shù)的相對(duì)誤差為1e-2,但使用雙精度數(shù)時(shí)的相對(duì)誤差為1e-8的情況。 還需要注意保持浮點(diǎn)數(shù)的有效范圍,在論文《What Every Computer Scientist Should Konw About Floating-Point Artthmetic》描述了多種可能因?yàn)楦↑c(diǎn)數(shù)值計(jì)算導(dǎo)致的錯(cuò)誤。老師建議將原始的解析梯度和數(shù)值梯度數(shù)據(jù)打印出來(lái),以確保用來(lái)比較的數(shù)值不要太?。ㄍǔ=^對(duì)值小于1e-10是很壞的情況)。但是如果出現(xiàn)確實(shí)過(guò)小的情形,可以借助一個(gè)常數(shù)將損失函數(shù)的數(shù)值范圍暫時(shí)擴(kuò)展到一個(gè)更“好”的范圍,使得浮點(diǎn)數(shù)變得更加密集;比較理想的數(shù)值范圍是在1.0的數(shù)量級(jí)上,即浮點(diǎn)數(shù)指數(shù)為0。 還有一種情況是:目標(biāo)函數(shù)存在不可導(dǎo)點(diǎn)(kinks)。 不可導(dǎo)點(diǎn)是指目標(biāo)函數(shù)不存在導(dǎo)數(shù)的部分,ReLU、SVM損失函數(shù)、Maxout神經(jīng)元等都存在kinks點(diǎn)。以ReLU函數(shù)為例,當(dāng)x=0時(shí),函數(shù)不可導(dǎo),即是函數(shù)的一個(gè)kinks點(diǎn),下圖1是ReLU的函數(shù)曲線:
在x=e-6處,理論梯度應(yīng)該是0,但當(dāng)使用上面公式(2)求梯度時(shí),如果h>e-6,求出的梯度結(jié)果并不為0,因?yàn)?nbsp;f(x+h) 越過(guò)了不可導(dǎo)點(diǎn)。而在實(shí)際應(yīng)用中,上述情況是很常見(jiàn)。例如,用CIFAR-10訓(xùn)練的SVM中,樣本數(shù)為50000個(gè),每個(gè)樣本產(chǎn)生9個(gè) max(0,x) 式子,所以共有 450,000個(gè)式子,所以遇到很多的不可導(dǎo)點(diǎn)是正?,F(xiàn)象。 針對(duì)上面的情形,課中給出的建議是: (1)使用少量的數(shù)據(jù)點(diǎn)。因?yàn)楹胁豢蓪?dǎo)點(diǎn)損失函數(shù)的數(shù)據(jù)點(diǎn)越少,出現(xiàn)的不可導(dǎo)點(diǎn)就越少,在計(jì)算有限差值近似時(shí)越過(guò)不可導(dǎo)點(diǎn)的概率就越小;并且這還可以使得檢查過(guò)程變得高效。 (2)謹(jǐn)慎設(shè)置步長(zhǎng) h 。步長(zhǎng)值并不是越小越好,當(dāng)h過(guò)小時(shí),可能會(huì)遇到上面說(shuō)的數(shù)值精度問(wèn)題。如果梯度檢查無(wú)法進(jìn)行,可以嘗試將 h 調(diào)到1e-4或者1e-6。 (3)需要注意梯度檢查的時(shí)機(jī)。最好讓神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)一小段時(shí)間,等到損失函數(shù)開始下降的以后再進(jìn)行梯度檢查。因?yàn)槿绻麖囊婚_始就進(jìn)行梯度檢查,此時(shí)梯度可能正處于不正常的邊界。 另外,梯度檢查還需要注意的三點(diǎn)有: (1)計(jì)算數(shù)據(jù)損失時(shí)注意正則化損失的影響,不要讓正則化損失掩蓋數(shù)據(jù)損失。 由于損失函數(shù)包括數(shù)據(jù)損失和正則化損失兩部分,所以可能存在正則化損失吞沒(méi)數(shù)據(jù)損失的風(fēng)險(xiǎn)。建議做法是:先關(guān)掉正則化部分,而是對(duì)數(shù)據(jù)損失做單獨(dú)檢查,然后再對(duì)正則化損失做單獨(dú)檢查。 對(duì)正則化做單獨(dú)檢查的方法有:1. 修改代碼,去掉其中數(shù)據(jù)損失的部分; 2.提高正則化強(qiáng)度,確認(rèn)其效果在梯度檢查中能否忽略。 (2)注意隨機(jī)失活和數(shù)據(jù)擴(kuò)張的不確定影響。 這可能給計(jì)算梯度結(jié)果帶來(lái)不確定的誤差影響。如果關(guān)閉這些操作,則無(wú)法對(duì)它們進(jìn)行梯度檢查(例如隨機(jī)失活的反向傳播可能存在錯(cuò)誤),所以更好的解決方法是在計(jì)算 f(x+h) 和 f(x-h) 前強(qiáng)制增加一個(gè)特定的隨機(jī)種子,在計(jì)算解析梯度時(shí)也采取這個(gè)方法。 (3)檢查少量的維度。 在實(shí)際應(yīng)用中,神經(jīng)網(wǎng)絡(luò)可能有上百萬(wàn)的參數(shù),在這種情況下只能檢查部分維度。但需要注意的是,選取的參數(shù)應(yīng)該從所有不同的參數(shù)中選取部分檢查,避免出現(xiàn)從參數(shù)向量中隨機(jī)選取出的參數(shù)可能只是偏置參數(shù)的情況。 進(jìn)行學(xué)習(xí)之前的合理性檢查技巧:
參數(shù)調(diào)優(yōu)的過(guò)程是費(fèi)時(shí)費(fèi)力的,所以在開始之前,下面的技巧是很有必要的: (1)原文中“Look for correct loss at chance performance”,這里的chance performance指的是不是統(tǒng)計(jì)概率中的得分的意思(我不確定,如果有清楚的還望告知?。?。 當(dāng)使用小參數(shù)初始化時(shí),確保得到的損失值與期望的損失值是一樣的。最好的方式是單獨(dú)對(duì)數(shù)據(jù)損失進(jìn)行檢查(正則化強(qiáng)度置零)。 (2)當(dāng)增大正則化強(qiáng)度時(shí),查看損失值是否跟著變大。 (3)在整個(gè)數(shù)據(jù)集進(jìn)行訓(xùn)練之前,先在一個(gè)很小的數(shù)據(jù)集上進(jìn)行訓(xùn)練(比如20個(gè)數(shù)據(jù)),并設(shè)置正則化強(qiáng)度為0,確保此時(shí)的損失值為0。只有這個(gè)檢查通過(guò),整個(gè)數(shù)據(jù)集的訓(xùn)練才有意義。 學(xué)習(xí)過(guò)程中的檢查:
在神經(jīng)網(wǎng)絡(luò)訓(xùn)練過(guò)程中,有許多有用的參數(shù)(例如損失函數(shù)值,驗(yàn)證集和訓(xùn)練集的準(zhǔn)確率,權(quán)重的更新比例等)需要監(jiān)控,這些參數(shù)對(duì)于不同超參數(shù)的設(shè)置和調(diào)優(yōu)具有指導(dǎo)意義。 (1)損失函數(shù)值
上圖2中,x軸表示周期。左面是不同學(xué)習(xí)率對(duì)應(yīng)的損失函數(shù)值曲線;右圖是一個(gè)典型的損失函數(shù)值隨時(shí)間的變化曲線。從左圖中,我們發(fā)現(xiàn),學(xué)習(xí)率設(shè)置過(guò)高時(shí),損失值并不單調(diào)了,而紅色曲線對(duì)應(yīng)的是較好的學(xué)習(xí)率。 另外,損失函數(shù)值的震蕩程度還與批尺寸(batch size)有關(guān):當(dāng)批尺寸為1時(shí),震蕩相對(duì)會(huì)比較大;當(dāng)批尺寸是整個(gè)數(shù)據(jù)集時(shí),震蕩會(huì)比較小,因?yàn)槊總€(gè)梯度的更新都在單調(diào)地優(yōu)化損失函數(shù)(學(xué)習(xí)率過(guò)高除外)。 (2)訓(xùn)練集和驗(yàn)證集的準(zhǔn)確率
上圖3中,藍(lán)色的驗(yàn)證集曲線表明相比于訓(xùn)練集/驗(yàn)證集的準(zhǔn)確率低了很多,兩者中間的縫隙程度也能模型過(guò)擬合的程度。此時(shí)應(yīng)該增大正則化強(qiáng)度(更大的權(quán)重懲罰,更多的隨機(jī)失活等)或者收集更多的數(shù)據(jù)。 如果遇到驗(yàn)證集曲線和訓(xùn)練集曲線近乎重合的情況,說(shuō)明模型容量不夠大,此時(shí)應(yīng)該通過(guò)增加參數(shù)的數(shù)量使得模型容量更大些。
(3)權(quán)重的更新比例
這個(gè)之前課中也提過(guò),這個(gè)參數(shù)指的是每次訓(xùn)練后有更新的權(quán)重占所有權(quán)重的比例。經(jīng)驗(yàn)性的結(jié)論是這個(gè)比例應(yīng)該在1e-3左右,如果小于此值,表明學(xué)習(xí)率可能設(shè)置的過(guò)?。蝗绻笥诖酥?,表明學(xué)習(xí)率可能設(shè)置的過(guò)大。
(4)課中還給出了幾種判別學(xué)習(xí)過(guò)程是否出現(xiàn)問(wèn)題的方法
上圖是將將神經(jīng)網(wǎng)絡(luò)的第一層權(quán)重可視化的例子。左邊的特征充滿了噪音,表明網(wǎng)絡(luò)可能出現(xiàn)了以下問(wèn)題:網(wǎng)絡(luò)不收斂,學(xué)習(xí)率設(shè)置不恰當(dāng),正則化懲罰的權(quán)重過(guò)低等。右邊的特征比較平滑,干凈而且種類多,表明訓(xùn)練過(guò)程良好。
-----------第二部分:參數(shù)調(diào)優(yōu)----------
參數(shù)更新:
優(yōu)化算法是通過(guò)改善訓(xùn)練方式,來(lái)最小化(或最大化)損失函數(shù)的過(guò)程。優(yōu)化算法分為兩大類: 2. 二階優(yōu)化算法。 二階優(yōu)化算法使用二階導(dǎo)數(shù)(也叫Hessian方法)優(yōu)化損失函數(shù)。課中也提及了其迭代公式,但是由于其計(jì)算成本比較高,所以應(yīng)用的并不廣泛,不加說(shuō)明了。
當(dāng)可以使用反向傳播計(jì)算解析梯度后,梯度能被用來(lái)進(jìn)行更新參數(shù)的過(guò)程。課中提及了幾種網(wǎng)絡(luò)優(yōu)化算法:梯度下降法,動(dòng)量更新法,學(xué)習(xí)率退火法等。 (1)梯度下降法。 參數(shù)更新最簡(jiǎn)單的方式是沿著梯度負(fù)方向改變參數(shù)。假設(shè)參數(shù)向量為x ,其梯度為dx,更新形式為:
其中,learning_rate是之前說(shuō)的學(xué)習(xí)率。注:批量梯度下降在計(jì)算損失函數(shù)的梯度時(shí),是遍歷數(shù)據(jù)集中的每一個(gè)樣本,如果在每一次迭代中都進(jìn)行梯度下降是非常低效的,因?yàn)樗惴ǖ拿看蔚鷥H以很小的步進(jìn)來(lái)提升損失函數(shù)。為了解決這個(gè)問(wèn)題,可以使用小批量(Mini-batch)梯度下降算法,該算法在數(shù)據(jù)集的一個(gè)小批量上近似計(jì)算梯度,然后使用這個(gè)梯度去更新權(quán)值。比如卷積神經(jīng)網(wǎng)絡(luò),每次在訓(xùn)練集中選擇包含256個(gè)樣本的一批數(shù)據(jù),然后使用這批數(shù)據(jù)計(jì)算梯度,完成參數(shù)更新,代碼附在下面。用來(lái)估計(jì)梯度的 batch 大小是可以選擇的一個(gè)超參數(shù),當(dāng)它等于 1 時(shí),即為隨機(jī)梯度下降(SGD),大多數(shù)深度學(xué)習(xí)框架都會(huì)選擇隨機(jī)梯度下降的 batch 大小。
使用梯度下降的挑戰(zhàn):1. 很難選擇合適的學(xué)習(xí)率。學(xué)習(xí)率太小會(huì)導(dǎo)致網(wǎng)絡(luò)收斂過(guò)于緩慢,而學(xué)習(xí)率太大可能會(huì)影響收斂,并導(dǎo)致?lián)p失函數(shù)在最小值上波動(dòng),甚至出現(xiàn)梯度發(fā)散。 2. 相同的學(xué)習(xí)率并不適用于所有的參數(shù)更新。尤其是訓(xùn)練集數(shù)據(jù)很稀疏,并且特征頻率非常不同的時(shí)候;對(duì)于很少出現(xiàn)的特征,應(yīng)使用更大的更新率。 3. 在神經(jīng)網(wǎng)絡(luò)中,最小化非凸誤差函數(shù)的一大挑戰(zhàn)是避免陷于局部最小值中。實(shí)際問(wèn)題中這并非源于局部極小值,而是來(lái)自鞍點(diǎn),即在一個(gè)維度向上傾斜但在另一維度向下傾斜的點(diǎn)。鞍點(diǎn)通常被相同誤差值的平面包圍,這使得SGD算法很難脫離出來(lái),因?yàn)樘荻仍谒芯S度上接近于零。 (2)動(dòng)量更新法。動(dòng)量法或說(shuō)具有動(dòng)量的 SGD 有助于加速向量向著正確的梯度方向下降,加快收斂速度。
SGD方法中的高方差振蕩會(huì)使得網(wǎng)絡(luò)震蕩,動(dòng)量(Momentum)更新方法可以通過(guò)優(yōu)化相關(guān)方向的訓(xùn)練和弱化無(wú)關(guān)方向的振蕩,來(lái)加速SGD訓(xùn)練過(guò)程。動(dòng)量更新有兩種定義方法:一種是吳恩達(dá)提出的:定義一個(gè)動(dòng)量,即是梯度的移動(dòng)平均值。然后用它來(lái)更新網(wǎng)絡(luò)的權(quán)重,公式如下:
式中 L 是損失函數(shù),α 是學(xué)習(xí)率,β為動(dòng)量項(xiàng),一般取值0.9。另一種表達(dá)動(dòng)量更新的方式是:
Nesterov動(dòng)量:當(dāng)參數(shù)向量位于位置 x 時(shí),由上面的代碼可知,動(dòng)量部分會(huì)通過(guò) mu * v 稍微改變參數(shù)向量。可以將未來(lái)的近似位置x + mu * v 看做是“向前看”,并計(jì)算 x + mu * v處的梯度。視圖如下:
(3)學(xué)習(xí)率退火算法
訓(xùn)練深度網(wǎng)絡(luò)過(guò)程中,讓學(xué)習(xí)率隨著時(shí)間減弱是一種有效地方法。如果學(xué)習(xí)率很高,系統(tǒng)的動(dòng)能就很大,參數(shù)向量跳動(dòng)的就回厲害,不能夠穩(wěn)定到損失函數(shù)更深更窄的區(qū)域。通常,學(xué)習(xí)率退火有3種方式:
單參數(shù)自適應(yīng)學(xué)習(xí)率方法前面方法中的學(xué)習(xí)率是一種全局操作,并且對(duì)所有的參數(shù)都是使用同樣的學(xué)習(xí)率。學(xué)習(xí)率調(diào)參是很耗費(fèi)資源的過(guò)程,下面是幾種自適應(yīng)學(xué)習(xí)率調(diào)參的方法。
(1)Adagrad 是由Duchi等提出的自適應(yīng)學(xué)習(xí)率算法。
其中,變量 cache 的尺寸和梯度矩陣的尺寸是相同的,它跟蹤每個(gè)參數(shù)的梯度平方和。由于,cache 放在分母位置,所以在更新參數(shù) x 時(shí),高梯度值的權(quán)重的學(xué)習(xí)率會(huì)被減弱,而低梯度值的權(quán)重的學(xué)習(xí)率會(huì)被增強(qiáng)。eps 用于平滑(一般設(shè)為1e-4到1e-8),可以防止出現(xiàn)除數(shù)為0的情況。Adagrad的缺點(diǎn)是,在深度學(xué)習(xí)中單調(diào)的學(xué)習(xí)率通常過(guò)于激進(jìn)并且過(guò)早地停止學(xué)習(xí)。(2)RMSprop,該方法并未發(fā)表,出自于Geoff Hinton的Coursera課程中的第六節(jié)課的第29頁(yè)P(yáng)PT。該方法是對(duì)Adagrad方法的改進(jìn),它使用梯度平方的滑動(dòng)平均方式使得不像Adagrad那樣激進(jìn)。 其中,decay_rate 是一個(gè)超參數(shù),常用的值為[0.9,0.99,0.999]中的一個(gè)。與 Adagrad不同的是,學(xué)習(xí)率不會(huì)單調(diào)變小。(3)Adam,Adam看起來(lái)像是RMSProp的動(dòng)量版。
在引述論文中,推薦的參數(shù)值為:eps=1e-8, beta1=0.9, beta2=0.999。由于 m,v 兩個(gè)矩陣初始為0,所以完整的Adam算法還包含了偏置(bias)的矯正方法。一般,Adam比RMSProp要好,老師推薦的更新方法是SGD+Nesterov動(dòng)量方法,或Adam方法。 圖1
圖2圖1是一個(gè)損失函數(shù)的等高線圖,顯示了不同最優(yōu)化算法的直觀效果,其中基于動(dòng)量的方法出現(xiàn)了折返的情況。圖2展示了一個(gè)馬鞍狀的最優(yōu)化地形,其中,SGD很難突破對(duì)稱性,一直卡在頂部;RMSProp等方法能夠朝著馬鞍方向繼續(xù)前進(jìn),雖然該方向梯度小,但是由于 RMSProp方法中的分母項(xiàng)的存在,可以提高在該方向的學(xué)習(xí)率。
最后,附幾篇拓展文章:
|
|
|