當前位置:
首頁 > 知識 > 用Keras中的權值約束緩解過擬合

用Keras中的權值約束緩解過擬合

選自Machine Learning Mastery

作者:Jason Brownlee

機器之心編譯

參與:Geek AI、張倩

權值約束為緩解深度學習神經網路模型對訓練數據的過擬合、提高模型在新數據上的性能提供了一種方法。目前有多種類型的權值約束方式,比如最大向量範數和單位向量範數,其中有些方法要求用戶必須配置超參數。在本教程中,作者介紹了向深度學習神經網路模型加入權值約束以緩解過擬合的 Keras API。

本教程將幫你掌握:

如何使用 Keras API 創建向量範數約束。

如何使用 Keras API 向多層感知機(MLP)、卷積神經網路(CNN)以及循環神經網路(RNN)層加入權值約束。

如何通過向一個現有的模型添加權值約束來緩解過擬合。

如何使用 Keras 中的權值約束緩解深度神經網路中的過擬合現象(圖源:https://www.flickr.com/photos/31246066@N04/5907974408/)

教程大綱

本教程分為三個部分:

1.Keras 中的權值約束

2.神經網路層上的權值約束

3.權值約束的案例分析

Keras 中的權值約束

Keras API 支持權值約束技術。這樣的權值約束是逐層指定的,但是需要在層中的每一個節點應用並執行。使用權值約束的方法通常包括在層上為輸入權值設置「kernel_constraint」參數,以及為偏置的權值設置「bias_constraint」。一般來說,權值約束不會用於偏置的權重。我們可以使用一組不同的向量範數作為權值約束,Keras 在「keras.constraints module」中給出了這些方法:

最大範數(max_norm),限制權值的大小不超過某個給定的極限。

非負範數(non_neg),限制權值為正。

單位範數(unit_form),限制權值大小為 1.0。

最小最大範數(min_max_norm),限制權值大小在某個範圍內。

例如,一個權值約束可以通過下面的方式被引入並實例化

神經網路層上的權值約束

在 Keras 中,多數層都可以使用權值範數。本章將介紹一些常見的示例。

多層感知機的權值約束

下面的例子在一個稠密全連接層中設置了一個最大範數權值約束。

卷積神經網路的權值約束

下面的例子在一個卷積層中設置了一個最大範數權值約束。

循環神經網路的權值約束

與其他的層類型不同,循環神經網路允許你同時針對輸入權值、偏置權值以及循環輸入權值設置一個權值約束。對循環權值執行的約束是通過設置這一層的「recurrent_constraint」參數實現的。

下面的示例在一個 LSTM 層上設置了一個最大範數權值約束。

相信讀到這裡,讀者已經知道如何使用權值約束 API 了。下面將為讀者展示一個有效的案例。

權值約束案例分析

在本章中,我們將展示如何在一個簡單的二分類問題上使用權值約束緩解一個多層感知機的過擬合現象。

下面的例子給出了一個將權值約束應用到用於分類和回歸問題的神經網路的模板。

二分類問題

本文使用了一個標準的二分類問題,它定義了兩個半圓的觀測數據,每一個半圓對應一個類。每個觀測數據都有兩個相同規模的輸入變數和一個 0 或 1 的類輸出值。該數據集被稱為「月牙形」數據集,因為在繪製圖形時,每個類別的觀測數據所形成的形狀都是如此。我們可以使用「make_moons()」函數為該問題生成觀測數據。我們將向數據增加一些雜訊,並且為隨機數生成器設置了種子,從而使每次代碼運行時生成的示例相同。

我們可以在一幅圖中將數據集中的兩個變數作為 x 和 y 坐標繪製出來,並用觀測的顏色表示分類值的大小。

生成數據集及繪圖的完整示例如下:

運行該示例代碼將創建一個散點圖,該圖會顯示出每個類的半圓或月牙形的觀測數據。我們可以看到這些散開的雜訊使得月牙形顯得沒有那麼明顯了。

月牙形數據集的散點圖,圖中不同的顏色表示每個樣本的類值

這是一個很好的測試問題,因為這樣的類不能通過一條直線來分割,即線性不可分的情況,我們需要通過諸如神經網路這樣的非線性方法來解決這個問題。

我們僅僅生成了 100 個樣本,這樣的樣本量對於一個神經網路來說是很小的,但這恰好為在訓練數據集上發生過擬合提供了機會,會在測試數據集上出現更高的誤差:

這是一個使用正則化技術的絕佳場合。此外,樣本中帶有雜訊,這讓該模型有機會學習到它不能夠泛化到的樣本的一些特徵。

過擬合的多層感知機

我們可以開發一個多層感知機模型來解決這個二分類問題。該模型將含有一個隱藏層,其中包含的節點比解決這個問題本身所需的節點要多一些,從而為過擬合提供了機會。我們還將對模型進行較長時間的訓練,以確保模型過擬合。在定義模型之前,我們將把數據集分為訓練集和測試集,使用 30 個示例訓練模型,70 個示例評估擬合模型的性能。

接下來,我們可以開始定義模型了。隱藏層使用了 500 個節點,並且使用了線性整流(ReLU)函數。在輸出層中使用 sigmoid 激活函數來預測類的值為 0 還是 1。該模型採用二值交叉熵損失函數進行優化,適用於二分類問題和高效的 Adam 版本的梯度下降。

接著,上面定義的模型將在訓練數據上進行 4000 個 epoch 的擬合,默認批大小為 32。我們還將使用測試數據集作為驗證數據集進行實驗。

我們可以評價該模型在測試數據集上的性能,並展示實驗結果。

最後,我們將繪製模型在每個 epoch 中在訓練集和測試集上的性能曲線。如果模型確實過擬合了訓練數據集,隨著模型在訓練數據集中學習到統計雜訊,我們希望訓練集的準確率直線圖會持續遞增,而測試集的準確率曲線則會先上升,然後再次下降。

將以上所有部分合併在一起後,我們得到了如下所示的完整示例。

通過運行上面的示例,你將得到模型在訓練數據集和測試數據集上的性能。

我們可以看到,該模型在訓練數據集上的性能優於在測試數據集上的性能,這可能是發生過擬合的一個跡象。

由於神經網路和訓練演算法的隨機特性,你得到的具體訓練結果可能有所不同。由於模型是過擬合的,所以我們通常不會期望模型在相同數據集上重複運行得到的準確率之間有很大差異。

在訓練和測試集上創建的顯示模型準確率的折線圖。

我們可以看到預期的過擬合模型的形狀,它的準確率會增加到一個點,然後又開始下降。

帶權值約束的過擬合多層感知機

我們可以進一步更新使用權值約束的示例。有幾種不同的權值約束方式可供選擇。對於該模型來說,一個很好的簡單約束方式就是直接歸一化權值,使範數等於 1.0。這個約束的作用是迫使所有傳入的權值都很小。我們可以通過使用 Keras 中的「unit_norm」來實現這一點。該約束可以通過下面的方式添加到第一個隱藏層中:

我們還可以通過使用「min_max_norm」並將最小值和最大值都設為 1.0 來得到相同的結果,例如:

我們不能使用最大範數約束得到相同的結果,這是因為它允許範數取不大於某個極限的值,例如:

完整的帶單位範數約束的新的示例如下:

通過運行上面的示例,你將得到模型在訓練數據集和測試數據集上的性能。

我們可以看到,對權值大小的嚴格約束確實在不影響模型在訓練集上的性能的情況下提高了模型在保留(驗證)集上的性能。

仔細觀察訓練和測試的準確率的折線圖,我們可以看到,模型不再出現過擬合訓練數據集的情況。

在訓練集和測試集上的模型的準確率繼續上升到一個穩定的水平。

擴展

本章列舉出了一些擴展內容:

顯示出權值範數。更新示例以計算所處網路權值的大小,並說明權值約束確實能讓權值更小。

約束輸出層。更新示例,向模型的輸出層添加約束並比較結果。

約束偏置。更新示例,從而向偏差權值添加約束並比較結果。

多次評價。更新示例,從而對模型進行多次擬合和評價,並顯示出模型性能的均值和標準差。


API

Keras Constraints API:https://keras.io/constraints/

Keras constraints.py:https://github.com/keras-team/keras/blob/master/keras/constraints.py

Keras Core Layers API:https://keras.io/layers/core/

Keras Convolutional Layers API:https://keras.io/layers/convolutional/

Keras Recurrent Layers API:https://keras.io/layers/recurrent/

sklearn.datasets.make_moons API:http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_moons.html

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

------------------------------------------------

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

AlphaGo之後,DeepMind重磅推出AlphaFold:基因序列預測蛋白質結構
NeurIPS 2018 AutoML挑戰賽落幕:印度團隊第一,清華第二

TAG:機器之心 |