和DeepMind數(shù)據(jù)科學(xué)家、Udacity深度學(xué)習(xí)導(dǎo)師Andrew Trask一起,基于Numpy手寫神經(jīng)網(wǎng)絡(luò),更深刻地理解dropout這一概念。
總結(jié):幾乎所有目前最先進(jìn)的神經(jīng)網(wǎng)絡(luò)都用到了dropout. 這篇教程介紹如何通過幾行Python代碼在神經(jīng)網(wǎng)絡(luò)中加入Dropout. 讀完這篇教程之后,你將得到一個可以工作的dropout實現(xiàn),并且掌握在任何神經(jīng)網(wǎng)絡(luò)中加入和調(diào)整dropout的技能。
如果你對我的文章感興趣,歡迎在推特上關(guān)注 @iamtrask,也歡迎給我反饋。
直接給我代碼
import numpy as np
X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
y = np.array([[0,1,1,0]]).T
alpha,hidden_dim,dropout_percent,do_dropout = (0.5,4,0.2,True)
synapse_0 = 2*np.random.random((3,hidden_dim)) - 1
synapse_1 = 2*np.random.random((hidden_dim,1)) - 1
for j in xrange(60000):
layer_1 = (1/(1+np.exp(-(np.dot(X,synapse_0)))))
if(do_dropout):
layer_1 *= np.random.binomial([np.ones((len(X),hidden_dim))],1-dropout_percent)[0] * (1.0/(1-dropout_percent))
layer_2 = 1/(1+np.exp(-(np.dot(layer_1,synapse_1))))
layer_2_delta = (layer_2 - y)*(layer_2*(1-layer_2))
layer_1_delta = layer_2_delta.dot(synapse_1.T) * (layer_1 * (1-layer_1))
synapse_1 -= (alpha * layer_1.T.dot(layer_2_delta))
synapse_0 -= (alpha * X.T.dot(layer_1_delta))
一、什么是dropout?
如同前一篇文章提到的,神經(jīng)網(wǎng)絡(luò)是一個美化的搜索問題。神經(jīng)網(wǎng)絡(luò)中的每一個節(jié)點搜索輸入數(shù)據(jù)和正確的輸出數(shù)據(jù)之間的相關(guān)性。
考慮前一篇中的圖片。曲線表示網(wǎng)絡(luò)對應(yīng)每個具體權(quán)重產(chǎn)生的誤差。曲線的低點(讀作:低誤差)標(biāo)志著權(quán)重“找到”輸入和輸出之間的關(guān)系。圖中的球標(biāo)志著不同的權(quán)重。它們都試圖找到低點。
考慮顏色。球的初始位置是隨機生成的(就像神經(jīng)網(wǎng)絡(luò)的權(quán)重)。如果兩個球隨機開始于同一顏色區(qū)域,那么它們將收斂于同一點。這里存在冗余!浪費算力和內(nèi)存!這正是神經(jīng)網(wǎng)絡(luò)中發(fā)生的事。
為何dropout:dropout有助于防止權(quán)重收斂于同一位置。它通過在前向傳播階段隨機關(guān)閉節(jié)點做到這一點。接著在反向傳播時激活所有節(jié)點。讓我們仔細(xì)看看。
二、如何加入和調(diào)整dropout?
為了在網(wǎng)絡(luò)層上執(zhí)行dropout,我們在前向傳播階段隨機設(shè)置層的值為0——見第10行。
第9行:參數(shù)化是否使用dropout. 我們只打算在訓(xùn)練階段使用dropout. 不要在運行時使用dropout,也不要在測試數(shù)據(jù)集上使用dropout. 此外,這一行也意味著我們需要增大前向傳播的值。這與關(guān)閉的值的數(shù)目成正比。一個簡單的直覺是,如果你關(guān)閉一半的隱藏層,那么你需要加倍前向傳播的值,以正確補償輸出。感謝@karpathy指出這一點。
調(diào)整的最佳實踐
第4行:參數(shù)化dropout百分比。這影響關(guān)閉任何一個節(jié)點的概率。對隱藏層而言,較好的初始值設(shè)定是50%. 如果將dropout應(yīng)用于輸入層,最好不要超過25%.
Hinton主張在調(diào)整dropout的同時調(diào)整隱藏層的大小。首先關(guān)閉dropout,增加隱藏層尺寸,直到你完美地擬合了你的數(shù)據(jù)。接著,使用相同的隱藏層尺寸,開啟dropout進(jìn)行訓(xùn)練。這應(yīng)該是一個近乎最優(yōu)的配置。一旦結(jié)束訓(xùn)練,關(guān)閉dropout。萬歲!你有了一個可以工作的神經(jīng)網(wǎng)絡(luò)!
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4771瀏覽量
100714 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5500瀏覽量
121111
原文標(biāo)題:基于Numpy實現(xiàn)神經(jīng)網(wǎng)絡(luò):dropout
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論