当使用 sgd(随机梯度下降)作为优化器时,fit() 方法中的 batch_size 值应该是多少?

数据挖掘 深度学习 喀拉斯 张量流
2022-03-14 19:49:49

我对这个模型的批量大小感到困惑。我使用 sgd 即随机梯度下降作为优化器(参见代码)。我知道在 sgd 中,训练集中的单个随机实例用于计算每一步的梯度。因此,根据它,batch_size 应该等于 1。现在,在tf.keras.Sequential.fit()文档中它说:

如果未指定,batch_size 将默认为 32。

那么,我是否必须手动将 batch_size 设置为 1?这是因为默认值 32 将使其成为 Mini-batch Gradient Descent。

    import tensorflow as tf
    from tensorflow import keras

    fashion_mnist = keras.datasets.fashion_mnist
    (X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()

    X_valid, X_train = X_train_full[:5000]/255.0, X_train_full[5000:]/255.0
    y_valid, y_train = y_train_full[:5000], y_train_full[5000:]

    model = keras.models.Sequential()

    model.add(keras.layers.InputLayer(input_shape = [28, 28]))
    model.add(keras.layers.Flatten())
    model.add(keras.layers.Dense(300, activation = "relu"))
    model.add(keras.layers.Dense(100, activation = "relu"))
    model.add(keras.layers.Dense(10, activation = "softmax"))

    model.compile(loss = "sparse_categorical_crossentropy", optimizer = "sgd", metrics = ["accuracy"])

    history = model.fit(X_train, y_train, epochs = 30, validation_data = (X_valid, y_valid))
2个回答

首先,使用适当的术语,您可以说批量随机梯度下降和批量梯度下降处于极端,其中随机梯度下降以进行训练,批量梯度下降以进行训练,其中表示数据点。batchsize=1batchsize=nn

在适当的术语中,我们经常使用(也类似于您的示例)称为小批量梯度下降。请注意,此处的术语 mini 并不意味着它必须非常小,如 4、32 或 64,而是可以大于但小于在实践中,人们可以互换使用术语小批量梯度下降和随机梯度下降。这是因为在实践中它们的行为相似。1n

我个人认为这种做法(交替使用 SGD 和 minibatch SGD)并不坏,因为我不认为它有很大的不同,以至于它需要一个特定的新术语。

批量大小指定用于调整每次迭代参数的观察次数。如果为 1,将使用此观察的结果。如果大于 1,将使用平均性能。

理想情况下,您应该将批量大小视为超参数。这意味着您应该为您的问题确定最佳批量大小。您可以将简单的 for 循环或网格/随机搜索与其他超参数一起使用。