tf.train.ExponentialMovingAverage做什么?

时间:2016-07-22 09:34:13

标签: machine-learning tensorflow

我刚刚发现了一个使用此操作进行培训的TensorFlow代码。它如何帮助变量培训过程?

4 个答案:

答案 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

被使用。