了解用於緩解深度神經網絡內過度擬合問題的常規技術。
正則化
深度神經網絡(DNN)在體系結構內部具有大量的權重參數,可以學習一系列值。這些值的範圍是使神經網絡能夠解決龐大的複雜功能的關鍵。
神經網絡越深,其擁有的代表性越強,但是隨著權重參數數量的增加,就會出現一個缺點。缺點是神經網絡更容易過度擬合訓練數據集。
過度擬合:此問題涉及算法過於精確地預測在訓練過程中觀察和學習到的模式實例,從而預測向其呈現的模式的新實例。這可能導致機器學習算法無法準確地推廣到看不見的數據。如果訓練數據不能準確表示測試數據的分布,則可能會發生過度擬合。可以通過減少訓練數據中的特徵數量並通過各種技術降低網絡的複雜性來解決過度擬合問題
正則化技術通過限制網絡內權重值所保持的值範圍來減少神經網絡過度擬合的可能性(稍後會對此進行更多介紹)。
本文介紹了兩種對損失函數的結果施加約束條件的正則化策略。
該損失函數是一種方法,量化「 如何 」機器學習模型執行。量化是基於一組輸入的輸出(成本),這些輸入稱為參數值。參數值用於估計預測,「損失」是預測與實際值之間的差。
本文將不關注正則化的數學。相反,本文介紹了一些標準的正則化方法以及如何使用TensorFlow(Keras)在神經網絡中實現它們。
有關數學的更多詳細信息,Raimi Karim和Renu Khandelwal的這些文章合理地介紹了L1和L2正則化數學。
正則化的類型
我們可以了解到正則化技術作用於神經網絡中的權重參數。更具體地說,它修改了結果損失函數,進而修改了產生的權重值。
l1正則化
L1正則化對神經網絡權重值的影響是,通過使權重值等於0來懲罰權重接近0的權重。因此,如果權重值為-2,則在L1正則化的作用下,權重值為0。
L1正則化的一般直覺是,如果權重值接近於0或非常小,那麼對於模型的整體性能而言可以忽略不計,因此將其設置為0不會影響模型的性能並可以減少內存模型的容量。
L1懲罰權重的絕對值之和(| weight |)我知道我說過我不會參加數學,但是下面的數學符號應該相對容易理解。
我們有損失函數,在這種情況下,是均方誤差。
然後,我們將權重的絕對值之和與正則化超參數值的乘積相加,該乘積由lambda符號()表示。
數學符號中的「 i 」表示當前權重的索引,「 n 」表示層中權重值的總數。「 W 」代表重量值。
L2正則化
L2正則化也會懲罰權重值。對於較小的權重值和相對較大的權重值,L2正則化將值轉換為接近0但不完全為0的數字。
l2懲罰權重的平方和(權重)
如果您要結合使用L1和L2正則化技術的效果,那麼您將獲得「彈性網正則化 」
正則化技術對訓練過程中的神經網絡產生影響,而不是推論。
現在,我們對正則化有了一些基本的了解(可以隨意探索這兩種方法的數學方法)和一些示例,讓我們看看它們是如何實現的。
實施正則化
第一步是導入用於實現或支持神經網絡實現的工具和庫。
TensorFlow:一個用於實施,培訓和部署機器學習模型的開源平臺。Keras:一個開放原始碼庫,用於實現可在CPU和GPU上運行的神經網絡體系結構。import tensorflow as tf
from tensorflow import keras
我們將使用的數據集是瑣碎的fashion-MNIST數據集。
fashion-MNIST數據集包含70,000件服裝圖像。更具體地說,它包括60,000個訓練示例和10,000個測試示例,它們都是尺寸為28 x 28的灰度圖像,分為十類。
數據集的準備工作包括通過將每個像素值除以255.0來歸一化訓練圖像和測試圖像。這會將像素值置於0到1的範圍內。
在此階段,還將創建數據集的驗證部分。在訓練期間利用該組數據集來評估網絡在各種迭代中的性能。
(train_images, train_labels),(test_images, test_labels) = keras.datasets.fashion_mnist.load_data()
train_images = train_images / 255.0test_images = test_images / 255.0validation_images = train_images[:5000]validation_labels = train_labels[:5000]
接下來,我們使用Keras順序API實現一個簡單的模型。我們模型中的隱藏層使用了多種正則化技術。
要將正則化器添加到層,只需將首選的正則化技術傳遞給該層的關鍵字參數'kernel_regularizer'。
Keras正則化實現方法可以提供代表正則化超參數值的參數。這在下面的某些層中顯示。
Keras提供了l1和l2正則化器的實現,我們將在下面的代碼片段的某些隱藏層中使用它們。此外,我們還包括一個同時利用l1和l2正則化的層。
這就是在神經網絡中實施各種正則化技術的全部內容。不太困難。
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28,28]),keras.layers.Dense(200, activation='relu', kernel_regularizer=keras.regularizers.l1()), keras.layers.Dense(100, activation='relu', kernel_regularizer=keras.regularizers.l2(0.001)), keras.layers.Dense(50, activation='relu', kernel_regularizer=keras.regularizers.l1_l2(0.01)), keras.layers.Dense(10, activation='softmax')])
在下一個代碼段中,我們設置並指定優化算法來訓練實現的神經網絡,以及損失函數和超參數(例如學習率和曆元數)。
sgd = keras.optimizers.SGD(lr=0.01)
model.compile(loss="sparse_categorical_crossentropy", optimizer=sgd, metrics=["accuracy"])model.fit(train_images, train_labels, epochs=60, validation_data=(validation_images, validation_labels))
使用之前保留的測試數據進行模型性能的評估。
利用評估結果,您可以在觀察測試數據集評估的準確性之後,決定微調網絡超參數或進入生產。
model.evaluate(test_images,test_labels)
如果將損失函數的正則項從層中排除並針對相同數量的紀元進行訓練,則已實現的模型可能會在測試數據集上具有更好的性能。在具有數百萬個參數和更多功能的更深入的神經網絡中,更常使用正則化。
希望您現在對各種正則化技術以及如何實現它們有了直覺。探索神經網絡實施和培訓中的其他正則化方法(例如Dropout或Early Stoping)可能會很有趣。