tf moving average

tf中用到movingaverage的主要有两处,一个是数据的批处理,更新均值和方差时一个是对训练参数的更新时

 

1数据批处理

每一层数据的批处理,批处理的对象是每一层,一层中的某个特征向量作为一个特征点
对批处理时,会有一个均值与方差参数,对均值与方差的更新不是简单的使用取均值,而是前后均值之间通过指数衰减函数来进行更新
另外,个人对于批处理大小的设置的一点建议,通常来说,在电脑显存或内存允许的情况下,批处理大小大点好,但是
当资源有限时,而对于你的训练样本,比如说一个类别的样本不多,只有50个时,最好将批的大小设置成50的整数倍比较好

tensorflow中有一个函数是对数据进行批处理的:
tf.nn.batch_normalization
其函数定义是:
def batch_normalization(x, mean, variance, offset, scale, variance_epsilon, name=None):
mean与variance好理解,是均值和方差
offset是偏移,scale是尺度,对数据进行均值与方差进行归一化后,还要乘以尺度,再加上偏移,这个尺度与偏移是可训练的参数

在对数据进行归一化后,还需要对求得的均值与方差进行指数衰减更新,如果单纯的使用上面的更新也可以,但是效果可能比加了指数更新的
要差,另外,对均值和方差进行指数滑动平均时,有一个衰减系数,这个衰减系数通常设置成接近1,典型的设置范围是0.999-0.99-0.9
如果训练时出现训练样本结果好,测试样本差(过拟合),可以尝试将这个衰减系数的值降低,将tf.nn.batch_normalization包装起来加入moving average
的函数是slim.batch_norm()
使用这个函数需要输入批处理参数,下面只列举了这个函数参数的一部分:
 

 batch_norm_params = {
    # Decay for the moving averages.
    'decay': 0.995,
    # epsilon to prevent 0s in variance.,就是在归一化时,除以方差时,防止方差为0而加上的一个数
    'epsilon': 0.001,
    # force in-place updates of mean and variance estimates
    'updates_collections': None,
    # Moving averages ends up in the trainable variables collection
    'variables_collections': [ tf.GraphKeys.TRAINABLE_VARIABLES ],
    #是否是在训练模式,如果是在训练阶段,将会使用指数衰减函数(衰减系数为上面指定的decay),
    #对moving_mean和moving_variance进行统计特性的动量更新,也就是进行使用指数衰减函数对均值和方差进行更新
    #而如果是在测试阶段,均值和方差就是固定不变的,是在训练阶段就求好的,在训练阶段,每个批的均值和方差的更新是
    #加上了一个指数衰减函数,而最后求得的整个训练样本的均值和方差就是所有批的均值的均值,和所有批的方差的无偏估计,具体公式见下面
    'is_training':True,
    #如果为True,将会创建一个新的变量对 'moving_mean/biased' and 'moving_mean/local_step',默认设置为False,
    #将其设为True可以增加稳定性
    'zero_debias_moving_mean':True,

  }


关于批处理更详细好理解的链接:
http://blog.csdn.net/hjimce/article/details/50866313
http://www.jianshu.com/p/0312e04e4e83

 

2 训练参数更新时的moving average

        而使用指数衰减函数进行处理的除了在批处理中对批均值和方差进行处理,还有对可训练参数的更新时,也使用这个函数,这个函数
个人的理解就是结合上一次参数梯度的更新方向与这一次根据loss求得的梯度的更新方向,得到本次梯度应该更新的方向,说到底就是为了
加速收敛,而在实践中对参数使用指数衰减函数有时会产生相当好的结果(相比于不使用这个函数)

tf.train.ExponentialMovingAverage


这个函数的apply方法增加了对训练了的变量的浅层复制,以及根据上一次复制的变量值和当前变量值的进行滑动平均的操作。
这个滑动平均的操作通常在每个训练步完成后进行,变量更新的公式:

shadow_variable = decay * shadow_variable + (1 - decay) * variable


shadow_variable是上一次进行滑动平均后更新的变量,variable是当前的变量

该函数的官方定义:

http://wiki.jikexueyuan.com/project/tensorflow-zh/api_docs/python/train.html#ExponentialMovingAverage

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章