和DeepMind數(shù)據(jù)科學(xué)家、Udacity深度學(xué)習(xí)導(dǎo)師Andrew Trask一起,基于Numpy手寫(xiě)神經(jīng)網(wǎng)絡(luò),更深刻地理解dropout這一概念。
總結(jié):幾乎所有目前最先進(jìn)的神經(jīng)網(wǎng)絡(luò)都用到了dropout. 這篇教程介紹如何通過(guò)幾行Python代碼在神經(jīng)網(wǎng)絡(luò)中加入Dropout. 讀完這篇教程之后,你將得到一個(gè)可以工作的dropout實(shí)現(xiàn),并且掌握在任何神經(jīng)網(wǎng)絡(luò)中加入和調(diào)整dropout的技能。
如果你對(duì)我的文章感興趣,歡迎在推特上關(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ò)是一個(gè)美化的搜索問(wèn)題。神經(jīng)網(wǎng)絡(luò)中的每一個(gè)節(jié)點(diǎn)搜索輸入數(shù)據(jù)和正確的輸出數(shù)據(jù)之間的相關(guān)性。
考慮前一篇中的圖片。曲線表示網(wǎng)絡(luò)對(duì)應(yīng)每個(gè)具體權(quán)重產(chǎn)生的誤差。曲線的低點(diǎn)(讀作:低誤差)標(biāo)志著權(quán)重“找到”輸入和輸出之間的關(guān)系。圖中的球標(biāo)志著不同的權(quán)重。它們都試圖找到低點(diǎn)。
考慮顏色。球的初始位置是隨機(jī)生成的(就像神經(jīng)網(wǎng)絡(luò)的權(quán)重)。如果兩個(gè)球隨機(jī)開(kāi)始于同一顏色區(qū)域,那么它們將收斂于同一點(diǎn)。這里存在冗余!浪費(fèi)算力和內(nèi)存!這正是神經(jīng)網(wǎng)絡(luò)中發(fā)生的事。
為何dropout:dropout有助于防止權(quán)重收斂于同一位置。它通過(guò)在前向傳播階段隨機(jī)關(guān)閉節(jié)點(diǎn)做到這一點(diǎn)。接著在反向傳播時(shí)激活所有節(jié)點(diǎn)。讓我們仔細(xì)看看。
二、如何加入和調(diào)整dropout?
為了在網(wǎng)絡(luò)層上執(zhí)行dropout,我們?cè)谇跋騻鞑ルA段隨機(jī)設(shè)置層的值為0——見(jiàn)第10行。
第9行:參數(shù)化是否使用dropout. 我們只打算在訓(xùn)練階段使用dropout. 不要在運(yùn)行時(shí)使用dropout,也不要在測(cè)試數(shù)據(jù)集上使用dropout. 此外,這一行也意味著我們需要增大前向傳播的值。這與關(guān)閉的值的數(shù)目成正比。一個(gè)簡(jiǎn)單的直覺(jué)是,如果你關(guān)閉一半的隱藏層,那么你需要加倍前向傳播的值,以正確補(bǔ)償輸出。感謝@karpathy指出這一點(diǎn)。
調(diào)整的最佳實(shí)踐
第4行:參數(shù)化dropout百分比。這影響關(guān)閉任何一個(gè)節(jié)點(diǎn)的概率。對(duì)隱藏層而言,較好的初始值設(shè)定是50%. 如果將dropout應(yīng)用于輸入層,最好不要超過(guò)25%.
Hinton主張?jiān)谡{(diào)整dropout的同時(shí)調(diào)整隱藏層的大小。首先關(guān)閉dropout,增加隱藏層尺寸,直到你完美地?cái)M合了你的數(shù)據(jù)。接著,使用相同的隱藏層尺寸,開(kāi)啟dropout進(jìn)行訓(xùn)練。這應(yīng)該是一個(gè)近乎最優(yōu)的配置。一旦結(jié)束訓(xùn)練,關(guān)閉dropout。萬(wàn)歲!你有了一個(gè)可以工作的神經(jīng)網(wǎng)絡(luò)!
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4806瀏覽量
102697 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5554瀏覽量
122444
原文標(biāo)題:基于Numpy實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò):dropout
文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
labview BP神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)
【PYNQ-Z2試用體驗(yàn)】神經(jīng)網(wǎng)絡(luò)基礎(chǔ)知識(shí)
【案例分享】ART神經(jīng)網(wǎng)絡(luò)與SOM神經(jīng)網(wǎng)絡(luò)
人工神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)方法有哪些?
如何構(gòu)建神經(jīng)網(wǎng)絡(luò)?
matlab實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò) 精選資料分享
使用keras搭建神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)基于深度學(xué)習(xí)算法的股票價(jià)格預(yù)測(cè)
基于Numpy實(shí)現(xiàn)同態(tài)加密神經(jīng)網(wǎng)絡(luò)

基于Numpy實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò):反向傳播

如何使用numpy搭建一個(gè)卷積神經(jīng)網(wǎng)絡(luò)詳細(xì)方法和程序概述
如何使用Numpy搭建神經(jīng)網(wǎng)絡(luò)

評(píng)論