指数加权平均算法的原理

TensorFlow中的滑动平均模型使用的是滑动平均(Moving Average)算法,又称为指数加权移动平均算法(exponenentially weighted average),这也是ExponentialMovingAverage()函数的名称由来。
先来看一个简单的例子,这个例子来自吴恩达老师的DeepLearning课程,个人强烈推荐初学者都看一下。
开始例子。首先这是一年365天的温度散点图,以天数为横坐标,温度为纵坐标,你可以看见各个小点分布在图上,有一定的曲线趋势,但是并不明显

接着,如果我们要看出这个温度的变化趋势,很明显需要做一点处理,也即是我们的主题,用滑动平均算法处理。
首先给定一个值v0,然后我们定义每一天的温度是a1,a2,a3·····
接着,我们计算出v1,v2,v3····来代替每一天的温度,也就是上面的a1,a2,a3
计算方法是:v1 = v0 * 0.9 + a1 (1-0.9),v2= v1 0.9 + a2 (1-0.9),v3= v2 0.9 + a3 (1-0.9)···,也就是说,每一天的温度改变为前一天的v值 0.9 + 当天的温度 * 0.1,vt = v(t-1) * 0.9 + at * 0.1,把所有的v计算完之后画图,红线就是v的曲线:

v值就是指数加权平均数,整个过程就是指数加权平均算法,它很好的把一年的温度曲线给拟合了出来。把0.9抽象为β,总结为vt = v(t-1) * β + at * (1-β)。

β这个值的意义是什么?实际上vt ≈ 1/(1 - β) 天的平均温度,例如:假设β等于0.9,1/(1 - β) 就等于10,也就是vt等于前十天的平均温度,这个说可能不太看得出来;假设把β值调大道接近1,例如,将β等于0.98,1/(1-β)=50,按照刚刚的说法也就是前50天的平均温度,然后求出v值画出曲线,如图所示:

绿线就是β等于0.98时候的曲线,可以明显看到绿线比红线的变化更迟,红线达到某一温度,绿线要过一阵子才能达到相同温度。因为绿线是前50天的平均温度,变化就会更加缓慢,而红线是最近十天的平均温度,只要最近十天的温度都是上升,红线很快就能跟着变化。所以直观的理解就是,vt是前1/(1-β)天的平均温度。
再看看另一个极端情况:β等于0.5,意味着vt≈最近两天的平均温度,曲线如下黄线:

和原本的温度很相似,但曲线的波动幅度也相当大!

然后说一下这个滑动平均模型和深度学习有什么关系:通常来说,我们的数据也会像上面的温度一样,具有不同的值,如果使用滑动平均模型,就可以使得整体数据变得更加平滑——这意味着数据的噪音会更少,而且不会出现异常值。但是同时β太大也会使得数据的曲线右移,和数据不拟合。需要不断尝试出一个β值,既可以拟合数据集,又可以减少噪音。
滑动平均模型在深度学习中还有另一个优点:它只占用极少的内存
当你在模型中计算最近十天(有些情况下远大于十天)的平均值的时候,你需要在内存中加载这十天的数据然后进行计算,但是指数加权平均值约等于最近十天的平均值,而且根据vt = v(t-1) * β + at * (1-β),你只需要提供at这一天的数据,再加上v(t-1)的值和β值,相比起十天的数据这是相当小的数据量,同时占用更少的内存。

偏差修正

指数加权平均值通常都需要偏差修正,TensorFlow中提供的ExponentialMovingAverage()函数也带有偏差修正。

首先看一下为什么会出现偏差,再来说怎么修正。当β等于0.98的时候,还是用回上面的温度例子,曲线实际上不是像绿线一样,而是像紫线:

你可以注意到在紫线刚刚开始的时候,曲线的值相当的低,这是因为在一开始的时候并没有50天(1/(1-β)为50)的数据,而是只有寥寥几天的数据,相当于少加了几十天的数据,所以vt的值很小,这和实际情况的差距是很大的,也就是出现的偏差。
而在TensorFlow中的ExponentialMovingAverage()采取的偏差修正方法是:使用num_updates来动态设置β的大小

在数据迭代的前期,数据量比较少的时候,(1+num_updates)/(10+num_updates)的值比较小,使用这个值作为β来进行vt的计算,所以在迭代前期就会像上面的红线一样,和原数据更加接近。举个例子,当天数是第五天,β为0.98,那么(1+num_updates)/(10+num_updates) = 6/15 = 0.4,相当于最近1.6天的平均温度,而不是β=0.98时候的50天,这样子就做到了偏差修正。

滑动平均模型的代码实现

看到这里你应该大概了解了滑动平均模型和偏差修正到底是怎么回事了,接下来把这个想法对应到TensorFlow的代码中。

