【问题标题】:Why AdamOptimizer fails to find optimal value to minimize x*x?为什么 AdamOptimizer 无法找到最小化 x*x 的最优值?
【发布时间】:2018-05-29 11:07:23
【问题描述】:

我正在尝试使用 adagrad 优化器最小化 x*x。我希望得到 x=0 作为结果,但我得到的值 x 接近初始值。

import tensorflow as tf
x=tf.Variable(-2.)
sq=x*x
o = tf.train.AdamOptimizer(1e-1).minimize(sq)
with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run([init])
    sess.run([o])
    r=sess.run([x])
    print("done",r)

结果我得到 -1.9,而不是预期的 0。

我是否正确理解 -2 是这里的初始值,还是其他什么? AdamOptimiser 是只执行一步还是可以启动它以进行持续优化?我如何得到 x=0 作为结果?

【问题讨论】:

  • sess.run([o]) 只运行一个步骤。您应该将此行包装在一个循环中,例如 100 次迭代。
  • 请把它作为答案,所以我可以接受。也可能有一些标准的 TF 方法来避免写 for i in range(1000) 吗?

标签: tensorflow


【解决方案1】:

sess.run([0]) 只运行一个步骤。要执行完整的优化,您需要运行许多步骤,这可以通过在循环中重复单个步骤来完成。

因此,您可以将sess.run([o]) 替换为:

for i in range(1000):
   sess.run([o])

这会产生3.4735016e-23 的结果,非常接近预期的0

根据我的经验,人们通常会运行许多优化步骤,就像我演示的那样,使用 for 循环。如果您有兴趣将循环实现为 TensorFlow 操作,然后只运行一次此操作,则可以这样做,但不建议这样做。原因是:(a) 我认为这样做不会让您的代码获得任何“优雅”。 (b) 如果要运行 1000 步,则需要将 1000 组操作添加到图表中,并将它们归为一组。相比之下,只需要一组操作。

您可以查看更多相关信息in this question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2017-01-27
    • 2012-06-29
    相关资源
    最近更新 更多