はとむぎ研究室

大学生の備忘録でした

重みの正則化

重みの正則化

 より単純なモデルのほうが、より複雑なモデルよりも過学習に陥りにくいため、単純なモデル(パラメータの数が少ないモデル)をつくりたい。
 ネットワークの複雑さに歯止めをかけるように重みの値を制限すると、重みの値の分布がより正則化される。これを重みの正則化と呼ぶ。重みを正則化するには、大きな重みを使用する場合のコストをネットワークの損失関数に追加する。このコストには、次の2種類がある。

L2正則化を実際にやってみる

from keras import regularizers

model = models.Sequential()
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),
                                        activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),
                                        activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))


 l2(0.001)は、その層の重み行列の係数毎に、ネットワークの全損失に0.001 * weight_coefficient_valueを足すことを意味する。このペナルティが追加されるのは訓練時だけなので、このネットワークの損失値はテスト時よりも訓練時の方がずっと大きくなる。

f:id:heart_mugi:20200911183245j:plain
L2正則化が損失に与える影響(過学習を抑制している)

他の正則化のコード

from keras import regularizers

# L1正則化
regularizers.l1(0.001)
# L1正則化とL2正則化の同時適用
regularizers.l1_l2(l1=0.001, l2=0.001)


参考

ai-trend.jp