温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解EMA并解决EMA下ckpt权重与pb权重表现不一问题

发布时间:2021-11-17 11:00:16 来源:亿速云 阅读:148 作者:柒染 栏目:大数据

如何理解EMA并解决EMA下ckpt权重与pb权重表现不一问题,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

今天用YunYang的evaluate.py评估模型的时候,意外发现用同样的ckpt权重文件转换而成的pb文件效果不一样,使用ckpt的效果非常差,仔细研究后才发现是滑动平均(EMA)搞的鬼,于是便重新重温了一下EMA。

EMA定义与原理

  • EMA(ExponentialMovingAverage),也就是我们常说的滑动平均模型,一般在采用SGD(随机梯度下降)训练的时候,都会用他来提高我们在测试数据的表现,我们从[1]结合tensorflow提供的api来说一下他的定义:
  • Tensorflow提供了     tf.train.ExponentialMovingAverage来实现滑动平均模型。在初始化ExponentialMovingAverage时,需要提供一个     衰减率(decay)。这个衰减率将用于     控制模型更新的速度,这个第二部分会告诉大家是怎么控制的。ExponentialMovingAverage对每一个变量会维护一个     影子变量(shadow variable),顾名思义,这个影子变量的初始值就是相应变量的初始值,而每次运行变量更新时,影子变量的值就会被更新为:
  • 其中,shadow_variable就是我们的影子变量,variable就是我们本次准备更新的变量(也就是我们的权重),decay是衰减率。
 

EMA原理理解

  • 上面的那个公式看似复杂,其实很容易理解,     其实EMA就是把每一次梯度下降更新后的权重值和前一次的权重值进行了一种“联系”,这种联系让我们的模型更新还需要看上一次更新的脸色,没那么“随意”。具体举个例子来说:比如上一次的权重值shadow_variable为4,衰减率decay为0.999,这次经过SGD准备更新的权重值variable为5,那么我们新更新的权重值就是0.999×4+0.001×5=4.001,我们可以看到采用EMA之后的更新明显受限于上一次更新的权重。
  • 经过上面那个例子,我们也可以明白decay决定了模型更新的速度,     decay越大模型越趋于稳定(稳定的意思就是和上一次更新的权重值相差不大),在实际应用中,decay一般会设成非常接近1的数(比如0.999或者0.9999)。当然为了使得模型训练前期可以更新得更快,ExponentialMovingAverage也提供了一个num_updates参数来动态设置decay的大小,这里就不多说了。
 

ckpt和pb保存不同的原因

  • 众所周知,pb权重是由ckpt转换而来,他们的表现理论上是一致的,那我们的EMA终究是怎么干扰了我们ckpt的表现呢?这个要从tensorflow读取使用变量的滑动平均值的方式说起:tensorflow通过tf.train.ExponentialMovingAverage的variables_to_restore()函数获取变量重命名字典,这说明如果我们通过saver = tf.train.Saver(ema_obj.variables_to_restore())后saver.resore来恢复读取权重文件的话(ema_obj是我们定义好的一个滑动平均的类),     我们读取的将会是我们本来最后一次准备更新的权重,而不是我们的影子变量,也正是因为这个重命名机制从而导致了我们的ckpt和pb表现不同的关键。
  • 解决方法很简单,只需要删掉saver里面的ema_obj.variables_to_restore()就可以解决。
 

看完上述内容,你们掌握如何理解EMA并解决EMA下ckpt权重与pb权重表现不一问题的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI