Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow:关于adam优化器的困惑_Python_Tensorflow - Fatal编程技术网

Python Tensorflow:关于adam优化器的困惑

Python Tensorflow:关于adam优化器的困惑,python,tensorflow,Python,Tensorflow,我对adam优化器在tensorflow中的实际工作方式感到困惑 按照我阅读的方式,它说学习率在每次梯度下降迭代中都会改变 但是当我调用函数时,我给它一个学习率。我调用函数并不是为了做一个历元(隐式调用#迭代以完成我的数据训练)。我为每个批显式调用函数,如下所示 for epoch in epochs for batch in data sess.run(train_adam_step, feed_dict={eta:1e-3}) 所以我的预计到达时间不能改变。我

我对adam优化器在tensorflow中的实际工作方式感到困惑

按照我阅读的方式,它说学习率在每次梯度下降迭代中都会改变

但是当我调用函数时,我给它一个学习率。我调用函数并不是为了做一个历元(隐式调用#迭代以完成我的数据训练)。我为每个批显式调用函数,如下所示

for epoch in epochs
     for batch in data
          sess.run(train_adam_step, feed_dict={eta:1e-3})
所以我的预计到达时间不能改变。我没有传递时间变量。或者这是某种生成器类型的东西,在会话创建时,
t
每次调用优化器时都会递增


假设它是某种生成器类型的东西,并且学习率在无形中降低:我如何才能在不降低学习率的情况下运行adam优化器?在我看来基本上是一样的,我要做的唯一一件事就是使其相等(忽略学习率),就是分别改变超参数
动量
衰减
以匹配
beta1
beta2
。正确吗?

我发现文档非常清晰,我将在这里粘贴伪代码中的算法:

v_t <- decay * v_{t-1} + (1-decay) * gradient ** 2
mom = momentum * mom{t-1} + learning_rate * gradient / sqrt(v_t + epsilon)
variable <- variable - mom
您的参数

  • 学习率
    :1e-4和1e-2之间为标准
  • beta1
    :默认为0.9
  • beta2
    :默认为0.999
  • epsilon
    :默认情况下为1e-08 epsilon的默认值1e-8通常可能不是一个好的默认值。例如,在ImageNet上培训初始网络时,当前的最佳选择是1.0或0.1


初始化:


m_0RMS_-PROP和ADAM都具有自适应学习率

基本RMS_道具

cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
您可以看到,最初它有两个参数衰减率&eps

cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
然后我们可以增加动量,使梯度更稳定,然后我们可以写

cache = decay_rate * cache + (1 - decay_rate) * dx**2
**m = beta1*m + (1-beta1)*dx**  [beta1 =momentum parameter in the doc ]
x += - learning_rate * dx / (np.sqrt(cache) + eps)
现在你可以看到,如果我们保持beta1=o,那么它是没有动量的rms_-prop

然后是亚当的基础知识

cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
他最初是这样描述亚当的

Adam是最近提出的一个更新,看起来有点像带有 动力

是的!那么,这与带有动量的rms_道具有什么区别呢?

m = beta1*m + (1-beta1)*dx
v = beta2*v + (1-beta2)*(dx**2)
**x += - learning_rate * m / (np.sqrt(v) + eps)**
他在更新方程m中再次提到,v更平滑

因此,与rms_道具的区别在于更新的噪音更小

这是什么声音

在初始化过程中,我们将m和v初始化为零

m=v=0

为了减少这种初始化效应,通常需要进行一些预热。所以这个方程是这样的

m = beta1*m + (1-beta1)*dx          beta1 -o.9 beta2-0.999
**mt = m / (1-beta1**t)**
v = beta2*v + (1-beta2)*(dx**2)
**vt = v / (1-beta2**t)**
x += - learning_rate * mt / (np.sqrt(vt) + eps)
现在,我们运行它进行几次迭代。很明显,请注意粗体的线条,您可以看到当t增加(迭代次数)时,mt会发生以下情况


mt=m

我没有意识到学习率没有衰减,而是正常化了。谢谢你,我明白了。是的,保持动量和保持梯度的移动平均值是有区别的。谢谢。我可能错了,但它不是
sqrt(1-beta1^t)/(1-beta2^t)
吗?这些值意味着如果
gradient
在所有迭代中都是常量,那么对
变量的更新也会是常量。
cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)