指数滑动平均(Exponential Moving Average)

指数滑动平均也叫权重移动平均(Weighted Moving Average),是一种给予近期数据更高权重的平均方法。

假设有nnn个权重数据:[θ1,θ2,⋯,θn][\theta_1,\theta_2,\cdots,\theta_n][θ1​,θ2​,⋯,θn​],EMA的计算公式:
vt=βvt−1+(1−β)θt(1)v_t=\beta v_{t-1}+(1-\beta)\theta_t\tag{1} vt​=βvt−1​+(1−β)θt​(1)
其中vtv_tvt​称为影子权重,v0=0v_0=0v0​=0。

当β\betaβ越大时,滑动平均得到的值越和θ\thetaθ的历史值相关。如果β=0.9\beta=0.9β=0.9,则大致等于过去 10 个 θθθ 值的平均;如果 β=0.99\beta=0.99β=0.99,则大致等于过去 100 个θ\thetaθ值的平均。EMA可以近似看作过去1/(1−β)1/(1-\beta)1/(1−β)个时刻vvv值的平均。过去nnn时刻的平均为:
vt=(n−1)vt−1+θtn=n−1nvt−1+1nθt(2)v_t=\frac{(n-1)v_{t-1}+\theta_t}{n}=\frac{n-1}{n}v_{t-1}+\frac{1}{n}\theta_t\tag{2} vt​=n(n−1)vt−1​+θt​​=nn−1​vt−1​+n1​θt​(2)
类比可得β=n−1n\beta=\cfrac{n-1}{n}β=nn−1​

EMA计算,会将过去1/(1−β)1/(1-\beta)1/(1−β)个时刻前的数据衰减到 1e\cfrac{1}{e}e1​ 的比例:
vt=βvt−1+(1−β)θt=β(βvt−2+(1−β)θt−1)+(1−β)θt=⋯=βnvt−n+(1−β)(βn−1θt−n+1+⋯+β0θt)(3)\begin{aligned} v_t&=\beta v_{t-1}+(1-\beta)\theta_t\\ &=\beta(\beta v_{t-2}+(1-\beta)\theta_{t-1})+(1-\beta)\theta_t\\ &=\cdots\\ &=\beta^nv_{t-n}+(1-\beta)(\beta^{n-1}\theta_{t-n+1} + \cdots + \beta^0\theta_t) \end{aligned}\tag{3} vt​​=βvt−1​+(1−β)θt​=β(βvt−2​+(1−β)θt−1​)+(1−β)θt​=⋯=βnvt−n​+(1−β)(βn−1θt−n+1​+⋯+β0θt​)​(3)

vt−nv_{t-n}vt−n​的系数βn=β1/(1−β)≈1e\beta^n=\beta^{1/(1-\beta)}\approx \cfrac{1}{e}βn=β1/(1−β)≈e1​。

滑动平均的好处:占内存少,不需要保存过去101010个或者100100100个历史θ\thetaθ值,就能够估计其均值。(当然,也可以将历史值全保存下来计算均值准确,但后者占用更多内存和计算成本更高)。

公式(1)当滑动的步数较少时,vtv_tvt​容易受到初始值v0=0v_0=0v0​=0的影响,所以添加一个偏差修正vt=vt1−βtv_t=\cfrac{v_t}{1-\beta^t}vt​=1−βtvt​​,当ttt很大时,修正近似111

ema为什么有效

滑动平均可以使模型在测试数据上更鲁棒(robust)。对于目前普遍的mini-batch训练方式,参数的更新可能存在抖动,采用滑动平均可以使得参数的更新更平滑。

设 β=0.999\beta=0.999β=0.999,一个更直观的理解,在最后的 1000 次训练过程中,模型早已经训练完成,正处于抖动阶段,而滑动平均相当于将最后的 100010001000 次抖动进行了平均,这样得到的权重会更加 robust。

