1. backgroud
小样本是个工业界是个广泛存在的问题,领域内相关研究也非常多,不过众多研究未必都可以经受住业务的考验,本文主要结合工作业务探索一下相关技术的收益情况, 所选择的任务为文本分类,模型采用Roberta。
2.method
2.1 数据增强- embedding层面
2.1.1 mixup
mixup技术最初来源于CV领域,它的思路其实很简单:针对两个训练样本( x i , y i x^{i}, y^{i} xi,yi)和( x j , y j x^{j}, y^{j} xj,yj),可以以一定的 λ ∈ B e t a \lambda \in Beta λ∈Beta因子来对这两个样本进行线性插值来得到一条增强样本:
x ^ i , j = λ ∗ x i + ( 1 − λ ) ∗ x j y ^ i , j = λ ∗ y i + ( 1 − λ ) ∗ y j \hat x^{i,j}=\lambda * x^{i}+(1-\lambda)*x^{j}\\\hat y^{i,j}=\lambda*y^{i}+(1-\lambda)*y^{j} x^i,j=λ∗xi+(1−λ)∗xjy^i,j=λ∗yi+(1−λ)∗yj
从公式可以看出,增强样本不仅数据分布做了交叉,标签也进行了交叉,约束模型学习到的结果其实是个线性值,通过更多的增强样本,其实就约束了模型对噪音数据的拟合,从而起到正则化的效果。
不过由于nlp数据天然不同于cv数据,所以这一种方法也无法直接应用于nlp领域,因为nlp的token不像cv一样规整,可以直接插值处理,所以开始的很多研究就是聚焦于在隐层(包括hidden层及embedding层)来做插值运算,比较有代表性的技术就是word mixup以及sentence mixup:
本⽂采⽤的是2013年Simonyan结合2016年Li等提出的基于梯度(Gradient-based)的⽅法,这⾥就是通过计算input的embedding(e)的导数来表示该token的重要程度s(saliency scores),然后统计 x B x^{B} xB固定窗口大小内的段对应的最终选择得分并从中选择最大得分的段 s e g m e n t B segment^{B} segmentB,根据同样的方法从 x A x^{A} xA中选择最小得分的段 s e g m e n t A segment^{A} segmentA, 保证两段等长,然后用 s e g m e n t B segment^{B} segmentB去替换 s e g m e n t A segment^{A} segmentA,通过这种巧妙的设计来实现了input-level的mixup,实现了良好的效果。
2.1.2 对抗训练
所谓对抗训练,即通过添加扰动构建对抗样本,喂入模型一同训练,提高模型遇到对抗样本时的鲁棒性,同时一定程度也能提高模型的表现和泛化能力。
对抗学习首先出现在CV领域,并已经在CV领域取得了不错的效果,不过在CV领域存在的问题是在正常样本上表现很差,毕竟训练样本采用的是对抗样本,这其实是损害了模型的泛化性。而在NLP中,由大量实验表明,对抗学习后的模型泛化能力变强了。
对抗训练公式化的说:
m i n E ( x , y ) ∼ D [ m a x L r a d v ∈ S ( θ , x + r a d v , y ) ] M i n − M a x 公式 minE_{(x,y)\sim \mathcal{D} }\left [ maxL_{r_{adv}\in S}(\theta,x+r_{adv},y)\right ] \ \ Min-Max公式 minE(x,y)∼D[maxLradv∈S(θ,x+radv,y)] Min−Max公式
- 中括号里的含义为,我们要找到一组在样本空间内、使 L o s s Loss Loss最大的的对抗样本(该对抗样本由原样本 x x x和经过某种手段得到的扰动项 r a d v r_{adv} radv共同组合得到)。这样一组样本组成的对抗样本集,它们所体现出的数据分布,就是该中括号中所体现的。
- 外层 m i n ( ) min() min()函数指的则是,我们面对这种数据分布的样本集,要通过对模型参数的更新,使模型在该对抗样本集上的期望 l o s s loss loss最小.
通俗而言,就是希望模型能够尽量识别对抗强度最大的样本。
对抗训练算法方面,这里主要介绍三类对抗算法:FGM, PGD, FreeLB, 更多的对抗算法可以去搜索相关paper详细了解。了解对抗训练主要是搞懂两步:
- 如何对抗,即对抗应该怎么加的问题
- 模型如何应付对抗,即模型如何根据对抗更新参数问题
下面的介绍也主要介绍这两个步骤。
2.1.2.1 FGM:Fast Gradient Method
r a d v = ϵ g ∥ g ∥ 2 g = ▽ x L ( θ , x , y ) r_{adv}=\epsilon \frac {\mathcal {g}} {\left \| \mathcal {g}\right \|_{2} } \\ \mathcal{g}=\bigtriangledown _{\mathcal{x}}\mathcal{L}\left (\theta, \mathcal{x}, \mathcal{y} \right ) radv=ϵ∥g∥2gg=▽xL(θ,x,y)
如上就是FGM对抗向量的产生过程, g \mathcal{g} g即使 e m b e d d i n g embedding embedding所对应的梯度。
- 如何对抗
从上面的公式可以看出,模型首先需要 f o r w a r d forward forward一次用于生成 e m b e d d i n g embedding embedding的梯度,然后生成对抗向量 r a d v r_{adv} radv 添加到原始 e m b e d d i n g embedding embedding上,得到对抗样本 x ^ \hat {\mathcal{x}} x^。 - 模型如何应付对抗
得到对抗样本 x ^ \hat {x} x^以后,就正常送入模型前传反传更新参数即可。要注意的一点是,在更新参数的时候需要在原输入的 e m b e d d i n g embedding embedding上做更新。
2.1.2.2 PGD:Projected Gradient Descent
r a d v ∣ t + 1 = ϵ g t ∥ g t ∥ 2 r_{adv|\mathcal{t}+1}=\epsilon \frac {\mathcal{g}_{\mathcal{t}}} {\left \|\mathcal{g}_{\mathcal{t}}\right \|_{2}} radv∣t+1=ϵ∥gt∥2gt
从公式来看,这里的扰动向量多了个下角标 t t t,这个 t t t代表的 s t e p s steps steps的第 t t t步,这也是PGD算法的核心思路:通过多次小步更新来逼近最优点。
- 如何对抗
PGD具体来说,就是一次次地进行前后向传播,一次次地根据 g r a d grad grad计算扰动 r a d v r_{adv} radv,一次次地将新的扰动KaTeX parse error: Expected '}', got 'EOF' at end of input: r_{adv累加到 e m b e d d i n g embedding embedding层的 g r a d grad grad上,若超出一个范围,则再映射回给定范围内。其中,在生成该步骤对抗向量的时候,要清空梯度,就如公式所说, t + 1 \mathcal{t}+1 t+1时刻的 r a d v r_{adv} radv只取决于 t \mathcal{t} t时刻。 - 模型如何应付对抗
从“如何对抗“中我们已经知道了PGD是个迭代对抗的过程,每一步的对抗向量的产生都是基于前面所有的对抗步骤来综合得出,最终,将最后一步计算得到的 g r a d grad grad累加到原始梯度上。即以累加过 t t t步扰动的梯度对应的 g r a d grad grad对原梯度进行更新
2.1.2.3 FreeLB
F r e e L B FreeLB FreeLB与PGD大同小异,只是少了一个梯度清零操作,这样的话相当于梯度更新的时候会考虑前面所有步骤。
2.1.3 对比学习
对比学习的思路一般都是学习两种分布之间的关系,比如 S i m C L R , S i m S C E , R D r o p SimCLR,SimSCE, RDrop SimCLR,SimSCE,RDrop等,其思路都是拉近相近样本而推远不相似样本,从而实现类内紧簇,类间易分的目的。了解对比学习主要是学习其思想,这里我们介绍最易于使用的算法 R D r o p RDrop RDrop算法来了解对比学习的思想。
RDrop流程特别简单:
看完上面的流程和图示基本不需要更多的介绍了,那么我们能从中学到对比学习的什么思路呢?
- 构造合适对比样本
不同的对比学习算法的主要区别就是如何构造合适的对比样本,可以手工构造正负样本对,比如 t r i p l e l o s s triple loss tripleloss,也可以通过一定的策略免除手工配对的开销,比如 R D r o p RDrop RDrop通过两次 f o r w a r d forward forward,利用 d r o p o u t dropout dropout的特性来构造同一份样本的两份对比样本。 - 根据对比样本选择的损失函数,比如对于向量类常用的kl距离,有标签数据通过构造合适的损失函数达到对比的目的等等。
2.2 半监督学习
半监督学习指的是训练集中既包含了有标签数据也包含了无标签数据,它的通用思路就是如何从有限的有标签数据中学到的知识泛化到广阔的无标签数据上面去,这样的话,无标签数据中一些有用的数据也能起到作用,从而产生数据增广的作用。
半监督学习是一个很大的研究范围,其理论基础有两个方面:
1)熵最小化(Entropy Minimization): 根据半监督学习的Cluster假设,决策边界应该尽可能地通过数据较为稀疏的地方(低密度区),以能够避免把密集的样本数据点分到决策边界的两侧。也就是模型通过对未标记数据预测后要作出低熵预测,即熵最小化。
H ( y ∣ x ) = − ∑ c = 1 C P m o d e l ( y = c ∣ x ) l o g P m o d e l ( y = c ∣ x ) \mathcal{H}\left (\mathcal{y}|\mathcal{x} \right)=-\sum^{\mathcal{C}}_{\mathcal{c}=1}\mathcal{P}_{model}\left(\mathcal{y=c}|\mathcal{x}\right )\mathcal{log\mathcal{P}_{model}\left(\mathcal{y=c}|\mathcal{x}\right )} H(y∣x)=−c=1∑CPmodel(y=c∣x)logPmodel(y=c∣x)
这个原则理论上可能比较难以理解,不过实际应用的时候就一目了然,其实就是一个无标签数据的预估概率作为其 p s e u d o l a b e l pseudo label pseudolabel,然后做交叉熵损失计算(不绝对,这里只是举了个交叉熵例子)。
2)一致性正则(Consistency Regularization): 对于未标记数据,希望模型在其输入受到扰动时产生相同的输出分布。
这个原则其实比较好理解,其实就是对比学习的概念。
由于半监督学习的算法特别多,这里只介绍两个,其他的算法可去进一步了解。
2.2.1 Temporal Ensembling
思路比较清晰的论文,流程图:
T e m p o r a l E n s e m b l i n g Temporal Ensembling TemporalEnsembling则采用时序融合模型,其中 z ^ i \hat z_{i} z^i是样本 x i x_{i} xi的历史 l o g i t s logits logits的 E M A EMA EMA加权平均和,将其视作人工标签,然后在时刻 t \mathcal{t} t 计算 l o g t i s i = z i logtis_{i}=z_{i} logtisi=zi与 z ^ i \hat z_{i} z^i的 m s e mse mse损失,这里很明显就是理论1的应用。
有个细节注意一下,就是无监督损失的权重函数 w ( t ) w(t) w(t),这个函数是个递增函数,其背后思路是开始的时候模型学习不充分,应充分学习有标签数据,损失函数重点关注有标签数据;后续随着学习越来越充分,模型对于有标签样本学习效果越来越好,那么他就有更好的能力去区分无监督样本,可以扩大无监督损失从而实现知识从有监督迁移到无监督里面去。
2.2.2 UDA:Unsupervised Data Augmentation for Consistency Training
U D A UDA UDA是 G o o g l e Google Google提出的一种应用理论2的算法,它的思路很简单,一图概之:
U D A UDA UDA认为目前的一些 a d v a n c e d d a t a a u g m e n t advanced \ data \ augment advanced data augment已经可以取得非常好的效果,所以其重心也是放在了探索应用 a d v a n c e d d a t a a u g m e n t advanced \ data \ augment advanced data augment搭配一致性原则来挖掘无监督样本的知识,从流程图也可以看出,其主要包含了两部分 l o s s loss loss左边的有监督 l o s s loss loss和右边的无监督 l o s s loss loss。右边用于计算一致性 l o s s loss loss的对比样本则是在原样本 x \mathcal{x} x上通过增强手段,比如回译,词替换, R a n d A u g m e n t RandAugment RandAugment等生成。
此外, U D A UDA UDA还使用了一些训练策略,比如 T S A TSA TSA ( T r a i n i n g S i g n a l A n n e a l i n g Training \ Signal \ Annealing Training Signal Annealing,训练信号退火,逐步去除带标签数据,从而避免模型过拟合。)、 S h a r p e n i n g P r e d i c t i o n s Sharpening \ Predictions Sharpening Predictions 锐化预测、 D o m a i n − r e l e v a n c e D a t a F i l t e r i n g Domain-relevance \ Data \ Filtering Domain−relevance Data Filtering领域相关数据过滤(对所有领域外数据进行概率计算,只使用其中分类正确且概率高的数据)来提升来训练效果。