滑动平均介绍和在tensorflow中的应用

滑动平均用于估计变量局部均值,减少更新的波动。在Tensorflow中,通过ExponentialMovingAverage进行实现,维护影子变量,用衰减率控制更新速度。在测试阶段,使用滑动平均权重可提升模型表现,因为它提供更平滑的更新路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

滑动平均:

或者被称之为加权平均,可以用来估计变量的局部均值,使变量的更新与一段时间内的取值有关。

1.滑动平均介绍

上面的式子中。β=0相当于没有使用滑动平均。

假设开始的之后的每个时刻一次对变量进行赋值,不使用滑动平均和使用滑动平均的结果如下:

         这里t时刻变量v的滑动平均值大致等于过去1/(1-β)个时刻θ的平均值。这个结论在滑动平均开始时相差比较大,所以有了Bias correction,将vt除以(1βt)修正对均值的估计。这样我们的公式就变成了。

这里的t越大,那么我们等式的分母越接近1。表示我们得到的β越大,表示我们得到的滑动平均值和θ的历史值有关。如果β=0.9,则大致等于过去10θ值的平均;如果β=0.99,则大致等于过去100θ值的平均。占内存少,不需要保存过去10个或者100个历史θ值,就能够估计其均值。(当然,滑动平均不如将历史值全保存下来计算均值准确,但后者占用更多内存和计算成本更高)(这里需要了解过去的10个值和100个值表示一种近似)

 

 

2.Tensorflow中使用滑动平均来更新变量(参数)

    在初始化 ExponentialMovingAverage 时,需要提供一个衰减率(decay),即公式(1)(2)中的β。这个衰减率将用于控制模型的更新速度。

ExponentialMovingAverage 对每一个变量(variable)会维护一个影子变量(shadow_variable),这个影子变量的初始值就是相应变量的初始值,而每次运行变量更新时,影子变量的值会更新为:

 上述,decay 决定了影子变量的更新速度,decay 越大影子变量越趋于稳定。在实际运用中,decay一般会设成非常接近1的数(比如0.9990.9999)。为了使得影子变量在训练前期可以更新更快,ExponentialMovingAverage 还提供了 num_updates 参数动态设置 decay 的大小。如果在初始化 ExponentialMovingAverage 时提供了 num_updates 参数,那么每次使用的衰减率将是:

 

 

3.滑动平均为什么在测试过程中使用

对神经网络边的权重 weights 使用滑动平均,得到对应的影子变量 shadow_weights在训练过程仍然使用原来不带滑动平均的权重 weights,不然无法得到 weights 下一步更新的值,又怎么求下一步 weights 的影子变量 shadow_weights。之后在测试过程中使用 shadow_weights 来代替 weights 作为神经网络边的权重,这样在测试数据上效果更好。因为 shadow_weights 的更新更加平滑,对于随机梯度下降而言,更平滑的更新说明不会偏离最优点很远;对于梯度下降 batch gradient decent,我感觉影子变量作用不大,因为梯度下降的方向已经是最优的了,loss 一定减小;对于 mini-batch gradient decent,可以尝试滑动平均,毕竟 mini-batch gradient decent 对参数的更新也存在抖动。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿6先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值