【深度學(xué)習(xí)】深度學(xué)習(xí)兩大基礎(chǔ)Tricks:Dropout和BN詳解
深度學(xué)習(xí)
Author:louwill
Machine Learning Lab
? ? ?
Dropout
???? dropout作為目前神經(jīng)網(wǎng)絡(luò)訓(xùn)練的一項(xiàng)必備技術(shù),自從被Hinton提出以來,幾乎是進(jìn)行深度學(xué)習(xí)訓(xùn)練時(shí)的標(biāo)配。就像做菜時(shí)必須加料酒一樣,無論何時(shí),大家在使用全連接層的時(shí)候都會(huì)習(xí)慣性的在后面加上一個(gè)dropout層。通常情況下,dropout被作為一種防止神經(jīng)網(wǎng)絡(luò)過擬合的正則化方法,對(duì)神經(jīng)網(wǎng)絡(luò)的泛化性能有很大的幫助。每個(gè)人都會(huì)用dropout,但你真的理解它嗎?本節(jié)我們就來看看dropout里的一些關(guān)鍵細(xì)節(jié)問題。
???? dropout的概念相信大家都已熟稔在心了,是指在神經(jīng)網(wǎng)絡(luò)訓(xùn)練中,以一定的概率隨機(jī)地丟棄一部分神經(jīng)元來簡(jiǎn)化網(wǎng)絡(luò)的一項(xiàng)操作。本質(zhì)上來說,dropout就是在正常的神經(jīng)網(wǎng)絡(luò)基礎(chǔ)上給每一層的每一個(gè)神經(jīng)元加了一道概率流程來隨機(jī)丟棄某些神經(jīng)元以達(dá)到防止過擬合的目的。

???? 在keras中,dropout的實(shí)現(xiàn)只需要一行代碼:
from keras.layers import Dropoutx = Dropout(0.5)(x)
???? 但作為深度學(xué)習(xí)從業(yè)人員的你,在使用keras敲下這樣一行代碼時(shí),你需要心里對(duì)其實(shí)現(xiàn)細(xì)節(jié)無比清晰才對(duì)。我們先來看一下包含dropout的神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程,主要是前向傳播和反向傳播。先來看包含dropout的前向傳播過程。假設(shè)標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)前向傳播過程的數(shù)學(xué)描述為:

???? 使用一個(gè)參數(shù)為p的服從Bernoulli二項(xiàng)分布的隨機(jī)變量r,將這個(gè)隨機(jī)變量加入到標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)輸入中,那么帶有dropout的神經(jīng)網(wǎng)絡(luò)可以描述為:

???? 這樣的數(shù)學(xué)描述簡(jiǎn)潔明了,好像也沒什么特別注意的細(xì)節(jié)。我們以一層全連接網(wǎng)絡(luò)為例來看dropout的具體實(shí)現(xiàn)過程。
D1 = np.random.rand(A1.shape[0], A1.shape[1])D1 = D1 < probA1 = np.multiply(D1, A1)A1?=?A1?/?prob????????????????????????????
???? 其中A1為上一層的輸出,D1為用隨機(jī)數(shù)生成的一組dropout向量,然后將其與保留概率prob做比較得到一個(gè)布爾向量,再將其與A1做乘積即可得到失活后的A1,按理說dropout到這里應(yīng)該也就完成了,但最后還有一個(gè)將A1除以保留概率的操作。所以這里有個(gè)疑問,為什么在dropout之后還要做個(gè)rescale的除法?
???? 其實(shí),這種實(shí)現(xiàn)dropout的方法也叫Inverted Dropout,是一種經(jīng)典的dropout實(shí)現(xiàn)方法。先不說Inverted Dropout,我們來看正常dropout應(yīng)該是怎樣的:當(dāng)我們使用了dropout后,在模型訓(xùn)練階段只有占比為p部分的神經(jīng)元參與了訓(xùn)練,那么在預(yù)測(cè)階段得到的結(jié)果會(huì)比實(shí)際平均要大1/p,所以在測(cè)試階段我們需要將輸出結(jié)果乘以p來保持輸出規(guī)模不變。這種原始的dropout實(shí)現(xiàn)方式也叫Vanilla Dropout。Vanilla操作有一個(gè)重大缺陷,那就是預(yù)測(cè)過程需要根據(jù)訓(xùn)練階段所使用的dropout策略做調(diào)整,比較麻煩,所以一般情況下都不會(huì)使用這種方法。
???? 既如此,相必大家也知道了,我們目前用的都是Inverted Dropout方法,為了能夠在神經(jīng)網(wǎng)絡(luò)訓(xùn)練完成后安安心心的做預(yù)測(cè),我們可以把全部心思都放在訓(xùn)練階段,所有的設(shè)置都在訓(xùn)練階段完成。所以為了保證神經(jīng)網(wǎng)絡(luò)在丟棄掉一些神經(jīng)元之后總體信號(hào)強(qiáng)度不變和預(yù)測(cè)結(jié)果穩(wěn)定,也有一種說法叫保證Bernoulli二項(xiàng)分布的數(shù)學(xué)期望不變,我們?cè)贗nverted Dropout方法中對(duì)dropout之后的做了除以p的rescale操作。
???? 反向傳播時(shí)同理,梯度計(jì)算時(shí)需要除以保留概率:
dA1 = np.multiply(dA1, D1)dA1 = dA1 / prob
???? 這就是dropout最關(guān)鍵的一個(gè)細(xì)節(jié)問題,一般在深度學(xué)習(xí)崗位面試時(shí)面試官喜歡追著問其中的細(xì)節(jié)。值得注意一下。
???? 另一個(gè)細(xì)節(jié)問題在于dropout有一種類似集成學(xué)習(xí)的boosting思想在里面。神經(jīng)網(wǎng)絡(luò)以1-p的概率丟棄某些神經(jīng)元,當(dāng)進(jìn)行多次訓(xùn)練時(shí),因?yàn)殡S機(jī)性每次訓(xùn)練的都是不同的網(wǎng)絡(luò),dropout使得神經(jīng)網(wǎng)絡(luò)不依賴于某些獨(dú)立的特征,最后的結(jié)果也就是幾次訓(xùn)練之后的平均結(jié)果,這些都使得神經(jīng)網(wǎng)絡(luò)具備更好的泛化性能,也正是dropout能夠防止過擬合的主要原因。

???? dropout作為一項(xiàng)主流的神經(jīng)網(wǎng)絡(luò)訓(xùn)練trick,大家在使用時(shí)要知其然,更要知其所以然。
BatchNormalization
? ? ?深度神經(jīng)網(wǎng)絡(luò)一直以來就有一個(gè)特點(diǎn):隨著網(wǎng)絡(luò)加深,模型會(huì)越來越難以訓(xùn)練。所以深度學(xué)習(xí)有一個(gè)非常本質(zhì)性的問題:為什么隨著網(wǎng)絡(luò)加深,訓(xùn)練會(huì)越來越困難?為了解決這個(gè)問題,學(xué)界業(yè)界也一直在嘗試各種方法。
???? sigmoid作為激活函數(shù)一個(gè)最大的問題會(huì)引起梯度消失現(xiàn)象,這使得神經(jīng)網(wǎng)絡(luò)難以更新權(quán)重。使用ReLu激活函數(shù)可以有效的緩解這一問題。

???? 對(duì)神經(jīng)網(wǎng)絡(luò)使用正則化方法也能對(duì)這個(gè)問題有所幫助,使用dropout來對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行簡(jiǎn)化,可以有效緩解神經(jīng)網(wǎng)絡(luò)的過擬合問題,對(duì)于深度網(wǎng)絡(luò)的訓(xùn)練也有一定的幫助。ResNet使用殘差塊和skip connection來解決這個(gè)問題,使得深度加深時(shí)網(wǎng)絡(luò)仍有較好的表現(xiàn)力。

? ? ? BN本質(zhì)上也是一種解決深度神經(jīng)網(wǎng)絡(luò)難以訓(xùn)練問題的方法。
???? 機(jī)器學(xué)習(xí)的一個(gè)重要假設(shè)就是IID(Independent Identically Distributed)假設(shè),即獨(dú)立同分布假設(shè)。所謂獨(dú)立同分布,就是指訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)是近似于同分布的,如若不然,機(jī)器學(xué)習(xí)模型就會(huì)很難有較好的泛化性能。
???? 一個(gè)重要的觀點(diǎn)就是深度神經(jīng)網(wǎng)絡(luò)在訓(xùn)練過程中每一層的輸入并不滿足獨(dú)立同分布假設(shè),當(dāng)疊加的網(wǎng)絡(luò)層每一層的輸入分布都發(fā)生變化時(shí),這使得神經(jīng)網(wǎng)絡(luò)訓(xùn)練難以收斂。這種神經(jīng)網(wǎng)絡(luò)隱藏層輸入分布的不斷變化的現(xiàn)象就叫Internal Covariate Shift(ICS)。ICS問題正是導(dǎo)致深度神經(jīng)網(wǎng)絡(luò)難以訓(xùn)練的重要原因之一。
???? 一直在做鋪墊,還沒說到底什么是BN。Batch Normalization,簡(jiǎn)稱BN,翻譯過來就是批標(biāo)準(zhǔn)化,因?yàn)檫@個(gè)Normalization是建立在Mini-Batch SGD的基礎(chǔ)之上的。BN是針對(duì)ICS問題而提出的一種解決方案。一句話來說,BN就是使得深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中每一層網(wǎng)絡(luò)輸入都保持相同分布。
???? 既然ICS問題表明神經(jīng)網(wǎng)絡(luò)隱藏層輸入分布老是不斷變化,我們能否讓每個(gè)隱藏層輸入分布穩(wěn)定下來?通常來說,數(shù)據(jù)標(biāo)準(zhǔn)化是將數(shù)據(jù)喂給機(jī)器學(xué)習(xí)模型之前一項(xiàng)重要的數(shù)據(jù)預(yù)處理技術(shù),數(shù)據(jù)標(biāo)準(zhǔn)化也即將數(shù)據(jù)分布變換成均值為0,方差為1的標(biāo)準(zhǔn)正態(tài)分布,所以也叫0-1標(biāo)準(zhǔn)化。圖像處理領(lǐng)域的數(shù)據(jù)標(biāo)準(zhǔn)化也叫白化(whiten),當(dāng)然,白化方法除了0-1標(biāo)準(zhǔn)化之外,還包括極大極小標(biāo)準(zhǔn)化方法。

???? 所以一個(gè)很關(guān)鍵的聯(lián)想就是能否將這種白化操作推廣到神經(jīng)網(wǎng)絡(luò)的每一個(gè)隱藏層?答案當(dāng)然是可以的。
???? ICS問題導(dǎo)致深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練難以收斂,隱藏層輸入分布逐漸向非線性激活函數(shù)取值區(qū)間的兩端靠近,比如說sigmoid函數(shù)的兩端就是最大正值或者最小負(fù)值。這里說一下梯度飽和和梯度敏感的概念。當(dāng)取值位于sigmoid函數(shù)的兩端時(shí),即sigmoid取值接近0或1時(shí),梯度接近于0,這時(shí)候就位于梯度飽和區(qū),也就是容易產(chǎn)生梯度消失的區(qū)域,相應(yīng)的梯度敏感就是梯度計(jì)算遠(yuǎn)大于0,神經(jīng)網(wǎng)絡(luò)反向傳播時(shí)每次都能使權(quán)重得到很好的更新。

???? 當(dāng)梯度逐漸向這兩個(gè)區(qū)域靠近時(shí),就會(huì)產(chǎn)生梯度爆炸或者梯度消失問題,這也是深度神經(jīng)網(wǎng)絡(luò)難以訓(xùn)練的根本原因。BN將白化操作應(yīng)用到每一個(gè)隱藏層,對(duì)每個(gè)隱藏層輸入分布進(jìn)行標(biāo)準(zhǔn)化變換,把每層的輸入分布都強(qiáng)行拉回到均值為0方差為1的標(biāo)準(zhǔn)正態(tài)分布。這樣一來,上一層的激活輸出值(即當(dāng)前層的激活輸入值)就會(huì)落在非線性函數(shù)對(duì)輸入的梯度敏感區(qū),遠(yuǎn)離了原先的梯度飽和區(qū),神經(jīng)網(wǎng)絡(luò)權(quán)重易于更新,訓(xùn)練速度相應(yīng)加快。
???? 那么具體到實(shí)際應(yīng)用時(shí),BN操作應(yīng)該放在哪里?以一個(gè)全連接網(wǎng)絡(luò)為例:

???? 可以看到,BN操作是對(duì)每一個(gè)隱藏層的激活輸出做標(biāo)準(zhǔn)化,即BN層位于隱藏層之后。對(duì)于Mini-Batch SGD來說,一次訓(xùn)練包含了m個(gè)樣本,具體的BN變換就是執(zhí)行以下公式的過程:

???? 這里有個(gè)問題,就是在標(biāo)準(zhǔn)化之后為什么又做了個(gè)scale and shift的變換。從作者在論文中的表述看,認(rèn)為每一層都做BN之后可能會(huì)導(dǎo)致網(wǎng)絡(luò)的表征能力下降,所以這里增加兩個(gè)調(diào)節(jié)參數(shù)(scale和shift),對(duì)變換之后的結(jié)果進(jìn)行反變換,彌補(bǔ)網(wǎng)絡(luò)的表征能力。
???? BN不僅原理上說的通,但關(guān)鍵還是效果好。BN大大緩解了梯度消失問題,提升了訓(xùn)練速度,模型準(zhǔn)確率也得到提升,另外BN還有輕微的正則化效果。

參考資料:
英文原文:https://medium.com/visionwizard/object-tracking-675d7a33e687
往期精彩回顧
獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開:
https://t.zsxq.com/y7uvZF6
本站qq群704220115。
加入微信群請(qǐng)掃碼:
