用Keras進行深度學習模式的正則化方法:Dropout

2021-02-13 機器AI學習 數據AI挖掘
想了解更多好玩的人工智慧應用,請關注公眾號「機器AI學習 數據AI挖掘」,」智能應用"菜單中包括:顏值檢測、植物花卉識別、文字識別、人臉美妝等有趣的智能應用。。

Dropout是神經網絡和深度學習模型的簡單而有效的正則化技術。

在這篇文章中,你將發現Dropout正則化技術,以及如何使用Keras將其應用於Python中的模型。

看完這篇文章後,你會知道:

Dropout正則化的原理。

如何在輸入層上使用Dropout。

如何在隱藏的層上使用Dropout。

如何根據問題調整Dropout。

讓我們開始吧。

神經網絡的Dropout正則化

Dropout是由Srivastava等人在2014年的一篇論文中提出的一種針對神經網絡模型的正則化方法「Dropout: A Simple Way to Prevent Neural Networks from Overfitting」(下載PDF)。

Dropout是在訓練期間隨機選擇的一些神經元忽略的技術。他們隨機「Dropout」。這意味著它們對下遊神經元的激活的貢獻暫時消除,並且在反向過程沒有實施任何權重的更新。

隨著神經網絡學習,神經元的權重會與網絡上下文適應。神經元的權重為特定的特性提供一些專門化的調整。相鄰的神經元變得依賴於這種專業化,如果過度使用,會導致這種過度專業化的模型脆弱不堪,無法訓練數據。神經元在訓練過程中的這種依賴上下文的現象被稱為複雜的協同適應(complex co-adaptations)。

你可以想像,如果神經元在訓練期間被隨機地從網絡中捨棄,那麼其他的神經元將不得不介入並處理對缺失的神經元做出預測所需要的表徵。這被認為可以讓網絡學習到多個獨立的內部表徵。

它的效果是讓網絡對神經元的特定權重變得不那麼敏感。讓網絡能夠更好地泛化,並且很少過擬合訓練數據。

Keras中的Dropout正則化

每輪權重更新,以給定的概率(例如20%)從隨機選擇的節點中捨棄,這個過程很容易實現。這就是在Keras中實現Dropout。Dropout僅在訓練模型時使用,在評估模型的技能時不使用。

接下來我們將探討在Keras中使用Dropout的幾種不同方法。

這些例子將使用Sonar數據集。這是二分類問題,其目標是用聲納的回聲正確識別巖石和礦。它是神經網絡的一個很好的測試數據集,因為所有的輸入值都是數字型,並且具有相同的量綱。

數據集可以從UCI Machine Learning庫下載。你可以將聲納數據集放在當前的工作目錄中,文件名為sonar.csv。

我們將使用scikit-learning的10次折交叉驗證來評估開發的模型,以便更好地梳理結果的差異。

有60個輸入值和一個輸出值,輸入值在網絡使用前被歸一化。基準神經網絡模型有兩個隱藏層,第一個為60個節點,第二個為30個。使用隨機梯度下降以較低的學習率和動量對模型進行訓練。

完整的基準模型如下所示。

01# Baseline Model on the Sonar Dataset03from pandasimport read_csv04from keras.modelsimport Sequential05from keras.layersimport Dense06from keras.layersimport Dropout07from keras.wrappers.scikit_learnimport KerasClassifier08from keras.constraintsimport maxnorm09from keras.optimizersimport SGD10from sklearn.model_selectionimport cross_val_score11from sklearn.preprocessingimport LabelEncoder12from sklearn.model_selectionimport StratifiedKFold13from sklearn.preprocessingimport StandardScaler14from sklearn.pipelineimport Pipeline15# fix random seed for reproducibility17numpy.random.seed(seed)19dataframe= read_csv("sonar.csv", header=None)20dataset= dataframe.values21# split into input (X) and output (Y) variables22X= dataset[:,0:60].astype(float)24# encode class values as integers25encoder= LabelEncoder()27encoded_Y= encoder.transform(Y)32    model= Sequential()33    model.add(Dense(60, input_dim=60, kernel_initializer='normal', activation='relu'))34    model.add(Dense(30, kernel_initializer='normal', activation='relu'))35    model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))37    sgd= SGD(lr=0.01, momentum=0.8, decay=0.0, nesterov=False)38    model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])41numpy.random.seed(seed)43estimators.append(('standardize', StandardScaler()))44estimators.append(('mlp', KerasClassifier(build_fn=create_baseline, epochs=300, batch_size=16, verbose=0)))45pipeline= Pipeline(estimators)46kfold= StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)47results= cross_val_score(pipeline, X, encoded_Y, cv=kfold)48print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

