本文主要是介绍指数滑动平均EMA,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
定义
指数移动平均(Exponential Moving Average)也叫权重移动平均(Weighted Moving Average),是一种给予近期数据更高权重的平均方法。
有数据 θ 1 , . . . , θ n \theta_1,...,\theta_n θ1,...,θn,
E M A : v t = β ⋅ v t − 1 + ( 1 − β ) ⋅ θ t EMA : v_t= \beta \cdot v_{t-1} + (1-\beta) \cdot \theta_t EMA:vt=β⋅vt−1+(1−β)⋅θt,其中, v t v_t vt 表示前 t t t 条的平均值 ( v 0 = 0 v_0 = 0 v0=0 ), β \beta β是加权权重值 (一般设为0.9-0.999)。
深度学习中的EMA
在深度学习的优化过程中, θ t \theta_t θt 是 t t t 时刻的模型权重weights, v t v_t vt 是 t t t 时刻的影子权重(shadow weights)。在梯度下降的过程中,会一直维护着这个影子权重,但是这个影子权重并不会参与训练。基本的假设是,模型权重在最后的n步内,会在实际的最优点处抖动,所以我们取最后n步的平均,能使得模型更加的鲁棒。
滑动平均为什么在测试过程中被使用?[1]
滑动平均可以使模型在测试数据上更健壮(robust)。“采用随机梯度下降算法训练神经网络时,使用滑动平均在很多应用中都可以在一定程度上提高最终模型在测试数据上的表现。”
对神经网络边的权重 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 对参数的更新也存在抖动。
设 decay=0.999,一个更直观的理解,在最后的 1000 次训练过程中,模型早已经训练完成,正处于抖动阶段,而滑动平均相当于将最后的 1000 次抖动进行了平均,这样得到的权重会更加 robust。
推导详见
https://zhuanlan.zhihu.com/p/68748778
Reference
[1] https://www.cnblogs.com/wuliytTaotao/p/9479958.html
这篇关于指数滑动平均EMA的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!