背景

纯粹的微调下,由于目标函数设置过于简单,神经网络很容易急不可耐地收敛到最近的局部最优点。这些最优点不仅并非全局最优点,同时不抗攻击。只要在模型输入上稍加扰动,输出的概率分布便会产生大幅度的偏移。为此,一些研究潜心于此,希望能让神经网络学习到的映射能力更为 平滑,从而进一步地提高 泛化能力。如果你对深度学习有一定深入的了解,对于这一点一定不陌生。

这些研究里最为经典的当属 VAE (变分自编码器),通过 reparameterization,将噪声结合到模型前馈的中间流程,基于不变的输入和输出,提高中间语义向量的平滑度。VAE 至今已演化出数百个版本,是 GAN 之外最为成功的生成模型。来到自然语言处理领域,添加噪声的方式则主要集中在 embedding 层,对 embedding 层的输出添加符合正态/均匀分布的扰动。如同 VAE 简单地设置噪声的方差,在每次输入时添加噪声,能获得一定的成效。但这样统一的标准,容易造成训练后期噪声范围过大而导致的参数收敛不平稳,达不到最优点。因此后来的研究则专注于根据梯度的分布,动态调整噪声的方向和范围,统称为对抗式训练。

minθE(Z,y)D[maxδp<ϵL(fθ(X+δ),y)]\min_\theta \mathbb{E}_{(\mathcal{Z},y)\sim\mathcal{D}}\Big[\max_{||\delta||_p<\epsilon}L(f_\theta(X+\delta),y)\Big]

FGSMFGM 是非常优秀的代表,每批样本进来,沿着梯度的正方向添加扰动,将添加扰动前的梯度和添加扰动后的梯度取平均值更新参数。随后 PGD 被提出,在 FGM 上多次迭代,找到最优的扰动。在 PGD 之后,还出现了 FreeATYOPOFreeLB 等优秀的对抗式训练算法。PGD 被引用了近 2,000 次,而 FreeLB 至今在 GLUE 上依然榜上有名。SMART 正是在这样的背景下诞生。

尽管 SMART 自推出至今,并未受到太多的关注。但实战说话,在我个人的试验下,它在不同任务上都超越了其他一众对抗式训练算法,达到了最优异的成绩。至于为何关于 SMART 的讨论热度不高,我认为是因为作者始终没有开放源码,同时论文存在信息跳跃,对没有接触过对抗式训练的新人不太友好。是金子总会发光,相信 SMART 在未来几个月会逐渐产生热度,成为如同分层学习率一样的通用训练技巧。

关于其他对抗式训练算法的讨论,网上公开的资料很多,我这里就不复述了。

SMART

SMART: Robust and Efficient Fine-Tuning for Pre-trained Natural Language Models through Principled Regularized Optimization
https://arxiv.org/abs/1911.03437

进入正题,SMART 的算法思路与此前基于 FGM、PGD 的一派对抗式算法有些许差异。此前的对抗式训练算法基本没有对目标函数进行修改,仅仅只是对添加扰动后传回的梯度进行处理,而 SMART 则是大刀阔斧地添加了两个正则项。两个正则项涉及到的思想,分别叫做 Smoothness-inducing Adversarial RegularizationBregman Proximal Point Optimization。前者要求模型在一定的扰动范围内,输出完全一致的概率分布;后者要求参数与 epoch 初始时的分布相近。
Rs(θ)=1ni=1nmaxx~ixipϵls(f(x~i;θ),f(xi;θ))\mathcal{R}_s(\theta)=\frac{1}{n}\sum_{i=1}^n\max_{||\tilde{x}_i-x_i||_p\le\epsilon}\mathcal{l}_s(f(\tilde{x}_i;\theta), f(x_i;\theta))

DBreg(θ,θt)=1ni=1nls(f(xi;θ),f(xi;θt))\mathcal{D}_{Breg}(\theta,\theta_t)=\frac{1}{n}\sum_{i=1}^n\mathcal{l}_s(f(x_i;\theta),f(x_i;\theta_t))

度量是否相似的损失 ls\mathcal{l}_s对称 KL 散度,相对于 KL 散度,是双向的考量:
ls(P,Q)=DKL(PQ)+DKL(QP)\mathcal{l}_s(P,Q)=\mathcal{D}_{KL}(P||Q)+\mathcal{D}_{KL}(Q||P)

在这两项正则项之下,最终的损失函数成为:
F(θ)=L(θ)+λsRs(θ)+μDBreg(θ,θt)\mathcal{F}(\theta)=\mathcal{L}(\theta)+\lambda_s\mathcal{R}_s (\theta)+\mu\mathcal{D}_{Breg}(\theta,\theta_t)

其中 λs\lambda_sμ\mu 是两个正则项分别对应的权重。最终的优化流程如下:
SMART: 不可错过的通用对抗式训练算法
翻译一下:

对于第 tt 轮迭代
 备份 θ\theta,作为参与 DBreg\mathcal{D}_{Breg} 计算的 θt\theta_t
 对于每一个 batch 数据
  使用正态分布随机初始化扰动,结合 xx 得到 x~\tilde{x}
  对于 mm 个小步
   计算扰动下的梯度 g~\tilde{g}
   基于 g~\tilde{g} 和学习率更新 x~\tilde{x}
  基于 x~\tilde{x} 重新计算梯度,更新参数 θ\theta
 更新 θt\theta_tθt(1β)θ+βθt\theta_t\leftarrow(1-\beta)\theta+\beta\theta_t

SMART 在我的各项任务之下都达到了 SOTA 的效果,私以为潜力不可估量。我在使用以下参数配置时达到最好的成绩,供参考:λs=0.5\lambda_s=0.5μ=0.2\mu=0.2Tx~=2T_{\tilde{x}}=2β=0.3\beta=0.3

由于代码比较复杂,且必须与我的模型框架结合才能使用,这里就不公开源码了。

相关文章:

  • 2021-04-26
  • 2022-12-23
  • 2021-12-08
  • 2021-06-23
  • 2021-04-09
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-12-04
  • 2022-12-23
  • 2021-06-22
  • 2021-06-10
  • 2022-12-23
  • 2021-05-12
相关资源
相似解决方案