【調參05】如何通過權重約束減少過擬合



在這裏插入圖片描述

Photo by Andreas Brücker

1. 懲罰較大的權重

諸如權重衰減(比如L2正則化)這樣的權重正則化方法在訓練神經網絡時,鼓勵網絡使用較小的權重會給懲罰損失函數。神經網絡中較小的權重可以使模型更穩定,並且不容易過擬合,從而在對新數據進行預測時具有更好的性能。

與權重正則化不同,權重約束(weight constraint) 類似一個觸發器,用於檢查權重的大小,當權重超出閾值時對其進行縮放。該約束可以限制權重的大小,可以代替權重衰減使用,也可以與其它網絡配置(例如非常大的學習率)結合使用。

神經網絡中,較大權重意味着可能已經過擬合。權重較大的網絡很可能已從訓練數據中學習了噪聲。這導致模型不穩定,並且對輸入變量的變化非常敏感。也就是說,當對新數據進行預測時,過擬合的網絡變現很差,即泛化能力很差。

解決該問題的一種常用而有效的方法是:更新在訓練過程中優化的損失函數,以考慮權重的大小。這被稱爲懲罰(penalty),因爲網絡的權重越大,網絡受到的懲罰就越大,從而導致更大的損失,進而導致更大的更新。結果是懲罰會鼓勵權重變小或不超過訓練過程中所需的權重,從而減少過擬合。

值得一提的是,儘管對損失函數增加懲罰確實鼓勵網絡朝着較小的權重發展,但它並沒有強迫網絡使用較小的權重。使用權重調整懲罰訓練的神經網絡可能仍有較大的權重,在某些情況下,權重可能非常大。


2. 權重約束

限制網絡權重大小的替代方案是使用權重約束。權重約束是對網絡的更新,它檢查權重的大小,如果大小超出閾值,則會縮放權重,以使權重限制在閾值內。

與對損失函數增加懲罰不同,權重約束可確保網絡的權重較小,而不是過分鼓勵它們變小。
儘管僅使用dropout進行了重大改進,但結合使用dropout和[weight約束]正則化,[…]與僅使用dropout相比,具有顯着的提升。

當網絡中已經使用Dropout層,但仍希望網絡具有較小的權重以減少過度擬合時,權重約束特別有用。一個經常被引用的例子是權重約束正則化與輟學正則化的結合使用,這與僅使用dropout相比,具有顯着的提升。Hinton老爺子說的。


3. 權重約束使用技巧

1. 在層內的每個節點上強制執行約束。

2. 層中的所有節點都使用相同的約束,並且同一網絡中的多個隱藏層通常會使用相同的約束。

之前的文章中提到了L2範數,在向量範數(節點中權重向量的大小)中,默認情況下計算L2範數。一些常用的約束方法如下:

  • 強制將向量範數置1;(比如unit範數)
  • 限制向量範數的最大值;(比如maximum範數)
  • 限制向量範數的變化區間;(比如min_max範數)

最大範數,也稱爲max-norm或maxnorm,是一種常用的約束,因爲它不像其它範數(比如unit範數)那樣激進,只需設置上限即可。

使用限制或範圍時,必須指定超參數 cc,限制每個隱藏單元處的傳入權重向量的範數。假設權重較小,則超參數通常也爲較小的整數值,例如1到4之間的值,cc 的典型值範圍是3到4。

如果範數超出閾值,則將其重新縮放或標準化,以使其權重在指定的範圍內。可以在每次更新權重之後(例如在每個小批量結束時)應用約束。

Hinton老爺子在2012年的論文中的實驗MNIST手寫數字分類和ImageNet圖片分類任務中使用了maxnorm約束。


4. 使用方法

  1. 與所有網絡類型一起使用
    權重約束是一種通用方法。可以與大多數網絡模型一起使用,尤其是MLP、CNN和LSTM等最常見的網絡類型。

  2. 標準化輸入數據
    將輸入變量重新縮放爲相同的比例是一種常規做法。當輸入變量具有不同的比例時,網絡權重的比例將相應地變化。當使用權重約束時,因爲較大的權重將導致約束更頻繁地觸發,所以在使用權重約束時,最好先標準化數據,常用的方法是Z-Score方法,即將所有數據減去均值再除以標準差。

  3. 使用更高的學習率
    使用權重約束時,最好使用較大的學習率,從而允許網絡每次對權重較大的更新。這是使用權重約束的突出優勢。Hinton老爺子還說不管權重更新有多大,使用約束而不是懲罰都可以防止權重過大。這樣就可以從很大的學習率開始,而學習率在學習過程中會下降,因此與以小權重開始並使用小學習率的方法相比,結合大學習率和權重限制的方法可以更徹底地搜索權重空間。


