<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【深度學(xué)習(xí)】深度學(xué)習(xí)兩大基礎(chǔ)Tricks:Dropout和BN詳解

          共 4439字,需瀏覽 9分鐘

           ·

          2020-10-31 21:33

          深度學(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 < prob                                A1 = 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還有輕微的正則化效果。



          參考資料:

          Nitish Srivastava, Geoffrey Hinton, Alex Krizhevsky, Ilya Sutskever, Ruslan Salakhutdinov; 15(Jun):1929?1958, 2014.
          Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.
          https://www.cnblogs.com/guoyaohua/p/8724433.html

          英文原文:https://medium.com/visionwizard/object-tracking-675d7a33e687

          往期精彩回顧





          獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開:

          https://t.zsxq.com/y7uvZF6

          本站qq群704220115。

          加入微信群請(qǐng)掃碼:

          瀏覽 60
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产经典的三级字在线播放 | 水蜜桃网站 | 国产AV资源 | 国产亚洲大屌视频 | 国产成人精品午夜精品 |