運行示例,生成的估計分類準確度是86%。

在可見層上使用Dropout

Dropout應用於輸入的神經元稱為可見層。

在下面的示例中,我們在輸入(或者說可見層)和第一個隱藏層之間添加一個新層Dropout。捨棄率設置為20%,這意味著從每個更新周期中隨機排除5個輸入中的一個。

另外,按照關於Dropout的原始文章中的建議,對每個隱藏層的權重加了限制,確保權重的最大值不超過3。這可以通過在構造層時設置Dense class中的kernel_constraint參數實現。

學習率提升一個數量級,momentum上升到0.9。這些增加的學習率的方法也是在原來的Dropout論文中推薦的。

繼續從上面的基準示例,下面的代碼練習與相同的輸入Dropout網絡。

01# dropout in the input layer with weight constraint04    model= Sequential()05    model.add(Dropout(0.2, input_shape=(60,)))06    model.add(Dense(60, kernel_initializer='normal', activation='relu', kernel_constraint=maxnorm(3)))07    model.add(Dense(30, kernel_initializer='normal', activation='relu', kernel_constraint=maxnorm(3)))08    model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))10    sgd= SGD(lr=0.1, momentum=0.9, decay=0.0, nesterov=False)11    model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])14numpy.random.seed(seed)16estimators.append(('standardize', StandardScaler()))17estimators.append(('mlp', KerasClassifier(build_fn=create_model, epochs=300, batch_size=16, verbose=0)))18pipeline= Pipeline(estimators)19kfold= StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)20results= cross_val_score(pipeline, X, encoded_Y, cv=kfold)21print("Visible: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

運行示例,生成的估計分類準確度下降到83.5%。

在隱藏層中使用Dropout

Dropout也可用於模型內的隱藏層節點

在下面的示例中,Dropout應用於兩個隱藏層之間以及最後一個隱藏層和輸出層之間。再次使用20%的輟學率,就像這些層的權重約束一樣。??????

01# dropout in hidden layers with weight constraint04    model= Sequential()05    model.add(Dense(60, input_dim=60, kernel_initializer='normal', activation='relu', kernel_constraint=maxnorm(3)))06    model.add(Dropout(0.2))07    model.add(Dense(30, kernel_initializer='normal', activation='relu', kernel_constraint=maxnorm(3)))08    model.add(Dropout(0.2))09    model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))11    sgd= SGD(lr=0.1, momentum=0.9, decay=0.0, nesterov=False)12    model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])15numpy.random.seed(seed)17estimators.append(('standardize', StandardScaler()))18estimators.append(('mlp', KerasClassifier(build_fn=create_model, epochs=300, batch_size=16, verbose=0)))19pipeline= Pipeline(estimators)20kfold= StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)21results= cross_val_score(pipeline, X, encoded_Y, cv=kfold)22print("Hidden: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

我們可以看到,對於這個問題,以及使用隱藏層中的Dropout網絡配置並沒有提升性能。事實上,表現比基線差。

可能需要額外的訓練次數,或者需要進一步調整學習率。

使用Dropout的提示??

關於Dropout的原始論文提供了一套標準機器學習問題的實驗結果。因此,他們在實踐中提供了一些有用的啟發式來考慮使用輟學。

通常,使用20%-50%的捨棄率比較好。一個概率太低,沒什麼效果,概率太高會導致網絡的學習不充分。

Dropout被使用在大型網絡中可能會有更好的表現,有更多機會學習獨立表徵。

