我刚刚发现了一个使用此操作进行培训的TensorFlow代码。它如何帮助变量培训过程?
答案 0 :(得分:4)
通过使用指数衰减维持变量的移动平均值。
在训练模型时,保持训练参数的移动平均值通常是有益的。使用平均参数的评估有时会产生比最终训练值更好的结果。
DOC: https://www.tensorflow.org/versions/r0.10/api_docs/python/train.html#ExponentialMovingAverage
答案 1 :(得分:1)
您可能需要查看class tf.train.ExponentialMovingAverage
的文档:
某些训练算法(如GradientDescent和Momentum)通常可以在优化过程中保持变量的移动平均值。使用移动平均值进行评估通常会显着改善结果。
通过使用指数衰减维持变量的移动平均值。
解释:
答案 2 :(得分:1)
我有一个问题。考虑到tf.train.ExponentialMovingAverage的TensorFlow官方文档,更新shadow variable
的公式如下:
shadow_variable = decay * shadow_variable +(1 - decay)* variable
但是看一下moving average概念的维基百科链接,更新操作看起来如下:
shadow_variable =(1 - 衰变)* shadow_variable + decay * variable
哪一个是正确的?我认为Wikipedia documentation for moving average的维基百科链接更全面。但是,我对上述论点不太确定。
答案 3 :(得分:1)
据我说:
shadow_variable = decay * shadow_variable + (1 - decay) * variable
是正确的。 我用给定的数据计算了ExponentailMovingAverage:
In [31]: sess.run([a,b])
Out[31]:
[array([[-2.0687273 , -0.43363234],
[ 0.40200853, 0.02875281]], dtype=float32),
array([[-0.31468132, -0.69469845],
[ 2.0624537 , -0.25533926]], dtype=float32)]
使用阴影变量:
In [28]: sess.run([ema_a,ema_b])
Out[28]:
[array([[-1.0375735, -1.0736414],
[ 0.0657308, -0.668182 ]], dtype=float32),
array([[-0.31468132, -0.69469845],
[ 2.0624537 , -0.25533926]], dtype=float32)]
然后我应用了ema_operation来计算新的阴影变量。结果如下:
In [29]: sess.run(ema_apply_op)
In [30]: sess.run([ema_a,ema_b])
Out[30]:
[array([[-1.1406889 , -1.0096405 ],
[ 0.09935857, -0.5984885 ]], dtype=float32),
array([[-0.31468132, -0.69469845],
[ 2.0624537 , -0.25533926]], dtype=float32)]
注意:您可以计算这些值,然后您就会知道
shadow_variable = decay * shadow_variable + (1 - decay) * variable
被使用。