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

1 滑动平均概述

滑动平均(也称为 影子值 ):记录了每一个参数一段时间内过往值的平均,增加了模型的泛化性。

滑动平均通常针对所有参数进行优化:W 和 b,

简单地理解,滑动平均像是给参数加了一个影子,参数变化,影子缓慢追随。

滑动平均的表示公式为

影子 = 衰减率 * 影子 + ( 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的值赋为1
    sess.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]

原文地址:https://www.cnblogs.com/gengyi/p/9901502.html

时间: 2024-11-10 01:31:39

神经网络优化(二) - 滑动平均的相关文章

神经网络优化(二) - 搭建神经网络八股

为提高程序的可复用性,搭建模块化的神经网络八股 1 前向传播 前向传播就是设计.搭建从输入(参数 x ) 到输出(返回值为预测或分类结果 y )的完整网络结构,实现前向传播过程,一般将其放在 forward.py 文件中 前向传播需要定义三个函数(实际上第一个函数是框架,第二.三个函数是赋初值过程) def forward(x, regularizer): w = b = y = return y 函数功能: 定义前向传播过程,返回值为y 完成网络结构的设计,实现从输入到输出的数据通路 regu

【零基础】神经网络优化之Adam

一.序言 Adam是神经网络优化的另一种方法,有点类似上一篇中的“动量梯度下降”,实际上是先提出了RMSprop(类似动量梯度下降的优化算法),而后结合RMSprop和动量梯度下降整出了Adam,所以这里我们先由动量梯度下降引申出RMSprop,最后再介绍Adam.不过,由于RMSprop.Adam什么的,真的太难理解了,我就只说实现不说原理了. 二.RMSprop 先回顾一下动量梯度下降中的“指数加权平均”公式: vDW1 = beta*vDW0 + (1-beta)*dw1 vDb1 = b

tensorflow:实战Google深度学习框架第四章02神经网络优化(学习率,避免过拟合,滑动平均模型)

1.学习率的设置既不能太小,又不能太大,解决方法:使用指数衰减法 例如: 假设我们要最小化函数 y=x2y=x2, 选择初始点 x0=5x0=5 1. 学习率为1的时候,x在5和-5之间震荡. import tensorflow as tf TRAINING_STEPS = 10 LEARNING_RATE = 1 x = tf.Variable(tf.constant(5, dtype=tf.float32), name="x") y = tf.square(x) train_op

滑动平均滤波算法(递推平均滤波法)

//滑动平均滤波算法(递推平均滤波法) //ADNum为获得的AD数 //GN为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 const int GN = 12; int filterPtr = 0; bool isFirst = true; public float gSum = 0; float[] gbuf  = new float[GN]; float GlideFilterAD(float ADNum) { if (isFirst) { isFirst =

78、tensorflow滑动平均模型,用来更新迭代的衰减系数

''' Created on 2017年4月21日 @author: weizhen ''' #4.滑动平均模型 import tensorflow as tf #定义一个变量用于计算滑动平均,这个变量的初始值为0. #类型为tf.float32,因为所有需要计算滑动平均的变量必须是实数型 v1=tf.Variable(0,dtype=tf.float32) #这里step变量模拟神经网络中迭代的轮数,可以用于动态控制衰减率 step=tf.Variable(0,trainable=False)

求滑动平均

臭氧的滑动平均 select FID,version,fsiteid,fDATETIME, case when (count(fO3) OVER (partition by fsiteid order by fDATETIME RANGE interval '7' hour preceding ))>5 then (avg(fO3) OVER (partition by fsiteid order by fDATETIME RANGE interval '7' hour preceding ))

滑动平均滤波算法(递推平均滤波法)(转帖)

//滑动平均滤波算法(递推平均滤波法)--C语言版 int FilterI=0; //ADNum为获得的AD数 //n为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 int GlideFilterAD(int value_buf[],int n,int ADNum) { int sum=0; value_buf[FilterI++]=ADNum; if(FilterI==n) FilterI=0; //先进先出,再求平均值 for(int count=0;count

tensorflow(3):神经网络优化(ema,regularization)

1.指数滑动平均 (ema) 描述滑动平均: with tf.control_dependencies([train_step,ema_op]) 将计算滑动平均与 训练过程绑在一起运行 train_op=tf.no_op(name='train')  使它们合成一个训练节点 #定义变量一级滑动平均类 #定义一个32位浮点变量,初始值为0.0, 这个代码就是在不断更新w1参数,优化 w1,滑动平均做了一个w1的影子 w1=tf.Variable(0,dtype=tf.float32) #定义num

tensorflow-正则化+指数衰减+滑动平均

#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Sep 19 09:42:22 2017 @author: myhaspl """ import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_NODE=784 OUTPUT_NODE=10 LAYE