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


45

我已经在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)

以及其他一些尝试。


但是,无论我的设置是什么,的错误GradientDescentOptimizer减少速度都比的慢得多AdamOptimizer

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

为什么会这样呢?看来AdamOptimizer永远是更好的选择?!


2
Adam优化器比梯度下降器更复杂(基于本文)。
马克·克莱森

Answers:


77

tf.train.AdamOptimizer使用金玛和Ba的亚当算法来控制学习率。亚当提供了一些简单的优势tf.train.GradientDescentOptimizer。最重要的是,它使用参数的移动平均值(动量)。Bengio讨论了为什么这是在第3.1.1节有益的原因本文。简而言之,这使Adam可以使用较大的有效步长,并且该算法无需进行微调即可收敛到该步长。

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


5
感谢您的回答!当谈到“ 超参数调整 ” 时,您能否添加确切的含义?
daniel451 2015年

12
对不起,行话!大概来说,我的意思是“改变构造函数的learning_rate参数,tf.train.GradientDescentOptimizer直到收敛更快。” :)
mrry
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.