也有一种解释,是将ema视作学习率衰减。近似的推导:
θn=θn−1−gn−1=θn−1−gn−1−gn−2=⋯=θ1−∑i=1n−1gi(4)\begin{aligned} \theta_n&=\theta_{n-1}-g_{n-1}\\ &=\theta_{n-1}-g_{n-1}-g_{n-2}\\ &=\cdots\\ &=\theta_1-\sum_{i=1}^{n-1}g_i \end{aligned}\tag{4} θn​​=θn−1​−gn−1​=θn−1​−gn−1​−gn−2​=⋯=θ1​−i=1∑n−1​gi​​(4)
继续推导公式(3),令t=nt=nt=n时刻n的影子权重为:
vn=βnv0+(1−β)(βn−1θ1+⋯+β0θn)(5)v_n=\beta^nv_{0}+(1-\beta)(\beta^{n-1}\theta_{1} + \cdots + \beta^0\theta_n)\tag{5} vn​=βnv0​+(1−β)(βn−1θ1​+⋯+β0θn​)(5)
将θn\theta_nθn​代入影子权重的公式,v0v_0v0​取θ1\theta_1θ1​:
vn=βnv0+(1−β)(βn−1θ1+⋯+β0θn)=βnv0+(1−β)(θ1−∑i=1n−1gi+β(θ1−∑i=1n−2gi)+⋯+βn−2(θ1−∑i=11gi)+βn−1θ1)=βnv0+(1−β)(θ1+βθ1+⋯+βn−1θ1−(∑i=1n−1gi+β∑i=1n−2gi+⋯+βn−2∑i=11gi))=βnv0+(1−β)((1−βn1−β)θ1−∑i=1n−11−βn−i1−βgi)=βnv0+(1−βn)θ1−∑i=1n−1(1−βn−i)gi=θ1−∑i=1n−1(1−βn−i)gi(6)\begin{aligned} v_n&=\beta^nv_{0}+(1-\beta)(\beta^{n-1}\theta_{1} + \cdots + \beta^0\theta_n)\\ &=\beta^nv_0+(1-\beta)(\theta_1-\sum_{i=1}^{n-1}g_i + \beta(\theta_1-\sum_{i=1}^{n-2}g_i)+\cdots+\beta^{n-2}(\theta_1-\sum_{i=1}^1g_i)+\beta^{n-1}\theta_1)\\ &=\beta^nv_0+(1-\beta)\left(\theta_1+\beta\theta_1+\cdots+\beta^{n-1}\theta_1 -(\sum_{i=1}^{n-1}g_i+\beta\sum_{i=1}^{n-2}g_i+\cdots+\beta^{n-2}\sum_{i=1}^1g_i)\right)\\ &=\beta^nv_0+(1-\beta)\left((\frac{1-\beta^n}{1-\beta})\theta_1-\sum_{i=1}^{n-1}\frac{1-\beta^{n-i}}{1-\beta}g_i\right)\\ &=\beta^nv_0+(1-\beta^n)\theta_1-\sum_{i=1}^{n-1}(1-\beta^{n-i})g_i\\ &=\theta_1-\sum_{i=1}^{n-1}(1-\beta^{n-i})g_i \end{aligned}\tag{6} vn​​=βnv0​+(1−β)(βn−1θ1​+⋯+β0θn​)=βnv0​+(1−β)(θ1​−i=1∑n−1​gi​+β(θ1​−i=1∑n−2​gi​)+⋯+βn−2(θ1​−i=1∑1​gi​)+βn−1θ1​)=βnv0​+(1−β)(θ1​+βθ1​+⋯+βn−1θ1​−(i=1∑n−1​gi​+βi=1∑n−2​gi​+⋯+βn−2i=1∑1​gi​))=βnv0​+(1−β)((1−β1−βn​)θ1​−i=1∑n−1​1−β1−βn−i​gi​)=βnv0​+(1−βn)θ1​−i=1∑n−1​(1−βn−i)gi​=θ1​−i=1∑n−1​(1−βn−i)gi​​(6)
对比公式(4)可的EMA对第iii步梯度更新增加了权重系数1−βn−i1-\beta^{n-i}1−βn−i,类似于learning rate decay。

【炼丹技巧】指数移动平均(EMA)的原理及PyTorch实现
理解滑动平均(exponential moving average)
第二周:优化算法 (Optimization algorithms)

