使用 TensorFlow 進行深度學習中的模型驗證和正則化實踐介紹

已發表: 2020-10-28

目錄

介紹

機器通過監督學習算法的範式來吸收信息的實踐已經徹底改變了一些任務,如序列生成、自然語言處理甚至計算機視覺。 這種方法基於利用具有一組輸入特徵和一組相應標籤的數據集。 然後機器使用以特徵和標籤形式存在的這些信息來學習數據的分佈和模式,從而對看不見的輸入進行統計預測。

設計深度學習模型的一個重要步驟是評估模型性能,尤其是在新的和看不見的數據點上。 關鍵目標是開發超越訓練數據的模型。 我們需要能夠在現實世界中做出良好且可靠預測的模型。 幫助我們解決這個問題的一個重要概念是我們今天將介紹的模型驗證和正則化。

模型驗證

構建機器學習模型總是歸結為將可用數據分成三組:訓練、驗證和測試集。 模型使用訓練數據來學習分佈的怪癖和特徵。

這裡要知道的一個重點是,模型在訓練集上的令人滿意的表現並不意味著模型也會在具有相似性能的新數據上泛化,這是因為模型已經偏向於訓練集。 因此,驗證和測試集的概念用於報告模型對新數據點的泛化程度。

標準程序是使用訓練數據擬合模型,使用驗證數據評估模型性能,最後使用測試數據評估模型在全新示例上的表現。

驗證集用於調整超參數(隱藏層數、學習率、輟學率等) ,以便模型能夠很好地泛化。 機器學習新手面臨的一個常見難題是了解單獨驗證和測試集的需求。

對兩個不同集合的需求可以通過以下直覺來理解:對於每個需要設計的深度神經網絡,都存在多個需要調整以獲得令人滿意的性能的超參數。

可以使用任一超參數訓練多個模型,然後可以根據該模型在驗證集上的性能選擇具有最佳性能指標的模型。 現在,每次為了在驗證集上獲得更好的性能而調整超參數時,一些信息就會洩漏/輸入到模型中,因此,神經網絡的最終權重可能會偏向驗證集。

每次調整超參數後,我們的模型在驗證集上繼續表現良好,因為這是我們優化它的目的。 這就是驗證測試不能準確地表示模型的泛化能力的原因。 為了克服這個缺點,測試集開始發揮作用。

模型泛化能力的最準確表示是由測試集上的性能給出的,因為我們沒有優化模型以在該集上獲得更好的性能,因此,這將表明對模型能力的最實用估計。

必讀:您應該了解的頂級深度學習技術

使用 TensorFlow 2.0 實施驗證策略

TensorFlow 2.0 提供了一個非常簡單的解決方案,可以在單獨的保留驗證測試中跟踪我們模型的性能。 我們可以model.fit()方法中傳遞validation_split關鍵字參數

validation_split關鍵字輸入作為介於0 和 1之間的浮點數,表示要用作驗證數據的訓練數據的比例。 因此,在關鍵字中傳遞0.1的值意味著保留10%的訓練數據用於驗證。

使用sklearn糖尿病數據集可以輕鬆演示驗證拆分的實際實現該數據集有 442 個實例,其中 10 個基線變量(年齡、性別、BMI 等)作為訓練特徵,一年後疾病進展的度量作為其標籤。

我們使用 TensorFlow 和 sklearn 導入數據集:

數據預處理後的基本步驟是構建具有密集層的順序前饋神經網絡:

在這裡,我們有一個神經網絡,它有六個帶有relu激活的隱藏層和一個帶有線性激活的輸出層

然後我們使用Adam優化器和均方誤差損失函數編譯模型

然後使用model.fit()方法來訓練模型 100 個 epoch, validation_split為 15%。

我們還可以繪製對訓練數據和驗證數據都觀察到的模型損失:

上圖顯示,驗證損失在 10 個 epoch 後持續上升,而訓練損失繼續減少。 這種趨勢是機器學習中一個非常重要的問題的教科書示例,稱為過度擬合

已經進行了許多開創性的研究來克服這個問題,這些解決方案統稱為正則化技術 以下部分將介紹正則化的方面以及正則化任何深度學習模型的過程。

規範我們的模型

在上一節中,我們在訓練集和驗證集的損失圖中觀察到了相反的趨勢,其中後一組的成本函數圖似乎在上升,而前一組的成本函數圖繼續下降,因此產生了差距(泛化差距)。 詳細了解機器學習中的正則化。

兩個損失圖之間存在這種差距的事實表明,該模型無法很好地泛化驗證集(看不見的數據) ,因此該數據集上產生的成本/損失值也將不可避免地很高。

之所以會出現這種特殊性,是因為經過訓練的模型的權重和偏差能夠很好地共同適應訓練數據的分佈,以至於它無法預測新的和看不見的特徵的標籤,從而導致驗證損失增加。

基本原理是,配置一個複雜的模型會產生這樣的異常,因為模型參數變得對訓練數據變得非常健壯。 因此,簡化或降低模型的容量/複雜度將減少過擬合效應。 實現這一點的一種方法是在我們的深度學習模型中使用 dropout,我們將在下一節中介紹。

在 TensorFlow 中理解和實現 Dropout

使用 dropouts 背後的關鍵感知是隨機刪除隱藏和可見單元,以獲得一個不太複雜的模型,該模型限制模型參數的增加,因此,使模型在廣義數據集上的性能更加穩健。

這種最近被接受的做法是機器學習從業者用來在任何深度學習模型中誘導正則化效果的強大方法。 Dropout 可以通過 TensorFlow 上的 Keras API 輕鬆實現,方法是導入dropout層並在其中傳遞rate參數以指定需要刪除的單元的分數。

這些 dropout 層通常在每個密集層之後立即堆疊,以產生密集 dropout層架構的交替潮。

我們可以修改我們之前定義的前饋神經網絡,使其包含六個dropout層,每個隱藏層一個:

在這裡, dropout_rate設置0.2 ,這表示在訓練模型時將丟棄 20% 的節點。 我們使用相同的優化器、損失函數、指標和 epoch 數來編譯和訓練模型,以便進行公平比較。

使用 dropout 對模型進行正則化的主要影響可以通過再次繪製在訓練集和驗證集上獲得的模型的損失曲線來解釋:

從上圖中可以明顯看出,對模型進行正則化後得到的泛化差距要小得多,這使得模型不太容易過度擬合訓練數據。

另請閱讀:深度學習項目理念

結論

模型驗證和正則化方面是設計構建任何機器學習解決方案的工作流程的重要部分。 為了即興監督學習,正在進行大量研究,本動手教程提供了在組裝任何學習算法時對一些最被接受的實踐和技術的簡要了解。

如果您有興趣了解有關深度學習技術、機器學習的更多信息,請查看 IIIT-B 和 upGrad 的機器學習和深度學習 PG 認證,該認證專為在職專業人士設計,提供 240 多個小時的嚴格培訓、5 個以上的案例研究和分配,IIIT-B 校友身份和頂級公司的工作協助。

引領人工智能驅動的技術革命

機器學習和人工智能的 PG 文憑
了解更多