使用GradientDescentOptimizer而不是Adam Optimizer时,模型似乎不会收敛 . 另一方面,AdamOptimizer似乎工作正常 . 来自tensorflow的GradientDescentOptimizer出了什么问题?
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
def randomSample(size=100):
"""
y = 2 * x -3
"""
x = np.random.randint(500, size=size)
y = x * 2 - 3 - np.random.randint(-20, 20, size=size)
return x, y
def plotAll(_x, _y, w, b):
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(_x, _y)
x = np.random.randint(500, size=20)
y = w * x + b
ax.plot(x, y,'r')
plt.show()
def lr(_x, _y):
w = tf.Variable(2, dtype=tf.float32)
b = tf.Variable(3, dtype=tf.float32)
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
linear_model = w * x + b
loss = tf.reduce_sum(tf.square(linear_model - y))
optimizer = tf.train.AdamOptimizer(0.0003) #GradientDescentOptimizer
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for i in range(10000):
sess.run(train, {x : _x, y: _y})
cw, cb, closs = sess.run([w, b, loss], {x:_x, y:_y})
print(closs)
print(cw,cb)
return cw, cb
x,y = randomSample()
w,b = lr(x,y)
plotAll(x,y, w, b)
1 回答
我曾经遇到过类似的问题,我花了很长时间才发现真正的问题 . 随着梯度下降,我的损失函数实际上在增长而不是变小 .
原来,我的 learning rate was too high . 如果你采取梯度下降太大的步骤,你最终可以跳过最小值 . 如果你真的不走运,就像我一样,你最终跳得太远,你的错误就会增加 .
降低学习率应使模型收敛 . 但这可能需要很长时间 .
Adam optimizer has momentum ,也就是说,它不仅仅跟随瞬时梯度,而是以一种速度跟踪它前进的方向 . 这样,如果你因为渐变开始前后移动而不是动量会迫使你在这个方向上走得更慢 . 这有很大帮助!除了动量之外,Adam还有一些更多的推文,使其成为首选的深度学习优化器 .
如果您想了解有关优化器的更多信息,这篇博文非常有用 . http://ruder.io/optimizing-gradient-descent/