You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何AdamOptimizer无法求得x²的最小值0?优化结果不符预期

解答你的Adam优化器相关疑问

先直接拆解你的问题,再给你修正后的可运行代码:

你的疑问逐个解答

  • -2是否为x的初始值?
    没错!你通过tf.Variable(-2.)定义了变量x,并且在会话里执行了tf.global_variables_initializer()完成初始化,所以x的初始值确实是-2。

  • AdamOptimizer是否仅执行一次优化步骤?
    完全正确!你的代码里只调用了一次sess.run([o]),这就只触发了Adam的一次优化迭代。Adam这类梯度下降优化器都是迭代式工作的,单次步长(你设置的学习率是1e-1)下只会让参数产生很小的更新,所以从-2变到-1.9是完全符合预期的。

  • 能否进行持续优化?
    当然可以!只需要把优化步骤的执行逻辑放到循环里,重复调用优化操作,就能让Adam持续更新参数x,逐步逼近最优解。

  • 如何才能得到x=0的结果?
    核心就是增加迭代次数,让优化器有足够多的步骤去调整参数。你也可以在迭代过程中观察损失值(也就是sq=x*x)的变化,当损失接近0时,x就差不多趋近于0了。

修正后的代码示例

import tensorflow as tf

x = tf.Variable(-2.)
sq = x * x
optimizer = tf.train.AdamOptimizer(1e-1)
train_op = optimizer.minimize(sq)

with tf.Session() as sess:
    # 初始化所有变量
    sess.run(tf.global_variables_initializer())
    
    # 执行1000次优化迭代
    for step in range(1000):
        sess.run(train_op)
        # 每100步打印一次状态,观察收敛过程
        if step % 100 == 0:
            current_x, current_loss = sess.run([x, sq])
            print(f"Step {step}: x = {current_x:.4f}, loss = {current_loss:.4f}")
    
    # 输出最终结果
    final_x = sess.run(x)
    print(f"\nFinal result: x = {final_x:.4f}")

运行这段代码后,你会看到x逐步向0靠近,损失值也会持续降低,最终x会非常接近0(受浮点精度限制不会完全等于0,但已经满足你的需求)。

内容的提问来源于stack exchange,提问作者Stepan Yakovenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:45:39