主要内容

什么是EMA?

为什么EMA在测试过程中使用通常能提升模型表现?

Tensorflow实现

PyTorch实现

Refercences


什么是EMA?

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

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

假设我们得到一个参数 θ \theta θ在不同的 epoch 下的值
θ 1 , θ 2 , . . . , θ t \theta_1,\theta_2,...,\theta_t θ1​,θ2​,...,θt​

当训练结束的 θ \theta θ的MovingAverage 就是:

v t = β ∗ v t − 1 + ( 1 − β ) ∗ v t v_t=\beta*v_{t-1}+(1-\beta)*v_t vt​=β∗vt−1​+(1−β)∗vt​

β \beta β代表衰减率,该衰减率用于控制模型更新的速度。

Andrew Ng在Course 2 Improving Deep Neural Networks中讲到, t t t时刻变量 v v v的滑动平均值大致等于过去 1 / ( 1 − β ) 1/(1−\beta) 1/(1−β)个时刻 v v v值的平均。


图1 不同 β \beta β 值做EMA的效果对比(天气预报数据)

当 β \beta β越大时,滑动平均得到的值越和 v v v的历史值相关。如果 β = 0.9 \beta=0.9 β=0.9,则大致等于过去10个 v v v值的平均;如果 β = 0.99 \beta=0.99 β=0.99,则大致等于过去100个 v v v值的平均。(数学证明先省略,因为作者暂时没理解证明过程==)

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

为什么EMA在测试过程中使用通常能提升模型表现?

滑动平均可以使模型在测试数据上更健壮(robust)。“采用随机梯度下降算法训练神经网络时,使用滑动平均在很多应用中都可以在一定程度上提高最终模型在测试数据上的表现。”

对神经网络边的权重 weights 使用滑动平均,得到对应的影子变量shadow_weights。在训练过程仍然使用原来不带滑动平均的权重 weights,以得到 weights 下一步更新的值,进而求下一步 weights 的影子变量 shadow_weights。之后在测试过程中使用shadow_weights 来代替 weights 作为神经网络边的权重,这样在测试数据上效果更好。因为 shadow_weights 的更新更加平滑,对于:

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

Tensorflow实现

TensorFlow 提供了 tf.train.ExponentialMovingAverage来实现滑动平均。

Example usage when creating a training model:

# Create variables.
var0 = tf.Variable(...)
var1 = tf.Variable(...)
# ... use the variables to build a training model...
...
# Create an op that applies the optimizer.  This is what we usually
# would use as a training op.
opt_op = opt.minimize(my_loss, [var0, var1])# Create an ExponentialMovingAverage object
ema = tf.train.ExponentialMovingAverage(decay=0.9999)with tf.control_dependencies([opt_op]):# Create the shadow variables, and add ops to maintain moving averages# of var0 and var1. This also creates an op that will update the moving# averages after each training step.  This is what we will use in place# of the usual training op.training_op = ema.apply([var0, var1])...train the model by running training_op...

There are two ways to use the moving averages for evaluations:

Example of restoring the shadow variable values:

# Create a Saver that loads variables from their saved shadow values.
shadow_var0_name = ema.average_name(var0)
shadow_var1_name = ema.average_name(var1)
saver = tf.train.Saver({shadow_var0_name: var0, shadow_var1_name: var1})
saver.restore(...checkpoint filename...)
# var0 and var1 now hold the moving average values

PyTorch实现

PyTorch官方目前没有提供EMA的实现,不过自己实现也不会太复杂,下面提供一个网上大神的实现方法:

class EMA():def __init__(self, decay):self.decay = decayself.shadow = {}def register(self, name, val):self.shadow[name] = val.clone()def get(self, name):return self.shadow[name]def update(self, name, x):assert name in self.shadownew_average = (1.0 - self.decay) * x + self.decay * self.shadow[name]self.shadow[name] = new_average.clone()

使用方法,分为初始化、注册和更新三个步骤。

// init
ema = EMA(0.999)// register
for name, param in model.named_parameters():if param.requires_grad:ema.register(name, param.data)// update
for name, param in model.named_parameters():if param.requires_grad:ema.update(name, param.data) 

Refercences

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

[2]. EMA 指数滑动平均原理和实现 (PyTorch)
[3]. tf.train.ExponentialMovingAverage

