【深度学习】深度学习两大基础Tricks:Dropout和BN详解
深度學習
Author:louwill
Machine Learning Lab
? ? ?
Dropout
???? dropout作為目前神經網絡訓練的一項必備技術,自從被Hinton提出以來,幾乎是進行深度學習訓練時的標配。就像做菜時必須加料酒一樣,無論何時,大家在使用全連接層的時候都會習慣性的在后面加上一個dropout層。通常情況下,dropout被作為一種防止神經網絡過擬合的正則化方法,對神經網絡的泛化性能有很大的幫助。每個人都會用dropout,但你真的理解它嗎?本節我們就來看看dropout里的一些關鍵細節問題。
???? dropout的概念相信大家都已熟稔在心了,是指在神經網絡訓練中,以一定的概率隨機地丟棄一部分神經元來簡化網絡的一項操作。本質上來說,dropout就是在正常的神經網絡基礎上給每一層的每一個神經元加了一道概率流程來隨機丟棄某些神經元以達到防止過擬合的目的。
???? 在keras中,dropout的實現只需要一行代碼:
from keras.layers import Dropout x = Dropout(0.5)(x)???? 但作為深度學習從業人員的你,在使用keras敲下這樣一行代碼時,你需要心里對其實現細節無比清晰才對。我們先來看一下包含dropout的神經網絡訓練過程,主要是前向傳播和反向傳播。先來看包含dropout的前向傳播過程。假設標準神經網絡前向傳播過程的數學描述為:
???? 使用一個參數為p的服從Bernoulli二項分布的隨機變量r,將這個隨機變量加入到標準神經網絡輸入中,那么帶有dropout的神經網絡可以描述為:
???? 這樣的數學描述簡潔明了,好像也沒什么特別注意的細節。我們以一層全連接網絡為例來看dropout的具體實現過程。
D1 = np.random.rand(A1.shape[0], A1.shape[1]) D1 = D1 < prob A1 = np.multiply(D1, A1) A1?=?A1?/?prob???????????????????????????????? 其中A1為上一層的輸出,D1為用隨機數生成的一組dropout向量,然后將其與保留概率prob做比較得到一個布爾向量,再將其與A1做乘積即可得到失活后的A1,按理說dropout到這里應該也就完成了,但最后還有一個將A1除以保留概率的操作。所以這里有個疑問,為什么在dropout之后還要做個rescale的除法?
???? 其實,這種實現dropout的方法也叫Inverted Dropout,是一種經典的dropout實現方法。先不說Inverted Dropout,我們來看正常dropout應該是怎樣的:當我們使用了dropout后,在模型訓練階段只有占比為p部分的神經元參與了訓練,那么在預測階段得到的結果會比實際平均要大1/p,所以在測試階段我們需要將輸出結果乘以p來保持輸出規模不變。這種原始的dropout實現方式也叫Vanilla Dropout。Vanilla操作有一個重大缺陷,那就是預測過程需要根據訓練階段所使用的dropout策略做調整,比較麻煩,所以一般情況下都不會使用這種方法。
???? 既如此,相必大家也知道了,我們目前用的都是Inverted Dropout方法,為了能夠在神經網絡訓練完成后安安心心的做預測,我們可以把全部心思都放在訓練階段,所有的設置都在訓練階段完成。所以為了保證神經網絡在丟棄掉一些神經元之后總體信號強度不變和預測結果穩定,也有一種說法叫保證Bernoulli二項分布的數學期望不變,我們在Inverted Dropout方法中對dropout之后的做了除以p的rescale操作。
???? 反向傳播時同理,梯度計算時需要除以保留概率:
dA1 = np.multiply(dA1, D1) dA1 = dA1 / prob???? 這就是dropout最關鍵的一個細節問題,一般在深度學習崗位面試時面試官喜歡追著問其中的細節。值得注意一下。
???? 另一個細節問題在于dropout有一種類似集成學習的boosting思想在里面。神經網絡以1-p的概率丟棄某些神經元,當進行多次訓練時,因為隨機性每次訓練的都是不同的網絡,dropout使得神經網絡不依賴于某些獨立的特征,最后的結果也就是幾次訓練之后的平均結果,這些都使得神經網絡具備更好的泛化性能,也正是dropout能夠防止過擬合的主要原因。
???? dropout作為一項主流的神經網絡訓練trick,大家在使用時要知其然,更要知其所以然。
BatchNormalization
? ? ?深度神經網絡一直以來就有一個特點:隨著網絡加深,模型會越來越難以訓練。所以深度學習有一個非常本質性的問題:為什么隨著網絡加深,訓練會越來越困難?為了解決這個問題,學界業界也一直在嘗試各種方法。
???? sigmoid作為激活函數一個最大的問題會引起梯度消失現象,這使得神經網絡難以更新權重。使用ReLu激活函數可以有效的緩解這一問題。
???? 對神經網絡使用正則化方法也能對這個問題有所幫助,使用dropout來對神經網絡進行簡化,可以有效緩解神經網絡的過擬合問題,對于深度網絡的訓練也有一定的幫助。ResNet使用殘差塊和skip connection來解決這個問題,使得深度加深時網絡仍有較好的表現力。
? ? ? BN本質上也是一種解決深度神經網絡難以訓練問題的方法。
???? 機器學習的一個重要假設就是IID(Independent Identically Distributed)假設,即獨立同分布假設。所謂獨立同分布,就是指訓練數據和測試數據是近似于同分布的,如若不然,機器學習模型就會很難有較好的泛化性能。
???? 一個重要的觀點就是深度神經網絡在訓練過程中每一層的輸入并不滿足獨立同分布假設,當疊加的網絡層每一層的輸入分布都發生變化時,這使得神經網絡訓練難以收斂。這種神經網絡隱藏層輸入分布的不斷變化的現象就叫Internal Covariate Shift(ICS)。ICS問題正是導致深度神經網絡難以訓練的重要原因之一。
???? 一直在做鋪墊,還沒說到底什么是BN。Batch Normalization,簡稱BN,翻譯過來就是批標準化,因為這個Normalization是建立在Mini-Batch SGD的基礎之上的。BN是針對ICS問題而提出的一種解決方案。一句話來說,BN就是使得深度神經網絡訓練過程中每一層網絡輸入都保持相同分布。
???? 既然ICS問題表明神經網絡隱藏層輸入分布老是不斷變化,我們能否讓每個隱藏層輸入分布穩定下來?通常來說,數據標準化是將數據喂給機器學習模型之前一項重要的數據預處理技術,數據標準化也即將數據分布變換成均值為0,方差為1的標準正態分布,所以也叫0-1標準化。圖像處理領域的數據標準化也叫白化(whiten),當然,白化方法除了0-1標準化之外,還包括極大極小標準化方法。
???? 所以一個很關鍵的聯想就是能否將這種白化操作推廣到神經網絡的每一個隱藏層?答案當然是可以的。
???? ICS問題導致深度神經網絡訓練難以收斂,隱藏層輸入分布逐漸向非線性激活函數取值區間的兩端靠近,比如說sigmoid函數的兩端就是最大正值或者最小負值。這里說一下梯度飽和和梯度敏感的概念。當取值位于sigmoid函數的兩端時,即sigmoid取值接近0或1時,梯度接近于0,這時候就位于梯度飽和區,也就是容易產生梯度消失的區域,相應的梯度敏感就是梯度計算遠大于0,神經網絡反向傳播時每次都能使權重得到很好的更新。
???? 當梯度逐漸向這兩個區域靠近時,就會產生梯度爆炸或者梯度消失問題,這也是深度神經網絡難以訓練的根本原因。BN將白化操作應用到每一個隱藏層,對每個隱藏層輸入分布進行標準化變換,把每層的輸入分布都強行拉回到均值為0方差為1的標準正態分布。這樣一來,上一層的激活輸出值(即當前層的激活輸入值)就會落在非線性函數對輸入的梯度敏感區,遠離了原先的梯度飽和區,神經網絡權重易于更新,訓練速度相應加快。
???? 那么具體到實際應用時,BN操作應該放在哪里?以一個全連接網絡為例:
???? 可以看到,BN操作是對每一個隱藏層的激活輸出做標準化,即BN層位于隱藏層之后。對于Mini-Batch SGD來說,一次訓練包含了m個樣本,具體的BN變換就是執行以下公式的過程:
???? 這里有個問題,就是在標準化之后為什么又做了個scale and shift的變換。從作者在論文中的表述看,認為每一層都做BN之后可能會導致網絡的表征能力下降,所以這里增加兩個調節參數(scale和shift),對變換之后的結果進行反變換,彌補網絡的表征能力。
???? BN不僅原理上說的通,但關鍵還是效果好。BN大大緩解了梯度消失問題,提升了訓練速度,模型準確率也得到提升,另外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
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯獲取一折本站知識星球優惠券,復制鏈接直接打開:
https://t.zsxq.com/y7uvZF6
本站qq群704220115。
加入微信群請掃碼:
總結
以上是生活随笔為你收集整理的【深度学习】深度学习两大基础Tricks:Dropout和BN详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 指针都没搞懂,还能算得上 C++ 老司机
- 下一篇: 【推荐系统】面向科研的推荐系统Bench