SWA(随机权重平均)——一种全新的模型优化方法

这两天被朋友推荐看了一篇热乎的新型优化器的文章,文章目前还只挂在arxiv上,还没发表到顶会上。本着探索的目的,把这个论文给复现了一下,顺便弥补自己在优化器方面鲜有探索的不足。

论文标题:Averaging Weights Leads to Wider Optima and Better Generalization

论文链接:https://arxiv.org/abs/1803.05407.pdf

官方代码:https://github.com/timgaripov/swa


随机权重平均(SWA)和随机梯度下降(SGD)有很多相似之处,准确来说SWA是基于SGD的改进版本。文章的主要比较对象也是SGD。

。典型的深度神经网络训练过程就是用 SGD 来优化一个损失函数,同时使用一个衰减的学习率,直到收敛为止。SWA 论文的结果证明,取 SGD 轨迹的多点简单平均值,以一个周期或者不变的学习 率,会比传统训练有更好的泛化效果。论文的结果同样了证明了,随机权重平均 (SWA)相比可以找到更广的最优值域。

SWA的灵感来自于实际观察,每次学习率循环结束时产生的局部最小值趋向于在损失面的边缘区域累积,这些边缘区域上的损失值较小(上面左图中,显示低损失的红色区域上的点W1,W2和W3)。通过对几个这样的点取平均,很有可能得到一个甚至更低损失的、全局化的通用解(上面左图上的Wswa)。

看一下swa的算法流程:

对 WSWA做了一个周期性的滑动平均,周期为 c,即每 c 步进行一次滑动平均, 其他时间就按普通 SGD 进行更新。可见,计算操作也是十分的简便。
 

就论文中的结果而言,可以看出 SWA相对于 SGD 来说有以下优点:1,不依赖学 习率的变化,设置恒定学习率的时候依然可以达到很好的收敛效果。而对于 SGD 而言,恒定学习率会导致收敛情况变差。2,收敛速度十分快,在原测试集上可 以在 150 个 epoch 就收敛得非常好,也非常平稳振荡幅度非常小。

个人主观分析:SWA 加入了周期性滑动平均操作来限制权重的变化,解决 了传统 SGD 在反向过程中的权重振荡问题。 SGD 是依靠当前 batch 的数据来更新 参数,每一个 epoch 都会调整一次参数,随机挑选的梯度方向极有可能不是最佳 梯度方向,甚至与最佳梯度方向有一个很大的夹角,这样大刀阔斧调整的参数, 极其容易振荡。而 SWA限制更新频率,对周期内参数取滑动均值,这样就解决 了 SGD 的问题。 


关于复现 

 这次并没有用作者给的官方代码实现,而是用keras框架搭的一个自己的网络,用自己的数据集,来比较SGD和SWA的差异。代码暂时不方便上传,不过估计也没人care。。。不过对于SWA优化器的keras实现参考了https://github.com/kristpapadopoulos/keras-stochastic-weight-averaging

先看SGD的结果:

train loss和val loss大相径庭的原因跟数据集有关系,不用太care,主要关注的是train loss。 

再看SWA的结果:

对 SGD 而言,每个 epoch 都会大刀阔斧调整参数(因为我设定的是恒定学习率)。 所以 SGD 的 loss 曲线抖动会比较大,而且要接近 200 个 epoch 才有比较好的收 敛效果。 对于 SWA而言,抖动幅度会比 SGD 小很多,而且 cycle 设置越大抖动会越小。大 概 150 个 epoch 就有比较好的收敛情况。这也是作者分析的,SWA 可以更容易 找到最优值域。 


总结

SGD 的出现就是为了解决 mini-BatchGD 计算比较费时的问题,然而 SGD 的收敛 结果不会太好,往往不会好于 mini-batchGD。SGD 为了计算节省时间,舍弃了训 练稳定、最优收敛结果等性质。然而,SWA 刚好补充了 SGD 的这几点不足,在 计算方面,SWA 相对于 SGD 的计算量的增长可以忽略不记,只多了一个周期性 的权重平均而已。但是在稳定性和最优值域的寻找方面,SWA 是要远好于 SGD 的。尤其是这种训练时的稳定性,使得 SWA 比 SGD 更适合用于在线学习等模型 要求稳定性的领域。

猜你喜欢

转载自blog.csdn.net/leviopku/article/details/84037946