文章来自公众号【机器学习炼丹术】python
【概述】:这是一种经过梯度降低改善深度学习泛化能力的方法,并且不会要求额外的计算量,能够用到Pytorch的优化器中。算法
随机权重平均和随机梯度降低SGD类似,因此我通常吧SWa当作SGD的进阶版本。框架
【怎么理解】:ide
SWA加入了周期性滑动平均来限制权重的变化,解决了传统SGD在反向过程当中的权重震荡问题。SGD是依靠当前的batch数据进行更新,寻找随机梯度降低随机寻找的样本的梯度降低方向极可能并非咱们想要的方向。oop
论文中给出了一个图片:学习
这里讲如何在pytorch深度学习框架中加入swa做为优化器:测试
from torchcontrib.optim import SWA # training loop base_opt = torch.optim.SGD(model.parameters(), lr=0.1) opt = torchcontrib.optim.SWA(base_opt, swa_start=10, swa_freq=5, swa_lr=0.05) for _ in range(100): opt.zero_grad() loss_fn(model(input), target).backward() opt.step() opt.swap_swa_sgd()
若是使用了swa的话,那么lr_schedule这个方法就不须要在使用了,很是的方便。优化
【关于参数】:
使用swa的时候,就直接经过spa
torchcontrib.optim.SWA(base_opt,swa_start,swa_greq,swa_lr)
来封装原来的优化器。
这里有一个问题就是在BatchNorm层训练的时候,BN层中也是有两个训练参数的,使用$w_{swa}$重置了模型参数,可是并无更新BN层的参数,因此若是有bn层的话,还须要加上:
opt.bn_update(train_loader,model)
这个方法的loss以下:
很是好理解了,前面一项就是训练集的loss,后面是测试集的loss,而后用一个$\alpha(t)$来作权重。
而后这个$\alpha(t)$就是随着训练的迭代次数增长而慢慢的线性增长(若是按照原来的论文中的描述):
【一些关于pseudo-label的杂谈】
这个方法提出在2013年,而后再2015年做者用entropy信息熵来证实这个方法的有效性。可是证实过程较为牵强。这个伪标签我在2017年的一个项目中想到了,可是不知道可行不可行本身当时也没法进行证实,就做罢了,没想到如今看到一样的方法在2013年就提出来了。有点五味杂陈哈哈。
参考文献: