为什么神经网络优化器从SGD变为亚当会导致精度大幅下降?

时间:2017-08-12 21:39:11

标签: neural-network keras conv-neural-network

我正在训练大约10,000张图像上的covnet,并注意到将优化器从opt = SGD()切换到opt = 'adam'会导致精确度大幅降低,使所有其他参数保持平等。使用SGD(),我可以获得大约80%的准确度(在每个时期之后逐渐增加)。对于亚当,我在每个时代都坚持22.25%的验证准确度。

我想了解可能的原因是什么。

参数

dropout_prob = 0.2
activation_function = 'relu'
loss_function = 'categorical_crossentropy'
batch_size = 32
epoch_count = 20
num_classes = 3

模型

 model = Sequential()
        model.add(Conv2D(filters=16, kernel_size=(3, 3), input_shape=inp_shape))
        model.add(Conv2D(filters=32, kernel_size=(3, 3)))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Dropout(rate=dropout_prob))
        model.add(Flatten())
        model.add(Dense(128, activation=activation_function))
        model.add(Dropout(rate=dropout_prob))
        model.add(Dense(64, activation=activation_function))
        model.add(Dropout(rate=dropout_prob))
        model.add(Dense(32, activation=activation_function))
        model.add(Dense(num_classes, activation='softmax'))
        model.summary()
        model.compile(loss=loss_function, optimizer=opt, metrics=['accuracy'])
        history = model.fit(x_train, y_train_cat, batch_size=batch_size, epochs=epoch_count,
                            verbose=verbose_level,
                            validation_data=(x_test, y_test_cat))

2 个答案:

答案 0 :(得分:2)

不同的优化器可能需要不同的优化超参数来收敛。 尝试使用

替换opt='adam'(使用默认学习率)
opt = keras.optimizers.Adam(lr=learning_rate)

而不是使用默认值learning_rate,而是使用cross-validation选择其值。

根据经验,通常学习率介于1e-6..0.1之间。您可以尝试使用以下学习率值:[1e-6, 3e-6, 1e-5, 3e-5, 1e-4, ..., 1e-1]

答案 1 :(得分:0)

基于SGD的优化器的一个缺点是,它们依赖于在所有方向上(即,对于要为其更新梯度的所有参数)梯度的标量和统一学习。相比之下,诸如Adam之类的自适应学习策略会根据函数曲率的估计来对梯度进行斜率缩放。 Adam不使用在多个参数之间共享的学习率,而是使用一种学习率向量,每个参数一个学习率,并随着训练的进行进行调整。正是这种梯度的不均匀缩放导致了Adam的泛化能力的滞后,并且在您的情况下,可能导致准确性的大幅下降。

Improving Generalization Performance by Switching from Adam to SGD中所述:

  

尽管训练效果出众,但自适应优化方法如   因为发现Adam,Adagrad或RMSprop的概括性很差   与随机梯度下降(SGD)相比。这些方法往往   在训练初期表现良好,但表现不佳   在培训的后期阶段由SGD进行。

为了结合这两个优化器的优势,他们引入了从Adam到SGD的切换技术,方法是:(a)切换点,即在切换到SGD之前与Adam训练模型的时间。作为经验法则,论文至少要经过10个周期才能指向收缩。 (b)切换后用于SGD的学习率:由Adam的动量参数beta_1确定。

可以找到很好的解释here