用大白话讲滑动平均模型(Tensorflow)

无论是书上还是论坛讲的滑动平均模型都太官方,看了好久才看懂,其实很简单的事,大家说起来确很费事。
首先,先不要分析这个名字的含义,我就是被这几个字给骗了,其实他的作用就一个:控制衰减率!!!
那怎么控制呢?
TensorFlow中给出了影子变量(shadow varible)的概念,我当初看到这更懵了,tf还给个公式:

shadow_varible = decay×shadow_variable+(1-decay)×varible

这玩意也好意思叫公式???
逗比的我看了好久才看懂,哈哈,合并同列项一看

求:shadow_varible = decay×shadow_variable+(1-decay)×varible
解:  (1-decay)×shadow_variable=(1-decay)×varible
答: shadow_variable = varible

看到这时是不是已经怀疑人生了?当然不能这么合并,因为等号左面的shadow_varible和等号右面的不是一个,可以理解为:
y1= decay×shadow_variable+(1-decay)×varible ①
而y1的值充当下一个shadow_variable
y2= decay×y1+(1-decay)×varible ②

这里面的decay是衰减率,取0.99或者0.9999,就是为了接近1,
这么做的目的就是让②等式y2≈y1,为什么让y2≈y1?因为让他衰减慢一点,为什么让他衰减慢一点,这里可以先理解decay是个阈值,后面会改动decay,这里设置decay是给一个使最后衰减最慢的一个阈值,其实真正的衰减速度可能会快于他,但是不能慢于他。

看公式①,请问varible是干什么的?
shadow_varible叫影子变量,那肯定会问是谁的影子,就是varible的影子。varible是个人,厉害了!
这下知道了,用大白话说:
新影子变量=旧影子变量×衰减率+(1-衰减率)×人
开始代码编写:
首先设置decay(衰减率),因为这个貌似是常量,
本想来个高大上的指数级衰减小学习率

decayed_learning_rate=learning_rate * decay ^(global_step/decay_steps)

但发现tf已经有控制学习率的方法了。
decay=min{decay,1+num_updates/10+num_updates)}
不过num_updates只能使等号左面的decay控制在等号右面的decay初始化的数值之内,也就是为了使衰减前期可以更新快一点,也就是我刚才说的等号右面的decay真正的意义就是最慢的那个阈值(往上翻)。
代码编写decay:

step=tf.Variable(0,trainable=False)#不让其做训练
ema = tf.train。ExponentialMovingAverage(0.99,step)

其次编写(人)varible

v1=tf.Variable(0,dtype=tf.float32)

影子变量

maintain_averages_op = ema.apply([v1])

更新v1滑动平均值

with tfSession() as sess:
    sess.run(maintain_averages_op)

这里可以输出看一下,改动v1看看结果就知道了

    print sess.run([v1, ema.apply([v1])])

猜你喜欢

转载自blog.csdn.net/qq_32166779/article/details/83996623