昨天提到了 Overfitting,要避免這樣的問題,我們可以使用正則化(Regularization)的方法,讓模型可以更簡單,更符合 Generalization 的特性。今天介紹其中一種方法,為權重的正則化。
今天介紹的正則化方法,影響的對象為權重,目的為讓權重值不要過大,讓模型可以較簡單不複雜。此種正則化的方法為於損失函數中對較大權重使用懲罰(Penalty),給予模型一些限制,減少過度學習稀有特徵。常使用的權重正則化方法有 L1 和 L2 正則化:
L1 和 L2 正則化可以一起使用:
匯入 regularizers
模組:
from tensorflow.keras import regularizers
於要使用正則化的層設定 kernel_regularizer
參數,如果要使用 L1 正則化,將參數設定為 regularizers.l1(penalty)
,使用 L2 正則化使用 regularizers.l2(penalty)
,其中 penalty 設定為正則化強度數值。如果想同時使用 L1 和 L2 正則化,參數設為 regularizers.l1_l2(l1=penalty1, l2=penalty2)
,penalty 的值可以各自設定。
例如在全連接層加上正則化:
# 原本的全連接層
x = layers.Dense(4096, activation="relu")(x)
# 加入權重正則化
# L1
x = layers.Dense(4096, activation="relu", kernel_regularizer=regularizers.l1(0.01))(x)
# L2
x = layers.Dense(4096, activation="relu", kernel_regularizer=regularizers.l2(0.01))(x)
# L1 + L2
x = layers.Dense(4096, activation="relu", kernel_regularizer=regularizers.l1_l2(l1=0.01, l2=0.01))(x)
通常會在較小型的深度學習模型上去使用權重正則化,如果是較大型的模型,可以使用 Dropout 的方法,這就是明天要介紹的主題。