乐趣区

关于机器学习:机器学习的Tricks随机权值平均优化器swa与pseudolabel伪标签

文章来自公众号【机器学习炼丹术】

1 stochastic weight averaging(swa)

  • 随机权值均匀
  • 这是一种全新的优化器,目前常见的有 SGB,ADAM,

【概述】:这是一种通过梯度降落改善深度学习泛化能力的办法,而且不会要求额定的计算量,能够用到 Pytorch 的优化器中。

随机权重均匀和随机梯度降落 SGD 类似,所以我个别吧 SWa 看成 SGD 的进阶版本。

1.1 原理与算法

swa 算法流程:

【怎么了解】:

  • 对 $w_{swa}$ 做了一个周期为 c 的滑动均匀。每迭代 c 次,就会对这个 $w_{swa}$ 做一次滑动均匀。其余的工夫应用 SGD 进行更新。
  • 简略的说,整个流程是模型初始化参数之后,应用 SGD 进行梯度降落,迭代了 c 个 epoch 之后,将模型的参数用加权均匀,失去 $w_{SWA}$, 而后当初模型的参数就是 $w_{SWA}$, 而后再用 SGD 去梯度降落 c 个 epoch,而后再加权均匀进去一个新的 $w_{SWA}$.

SWA 退出了周期性滑动均匀来限度权重的变动,解决了 传统 SGD 在反向过程中的权重震荡问题。SGD 是依附以后的 batch 数据进行更新,寻找随机梯度降落随机寻找的样本的梯度降落方向很可能并不是咱们想要的方向。

论文中给出了一个图片:

  • 绿线是恒定学习率的 SGD,成果并不好,直到 SGD 在训练的过程中所见了学习率,才能够失去一个收敛的后果;
  • 而应用 Stochastic weight averaging 能够在学习率恒定的状况下,疾速收敛,而且过程安稳。

1.2 python 与实现

这里讲如何在 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 的时候,就间接通过

torchcontrib.optim.SWA(base_opt,swa_start,swa_greq,swa_lr)

来封装原来的优化器。

  • swa_start: 是一个整数,示意通过 swa_start 个 steps 后,将学习率切换为固定值 swa_lr。(在 swa_start 之前的 step 中,lr 是 0.1,在 10 个 steps 之后,lr 变成 0.05)
  • swa_freq: 在 swa_freq 个 step 优化之后,会将对应的权重加到 swa 滑动均匀的后果上,相当于算法中的 c;
  • 应用 opt.swap_swa_sgd()之后,能够将模型的权重替换为 swa 的滑动均匀的权重。

1.3 对于 BN

这里有一个问题就是在 BatchNorm 层训练的时候,BN 层中也是有两个训练参数的,应用 $w_{swa}$ 重置了模型参数,然而并没有更新 BN 层的参数,所以如果有 bn 层的话,还须要加上:

opt.bn_update(train_loader,model)

2 Pseudo-Label

  • 伪标签
  • 这是一种半监督的办法。其实非常简单,就是对于未标记的数据,许纳泽预测概率最大的标记作为该样本的 pseudo-label,而后给未标记数据设置一个权重,在训练过程中缓缓减少未标记数据的权重。

这个办法的 loss 如下:

十分好了解了,后面一项就是训练集的 loss,前面是测试集的 loss,而后用一个 $\alpha(t)$ 来做权重。

而后这个 $\alpha(t)$ 就是随着训练的迭代次数减少而缓缓的线性减少(如果依照原来的论文中的形容):

【一些对于 pseudo-label 的杂谈】

这个办法提出在 2013 年,而后再 2015 年作者用 entropy 信息熵来证实这个办法的有效性。然而证实过程较为牵强。这个伪标签我在 2017 年的一个我的项目中想到了,然而不晓得可行不可行本人过后也无奈进行证实,就作罢了,没想到当初看到同样的办法在 2013 年就提出来了。有点五味杂陈哈哈。

参考文献:

  1. Izmailov, Pavel, et al. “Averaging weights leads to wider optima and better generalization.” arXiv preprint arXiv:1803.05407 (2018).
  2. Grandvalet, Yves, and Yoshua Bengio. “Semi-supervised learning by entropy minimization.” Advances in neural information processing systems. 2005.
退出移动版