Keras 中的正则化策略

Posted

技术标签:

【中文标题】Keras 中的正则化策略【英文标题】:Regularization strategy in Keras 【发布时间】:2018-06-20 07:30:38 【问题描述】:

我试图在 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)

这里显示了没有正则化的结果Without regularization。与验证相比,训练的平均绝对误差要小得多,并且两者都有固定的差距,这是过度拟合的标志。

像这样为每一层指定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?

【问题讨论】:

【参考方案1】:

根据您的结果,您似乎需要找到合适的正则化量,以平衡训练准确度和对测试集的良好泛化能力。这可能就像减少 L2 参数一样简单。尝试将 lambda 从 0.001 降低到 0.0001 并比较您的结果。

如果你找不到适合 L2 的参数设置,你可以尝试 dropout 正则化。只需在每对密集层之间添加model.add(Dropout(0.2)),并在必要时尝试丢弃率。较高的 dropout 率对应于更多的正则化。

【讨论】:

以上是关于Keras 中的正则化策略的主要内容,如果未能解决你的问题,请参考以下文章

Keras 的深度学习模型中的 Dropout 正则化

Keras:内核和活动正则化器之间的区别

自动编码器的正则化太强(Keras 自动编码器教程代码)

使用 L2 正则化将 sklearn MLPClassifier 移植到 Keras

keras构建前馈神经网络(feedforward neural network)进行分类模型构建并加入L2正则化

如何在 Keras 中正确实现自定义活动正则化器?