张量流中 GradientDescentOptimizer 和 AdamOptimizer 的区别?

Posted

技术标签:

【中文标题】张量流中 GradientDescentOptimizer 和 AdamOptimizer 的区别?【英文标题】:Difference between GradientDescentOptimizer and AdamOptimizer in tensorflow? 【发布时间】:2018-02-25 13:40:35 【问题描述】:

当使用 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】:

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

原来我的学习率太高了。如果你在梯度下降中采取了太大的步骤,你最终可能会跳过最小值。如果你真的很不走运,就像我一样,你最终会跳得太远,以至于你的错误会增加。

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

Adam 优化器具有动量,也就是说,它不仅遵循瞬时梯度,而且还以一种 速度 跟踪它之前的方向>。这样,如果你因为梯度而开始来回移动,那么动量将迫使你在这个方向上走得更慢。这很有帮助!除了动量之外,Adam 还有几周的时间使其成为首选的深度学习优化器。

如果您想了解更多关于优化器的信息,这篇博文内容非常丰富。 http://ruder.io/optimizing-gradient-descent/

【讨论】:

以上是关于张量流中 GradientDescentOptimizer 和 AdamOptimizer 的区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何在张量流中对张量进行子集化?

如何在张量流中张量的某些索引处插入某些值?

张量流中的条件图和访问张量大小的for循环

在张量流中,如何迭代存储在张量中的输入序列?

当切片本身是张量流中的张量时如何进行切片分配

根据张量流中给定的序列长度数组对 3D 张量进行切片