1. 用滑动平均估计局部均值

  滑动平均(exponential moving average),或者叫做指数加权平均(exponentially weighted moving average),可以用来估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关。

  变量vv在tt时刻记为vtvt,θtθt为变量vv在tt时刻的取值,即在不使用滑动平均模型时vt=θtvt=θt,在使用滑动平均模型后,vtvt的更新公式如下:

vt=β∗vt−1+(1−β)∗θt(1)(1)vt=β∗vt−1+(1−β)∗θt

  上式中,β∈[0,1)β∈[0,1)。β=0β=0 相当于没有使用滑动平均。

  假设起始v0=0v0=0,β=0.9β=0.9,之后每个时刻,依次对变量vv进行赋值,不使用滑动平均和使用滑动平均结果如下:

表 1

t

不使用滑动平均模型,即给vv直接赋值θθ

使用滑动平均模型,按照公式(1)更新vv

使用滑动平均模型,按照公式(2)更新vv

0 0 / /
1 10 1 10
2 20 2.9 13.6842
3 10 3.61 13.3210
4 0 3.249 9.4475
5 10 3.9241 9.5824
6 20 5.53169 11.8057
7 30 7.978521 15.2932
8 5 7.6806689 13.4859
9 0 6.91260201 11.2844

图 1:三种变量更新方式

  Andrew Ng在Course 2 Improving Deep Neural Networks中讲到,tt时刻变量vv的滑动平均值大致等于过去1/(1−β)1/(1−β)个时刻θθ值的平均。这个结论在滑动平均起始时相差比较大,所以有了Bias correction,将vtvt除以(1−βt)(1−βt)修正对均值的估计。

  加入了Bias correction后,vtvt更新公式如下:

vt=β∗vt−1+(1−β)∗θt1−βt(2)(2)vt=β∗vt−1+(1−β)∗θt1−βt

tt越大,1−βt1−βt越接近1,则公式(1)和(2)得到的结果将越来越近。

  当ββ越大时,滑动平均得到的值越和θθ的历史值相关。如果β=0.9β=0.9,则大致等于过去10个θθ值的平均;如果β=0.99β=0.99,则大致等于过去100个θθ值的平均。

  滑动平均的好处:

占内存少,不需要保存过去10个或者100个历史θθ值,就能够估计其均值。(当然,滑动平均不如将历史值全保存下来计算均值准确,但后者占用更多内存和计算成本更高)

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

  滑动平均可以看作是变量的过去一段时间取值的均值,相比对变量直接赋值而言,滑动平均得到的值在图像上更加平缓光滑,抖动性更小,不会因为某次的异常取值而使得滑动平均值波动很大,如图 1所示。

  TensorFlow 提供了 tf.train.ExponentialMovingAverage 来实现滑动平均。在初始化 ExponentialMovingAverage 时,需要提供一个衰减率(decay),即公式(1)(2)中的ββ。这个衰减率将用于控制模型的更新速度。ExponentialMovingAverage 对每一个变量(variable)会维护一个影子变量(shadow_variable),这个影子变量的初始值就是相应变量的初始值,而每次运行变量更新时,影子变量的值会更新为:

shadow_variable=decay∗shadow_variable+(1−decay)∗variable(3)(3)shadow_variable=decay∗shadow_variable+(1−decay)∗variable

公式(3)中的 shadow_variable 就是公式(1)中的vtvt,公式(3)中的 variable 就是公式(1)中的θtθt,公式(3)中的 decay 就是公式(1)中的ββ。

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

min{decay,1+num_updates10+num_updates}(4)(4)min{decay,1+num_updates10+num_updates}

这一点其实和Bias correction很像。

  TensorFLow 中使用 ExponentialMovingAverage 的例子:code

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

  滑动平均可以使模型在测试数据上更健壮(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.999decay=0.999,一个更直观的理解,在最后的1000次训练过程中,模型早已经训练完成,正处于抖动阶段,而滑动平均相当于将最后的1000次抖动进行了平均,这样得到的权重会更加robust。

References

Course 2 Improving Deep Neural Networks by Andrew Ng

《TensorFlow实战Google深度学习框架》 4.4.3

理解滑动平均(exponential moving average)相关推荐

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

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

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

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

  3. EMA指数滑动平均(Exponential Moving Average)

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

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

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

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

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

  6. TENSORFLOW GUIDE: EXPONENTIAL MOVING AVERAGE FOR IMPROVED CLASSIFICATION

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

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

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

  8. tensorflow || 滑动平均的理解--tf.train.ExponentialMovingAverage

    1 滑动平均的理解 滑动平均(exponential moving average),或者叫做指数加权平均(exponentially weighted moving average),可以用来估计变 ...

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

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

最新文章

  1. Android 开发应该掌握的 Proguard 技巧
  2. instanceof 实现
  3. 揭秘TensorFlow:Google开源到底开的是什么?
  4. 常用的机器学习数据挖掘知识点【转】
  5. 服务器添加管理员隐藏账号,绝招:隐藏管理员账号 三分钟搞定
  6. c语言相邻地址相差多少,C语言内存地址基础
  7. 微信分享功能问题-描述内容换行,导致js加载失败
  8. 全球四大互联网公司最大的敌人是谁
  9. 最短路径例题(Floyd、Dijkstra)
  10. java gb28181网关_视频网关GB28181协议转换解决方案
  11. python多线程返回值问题重写Thread类的run方法
  12. Turtle 模块基础详解-画直线
  13. 《简明python教程》笔记一
  14. idea-debugger调试模式
  15. 摄影基础1 : 135相机
  16. [pwn]调试:gdb+pwndbg食用指南
  17. 四川多多开店:拼多多银行卡认证流程是什么
  18. libcurl异步请求+http长连接池
  19. Authing 联手腾讯云,在云函数上轻松部署 SSO 应用
  20. 【零 zedboard】从SD卡中启动

热门文章

  1. 记录人生第一次收获offer的艰辛
  2. 使用环信进行即时通信IM
  3. Python pyautogui 实现自动发送消息
  4. Kerberos双跳变通办法
  5. Docker 磁盘空间使用分析与清理 解决磁盘空间不足
  6. python pandas 条件选择
  7. 数字孪生系统:智慧城市数据可视化
  8. Npm依赖检查版本及升级
  9. markdown写作教程总结
  10. 达尔文的进化论VS柏拉图的理念论