小 SGD 批量大小会导致更快的过拟合吗?

机器算法验证 神经网络 深度学习 过拟合 喀拉斯 随机梯度下降
2022-03-13 19:00:49

我有前馈神经网络,在 cca 34k 样本上训练并在 8k 样本上进行测试。数据集中有 139 个特征。ANN 在两个标签 0 和 1 之间进行分类,所以我在最后一层和两个隐藏层使用 sigmoid 函数,两者都有 400 个单位。NN 是使用以下 Keras 代码创建的:

model = Sequential()
model.add(Dense(units=139, input_dim=len(list(X))))

model.add(Dense(units=400))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(Dense(units=400))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(Dense(units=1))
model.add(Activation('sigmoid'))

model.compile(optimizer='sgd',
          loss='binary_crossentropy',
          metrics=['accuracy'])

checkpoint = ModelCheckpoint('tempmodelKeras.h5',period=1)
custom = LambdaCallback(on_epoch_end=lambda epoch,logs: test_callback_wrapper())
model.fit(X, y, epochs=500, batch_size=128, callbacks=[checkpoint,custom])

test_callback_wrapper()仅用于在测试数据集上的每个 epoch 之后测试模型,然后计算不同阈值的平均精度分数。

现在我需要帮助的部分:下图显示了测试集的 X 轴上的纪元数和 Y 轴上的平均精度。

时期内不同批次大小的平均精度

我尝试了三种不同的批量大小(32、128、256),但如果你看一下情节,看起来更小的批量大小在达到最大平均精度所需的时期数方面“更快”,但更容易到过拟合但是,我阅读了几篇文章,其中写到较大的批次通常会导致过度拟合,而较小的批次更好。怎么可能在我的图像中,反之亦然,更大的批次表现更好?

1个回答

在 x 轴上使用“epoch”来比较收敛的“速度”,同时比较不同的批量大小是没有意义的,因为每个时期的权重更新次数取决于批量大小当使用较小的批次时,学习算法在每个 epoch 执行更多的权重更新,自然它似乎收敛得更快。

在您的图像中,灰色曲线(batch size = 32)在 epoch 40 左右开始减少(过度拟合)。橙色曲线(batch size = 128,四倍以上)似乎在 epoch 160 左右达到峰值——四次之后,正好在相同数量的权重更新。您可能会在 320 纪元附近的蓝色曲线上看到类似的峰值。

通常,较小的批次会导致更嘈杂的梯度估计,并且能够更好地避开较差的局部最小值并防止过度拟合。另一方面,小批量可能对于良好的学习来说过于嘈杂。最后,它只是另一个需要在特定数据集上调整的超参数。在您的情况下,它似乎并没有起到很大的作用,因为所有曲线都在相同的精度附近达到峰值,并且无论批量大小如何,提前停止都应该导致相同的性能。