web-dev-qa-db-ja.com

Kerasの正則化戦略

Kerasで非線形回帰問題を設定しようとしています。残念ながら、結果は過剰適合が発生していることを示しています。コードは次のとおりです。

model = Sequential()
model.add(Dense(number_of_neurons, input_dim=X_train.shape[1], activation='relu', kernel_regularizer=regularizers.l2(0)))
model.add(Dense(int(number_of_neurons), activation = 'relu', kernel_regularizer=regularizers.l2(0)))
model.add(Dense(int(number_of_neurons), activation='relu', kernel_regularizer=regularizers.l2(0)))
model.add(Dense(int(number_of_neurons), activation='relu',kernel_regularizer=regularizers.l2(0)))
model.add(Dense(int(number_of_neurons), activation='relu',kernel_regularizer=regularizers.l2(0)))
model.add(Dense(outdim, activation='linear'))
Adam = optimizers.Adam(lr=0.001)
model.compile(loss='mean_squared_error', optimizer=Adam, metrics=['mae'])
model.fit(X, Y, epochs=1000, batch_size=500, validation_split=0.2, shuffle=True, verbose=2 , initial_Epoch=0)

正則化なしの結果をここに示します 正則化なし 。トレーニングの平均絶対誤差は検証に比べてはるかに小さく、両方とも固定フィッティングがあり、これは過剰適合の兆候です。

L2正則化は、各レイヤーに対して次のように指定されました。

model = Sequential()
model.add(Dense(number_of_neurons, input_dim=X_train.shape[1], activation='relu', kernel_regularizer=regularizers.l2(0.001)))
model.add(Dense(int(number_of_neurons), activation = 'relu', kernel_regularizer=regularizers.l2(0.001)))
model.add(Dense(int(number_of_neurons), activation='relu', kernel_regularizer=regularizers.l2(0.001)))
model.add(Dense(int(number_of_neurons), activation='relu',kernel_regularizer=regularizers.l2(0.001)))
model.add(Dense(int(number_of_neurons), activation='relu',kernel_regularizer=regularizers.l2(0.001)))
model.add(Dense(outdim, activation='linear'))
Adam = optimizers.Adam(lr=0.001)
model.compile(loss='mean_squared_error', optimizer=Adam, metrics=['mae'])
model.fit(X, Y, epochs=1000, batch_size=500, validation_split=0.2, shuffle=True, verbose=2 , initial_Epoch=0)

これらの結果をここに示します L2 regularized result 。 MAEはトレーニングに近いので良いです。ただし、トレーニングの場合はMAEは0.03で劣ります(正則化なしでは0.0028でずっと低くなりました) 。

正則化でトレーニングMAEを減らすにはどうすればよいですか?

9
trumee

結果に基づいて、トレーニング精度とテストセットへの一般化のバランスをとるために、適切な量の正則化を見つける必要があるようです。これは、L2パラメータを減らすのと同じくらい簡単かもしれません。ラムダを0.001から0.0001に減らして、結果を比較してみてください。

L2の適切なパラメーター設定が見つからない場合は、代わりにドロップアウトの正規化を試すことができます。密なレイヤーの各ペアの間にmodel.add(Dropout(0.2))を追加し、必要に応じてドロップアウト率を試してください。ドロップアウト率が高いほど、より正規化されます。

11
Imran