5. tf.keras API

5.1 tf.keras.Constraint 一覽

class MaxNorm: MaxNorm weight constraint.
class MinMaxNorm: MinMaxNorm weight constraint.
class NonNeg: Constrains the weights to be non-negative.
class RadialConstraint: Constrains Conv2D kernel weights to be the same for each radius.
class UnitNorm: Constrains the weights incident to each hidden unit to have unit norm.
class max_norm: MaxNorm weight constraint.
class min_max_norm: MinMaxNorm weight constraint.
class non_neg: Constrains the weights to be non-negative.
class radial_constraint: Constrains Conv2D kernel weights to be the same for each radius.
class unit_norm: Constrains the weights incident to each hidden unit to have unit norm.


5.2 UnitNorm

tf.keras.constraints.UnitNorm(
    axis=0
)

函數功能:

將輸入每個隱藏單元的權重約束爲單位範數。

參數說明:

  • axis:沿哪些軸計算權重範數。比如 Dense 層權重矩陣的shape爲 (input_dim, output_dim)axis=0 意味着限制第一個維度即 input_dim 維度權重向量的大小;對於 Conv2D 層,如果權重向量的shape爲 (rows, cols, input_depth, output_depth) ,將 axis 設置爲 [0, 1, 2] 意味着約束 rows, cols, input_depth 維度的filter的權重。

5.3 MaxNorm

tf.keras.constraints.MaxNorm(
    max_value=2, axis=0
)

函數功能:

設置每個隱層單元的權重範數的最大值。

參數說明:

  • m:輸入權重的最大範數;
  • axis:沿哪些軸計算權重範數。比如 Dense 層權重矩陣的shape爲 (input_dim, output_dim)axis=0 意味着限制第一個維度即 input_dim 維度權重向量的大小;對於 Conv2D 層,如果權重向量的shape爲 (rows, cols, input_depth, output_depth) ,將 axis 設置爲 [0, 1, 2] 意味着約束 rows, cols, input_depth 維度的filter的權重。

5.4 MinMaxNorm

tf.keras.constraints.MinMaxNorm(
    min_value=0.0, max_value=1.0, rate=1.0, axis=0
)

函數功能:

將每個隱層單元的權重範數限制在某一區間內。

參數說明:

  • min_value:輸入權重的最小范數。
  • max_value:輸入權重的最大範數。
  • rate:執行約束的比率:權重按照公式 yield (1 - rate) * norm + rate * norm.clip(min_value, max_value) 調整。rate = 1.0 表示嚴格執行約束,而 rate <1.0 意味着權重將在每一步重新調整以緩慢移至所需間隔內的值。

6. 應用

6.1 MLP

在Dense層上設置最大範數權重約束。

from tensorflow.keras.layers import Dense
from tensorflow.keras.constraints import max_norm
...
model.add(Dense(32, kernel_constraint=max_norm(3), bias_constraint=max_norm(3)))
...

6.2 CNN

在卷積層上設置最大範數權重約束。

from tensorflow.keras.layers import Conv2D
from tensorflow.keras.constraints import max_norm
...
model.add(Conv2D(32, (3,3), kernel_constraint=max_norm(3), bias_constraint=max_norm(3)))
...

6.3 RNN

與其它layer不同,RNN允許對輸入權重和偏差以及遞歸輸入權重設置權重約束。

from tensorflow.keras.layers import LSTM
from tensorflow.keras.constraints import max_norm
...
model.add(LSTM(32, kernel_constraint=max_norm(3), recurrent_constraint=max_norm(3), bias_constraint=max_norm(3)))
...

https://machinelearningmastery.com/introduction-to-weight-constraints-to-reduce-generalization-error-in-deep-learning/
https://machinelearningmastery.com/how-to-reduce-overfitting-in-deep-neural-networks-with-weight-constraints-in-keras/
https://www.tensorflow.org/api_docs/python/tf/keras/constraints
https://arxiv.org/pdf/1207.0580.pdf
http://jmlr.org/papers/v15/srivastava14a.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章