指数加权平均(EMA)理解相关推荐

  1. 深度学习笔记(2):2.3|2.4 指数加权平均及理解 | 2.5 指数加权平均的偏差修正

    接下来介绍一些比梯度下降法计算速度更快的优化算法. 2.3  指数加权平均 为了更好地介绍这些优化算法,这里先介绍一个概念----指数加权平均(exponentially weighted avera ...

  2. 机器学习模型性能提升技巧:指数加权平均(EMA)

    主要内容 什么是EMA? 为什么EMA在测试过程中使用通常能提升模型表现? Tensorflow实现 PyTorch实现 Refercences 什么是EMA? 滑动平均(exponential mo ...

  3. 2.4 理解指数加权平均-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.3 指数加权平均 回到目录 2.5 指数加权平均的偏差修正 理解指数加权平均 (Understanding Exponentially Weighted Averages ...

  4. PyTorch指数移动平均(EMA)手册

    文章目录 PyTorch指数移动平均(EMA)手册 EMA的数学模型 EMA的意义 EMA的偏差修正 EMA在测试阶段的优越性能 PyTorch实现 Reference PyTorch指数移动平均(E ...

  5. 指数加权平均(EWA)

    平时跑模型只知道直接上Adam Optimizer,但具体原理却不甚理解,于是把吴恩达老师的深度学习课翻出来看,记录一下关于动量优化算法的基础-EMA相关内容. 指数加权平均的概念 平时我们计算平均值 ...

  6. 2.2.2 指数加权平均

    指数加权平均 下面介绍一下比梯度下降更快的算法,不过在这之前,你要了解指数加全平均. 如1和2所示,指数加权实际上就是设置一个权值.就像下图所示 通过 11−β11−β \frac{1}{1-\bet ...

  7. 2.5 指数加权平均的偏差修正-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.4 理解指数加权平均 回到目录 2.6 动量梯度下降法 指数加权平均的偏差修正 (Bias Correction in Exponentially Weighted Av ...

  8. 2.3 指数加权平均-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.2 理解 mini-batch 梯度下降法 回到目录 2.4 理解指数加权平均 指数加权平均 (Exponentially Weighted Averages) 我想向你 ...

  9. 指数加权平均与RmsProp(转载+自己总结)以及Adagrad

    一.指数加权平均(先说用途:抗噪声拟合) 假设我们有一年365天的气温数据θ1,θ2,...,θ365\theta_1,\theta_2,...,\theta_{365}θ1​,θ2​,...,θ36 ...

最新文章

  1. 网吧ARP双绑定详细策略   -限制P2P绝密版
  2. python抢票_50 个加速包都抢不到车票,还不如这个 Python 抢票神器!
  3. Maven项目中获取classpath和资源文件的路径
  4. DS18B20读数错误排除
  5. 改变dom样式的方法
  6. 北京大学:“巍巍上庠 国运所系”北大为时代发展而歌(附历年高考各省投档线)...
  7. 云+X案例展 | 金融类:青云QingCloud助力泰康人寿云计算演进之路
  8. java高效写文件_java如何高效读写10G以上大文件
  9. 冒号课堂§6.4:后台脚本
  10. 标准化设计解决方案 - 标记语言和样式手册 表单
  11. 美检方或起诉刘强东;百度对呛微信规则;澳洲调查 Facebook | 极客头条
  12. 计算机通过逻辑电路实现运算,计算机组成与体系结构数据表示与运算算法和逻辑电路实现.ppt...
  13. python脚本性能分析
  14. Ble扫描导致wifi信号弱/断开解决
  15. 国际计算机网络信息与安全管理,计算机信息网络国际联网单位安全管理制度
  16. 7.1 认识Access报表
  17. 关于彻底删除捆绑软件的解决方案
  18. App启动页倒计时圆形并且跳过功能实现
  19. cf3月活动大全 3月活动汇总2015
  20. Win32无边框窗口

热门文章

  1. [背包DP] 洛谷相关题目整理与练习(74题-)
  2. redis 两台服务器组集群
  3. 3.5学习内容 宽带测速原理,RESTful架构,rpc个人理解
  4. MapReduce最佳成绩统计,男生女生比比看
  5. Keil C51中code、data、bdata、idata、xdata、pdata的解释
  6. word2vec and glove
  7. 零基础自学平面设计需要学些什么?
  8. 学习ios Metal(3)—宽度可调的线条的绘制
  9. 【EFS】NV65633-LTE搜网能力的NV值、格式、配置
  10. Toad 工具使用心得