首先明确一点,TensorFlow中的ExponentialMovingAverage()是针对权重weight和偏差bias的,而不是针对训练集的。如果你现在训练集中实现这个效果,需要自己设计代码。
为什么要对w和b使用滑动平均模型呢?因为在神经网络中,
更新的参数时候不能太大也不能太小,更新的参数跟你之前的参数有联系,不能发生突变。一旦训练的时候遇到个“疯狂”的参数,有了滑动平均模型,疯狂的参数就会被抑制下来,回到正常的队伍里。这种对于突变参数的抑制作用,用专业术语讲叫鲁棒性,鲁棒性就是对突变的抵抗能力,鲁棒性越好,这个模型对恶性参数的提抗能力就越强。
在TensorFlow中,ExponentialMovingAverage()可以传入两个参数:衰减率(decay)和数据的迭代次数(step),这里的decay和step分别对应我们的β和num_updates,所以在实现滑动平均模型的时候,步骤如下:
1、定义训练轮数step
2、然后定义滑动平均的类
3、给这个类指定需要用到滑动平均模型的变量(w和b)
4、执行操作,把变量变为指数加权平均值

    # 1、定义训练的轮数,需要用trainable=False参数指定不训练这个变量,# 避免这个变量被计算滑动平均值global_step = tf.Variable(0, trainable=False)# 2、给定滑动衰减率和训练轮数,初始化滑动平均类# 定训练轮数的变量可以加快训练前期的迭代速度variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)# 3、用tf.trainable_variable()获取所有可以训练的变量列表,也就是所有的w和b# 全部指定为使用滑动平均模型variables_averages_op = variable_averages.apply(tf.trainable_variables())# 反向传播更新参数之后,再更新每一个参数的滑动平均值,用下面的代码可以一次完成这两个操作with tf.control_dependencies([train_step, variables_averages_op]):train_op = tf.no_op(name="train")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

设置完使用滑动平均模型之后,只需要在每次使用反向传播的时候改为使用run.(train_op)就可以正常执行了。

TensorFlow滑动平均模型相关推荐

  1. tensorflow随笔-滑动平均模型

    随机梯度下降算法训练时,使用滑动平均模型 可以提高模型健壮性. 在Tensorflow中提供了tf.train.ExponentialMovingAverage来实现滑动平均模型.在初始化Expone ...

  2. 【TensorFlow】TensorFlow从浅入深系列之五 -- 教你详解滑动平均模型

    本文是<TensorFlow从浅入深>系列之第5篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维导 ...

  3. tensorflow随机梯度下降算法使用滑动平均模型

    在采用随机梯度下降算法训练神经网络时,使用滑动平均模型可以提高最终模型在测试集数据上的表现.在Tensflow中提供了tf.train.ExponentialMovingAverage来实现滑动平均模 ...

  4. 浅谈tensorflow的指数衰减学习率、正则化、滑动平均模型

    指数衰减学习率使训练迭代更加有效: 学习率决定了每一次迭代训练过程优化神经网络数的幅度,学习率的正确选取对于训练的效率.和效果均有一定的影响,如果我们学习率设定过大,则会可能导致参数在极值两侧跳动,这 ...

  5. Tensorflow笔记之滑动平均模型

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

  6. TensorFlow入门:滑动平均模型

    在TensorFlow中提供了tf.train.ExponentialMovingAverage 来实现滑动平均模型,在采用随机梯度下降算法训练神经网络时,使用其可以提高模型在测试数据上的健壮性(ro ...

  7. Tensorflow:滑动平均模型

    本文转载自:TensorFlow入门:滑动平均模型 在TensorFlow中提供了tf.train.ExponentialMovingAverage 来实现滑动平均模型,在采用随机梯度下降算法训练神经 ...

  8. Tensorflow详解(八)——滑动平均模型

    目录 1.目标: 2.python实现方法: 3.tensorflow计算步骤: 1.目标: 为了在采用随机梯度下降算法训练神经网络时提高最终模型在测试数据上的表现,Tensorflow提供了一种在变 ...

  9. tensorflow 3.滑动平均模型

    # import tensorflow as tf #定义一个变量用于计算滑动平均,这个变量的初始值为0,注意这里手动指定了变量的类型为tf.float32, # 因为所有需要计算滑动平均的变量必须是 ...

最新文章

  1. 枚举的定义枚举类型定义
  2. python语言使用什么语句实现上下文管理协议_Python 技巧探究:上下文管理器和with语句...
  3. 【Codeforces 986B】Petr and Permutations
  4. 五大关键物联网应用助力优化数据中心基础设施管理
  5. 会计信息质量要求有哪些?
  6. opencv 图像增强_图像增强、锐化,利用 Python-OpenCV 帮你实现 4 种方法!
  7. 安排!活动素材的亿级用户精准投放
  8. 第四章语法分析和语法分析程序
  9. python大写字母怎么表示_python – 如何在字符串中搜索大写字母并返回带有和不带大写字母的单词列表...
  10. 【Python3网络爬虫开发实战】3.1.1-发送请求
  11. 电脑不能正常启动windows怎么办,电脑系统无法正常启动
  12. 项目过程的几点经验总结
  13. 如何使用Java代码获取文件、文件流或字符串的编码方式
  14. -3dB带宽定义和理解
  15. FPGA Nios II学习笔记一
  16. 微信公众号开发 糟糕的体验_糟糕的开发人员–好老板
  17. 如何从程序员升级到架构师?
  18. 2014年至今参与的五个项目总结
  19. 与《代码大全》齐名的经典著作 1
  20. 有宠商城Android端

热门文章

  1. html如何使圆点变色,CSS3 波动的彩色小圆点
  2. e5运行Linux系统,在Deepin系统下用deepin-wine5是不能安装腾讯手游助手的
  3. Maya 2017 outliner大纲视图未过滤出多余的set
  4. MATLAB算法实战应用案例精讲-【智能优化算法】多目标粒子群优化(MOPSO)(补充篇)(附MATLAB和python代码实现)
  5. iPhone和iPad屏幕的尺寸和分辨率
  6. springboot+jsp酒店客房VIP客户管理系统java
  7. Linux 删除文件夹下部分指定数据命令
  8. C语言 网吧管理系统 链表项目设计
  9. 佳能 5D4 设置与使用建议(一)
  10. JavaScript前端中的伪类元素before和after使用详解