在筆記 4 中,詳細(xì)闡述了機(jī)器學(xué)習(xí)中利用正則化防止過(guò)擬合的基本方法,對(duì) L1 和 L2 范數(shù)進(jìn)行了通俗的解釋。為了防止深度神經(jīng)網(wǎng)絡(luò)出現(xiàn)過(guò)擬合,除了給損失函數(shù)加上 L2 正則化項(xiàng)之外,還有一個(gè)很著名的方法——dropout.
廢話(huà)少說(shuō),咱們單刀直入正題。究竟啥是 dropout ? dropout 是指在神經(jīng)網(wǎng)絡(luò)訓(xùn)練的過(guò)程中,對(duì)所有神經(jīng)元按照一定的概率進(jìn)行消除的處理方式。在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時(shí),dropout 能夠在很大程度上簡(jiǎn)化神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),防止神經(jīng)網(wǎng)絡(luò)過(guò)擬合。所以,從本質(zhì)上而言,dropout 也是一種神經(jīng)網(wǎng)絡(luò)的正則化方法。
假設(shè)我們要訓(xùn)練了一個(gè) 4 層(3個(gè)隱層)的神經(jīng)網(wǎng)絡(luò),該神經(jīng)網(wǎng)絡(luò)存在著過(guò)擬合。于是我們決定使用 dropout 方法來(lái)處理,dropout 為該網(wǎng)絡(luò)每一層的神經(jīng)元設(shè)定一個(gè)失活(drop)概率,在神經(jīng)網(wǎng)絡(luò)訓(xùn)練過(guò)程中,我們會(huì)丟棄一些神經(jīng)元節(jié)點(diǎn),在網(wǎng)絡(luò)圖上則表示為該神經(jīng)元節(jié)點(diǎn)的進(jìn)出連線(xiàn)被刪除。最后我們會(huì)得到一個(gè)神經(jīng)元更少、模型相對(duì)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò),這樣一來(lái)原先的過(guò)擬合情況就會(huì)大大的得到緩解。這樣說(shuō)似乎并沒(méi)有將 dropout 正則化原理解釋清楚,我們繼續(xù)深究一下:為什么 dropout 可以可以通過(guò)正則化發(fā)揮防止過(guò)擬合的功能?
因?yàn)?dropout 可以隨時(shí)隨機(jī)的丟棄任何一個(gè)神經(jīng)元,神經(jīng)網(wǎng)絡(luò)的訓(xùn)練結(jié)果不會(huì)依賴(lài)于任何一個(gè)輸入特征,每一個(gè)神經(jīng)元都以這種方式進(jìn)行傳播,并為神經(jīng)元的所有輸入增加一點(diǎn)權(quán)重,dropout 通過(guò)傳播所有權(quán)重產(chǎn)生類(lèi)似于 L2 正則化收縮權(quán)重的平方范數(shù)的效果,這樣的權(quán)重壓縮類(lèi)似于 L2 正則化的權(quán)值衰減,這種外層的正則化起到了防止過(guò)擬合的作用。
所以說(shuō),總體而言,dropout 的功能類(lèi)似于 L2 正則化,但又有所區(qū)別。另外需要注意的一點(diǎn)是,對(duì)于一個(gè)多層的神經(jīng)網(wǎng)絡(luò),我們的 dropout 某層神經(jīng)元的概率并不是一刀切的。對(duì)于不同神經(jīng)元個(gè)數(shù)的神經(jīng)網(wǎng)絡(luò)層,我們可以設(shè)置不同的失活或者保留概率,對(duì)于含有較多權(quán)值的層,我們可以選擇設(shè)置較大的失活概率(即較小的保留概率)。所以,總結(jié)來(lái)說(shuō)就是如果你擔(dān)心某些層所含神經(jīng)元較多或者比其他層更容易發(fā)生過(guò)擬合,我們可以將該層的失活概率設(shè)置的更高一些。
說(shuō)了這么多,總算大致把 dropout 說(shuō)明白了。那 dropout 這種操作在實(shí)際的 python 編程中該如何實(shí)現(xiàn)呢?以一個(gè)三層的神經(jīng)網(wǎng)絡(luò)為例,首先我們需要定義一個(gè) 3 層的 dropout 向量,然后將其與保留概率 keep-prob 進(jìn)行比較生成一個(gè)布爾值向量,再將其與該層的神經(jīng)元激活輸出值進(jìn)行乘積運(yùn)算,最后擴(kuò)展上一步的計(jì)算結(jié)果,將其除以 keep-prob 即可。但在實(shí)際編程中就沒(méi)說(shuō)的這么容易了,我們需要對(duì)整個(gè)神經(jīng)網(wǎng)絡(luò)的計(jì)算過(guò)程進(jìn)行重新定義,包括前向傳播和反向傳播的計(jì)算定義。
含 dropout 的前向計(jì)算定義如下:
def forward_propagation_with_dropout(X, parameters, keep_prob = 0.5):
np.random.seed(1) # retrieve parameters
W1 = parameters["W1"]
b1 = parameters["b1"]
W2 = parameters["W2"]
b2 = parameters["b2"]
W3 = parameters["W3"]
b3 = parameters["b3"] # LINEAR -> RELU -> LINEAR -> RELU -> LINEAR -> SIGMOID
Z1 = np.dot(W1, X) + b1
A1 = relu(Z1)
D1 = np.random.rand(A1.shape[0], A1.shape[1])
D1 = D1 < keep_prob ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?A1 = np.multiply(D1, A1) ? ? ? ? ? ? ? ? ? ? ? ?
? ?A1 = A1 / keep_prob ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?Z2 = np.dot(W2, A1) + b2
? ?A2 = relu(Z2)
? ?D2 = np.random.rand(A2.shape[0], A2.shape[1])
D2 = D2 < keep_prob ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?A2 = np.multiply(D2, A2) ? ? ? ? ? ? ? ? ? ? ?
? ?A2 = A2 / keep_prob ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?Z3 = np.dot(W3, A2) + b3
? ?A3 = sigmoid(Z3)
? ?cache = (Z1, D1, A1, W1, b1, Z2, D2, A2, W2, b2, Z3, A3, W3, b3) ? ?
return A3, cache
以上代碼基本體現(xiàn)了 dropout 的實(shí)現(xiàn)的四步流程。
含 dropout 的反向傳播計(jì)算定義如下:
def backward_propagation_with_dropout(X, Y, cache, keep_prob):
m = X.shape[1]
(Z1, D1, A1, W1, b1, Z2, D2, A2, W2, b2, Z3, A3, W3, b3) = cache
dZ3 = A3 - Y
dW3 = 1./m * np.dot(dZ3, A2.T)
db3 = 1./m * np.sum(dZ3, axis=1, keepdims = True)
dA2 = np.dot(W3.T, dZ3)
dA2 = np.multiply(dA2, D2)
dA2 = dA2 / keep_prob
dZ2 = np.multiply(dA2, np.int64(A2 > 0))
dW2 = 1./m * np.dot(dZ2, A1.T)
db2 = 1./m * np.sum(dZ2, axis=1, keepdims = True)
dA1 = np.dot(W2.T, dZ2)
dA1 = np.multiply(dA1, D1)
dA1 = dA1 / keep_prob
dZ1 = np.multiply(dA1, np.int64(A1 > 0))
dW1 = 1./m * np.dot(dZ1, X.T)
db1 = 1./m * np.sum(dZ1, axis=1, keepdims = True)
gradients = {"dZ3": dZ3, "dW3": dW3, "db3": db3,"dA2": dA2, "dZ2": dZ2, "dW2": dW2, "db2": db2, "dA1": dA1,
"dZ1": dZ1, "dW1": dW1, "db1": db1}
return gradients
在定義反向傳播計(jì)算函數(shù)時(shí),我們必須丟棄和執(zhí)行前向傳播時(shí)一樣的神經(jīng)元。
最后帶有 dropout 的分類(lèi)效果如下所示:
所以,總結(jié)而言,dropout 就是在正常的神經(jīng)網(wǎng)絡(luò)基礎(chǔ)上給每一層的每一個(gè)神經(jīng)元加了一道概率流程來(lái)隨機(jī)丟棄某些神經(jīng)元以達(dá)到防止過(guò)擬合的目的。
本文由《自興動(dòng)腦人工智能》項(xiàng)目部 凱文 投稿。
-
人工智能
+關(guān)注
關(guān)注
1792文章
47436瀏覽量
238981 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8425瀏覽量
132772 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5508瀏覽量
121295
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論