使用更小批量的线性分类器获得更好/更快的结果

Better / Faster Result with smaller batch Size linear classifier

我目前正在使用 tensorflow 训练多个线性分类器,我发现了一些奇怪的东西。

如果 batch_size 很小,我的结果会更好(模型学习更快) 我正在研究 FashionMNIST

epochs = 300
batch_size = 5000

# Create and fit model
model = tf.keras.Sequential()
model.add(Dense(1, activation="linear", input_dim=28*28))
model.add(Dense(10, activation="softmax", input_dim=1))
model.compile(optimizer=Adam(), loss=[categorical_crossentropy], metrics=[categorical_accuracy])
model.fit(x_train, y_one_hot_train, validation_data=(x_val, y_one_hot_val), epochs=epochs, batch_size=batch_size)

结果

批量大小:20000 和 200 个时期

loss: 2.7494 - categorical_accuracy: 0.2201 - val_loss: 2.8695 - val_categorical_accuracy: 0.2281

批量大小:10000 和 200 个时期

loss: 1.7487 - categorical_accuracy: 0.3336 - val_loss: 1.8268 - val_categorical_accuracy: 0.3331

批量大小:2000 和 200 个时期

loss: 1.2906 - categorical_accuracy: 0.5123 - val_loss: 1.3247 - val_categorical_accuracy: 0.5113

批量大小:1000 和 200 个时期

loss: 1.1080 - categorical_accuracy: 0.5246 - val_loss: 1.1261 - val_categorical_accuracy: 0.5273

你知道我为什么会得到这样的结果吗?

批量大小对学习有显着影响。当你将一个 batch 通过你的网络时会发生什么是你对梯度进行平均。这个概念是,如果你的批量大小足够大,这将提供一个足够稳定的估计完整数据集的梯度。通过从数据集中获取样本,您可以估计梯度,同时显着降低计算成本。你走得越低,你的估计就越不准确,但在某些情况下,这些嘈杂的梯度实际上可以帮助逃避局部最小值。当它太低时,如果您的数据嘈杂并且它可能无法学习或收敛速度很慢,您的网络权重可能会跳来跳去,从而对总计算时间产生负面影响。

除了另一个答案之外,还应该注意的是,在保持 epoch 数量不变的情况下增加批量大小会导致总体训练步骤减少。这是因为一个epoch是迭代一次数据所需要的步数,batch越大越小。
例如,将批量大小增加 10 将使训练步骤数减少 10。所以这不是一个真正公平的比较。您的批量大小为 20000 的模型仅获得 600 个训练步骤(每个时期 3 个步骤),而批量大小为 1000 的模型获得 12000(每个时期 60 个步骤)。