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

Neural network 为什么神经网络优化器从SGD变为Adam会导致精度大幅下降?,neural-network,keras,conv-neural-network,Neural Network,Keras,Conv Neural Network,我正在对一个covnet进行约10000张图像的训练,并注意到将优化器从opt=SGD()切换到opt='adam'会导致精度大幅降低,并保持所有其他参数相等。使用SGD(),我可以获得大约80%的准确度(在每个历元之后逐渐增加)。对于Adam,我在每个时代的验证准确率都是22.25% 我想了解可能的原因。 参数 dropout_prob = 0.2 activation_function = 'relu' loss_function = 'categorical_crossentropy' b

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

我想了解可能的原因。

参数

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


不同的优化器可能需要不同的优化超参数才能收敛。 尝试将
opt='adam'
(使用默认学习率)替换为

不要使用默认值
learning\u rate
,而是选择它的值using


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

基于SGD的优化器的缺点是,它们依赖于所有方向上梯度的标量和统一学习(即,对于要更新梯度的所有参数)。相比之下,Adam等自适应学习策略根据函数曲率的估计值对角缩放梯度。Adam使用一个学习率向量,每个参数一个学习率向量,并在训练过程中调整学习率,而不是维持多个参数共享的学习率。正是这种梯度的非均匀缩放导致Adam的泛化能力滞后,并且可能在您的案例中,导致精度大幅下降

如中所述:

尽管训练效果很好,但自适应优化方法 正如Adam一样,Adagrad或RMSprop的概括能力很差 与随机梯度下降法(SGD)相比。这些方法倾向于 在训练的最初阶段表现良好,但表现出色 在培训后期由SGD提供

为了结合这两种优化器的优点,他们引入了从Adam到SGD的切换技术,方法是:(a)切换点,即在切换到SGD之前用Adam训练模型的时间。根据经验,这篇论文指出,至少经历了10个时代之后,瑞士人的生活方式发生了变化。(b) 开关后用于SGD的学习速率:由Adam的动量参数
beta_1
确定


你可以找到一个很好的解释。

什么是
opt
?我很好奇,我的回答解决了你的问题吗?
 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))
opt = keras.optimizers.Adam(lr=learning_rate)