Tensorflow AdamOptimizer与Gradient Descen对比

2024-04-18 09:37:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我大致遵循this教程来了解简单的张量流计算。对于那些不想点击链接的人来说,这是一个简单的OLS问题,拟合y=Wx+b,真正的解决方案是:y=2x

并有以下代码和输出

import tensorflow as tf
tf.reset_default_graph()
import numpy as np

x = tf.placeholder(tf.float32, [None, 1]) # 1d input vector
W = tf.Variable(tf.zeros([1,1]))
b = tf.Variable(tf.zeros([1]))

y = tf.matmul(x,W) + b

y_res = tf.placeholder(tf.float32, [None, 1])

cost = tf.reduce_sum(tf.pow(y - y_res, 2))

x_l = np.array([[i] for i in range(100)])
y_l = 2 * x_l

train = tf.train.GradientDescentOptimizer(0.000001).minimize(cost)

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    for i in range(5):
        feed = {x: x_l,y_res:y_l}
        sess.run(train, feed_dict=feed)

        print ("iteration", i)
        print ("W", sess.run(W))
        print ("B", sess.run(b))

我得到了合理的答案

^{pr2}$

但是,我一直在寻找更进一步的东西,并理解一些其他实现的优化器,特别是ADAM

为了查看这个优化器的效果,我将相关行改为

train = tf.train.AdamOptimizer().minimize(cost)

结果有点奇怪:

('iteration', 0)
('W', array([[ 0.001]], dtype=float32))
('B', array([ 0.001], dtype=float32))
('iteration', 1)
('W', array([[ 0.00199998]], dtype=float32))
('B', array([ 0.00199998], dtype=float32))
('iteration', 2)
('W', array([[ 0.00299994]], dtype=float32))
('B', array([ 0.00299994], dtype=float32))
('iteration', 3)
('W', array([[ 0.00399987]], dtype=float32))
('B', array([ 0.00399987], dtype=float32))
('iteration', 4)
('W', array([[ 0.00499976]], dtype=float32))
('B', array([ 0.00499976], dtype=float32))

现在,我已经在学习率等方面搞砸了,但我有点困惑,为什么这很难融合。有没有人有任何直觉,为什么这个优化器在这样一个小问题上失败


Tags: runimporttfasfeednptrainres
2条回答

这个优化器和tf中提出的大多数其它优化方法一样,旨在改善随机优化的梯度下降。以某种方式,这些优化器会慢慢积累知识(动量、力矩等),最终超越基本的梯度下降。在

你的实验不是随机的,简单到可以用梯度下降快速收敛。这两个条件都不利于更精细的优化器发挥作用。在

我不会说亚当,它很难融合,也不会失败,它只是慢慢来:

iteration 14499
W [[ 1.9996556]]
B [ 0.02274081]

你所链接的论文摘要说明了亚当最适合解决什么样的问题,而这不是一个。尝试SGD在其中一个问题,你会看到一个真正的失败。在

相关问题 更多 >