EMA指数滑动平均(Exponential Moving Average)相关推荐

  1. 理解滑动平均(exponential moving average)

    1. 用滑动平均估计局部均值 滑动平均(exponential moving average),或者叫做指数加权平均(exponentially weighted moving average),可以 ...

  2. YOLOv5的Tricks | 【Trick7】指数移动平均(Exponential Moving Average,EMA)

    如有错误,恳请指出. 文章目录 1. 移动平均法 2. 指数移动平均 3. TensorFlow中的EMA使用 4. Yolov5中的EMA使用 这篇博客主要用于整理网上对EMA(指数移动平均)的介绍 ...

  3. BN/Batch Norm中的滑动平均/移动平均/Moving Average

    BN中的滑动平均是怎么做的 训练过程中的每一个batch都会进行滑动平均的计算[1]: moving_mean = moving_mean * momentum + batch_mean * (1 - ...

  4. 指数移动平均值(exponential moving average)常用于平滑曲线

    https://baike.baidu.com/item/EMA/12646151 https://blog.csdn.net/kuweicai/article/details/80517284 ht ...

  5. 滑动平均(Moving Average Models,MA)模型

    这里我们直接给出MA(q)模型的形式: c0为一个常数项.这里的at,是AR模型t时刻的扰动或者说新息(也就是白噪声误差项),则可以发现,该模型,使用了过去q个时期的随机干扰或预测误差来线性表达当前的 ...

  6. 炼丹系列2: Stochastic Weight Averaging (SWA) Exponential Moving Average(EMA)

    这个系列将记录下本人平时在深度学习方面觉得实用的一些trick,可能会包括性能提升和工程优化等方面. 该系列的代码会更新到Github 炼丹系列1: 分层学习率&梯度累积 炼丹系列2: Sto ...

  7. TENSORFLOW GUIDE: EXPONENTIAL MOVING AVERAGE FOR IMPROVED CLASSIFICATION

    Parameter Selection via Exponential Moving Average When training a classifier via gradient decent, w ...

  8. 计算MACD(指数平滑移动平均线)Moving Average Convergence / Divergence

    移动平均值:EMA 离差值:DIF DEA:9日DIF移动平均值 MACD:指数平滑移动平均线 1.  EMA(12)=(前一日EMA(12)*11+今日收盘价*2)/13 2.  EMA(26)=( ...

  9. 神经网络优化:指数衰减计算平均值(滑动平均)

    Polyak平均会平均优化算法在参数空间访问中的几个点.如果t次迭代梯度下降访问了点,那么Polyak平均算法的输出是. 当应用Polyak平均于非凸问题时,通常会使用指数衰减计算平均值: 1. 用滑 ...

最新文章

  1. 湖北生态工程职业技术学院计算机分数线,湖北生态工程职业技术学院录取分数线2021是多少分(附历年录取分数线)...
  2. java安全编码指南之:Mutability可变性
  3. 从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级
  4. 使用.NET Core创建Windows服务(一) - 使用官方推荐方式
  5. java mvc 导出excel_Java springMVC POI 导出 EXCEL
  6. oracle关于分区,关于Oracle分区
  7. 站点简介(欢迎大家踊跃参与本站站点的建设,谢谢)
  8. hive时间函数入门
  9. 苹果 macOS Monterey 桌面抽象风格不好看,如何换成自己喜欢的照片?
  10. 配置Gitlab Push自动触发jenkins构建
  11. 混合罚函数c语言程序,混合惩罚函数法.ppt
  12. Unity经验分享——如何实现黑洞吸附效果
  13. Mysql读写分离的原理及配置--amoeba
  14. execute()方法
  15. 5G无线系统设计与国际标准 pdf和Word
  16. 详解 CatBoost 原理
  17. Oracle最新练习题
  18. GO学习笔记1.5:第一个GO项目常见问题
  19. 自然语言词向量模型:Glove和Bert
  20. 【kubernetes】coredns报错

热门文章

  1. 时间序列分析 | SVM支持向量机时间序列预测(Matlab完整程序)
  2. 脑机接口2——原理和概念
  3. 【记】Vue - 拖拽元素组件实现
  4. 计算机网络的软件技术基础知识,[计算机软件技术基础知识要点.doc
  5. 游玩3ds游戏的N种方法
  6. log4j实现发送邮件功能
  7. VMWare虚拟机下调整界面的大小
  8. Proe Creo 二次开发之模型装配--缺省与坐标系
  9. 计算机的输出原理,计算机原理及系统结构 输入输出设备.ppt
  10. 痞子衡嵌入式:在MDK开发环境下将关键函数重定向到RAM中执行的几种方法