一、 一句话总结权重滑动平均(Exponential Moving Average)就是:Copy一份模型所有权重(记为Weights)的备份(记为EMA_weights),训练过程中每次更新权重时同时也对EMA_weights进行滑动平均更新,训练阶段结束后用EMA_weights替换模型权重进行预测。
具体地,EMA的超参decay一般设为接近1的数,从而保证每次EMA_weights的更新都很稳定。每batch更新流程为:
Weights=Weights+LR*Grad; (模型正常的梯度下降)
EMA_weights=EMA_weights*decay+(1-decay)*Weights; (根据新weight更新EMA_weights)
需要知道训练阶段无关EMA_weights,它只在测试阶段时导入进行预测。
二、如何保存最优EMA_weights?
keras可以通过回调on_epoch_end在每个epoch结束时,将EMA_weights加载至模型并save_weights,计算验证集Metrics从而决定是否保存。(注意要在下一个epoch开始前将模型参数替换为Weights)
三、可参考推导:
这个想法用到了mean teacher模型上,但是为什么利用滑动平均更新模型,就会使teacher模型好呢
可能是因为EMA使训练后得到的模型更稳定吧,直观上模型训练到后期就会在优化的极值附近波动,EMA通常decay设的很大,比如0.9999,这样再根据推导过程的最后一个公式理解,对于较近的时间步的梯度,n-i更小,1-α^(n-i)更小,则训练后期的梯度对EMA参数的影响更小,所以EMA的参数更新随着训练的进行越来越稳定吧,我一般都是当成个通用trick用的