Python Tensorflow:关于adam优化器的困惑
我对adam优化器在tensorflow中的实际工作方式感到困惑 按照我阅读的方式,它说学习率在每次梯度下降迭代中都会改变 但是当我调用函数时,我给它一个学习率。我调用函数并不是为了做一个历元(隐式调用#迭代以完成我的数据训练)。我为每个批显式调用函数,如下所示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}) 所以我的预计到达时间不能改变。我
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)