我正在松散地关注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))
我得到了合理的答案
('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))
现在,我已经在这里弄乱了学习率等等,但是我有点困惑的是为什么这会很难融合。有没有人对于为什么这个优化器在这样一个微不足道的问题上失败有任何直觉
答案 0 :(得分:2)
此优化器以及tf中提出的大多数其他优化器旨在改善随机优化的梯度下降。以这种或那种方式,这些优化者慢慢建立知识(动量,时刻......),最终超越基本梯度下降。
你的实验不是随机的,而且很简单,可以快速收敛梯度下降。两者都是更精细的优化者发光的不利条件。
答案 1 :(得分:1)
我不会说ADAM它很难收敛并且没有失败,它只是花时间:
iteration 14499
W [[ 1.9996556]]
B [ 0.02274081]
您链接的论文摘要说明ADAM最适合哪种问题,而这不是一个问题。在其中一个问题中尝试SGD,你会看到真正的失败。