为何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
相关产品推荐
相关产品推荐