在輸入層和隱藏層都使用Dropout已經證明效果不錯。

使用大的學習率與衝量,學習率擴大10~100倍,衝量值調到0.9~0.99。

限制網絡權重的大小。大的學習率可能導致過大的網絡權重。對網絡權重的大小施加約束,可以改善結果。

總結

在這篇文章中,你發現了深度學習模型的Dropout正則化技術。你學了:

Dropout的含義和原理。

如何在自己的深度學習模式使用Dropout。

使用Dropout達到最好效果的技巧。

相關焦點

  • 基於Keras/Python的深度學習模型Dropout正則項
    dropout技術是神經網絡和深度學習模型的一種簡單而有效的正則化方式。
  • 深度學習筆記5:正則化與dropout
    在筆記 4 中,詳細闡述了機器學習中利用正則化防止過擬合的基本方法,對 L1 和 L2 範數進行了通俗的解釋。為了防止深度神經網絡出現過擬合,除了給損失函數加上 L2 正則化項之外,還有一個很著名的方法——dropout.       廢話少說,咱們單刀直入正題。究竟啥是 dropout ?
  • AMS機器學習課程:Keras深度學習 - 卷積神經網絡正則化
    github.com/djgagne/ams-ml-python-course/blob/master/module_3/ML_Short_Course_Module_3_Deep_Learning.ipynbDavid John Gagne, National Center for Atmospheric Research本文接上一篇文章《AMS機器學習課程:Keras深度學習
  • 深度學習(二十二)Dropout淺層理解與實現
    Dropout是2012年深度學習視覺領域的開山之作paper:《ImageNet Classification with Deep Convolutional》所提到的算法,用於防止過擬合。在我剛入門深度學習,搞視覺的時候,就有所耳聞,當時只知道它是為了防止過擬合。
  • 神經網絡的正則化(代碼篇)
    為了將AI知識體系以最簡單的方式呈現給你,從這個星期開始,芯君邀請AI專業人士開設「周末學習課堂」——每周就AI學習中的一個重點問題進行深度分析,課程會分為理論篇和代碼篇,理論與實操,一個都不能少!來,退出讓你廢寢忘食的遊戲頁面,取消只有胡吃海塞的周末聚會吧。
  • TensorFlow(Keras)中的正則化技術及其實現(附代碼)
    了解用於緩解深度神經網絡內過度擬合問題的常規技術。正則化深度神經網絡(DNN)在體系結構內部具有大量的權重參數,可以學習一系列值。這些值的範圍是使神經網絡能夠解決龐大的複雜功能的關鍵。過度擬合:此問題涉及算法過於精確地預測在訓練過程中觀察和學習到的模式實例,從而預測向其呈現的模式的新實例。這可能導致機器學習算法無法準確地推廣到看不見的數據。如果訓練數據不能準確表示測試數據的分布,則可能會發生過度擬合。
  • 深度學習第17講:keras入門和快速上手指南
    作者:魯偉一個數據科學踐行者的學習日記。
  • 理解神經網絡中的Dropout
    dropout是指在深度學習網絡的訓練過程中,對於神經網絡單元,按照一定的概率將其暫時從網絡中丟棄。注意是暫時,對於隨機梯度下降來說,由於是隨機丟棄,故而每一個mini-batch都在訓練不同的網絡。
  • 深度學習中Dropout原理解析
    過擬合是很多機器學習的通病。如果模型過擬合,那麼得到的模型幾乎不能用。為了解決過擬合問題,一般會採用模型集成的方法,即訓練多個模型進行組合。此時,訓練模型費時就成為一個很大的問題,不僅訓練多個模型費時,測試多個模型也是很費時。
  • 入門 | 深度學習模型的簡單優化技巧
    ,包括遷移學習、dropout、學習率調整等,並展示了如何用 Keras 實現。深度學習技術以下是一些通過預訓練模型來改善擬合時間和準確性的方法:研究理想的預訓練體系架構:了解遷移學習的好處,或了解一些功能強大的 CNN 體系架構。考慮那些看起來不太適合但具有潛在共享特性的領域。
  • 深度學習基礎(十):TensorFlow 2.x模型的驗證、正則化和回調
    前期文章連結:霍夫變換-形狀特徵提取算法:車道線檢測開源自動駕駛汽車數據集基於深度學習和神經網絡的重要基礎及方法概要深度學習背後的數學思想Tensorflow2實現YOLOv3目標檢測開發機器學習模型時的一個常見問題是過擬合。
  • 用 Keras 功能 API 進行深度學習
    Keras Python庫可快速輕鬆地創建深度學習模型。順序API允許您針對大多數問題逐層創建模型。它的局限性在於它不允許您創建共享圖層或具有多個輸入或輸出的模型。Keras中的功能性API是創建模型的替代方法,它提供了更大的靈活性,包括創建更複雜的模型。在本教程中,您將發現如何在Keras中使用更靈活的功能API來定義深度學習模型。
  • keras 教程
    通過輸入等號後面的內容可以針對不同的訓練任務進行不同的選擇。在完成配置過程之後,我們便可以用fit方法對模型進行訓練。該模型也將通過兩個損失函數進行監督學習。較早地在模型中使用主損失函數,是深度學習模型的一個良好正則方法。模型結構如下圖所示:
  • 筆記(乾貨):dropout原理總結
    深度學習架構現在變得越來越深,dropout作為一個防過擬合的手段,使用也越來越普遍。那麼,我們想問的是,什麼是dropout呢?dropout改變之前稠密網絡中,權重統一學習,參數統一更新的模式,提出在每次訓練迭代中,讓網絡中的部分參數得到學習,即部分參數得到更新,部分參數保持不更新。
  • Dropout也能自動化了,谷歌Quoc Le等人利用強化學習自動找尋模型專用Dropout
    研究者稱,通過強化學習來學習 Dropout 的規律,AutoDropout 可以提高圖像識別、語言理解和機器翻譯的性能。該研究已被人工智慧頂會 AAAI-2021 接收。現代神經網絡常常過參數化,因而需要適當的正則化來避免過擬合現象。Dropout 是一種常見的正則化方法,該方法從網絡的一些中間層中隨機選擇神經元,並將這些神經元的值替換為零。換言之,這些神經元被從當前訓練步中丟棄。
  • 神經網絡中的損失函數正則化和 Dropout 並手寫代碼實現
    在深度神經網絡中最常用的方法是Regularization和dropout。 在本文中,我們將一起理解這兩種方法並在python中實現它們Regularization 正則化正則化通過在損失函數的末尾添加額外的懲罰項來幫助防止模型過度擬合。
  • Dropout VS BN: 別在你的網絡中使用Dropout
    在towardsdatascience上的這篇文章《Don’t Use Dropout in Convolutional Networks》分析了Dropout的缺陷以及在Cifar100數據集上對Dropout層和BN層的性能進行了對比。翻譯的原文如下。Dropout.
  • 《Python深度學習》讀書筆記(下)
    但本章的這些深度學習模型都沒有像人類一樣真正地理解文本,而只是映射出書面語言的統計結構,但這足以解決許多簡單的文本任務。深度學習用於自然語言處理是將模式識別應用於單詞、句子和段落,這與計算機視覺是將模式識別應用於像素大致相同。首先,深度學習模型不會接收原始文本作為輸入,它只能處理數值張量。
  • 一文概覽深度學習中的五大正則化方法和七大優化策略
    選自arXiv 機器之心編譯 深度學習中的正則化與優化策略一直是非常重要的部分,它們很大程度上決定了模型的泛化與收斂等性能。本文主要以深度卷積網絡為例,探討了深度學習中的五項正則化與七項優化策略,並重點解釋了當前最為流行的 Adam 優化算法。
  • 手把手 | 教你在R中使用Keras和TensorFlow構建深度學習模型
    the model with 1 input layer[784 neurons], 1 hidden layer[784 neurons] with dropout rate 0.4 and 1 output layer[10 neurons]#i.e number of digits from 0 to 9model %>%layer_dense