为什么我的梯度下降优化器在接近解决方案后会崩溃?

Why does my gradient descent optimizer blow up after getting close to a solution?

我正在尝试 运行 通过 Tensorflow 中的一个简单的线性回归示例,训练算法似乎正在收敛到一个解决方案,但一旦接近该解决方案,它就会开始反弹并最终爆炸。

我正在为 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]))

这是结果。我圈出了接近解决方案的部分。为什么梯度下降一旦接近解决方案就会中断,还是我做错了什么?

如果学习率太高,就会发生这种情况;尝试降低它。

您的代码一次只提供一个训练数据一个时期。这对应于随机梯度下降,其中损失值在训练期间往往比 batch 和 mini-batch 梯度下降更频繁地波动。此外,由于数据是按 x 递增的顺序馈送的,因此梯度值也会随着 x 的增加而增加。这就是为什么你会在一个纪元的后期看到更大的波动。

我猜你选择了高学习率。您可以使用网格搜索并找到最佳学习率,然后使用最佳学习率拟合数据。