文章目錄
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範數)那樣激進,只需設置上限即可。
使用限制或範圍時,必須指定超參數 ,限制每個隱藏單元處的傳入權重向量的範數。假設權重較小,則超參數通常也爲較小的整數值,例如1到4之間的值, 的典型值範圍是3到4。
如果範數超出閾值,則將其重新縮放或標準化,以使其權重在指定的範圍內。可以在每次更新權重之後(例如在每個小批量結束時)應用約束。
Hinton老爺子在2012年的論文中的實驗MNIST手寫數字分類和ImageNet圖片分類任務中使用了maxnorm約束。
4. 使用方法
-
與所有網絡類型一起使用
權重約束是一種通用方法。可以與大多數網絡模型一起使用,尤其是MLP、CNN和LSTM等最常見的網絡類型。 -
標準化輸入數據
將輸入變量重新縮放爲相同的比例是一種常規做法。當輸入變量具有不同的比例時,網絡權重的比例將相應地變化。當使用權重約束時,因爲較大的權重將導致約束更頻繁地觸發,所以在使用權重約束時,最好先標準化數據,常用的方法是Z-Score方法,即將所有數據減去均值再除以標準差。 -
使用更高的學習率
使用權重約束時,最好使用較大的學習率,從而允許網絡每次對權重較大的更新。這是使用權重約束的突出優勢。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