python - Tensorflow AdamOptimizer 与梯度下降

标签 python tensorflow

我正在松散地关注this教程来了解简单的 tensorflow 计算。对于那些不想点击链接的人,这是一个简单的 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))

为此我得到了合理的答案

('iteration', 0)
('W', array([[ 1.31340003]], dtype=float32))
('B', array([ 0.0198], dtype=float32))
('iteration', 1)
('W', array([[ 1.76409423]], dtype=float32))
('B', array([ 0.02659338], dtype=float32))
('iteration', 2)
('W', array([[ 1.91875029]], dtype=float32))
('B', array([ 0.02892353], dtype=float32))
('iteration', 3)
('W', array([[ 1.97182059]], dtype=float32))
('B', array([ 0.02972212], dtype=float32))
('iteration', 4)
('W', array([[ 1.99003172]], dtype=float32))
('B', array([ 0.02999515], dtype=float32))

但是,我一直在寻求更进一步并了解实现的其他一些优化器,特别是 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))

现在,我在这里搞乱了学习率等,但我有点困惑为什么它很难收敛。有谁知道为什么这个优化器在这样一个微不足道的问题上失败了

最佳答案

该优化器以及 tf 中提出的大多数其他优化器旨在改进随机优化的梯度下降。以一种或另一种方式,这些优化器慢慢地积累知识(动量、矩……),最终超越基本的梯度下降。

您的实验不是随机的,并且足够简单,可以通过梯度下降快速收敛。两者都不利于更复杂的优化器发挥作用。

关于python - Tensorflow AdamOptimizer 与梯度下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43872812/

相关文章:

python - 使用 sqlalchemy 0.6 记录查询

python - 在脚本结束时从 Python 3.5 切换到 2.7?

python - 如何在 CGIAr 中使用 Python 重定向到另一个页面

python - 使用 TensorFlow 的多标签文本分类

tensorflow - 如何在 TF2 中更改 Adam 的学习率?

python - 从 Tensorflow 中的模型检查点将损失值加载到 numpy.array

python - Numpy 数组值在没有被询问的情况下改变了?

Python re.findall 将输出打印为列表而不是字符串

python - 多个人工神经网络

python - 没有名为 '_pywrap_tensorflow_internal' 的模块错误