我试图在Tensorflow中运行一个简单的线性回归示例,看来训练算法正在收敛到解决方案,但是一旦接近解决方案,它就会开始反弹并最终爆炸。 / p>
我正在传递y = 2x
行的数据,因此梯度下降优化器应该能够轻松收敛到解决方案。
import tensorflow as tf
M = tf.Variable([0.4], dtype=tf.float32)
b = tf.Variable([-0.4], dtype=tf.float32)
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
linear_model = M * x + b
error = linear_model - y
loss = tf.square(error)
optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
for i in range(100):
sess.run(optimizer, {x: i, y: 2 * i})
print(sess.run([M, b]))
这是结果。我圈出了接近解决方案的部分。为什么梯度下降一旦接近解便会中断,或者我做错了什么?
答案 0 :(得分:1)
您的代码一次仅一次提供一次训练数据。这与随机梯度下降相对应,在训练过程中,损失值倾向于比批量和微型批量梯度下降更频繁地波动。此外,由于数据以x
的递增顺序进行馈送,因此梯度值也随x
一起增加。这就是为什么您会在时代的后半段看到更大的波动的原因。
答案 1 :(得分:0)
如果学习率太高,可能会发生这种情况;尝试降低它。
答案 2 :(得分:0)
我的猜测是您选择了高学习率。您可以使用网格搜索来找到最佳学习率,然后使用最佳学习率来拟合数据。