我大致遵循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))
我得到了合理的答案
^{pr2}$但是,我一直在寻找更进一步的东西,并理解一些其他实现的优化器,特别是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中提出的大多数其它优化方法一样,旨在改善随机优化的梯度下降。以某种方式,这些优化器会慢慢积累知识(动量、力矩等),最终超越基本的梯度下降。在
你的实验不是随机的,简单到可以用梯度下降快速收敛。这两个条件都不利于更精细的优化器发挥作用。在
我不会说亚当,它很难融合,也不会失败,它只是慢慢来:
你所链接的论文摘要说明了亚当最适合解决什么样的问题,而这不是一个。尝试SGD在其中一个问题,你会看到一个真正的失败。在
相关问题 更多 >
编程相关推荐