GradientDescentOptimizer 和 AdamOptimizer (TensorFlow) 之间的区别?

机器算法验证 机器学习 神经网络 错误 梯度下降 监督学习
2022-01-20 09:59:10

TensorFlow中编写了一个简单的MLP ,它正在建模XOR-Gate

因此对于:

input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]

它应该产生以下内容:

output_data = [[0.], [1.], [1.], [0.]]

该网络有一个输入层、一个隐藏层和一个输出层,每个层有 2、5 和 1 个神经元。

目前我有以下交叉熵:

cross_entropy = -(n_output * tf.log(output) + (1 - n_output) * tf.log(1 - output))

我也尝试过这个更简单的选择:

cross_entropy = tf.square(n_output - output)

与其他一些尝试一起。


但是,无论我的设置是什么,带有 a 的错误GradientDescentOptimizer下降速度都比a慢得多AdamOptimizer

事实上tf.train.AdamOptimizer(0.01),在 400-800 个学习步骤后产生了非常好的结果(取决于学习率,哪里0.01有最好的结果),而tf.train.GradientDescentOptimizer无论使用什么交叉熵计算或学习率,总是需要超过 2000 个学习步骤。

为什么会这样?似乎AdamOptimizer总是更好的选择?!

1个回答

使用tf.train.AdamOptimizerKingma 和 Ba 的Adam 算法来控制学习率。与简单的tf.train.GradientDescentOptimizer. 最重要的是它使用参数(动量)的移动平均线;Bengio 在本文的第 3.1.1 节讨论了这样做有益的原因简单地说,这使得 Adam 可以使用更大的有效步长,并且算法将收敛到这个步长而无需微调。

该算法的主要缺点是 Adam 需要在每个训练步骤中对每个参数执行更多计算(以保持移动平均和方差,并计算缩放梯度);以及为每个参数保留更多状态(大约使模型大小增加三倍以存储每个参数的平均值和方差)。在您的 MLP 中同样可以使用简单tf.train.GradientDescentOptimizer的,但需要更多的超参数调整才能快速收敛。