您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

dropout正則化技術(shù)介紹

大?。?/span>0.5 MB 人氣: 2017-10-10 需要積分:1

?

  dropout技術(shù)是神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)模型的一種簡單而有效的正則化方式。

  本文將向你介紹dropout正則化技術(shù),并且教你如何在Keras中用Python將其應(yīng)用于你的模型。

  讀完本文之后,你將了解:

  dropout正則化的原理如何在輸入層使用dropout如何在隱藏層使用dropout如何針對(duì)具體問題對(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)練過程中隨機(jī)地忽略一些神經(jīng)元。這些神經(jīng)元被隨機(jī)地“拋棄”了。也就是說它們?cè)谡騻鞑ミ^程中對(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),具有一些特殊化。周圍的神經(jīng)元?jiǎng)t會(huì)依賴于這種特殊化,如果過于特殊化,模型會(huì)因?yàn)閷?duì)訓(xùn)練數(shù)據(jù)過擬合而變得脆弱不堪。神經(jīng)元在訓(xùn)練過程中的這種依賴于上下文的現(xiàn)象被稱為復(fù)雜的協(xié)同適應(yīng)(complex co-adaptations)。

  你可以想象一下,如果在訓(xùn)練過程中隨機(jī)丟棄網(wǎng)絡(luò)的一部分,那么其它神經(jīng)元將不得不介入,替代缺失神經(jīng)元的那部分表征,為預(yù)測結(jié)果提供信息。人們認(rèn)為這樣網(wǎng)絡(luò)模型可以學(xué)到多種相互獨(dú)立的內(nèi)部表征。

  這么做的效果就是,網(wǎng)絡(luò)模型對(duì)神經(jīng)元特定的權(quán)重不那么敏感。這反過來又提升了模型的泛化能力,不容易對(duì)訓(xùn)練數(shù)據(jù)過擬合。

  Keras的Dropout 正則化

  Dropout的實(shí)現(xiàn)很簡單,在每輪權(quán)重更新時(shí)隨機(jī)選擇一定比例(比如20%)的節(jié)點(diǎn)拋棄。Keras的Dropout也是這么實(shí)現(xiàn)的。Dropout技術(shù)只在模型訓(xùn)練的階段使用,在評(píng)估模型性能的時(shí)候不需使用。

  接下來我們看看Dropout在Keras中的一些不同用法。

  本例子使用了聲吶數(shù)據(jù)集(Sonar dataset)。這是一個(gè)二分類問題,目的是根據(jù)聲吶的回聲來正確地區(qū)分巖石和礦區(qū)。這個(gè)數(shù)據(jù)集非常適合神經(jīng)網(wǎng)絡(luò)模型,因?yàn)樗械妮斎攵际菙?shù)值型的,且具有相同的量綱。

  數(shù)據(jù)集可以從UCI機(jī)器學(xué)習(xí)代碼庫下載。然后把聲吶數(shù)據(jù)集放在當(dāng)前工作路徑下,文件命名為sonar.csv。

  我們會(huì)用scikit-learn來評(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ī)梯度下降的方法來訓(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)行代碼,分類的準(zhǔn)確率大概為82%。

  Accuracy: 82.68% (3.90%)

  在可見層使用Dropout

  Dropout可用于輸入神經(jīng)元,即可見層。

  在下面這個(gè)例子里,我們?cè)谳斎耄梢妼樱┖偷谝粋€(gè)隱藏層之間加入一層Dropout。丟棄率設(shè)為20%,就是說每輪迭代時(shí)每五個(gè)輸入值就會(huì)被隨機(jī)拋棄一個(gè)。

  另外,正如Dropout那篇論文中所推薦的,每個(gè)隱藏層的權(quán)重值都做了限制,確保權(quán)重范數(shù)的最大值不超過3。在構(gòu)建模型層的時(shí)候,可以通過設(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)行這段代碼,分類準(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è)問題以及所設(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í)問題上得到的實(shí)踐性結(jié)論。這些結(jié)論在dropout的實(shí)際應(yīng)用中會(huì)帶來幫助。

  通常丟棄率控制在20%~50%比較好,可以從20%開始嘗試。如果比例太低則起不到效果,比例太高則會(huì)導(dǎo)致模型的欠學(xué)習(xí)。在大的網(wǎng)絡(luò)模型上應(yīng)用。當(dāng)dropout用在較大的網(wǎng)絡(luò)模型時(shí)更有可能得到效果的提升,模型有更多的機(jī)會(huì)學(xué)習(xí)到多種獨(dú)立的表征。在輸入層(可見層)和隱藏層都使用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?來自Quora

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?