张量流中GradientDescentOptimizer和AdamOptimizer之间的区别?

时间:2017-09-16 14:58:35

标签: python machine-learning tensorflow regression gradient-descent

使用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 个答案:

答案 0 :(得分:6)

我曾经遇到类似的问题,我花了很长时间才发现真正的问题。随着梯度下降,我的损失函数实际上在增长而不是变小。

事实证明我的学习率太高。如果你采取梯度下降太大的步骤,你最终可以跳过最小值。如果你真的不走运,就像我一样,你最终跳得太远,你的错误就会增加。

降低学习率应使模型收敛。但这可能需要很长时间。

亚当优化器具有动量,也就是说,它不会跟随瞬时渐变,但它会以一种速度<跟踪它前面的方向/ em>的。这样,如果你因为渐变开始前后移动而不是动量会迫使你在这个方向上走得更慢。这有很大帮助!除了动量之外,Adam还有一些其他的推文,使其成为首选的深度学习优化器。

如果您想了解有关优化器的更多信息,请参阅此博客文章。 http://ruder.io/optimizing-gradient-descent/