为什么我的梯度下降优化器在接近解决方案后会崩溃?
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
的增加而增加。这就是为什么你会在一个纪元的后期看到更大的波动。
我猜你选择了高学习率。您可以使用网格搜索并找到最佳学习率,然后使用最佳学习率拟合数据。
我正在尝试 运行 通过 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
的增加而增加。这就是为什么你会在一个纪元的后期看到更大的波动。
我猜你选择了高学习率。您可以使用网格搜索并找到最佳学习率,然后使用最佳学习率拟合数据。