被玩坏了的“Dropout”

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 今天主要给大家带来Dropout在NLP最新应用,希望能给大家带来收获!!!!

在训练DNN模型时,正则化技术,如: L1/L2 Normalization、Batch/Layer Normalization、Dropout 等是不可缺少的模块,以防止模型过拟合,同时提升模型的泛化能力。

Dropout由于只需要简单地在训练过程中丢弃一部分神经元,而成为最为广泛使用的正则化技术。

1)训练时:每个神经元的输出Z有P的概率为0,1-P的概率为Z * 1/(1-P)

  1. 预测时:关闭dropout

今天想要介绍的几篇论文都是基于dropout为基础的

一、SimCSE

image-20211106212042194

论文地址:arxiv.org/pdf/2104.08…

•提出了一个基于对比学习的句子表示方法,同时适用于有监督无监督场景

•在语义文本相似度匹配(STS)等任务上超过了SOTA

image-20211106213319693

对比学习的思想:将样本和与它语义相似的样本(正样例)和与它语义不相似的样本(负样例)进行对比,希望通过设计模型结构和对比损失,使语义相近的样本对应的表示在表示空间更接近,语义不相近的样本的距离更远,以达到类似聚类的效果

                              ### 1.1 Unsupervised SimCSE
复制代码

无监督版本的SimCSE

image-20211106214026235image-20211106214250379

通过两次Dropout的方式构构造正样本,同一batch的其他样本构造负样本

本质上就是【自己,自己】构造正样本(通过两次构造dropout), 【自己, 她人】构造负样本

这里讲一下构造正样本的具体做法,在Transformer的Feed Forward Network (前馈神经网络)和Muti-head Attention中加入一个Dropout, 这样的话一个样本两次输入到模型中就能得到两个不同的Embedding以此来构造正例。

(原来dropout还可以这样玩,第一次见到真的是挺惊艳的)

1.2 Supervised SimCSE

监督版本的SimCSE

image-20211106215503591

以NLI中label为蕴含的句子对作为正样本,label为矛盾的作为负样本

1.3 实验效果

image-20211106221227786

在无监督/有监督场景下均超越SOTA

二、ESimCSE

image-20211107132323619

论文地址:arxiv.org/pdf/2109.04…

这篇paper算是对SimCSE的一个改进,主要有两个点。

2.1 Word Repetion

不管是bert还是robert他们都有一个公同点,就是输入都含有位置信息,那么问题就来了, 无监督simcse构造的正样本的两个句子具有相同的长度,负样本通常都有不一样的长度,那么模型是不是认为有相同长度或者相识长度的句子就是正样本(即语义相识),不同长度的句子为负样本,这样显然是非常不合理的。

所以本文作者在构造正样本的时候随机复制正样本中的单词,这样的话构造正样本的两个句子长度就会不一样了(当然随机复制几个单词不会影响语义)

几种改变句子长度方法的对比

image-20211107133436325

d u p r a t e dup_rate 是一个超参数表示的是复制单词的比率, d u p l e n dup_len 是上面定义的集合中的随机采样数,这将在扩展序列长度时引入更多的多样性。确定dup_len后,我们使用均匀分布从序列中随机选择需要重复的dup_len子词,组成dup_set

image-20211107134057889

原文中举了一个例子,如果句子中的第一个词在 d u p s e t dup_set 中,则 x = x 1 , x 2 , x 3 . . x N x={x_1,x_2,x_3..x_N} x + = x 1 , x 1 , x 2 , x 3 . . x N x^+={x_1,x_1,x_2,x_3..x_N} 不同于无监督的SimCSE需要通过两次BERT生成 x x x + x^+ ,ESimCSE生成的 x x x + x^+ 是相互独立的

2.2 Momentum Contrast

Momentun Contrast(动量对比)允许我们通过维护固定大小的队列来重用前面mini-batch中编码的句子Embedding。具体来说,队列中的Embedding会被逐步替换。若当前mini-batch中输出句子的Embedding入队时,如果队列已满,则删除队列中“最旧”的句子Embedding。

我们使用动量更新编码器对排队的句子Embedding进行编码。编码器的参数为 ,动量更新编码器的参数为 ,我们按以下方式更新 :‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

image-20211107140224210

其中 λ [ 0 , 1 ] \lambda\in[0,1] 为动量系数参数。 θ e \theta_e 是通过反向梯度计算得来的。

‍‍‍‍‍‍

ESimCSE的损失函数进一步修改如下:

image-20211107140757683

M M 是队列大小, h m + h{_m}^+ 是表示在队列中更新的embedding的句子。

三、R-Drop

image-20211106224558581

论文地址:arxiv.org/abs/2106.14…

这篇paper只能用四个字来形容 “简单粗暴”

先贴下模型的整体架构

image-20211106224941151

•一种基于Dropout的正则化方法R-Drop:对于同一个输入样本,让模型的两次输出尽量一致

•同时适用于NLP和CV任务:机器翻译、生成式摘要、自然语言理解、语言模型、图片分类

•用KL散度衡量两次输出的不一致性

image-20211106225127898

3.1 整体优化目标

l o s s = 交叉熵 + K L 散度 loss = 交叉熵 + KL散度

image-20211106225435495

image-20211106225522532

3.2 为什么简简单单的dropout如此有效呢?

1)在训练时,因为Dropout每次随机丢弃部分神经元,导致每次丢弃后产生的子模型都不一样,所以 Dropout 的操作一定程度上使得训练后的模型是一种多个子模型的组合。

2)Dropout在训练是开启,在测试时关闭,因此训练和测试存在不一致性。

3)而 R-Drop 在训练过程中通过刻意对子模型之间的输出进行约束,让两次的输出保持一致,从而降低了训练和测试的不一致性。

3.3 实验结果

机器翻译

image-20211106225919291

NLU

image-20211106230022876

这里附上苏神的代码:github.com/bojone/r-dr…

官方代码:github.com/dropreg/R-D…

对了这里要说明下具体实现并不是将一个样本输入到模型两次,而是通过concat方式([X,X])输入到模型。

四、总结

SimCSE、ESimCSE通过Dropout实现样本和与它语义相似的样本(正样例)和与它语义不相似的样本(负样例)进行对比,希望通过设计模型结构和对比损失,使语义相近的样本对应的表示在表示空间更接近,语义不相近的样本的距离更远,适合用于聚类,向量检索等。

R-Drop利用Dropout的随机性,缓解了训练和测试的不一致性,在有监督的场景下适用于所有带Dropout的模型,简单粗暴,但效果出众。

\

猜你喜欢

转载自juejin.im/post/7108553390065451015