dropout正則化技術(shù)介紹
推薦 + 挑錯(cuò) + 收藏(0) + 用戶(hù)評(píng)論(0)
?
dropout技術(shù)是神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)模型的一種簡(jiǎn)單而有效的正則化方式。
本文將向你介紹dropout正則化技術(shù),并且教你如何在Keras中用Python將其應(yīng)用于你的模型。
讀完本文之后,你將了解:
dropout正則化的原理如何在輸入層使用dropout如何在隱藏層使用dropout如何針對(duì)具體問(wèn)題對(duì)dropout調(diào)優(yōu)
神經(jīng)網(wǎng)絡(luò)的Dropout正則化
Dropout是Srivastava等人在2014年的一篇論文中提出的一種針對(duì)神經(jīng)網(wǎng)絡(luò)模型的正則化方法 Dropout: A Simple Way to Prevent Neural Networks from Overfitting。
Dropout的做法是在訓(xùn)練過(guò)程中隨機(jī)地忽略一些神經(jīng)元。這些神經(jīng)元被隨機(jī)地“拋棄”了。也就是說(shuō)它們?cè)谡騻鞑ミ^(guò)程中對(duì)于下游神經(jīng)元的貢獻(xiàn)效果暫時(shí)消失了,反向傳播時(shí)該神經(jīng)元也不會(huì)有任何權(quán)重的更新。
隨著神經(jīng)網(wǎng)絡(luò)模型不斷地學(xué)習(xí),神經(jīng)元的權(quán)值會(huì)與整個(gè)網(wǎng)絡(luò)的上下文相匹配。神經(jīng)元的權(quán)重針對(duì)某些特征進(jìn)行調(diào)優(yōu),具有一些特殊化。周?chē)纳窠?jīng)元?jiǎng)t會(huì)依賴(lài)于這種特殊化,如果過(guò)于特殊化,模型會(huì)因?yàn)閷?duì)訓(xùn)練數(shù)據(jù)過(guò)擬合而變得脆弱不堪。神經(jīng)元在訓(xùn)練過(guò)程中的這種依賴(lài)于上下文的現(xiàn)象被稱(chēng)為復(fù)雜的協(xié)同適應(yīng)(complex co-adaptations)。
你可以想象一下,如果在訓(xùn)練過(guò)程中隨機(jī)丟棄網(wǎng)絡(luò)的一部分,那么其它神經(jīng)元將不得不介入,替代缺失神經(jīng)元的那部分表征,為預(yù)測(cè)結(jié)果提供信息。人們認(rèn)為這樣網(wǎng)絡(luò)模型可以學(xué)到多種相互獨(dú)立的內(nèi)部表征。
這么做的效果就是,網(wǎng)絡(luò)模型對(duì)神經(jīng)元特定的權(quán)重不那么敏感。這反過(guò)來(lái)又提升了模型的泛化能力,不容易對(duì)訓(xùn)練數(shù)據(jù)過(guò)擬合。
Keras的Dropout 正則化
Dropout的實(shí)現(xiàn)很簡(jiǎn)單,在每輪權(quán)重更新時(shí)隨機(jī)選擇一定比例(比如20%)的節(jié)點(diǎn)拋棄。Keras的Dropout也是這么實(shí)現(xiàn)的。Dropout技術(shù)只在模型訓(xùn)練的階段使用,在評(píng)估模型性能的時(shí)候不需使用。
接下來(lái)我們看看Dropout在Keras中的一些不同用法。
本例子使用了聲吶數(shù)據(jù)集(Sonar dataset)。這是一個(gè)二分類(lèi)問(wèn)題,目的是根據(jù)聲吶的回聲來(lái)正確地區(qū)分巖石和礦區(qū)。這個(gè)數(shù)據(jù)集非常適合神經(jīng)網(wǎng)絡(luò)模型,因?yàn)樗械妮斎攵际菙?shù)值型的,且具有相同的量綱。
數(shù)據(jù)集可以從UCI機(jī)器學(xué)習(xí)代碼庫(kù)下載。然后把聲吶數(shù)據(jù)集放在當(dāng)前工作路徑下,文件命名為sonar.csv。
我們會(huì)用scikit-learn來(lái)評(píng)價(jià)模型質(zhì)量,為了更好地挑揀出結(jié)果的差異,采用了十折交叉驗(yàn)證(10-fold cross validation)方法。
每條數(shù)據(jù)有60個(gè)輸入值和1個(gè)輸出值,輸入值在送入模型前做了歸一化。基準(zhǔn)的神經(jīng)網(wǎng)絡(luò)模型有兩個(gè)隱藏層,第一層有60個(gè)節(jié)點(diǎn),第二層有30個(gè)。使用了隨機(jī)梯度下降的方法來(lái)訓(xùn)練模型,選用了較小的學(xué)習(xí)率和沖量。
完整的基準(zhǔn)模型代碼如下所示。
importnumpy importpandas fromkeras.models importSequential fromkeras.layers importDense fromkeras.layers importDropout fromkeras.wrappers.scikit_learn importKerasClassifier fromkeras.constraints importmaxnorm fromkeras.optimizers importSGD fromsklearn.cross_validation importcross_val_score fromsklearn.preprocessing importLabelEncoder fromsklearn.cross_validation importStratifiedKFold fromsklearn.preprocessing importStandardScaler fromsklearn.grid_search importGridSearchCV fromsklearn.pipeline importPipeline fromsklearn.grid_search importGridSearchCV # fix random seed for reproducibilityseed = 7numpy.random.seed(seed) # load datasetdataframe = pandas.read_csv(“sonar.csv”, header=None) dataset = dataframe.values # split into input (X) and output (Y) variablesX = dataset[:,0:60].astype(float) Y = dataset[:,60] # encode class values as integersencoder = LabelEncoder() encoder.fit(Y) encoded_Y = encoder.transform(Y) # baselinedefcreate_baseline():# create modelmodel = Sequential() model.add(Dense(60, input_dim=60, init=‘normal’, activation=‘relu’)) model.add(Dense(30, init=‘normal’, activation=‘relu’)) model.add(Dense(1, init=‘normal’, activation=‘sigmoid’)) # Compile modelsgd = SGD(lr=0.01, momentum=0.8, decay=0.0, nesterov=False) model.compile(loss=‘binary_crossentropy’, optimizer=sgd, metrics=[‘a(chǎn)ccuracy’]) returnmodel numpy.random.seed(seed) estimators = [] estimators.append((‘standardize’, StandardScaler())) estimators.append((‘mlp’, KerasClassifier(build_fn=create_baseline, nb_epoch=300, batch_size=16, verbose=0))) pipeline = Pipeline(estimators) kfold = StratifiedKFold(y=encoded_Y, n_folds=10, shuffle=True, random_state=seed) results = cross_val_score(pipeline, X, encoded_Y, cv=kfold) print(“Accuracy: %.2f%% (%.2f%%)”% (results.mean()*100, results.std()*100))
運(yùn)行代碼,分類(lèi)的準(zhǔn)確率大概為82%。
Accuracy: 82.68% (3.90%)
在可見(jiàn)層使用Dropout
Dropout可用于輸入神經(jīng)元,即可見(jiàn)層。
在下面這個(gè)例子里,我們?cè)谳斎耄梢?jiàn)層)和第一個(gè)隱藏層之間加入一層Dropout。丟棄率設(shè)為20%,就是說(shuō)每輪迭代時(shí)每五個(gè)輸入值就會(huì)被隨機(jī)拋棄一個(gè)。
另外,正如Dropout那篇論文中所推薦的,每個(gè)隱藏層的權(quán)重值都做了限制,確保權(quán)重范數(shù)的最大值不超過(guò)3。在構(gòu)建模型層的時(shí)候,可以通過(guò)設(shè)置Dense Class的W_constraint參數(shù)實(shí)現(xiàn)。
學(xué)習(xí)率提高了一個(gè)數(shù)量級(jí),沖量增加到0.9。這也是那篇Dropout論文的原文中所推薦的做法。
順著上面基準(zhǔn)模型的例子,下面的代碼是包含輸入層dropout的網(wǎng)絡(luò)模型。
# dropout in the input layer with weight constraintdefcreate_model1():# create modelmodel = Sequential() model.add(Dropout(0.2, input_shape=(60,))) model.add(Dense(60, init=‘normal’, activation=‘relu’, W_constraint=maxnorm(3))) model.add(Dense(30, init=‘normal’, activation=‘relu’, W_constraint=maxnorm(3))) model.add(Dense(1, init=‘normal’, activation=‘sigmoid’)) # Compile modelsgd = SGD(lr=0.1, momentum=0.9, decay=0.0, nesterov=False) model.compile(loss=‘binary_crossentropy’, optimizer=sgd, metrics=[‘a(chǎn)ccuracy’]) returnmodel numpy.random.seed(seed) estimators = [] estimators.append((‘standardize’, StandardScaler())) estimators.append((‘mlp’, KerasClassifier(build_fn=create_model1, nb_epoch=300, batch_size=16, verbose=0))) pipeline = Pipeline(estimators) kfold = StratifiedKFold(y=encoded_Y, n_folds=10, shuffle=True, random_state=seed) results = cross_val_score(pipeline, X, encoded_Y, cv=kfold) print(“Accuracy: %.2f%% (%.2f%%)”% (results.mean()*100, results.std()*100))
運(yùn)行這段代碼,分類(lèi)準(zhǔn)確率完美地提升到了86%。
Accuracy: 86.04% (6.33%)
在隱藏層使用Dropout
Dropout也可用于模型內(nèi)的隱藏層節(jié)點(diǎn)。
下面這個(gè)例子里,Dropout被用于兩個(gè)隱藏層之間和隱藏層與輸出層之間。丟棄率同樣設(shè)為20%,且使用權(quán)重限制。
# dropout in hidden layers with weight constraintdefcreate_model2():# create modelmodel = Sequential() model.add(Dense(60, input_dim=60, init=‘normal’, activation=‘relu’, W_constraint=maxnorm(3))) model.add(Dropout(0.2)) model.add(Dense(30, init=‘normal’, activation=‘relu’, W_constraint=maxnorm(3))) model.add(Dropout(0.2)) model.add(Dense(1, init=‘normal’, activation=‘sigmoid’)) # Compile modelsgd = SGD(lr=0.1, momentum=0.9, decay=0.0, nesterov=False) model.compile(loss=‘binary_crossentropy’, optimizer=sgd, metrics=[‘a(chǎn)ccuracy’]) returnmodel numpy.random.seed(seed) estimators = [] estimators.append((‘standardize’, StandardScaler())) estimators.append((‘mlp’, KerasClassifier(build_fn=create_model2, nb_epoch=300, batch_size=16, verbose=0))) pipeline = Pipeline(estimators) kfold = StratifiedKFold(y=encoded_Y, n_folds=10, shuffle=True, random_state=seed) results = cross_val_score(pipeline, X, encoded_Y, cv=kfold) print(“Accuracy: %.2f%% (%.2f%%)”% (results.mean()*100, results.std()*100))
我們觀察到,對(duì)于這個(gè)問(wèn)題以及所設(shè)置的模型配置參數(shù),在隱藏層使用dropout并不能提升模型效果。事實(shí)上,效果反而比基準(zhǔn)更差。
有可能需要增加訓(xùn)練迭代次數(shù),或者是更多地調(diào)優(yōu)學(xué)習(xí)率。
Accuracy: 82.16% (6.16%)
使用Dropout的小技巧
提出Dropout的那篇論文提供了一些在標(biāo)準(zhǔn)機(jī)器學(xué)習(xí)問(wèn)題上得到的實(shí)踐性結(jié)論。這些結(jié)論在dropout的實(shí)際應(yīng)用中會(huì)帶來(lái)幫助。
通常丟棄率控制在20%~50%比較好,可以從20%開(kāi)始嘗試。如果比例太低則起不到效果,比例太高則會(huì)導(dǎo)致模型的欠學(xué)習(xí)。在大的網(wǎng)絡(luò)模型上應(yīng)用。當(dāng)dropout用在較大的網(wǎng)絡(luò)模型時(shí)更有可能得到效果的提升,模型有更多的機(jī)會(huì)學(xué)習(xí)到多種獨(dú)立的表征。在輸入層(可見(jiàn)層)和隱藏層都使用dropout。在每層都應(yīng)用dropout被證明會(huì)取得好的效果。增加學(xué)習(xí)率和沖量。把學(xué)習(xí)率擴(kuò)大10~100倍,沖量值調(diào)高到0.9~0.99.限制網(wǎng)絡(luò)模型的權(quán)重。大的學(xué)習(xí)率往往導(dǎo)致大的權(quán)重值。對(duì)網(wǎng)絡(luò)的權(quán)重值做最大范數(shù)正則化等方法被證明會(huì)提升效果。
有關(guān)Dropout的更多資源
下面這些資料也是關(guān)于dropout在神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)模型中應(yīng)用。
Dropout: A Simple Way to Prevent Neural Networks from Overfitting(原論文)Improving neural networks by preventing co-adaptation of feature detectors.How does the dropout method work in deep learning?來(lái)自Quora
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%
下載地址
dropout正則化技術(shù)介紹下載
相關(guān)電子資料下載
- 深度學(xué)習(xí)在工業(yè)缺陷檢測(cè)中的應(yīng)用 63
- 探討目前主流3D激光SLAM算法方案 94
- 華為成為中國(guó)首個(gè)PyTorch基金會(huì)Premier會(huì)員 453
- 《人工智能在指揮和控制系統(tǒng)中的決策支持》 133
- 中國(guó)手機(jī)廠商發(fā)力這一領(lǐng)域 外媒:大戲剛剛開(kāi)始 262
- 百度智能云推出國(guó)內(nèi)首個(gè)大模型全鏈路生態(tài)支持體系 251
- 人工智能領(lǐng)域存在第一性原理嗎? 53
- 基于機(jī)器視覺(jué)檢測(cè)技術(shù)現(xiàn)狀 41
- 自動(dòng)駕駛規(guī)控決策方面的建議與解決方案 40
- 里程碑 主線(xiàn)科技無(wú)人集卡在舟山港開(kāi)啟全天候真無(wú)人常態(tài)化運(yùn)營(yíng) 166