1、概述

在采用随机梯度下降(SGD)算法训练神经网络时,使用滑动平均模型可以一定程度增强参数的稳定性,提高最终模型在测试数据上的表现,使模型在测试数据上更健壮。

在实际的神经网络计算中,实际使用的是经过滑动平均后的值

实际效果:滑动平均追随输入参数的变化而变化

滑动平均的表示公式为

影子 = 衰减率 * 影子 + ( 1 - 衰减率 ) * 参数

滑动平均值 = 衰减率 * 滑动平均值 + ( 1 - 衰减率 )* 参数

备注

影子初值 = 参数初值

衰减率 = min{ MOVING_AVERAGE_DECAY, (1+轮数) / (10 + 轮数 ) }

示例:

MOVING_AVERAGE_DECAY 为 0.99, 参数 w1 为 0,轮数 global_step 为 0,w1的滑动平均值为 0 。

参数w1更新为 1 时,则

 w1的滑动平均值 = min( 0.99, 1/10 ) * 0 + ( 1 - min( 0.99, 1/10 ) * 1 = 0.9

假设轮数 global_step 为 100 时,参数 w1 更新为 10 时,则

w1滑动平均值 = min(0.99, 101/110) * 0.9 + ( 1 - min( 0.99, 101/110) * 10 = 1.644

再次运行

w1滑动平均值 = min(0.99, 101/110) * 1.644 + ( 1 - min( 0.99, 101/110) * 10 = 2.328

再次运行

w1滑动平均值 = 2.956

2 滑动平均在Tensorflow中的表示方式

第一步 实例化滑动平均类ema

ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY(滑动平均衰减率),global_step(轮数计数器,表示当前轮数)
)

备注:

MOVING_AVERAGE_DECAY 滑动平均衰减率是超参数,一般设定的值比较大;

global_step - 轮数计数器,表示当前轮数,这个参数与其他计数器公用。

第二步 求算滑动平均节点ema_op

ema_op = ema.apply([])

ema.apply([ ]) 函数表示对 [ ] 中的所有数值求滑动平均。

示例:

ema_op = ema.apply(tf.trainable_variables())

每当运行此代码时,会对所以待优化参数进行求滑动平均运算。

第三步 具体实现方式

在工程应用中,我们通常会将计算滑动平均 ema_op 和训练过程 train_step 绑定在一起运行,使其合成一个训练节点,实现的代码如下

with tf.control_dependencies([ train_step, ema_op ]):train_op = tf.no_op(name = 'train')

另外:

查看某参数的滑动平均值

函数ema.average(参数名) --->  返回 ’ 参数名 ’ 的滑动平均值,

3 示例代码

# 待优化参数w1,不断更新w1参数,求w1的滑动平均(影子)import tensorflow as tf# 1. 定义变量及滑动平均类# 定义一个32位浮点变量并赋初值为0.0,
w1 = tf.Variable(0, dtype=tf.float32)# 轮数计数器,表示NN的迭代轮数,赋初始值为0,同时不可被优化(不参数训练)
global_step = tf.Variable(0, trainable=False)# 设定衰减率为0.99
MOVING_AVERAGE_DECAY = 0.99# 实例化滑动平均类
ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)# ema.apply()函数中的参数为待优化更新列表
# 每运行sess.run(ema_op)时,会对函数中的参数求算滑动平均值
# tf.trainable_variables()函数会自动将所有待训练的参数汇总为待列表
# 因该段代码中仅有w1一个参数,ema_op = ema.apply([w1])与下段代码等价
ema_op = ema.apply(tf.trainable_variables())# 2. 查看不同迭代中变量取值的变化。
with tf.Session() as sess:# 初始化init_op = tf.global_variables_initializer()sess.run(init_op)# 用ema.average(w1)获取w1滑动平均值 (要运行多个节点,作为列表中的元素列出,写在sess.run中)# 打印出当前参数w1和w1滑动平均值print("current global_step:", sess.run(global_step))print("current w1", sess.run([w1, ema.average(w1)]))# 参数w1的值赋为1sess.run(tf.assign(w1, 1))sess.run(ema_op)print("current global_step:", sess.run(global_step))print("current w1", sess.run([w1, ema.average(w1)]))# 更新global_step和w1的值,模拟出轮数为100时,参数w1变为10, 以下代码global_step保持为100,每次执行滑动平均操作,影子值会更新 sess.run(tf.assign(global_step, 100))sess.run(tf.assign(w1, 10))sess.run(ema_op)print("current global_step:", sess.run(global_step))print("current w1:", sess.run([w1, ema.average(w1)]))# 每次sess.run会更新一次w1的滑动平均值sess.run(ema_op)print("current global_step:", sess.run(global_step))print("current w1:", sess.run([w1, ema.average(w1)]))sess.run(ema_op)print("current global_step:", sess.run(global_step))print("current w1:", sess.run([w1, ema.average(w1)]))sess.run(ema_op)print("current global_step:" , sess.run(global_step))print("current w1:", sess.run([w1, ema.average(w1)]))sess.run(ema_op)print("current global_step:" , sess.run(global_step))print("current w1:", sess.run([w1, ema.average(w1)]))

运行

current global_step: 0
current w1 [0.0, 0.0]
current global_step: 0
current w1 [1.0, 0.9]
current global_step: 100
current w1: [10.0, 1.6445453]
current global_step: 100
current w1: [10.0, 2.3281732]
current global_step: 100
current w1: [10.0, 2.955868]
current global_step: 100
current w1: [10.0, 3.532206]
current global_step: 100
current w1: [10.0, 4.061389]

w1 的滑动平均值都向参数 w1 靠近。可见,滑动平均追随参数的变化而变化。

作者:耕毅

转载自:http://www.cnblogs.com/gengyi/p/9901502.html

神经网络优化-滑动平均相关推荐

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

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

  2. 神经网络优化(二) - 滑动平均

    1 滑动平均概述 滑动平均(也称为 影子值 ):记录了每一个参数一段时间内过往值的平均,增加了模型的泛化性. 滑动平均通常针对所有参数进行优化:W 和 b, 简单地理解,滑动平均像是给参数加了一个影子 ...

  3. 人工智能实践:TensorFlow笔记学习(四)—— 神经网络优化

    神经网络优化  大纲 4.1 损失函数 4.2 学习率 4.3 滑动平均 4.4 正则化 4.5 神经网络搭建八股 目标 掌握神经网络优化方法 4.1 损失函数 神经元模型:用数学公式表示为:,f为激 ...

  4. 深度学习教程(6) | 神经网络优化算法(吴恩达·完整版)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/35 本文地址:https://www.showmeai.tech/article-d ...

  5. Halide视觉神经网络优化

    Halide视觉神经网络优化 概述 Halide是用C++作为宿主语言的一个图像处理相关的DSL(Domain Specified Language)语言,全称领域专用语言.主要的作用为在软硬层面上( ...

  6. 各种神经网络优化算法:从梯度下降到Adam方法

    在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳 ...

  7. 【深度学习】从梯度下降到 Adam!一文看懂各种神经网络优化算法

    王小新 编译自 Medium 量子位 出品 | 公众号 QbitAI,编辑:AI有道 在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯 ...

  8. 神经网络优化中的Weight Averaging

    ©PaperWeekly 原创 · 作者|张子逊 研究方向|神经网络剪枝.NAS 在神经网络优化的研究中,有研究改进优化器本身的(例如学习率衰减策略.一系列 Adam 改进等等),也有不少是改进 no ...

  9. 神经网络优化器的选择_神经网络:优化器选择的重要性

    神经网络优化器的选择 When constructing a neural network, there are several optimizers available in the Keras A ...

最新文章

  1. RxJava 内置多种用于调度的线程类型
  2. 纸牌游戏——小猫钓鱼
  3. 计算机网络第4版潘爱民_【每日一题笔试】第 25 天
  4. [有限元]虚位移原理和虚力原理的证明的统一逻辑
  5. git 命令commit_Git Commit命令解释
  6. 苹果 Mac 电脑将采用自研芯片、App Store 上线“小程序”,WWDC20 为开发者带来了什么 ?
  7. 两男子骑摩托车抢夺宴席礼金 警方:嫌疑人已被抓获
  8. Debian从光盘apt-get
  9. C# 使用微信扫码登录网页
  10. python实现根据前序序列和中序序列求二叉树的后序序列
  11. 批发商/分销商会有一波向B2B转型的浪潮
  12. Latex文献报错 Something‘s wrong--perhaps a missing \item. \end{thebibliography}
  13. 添加镜头光晕的正确方法
  14. 最新国产电源厂家及具体型号pin-to-pin替代手册发布
  15. Linux 磁盘管理-配额管理-配置用户对磁盘进行指定大小或者文件数量的使用权限
  16. Spring Boot技术栈博客企业前后端
  17. java学习-画图小程序
  18. LIN总线解析与UART模拟LIN从机实战
  19. [职场道理] -- 宁做鸡头,不做凤尾
  20. 【Python】用sympy判断函数的单调性和极值

热门文章

  1. 如何制作一个浪漫的表白网页
  2. linux上传文件上传不了,linux不能上传文件是什么原因
  3. 答非所问的古今中外名人小笑话幽默
  4. 实现开启和关闭android移动网络(转)
  5. 如何将旧iPhone 的数据全部转移到新iPhone SE3上?
  6. 《勇士传说》横版卷轴动作类游戏笔记-2.素材导入和整理
  7. win10 关闭默认共享--还有一些不足之处
  8. 正版谷歌浏览器下载链接
  9. mhw跳过结尾_怪物猎人世界冷知识汇总 MHW冷门细节汇总
  10. 让皮肤美白水嫩的水果! - 健康程序员,至尚生活!