Press "Enter" to skip to content

丹琦女神新作:对比学习,简单到只需要Dropout两下

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

文 | 花小花Posy

上周把 《对比学习有多火?文本聚类都被刷爆了…》
分享到卖萌屋的群里后,遭到了群友们一波 嫌弃
安利。

 

小伙伴们表示,插入替换的数据增强方式已经Out了,SimCSE才是现在的靓仔。

 

snowfloating说:看完 Danqi Chen
组里的 SimCSE
,再看这篇感觉就没什幺惊喜了。

 

苏神: 直接用dropout,居然work了。真见鬼了……

 

奥多多奥多多:这篇有说法的。

 

抱着一颗好奇的心,想看看这篇SimCSE到底有什幺说法,又哪里见鬼了?小花认认真真拜读了原文,今天跟大家分享分享SimCSE用的什幺神奇招数。

看完你可能不信,但它真的很神奇!

 

SimCSE的全称是 Simple Contrastive Learning of Sentence Embeddings
, S代表Simple
。文中的方法完全对得起题目,它是真的 简单
!简单在哪儿呢?

 

 

它简单地 用dropout替换了传统的数据增强方法
,将同一个输入dropout两次作为对比学习的正例,而且效果甚好。

 

它简单地将NLI的数据用于监督对比学习,效果也甚好。

 

 

这幺简单的方法,真的work!?WHY?

 

下面我们一起领略一下这篇文章的风骚吧!

 

论文题目:

 

SimCSE: Simple Contrastive Learning of Sentence Embeddings

 

论文链接:

 

https://arxiv.org//2104.08821.pdf

 

SimCSE开篇讨论的问题是:对比学习为何work?写上一篇文的时候,我就在想对比学习为什幺work呢?今天看到本文给出了很好的解释。

 

对比学习为何work?

 

原来 ICML2020 专门有一篇文章[1]研究了对比学习为什幺work。[1]中指出,对比表示学习有用,主要是因为它优化了两个目标:

 

 

正例之间表示保持较近距离

 

随机样例的表示应分散在超球面上。

 

 

并提出这两个目标分别可以用指标 alignment
和 uniformity
来衡量。

 

下图可以直观理解这两个目标:

 

alignment计算正例对之间的向量距离的期望:

 

越相似的样例之间的alignment程度越高。因为alignment使用距离来衡量,所以距离越小,表示alignment的程度越高。

 

uniformity评估所有数据的向量均匀分布的程度,越均匀,保留的信息越多。

 

可以想象任意从表示空间中采样两个数据和, 希望他们的距离比较远。他们的距离越远,证明空间分布越uniform。所以uniformity的值也是越低越好。

 

SimCSE也采用这两个指标来衡量生成的句子向量,并证明了文本的语义空间也满足: alignment值越低且uniformity值越低,向量表示的质量越高,在STS任务上的Spearman相关系数越高

 

SimCSE

 

SimCSE有两个变体: Unsupervised SimCSE
和 Supervised SimCSE
,主要不同在于对比学习的正负例的构造。下面详细介绍下他们的构造方式。

 

无监督SimCSE

 

Unsupervised SimCSE引入dropout给输入加噪声,假设加噪后的输入仍与原始输入在语义空间距离相近。其正负例的构造方式如下:

 

正例:给定输入,用预训练语言模型编码两次得到的两个向量和作为正例对。

 

负例:使用in-batch negatives的方式,即随机采样一个batch中另一个输入作为的负例。

 

训练目标函数:

 

下图展示了Unsupervised SimCSE的样例:

 

如何生成dropout mask?

 

对于 Unsupervised SimCSE
,核心在于如何生成dropout mask。刚开始读完一遍的时候,惊叹原来dropout可以这幺用,效果提升还挺大。后来细想,仍旧有些困惑 两次dropout mask的生成过程是怎样的呢
?仔细读了下,原文说:

 

In other words, we pass the same input sentence to the pre-trained encoder twice and obtain two embeddings as “positive pairs”, by applying independently sampled dropout masks。

 

还是不太清楚。后来看了作者在GitHub的issue里面的回复才懂了。 因为BERT内部每次dropout都随机会生成一个不同的dropout mask。
所以SimCSL不需要改变原始BERT,只需要将同一个句子喂给模型两次,得到的两个向量就是应用两次不同dropout mask的结果。然后将两个向量作为正例对。(真的simple)

 

有监督SimCSE

本文还提出 Supervised SimCSE
, 利用标注数据来构造对比学习的正负例子
。为探究哪种标注数据更有利于句子向量的学习,文中在多种数据集上做了实验,最后发现 NLI数据最有利于学习句子表示
。下面以NLI数据为例介绍Supervised SimCSE的流程。

 

Supervised SimCSE 引入了NLI任务来监督对比学习过程。该模型假设如果两个句子存在蕴含关系,那幺它们之间的句子向量距离应该较近;如果两个句子存在矛盾关系,那幺它们的距离应该较远。因此 NLI中的蕴含句对和矛盾句对分别对应对比学习中的正例对和负例对
。所以在Supervised SimCSE中,正负例的构造方式如下:

 

正例:NLI中entailment关系样例对。负例:a) in-batch negatives b)NLI中关系为contradiction的样例对。

 

训练目标:

 

实验结果

 

Dropout优于传统数据增强?

 

下图中对比了使用Unsupervised SimCSE (第一行None)和常见的数据增强方法在STS-B验证集上的Spearman’s Correlation。

 

其中crop k%表示随机减掉k%长度的span,word deletion表示随机删除k%的词,delete one word只删除一个词,MLM 15%表示用随机替换掉15%的词。上表中所有dropout的方法的dropout的比例都是0.1。(因为文中对比了不同比例的dropout,p=0.1效果最好。)

 

实验结果很明显的可以看出,SimCSE是远超其余数据增强方法的。小花的理解是传统数据增强的方法是对原始输入直接进行改变,在编码后,增强的数据与原始数据在语义空间的距离是不是要比直接用dropout的方式要远。

 

Dropout与对比学习的关系

 

为了理解dropout为什幺work,作者可视化了不同方法下alignment和uniformity在训练过程中的变化趋势。

 

上图中对比了在不同数据增强/dropout方式下,和在训练过程中的变化方向(每训练10步采样一次)。Fix 0.1表示p=0.1时,两次使用相同dropout mask。对于Fixed 0.1和No dropout来讲,正例对的句子表示是完全相同的,

 

可以看到随着训练步数增加,Unsup. SimCSE的平稳地递减。虽然降低的趋势却不明显,但其初始化的值就相对较低。上图进一步验证了 SimCSE有效的原因是,它可以让alingnment和uniformity的值逐渐降低

 

小花在这里有一个问题请教:使用Fixed 0.1和No dropout与另外两种方式相比较,是不是不太公平?因为当正例对两个向量完全相同时,其实是缺失了一些变体的对比信息在里面的。还有既然两个向量完全相同,为什幺会上升呢?还望理解的小伙伴留言讨论下呀!( ╹▽╹
)

 

语义文本相似效果如何?

 

SimCSE在STS(语义文本相似)任务上进行了评估。评价指标是 Spearman’s correlation。
表格中对比了各种建模句子向量的方法,包括简单的对Glove向量取平均,到前不久的SOTA:BERT-Flow和BERT-Whitening。可以看到,在各种编码器和有无监督模式下,SimCSE都取得了显着的提升。比如无监督时,和与BERT-Whitening相比,Avg. 分别提升了7.96%和14.77%。

 

此外,作者还对比了不同句子表示模型下和与他们在STS任务上的结果:
可以看出:

 

Avg.BERT模型的较低,但较高;

 

相反,对BERT表示进行后处理的BERT-flow和BERT-whitening的较低,但是却很高;

 

Unsup.SimCSE和SimCSE的两个值都是较低的,他们的STS的结果也更好。

 

说明和需要结合使用,只有当二者的值都比较低时,模型学习到的句子向量表示才最适合STS任务。

 

迁移学习效果

 

除了STS任务上的评估外,本文还将训练好的句子向量迁移到7个任务上。

 

迁移学习上的SimCSE并没有展现出明显的优势。作者的解释是句子级别的训练目标并不能直接有利于迁移学习。为了让迁移学习效果更好,文中还是尝试将MLM损失和对比学习损失一起训练,取得了少量的提升(上表中标有w/MLM的行)。

 

有开源嘛?

 

有的! 4月23号刚开源的代码。

 

GitHub链接:

 

https://github.com/princeton-nlp/SimCSE

 

文中的预训练语言模型已经整合到了HuggingFace中,可以像BERT模型那样,直接通过API调用模型。

 

from transformers import AutoModel, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("princeton-nlp/sup-simcse-bert-base-uncased")
 = AutoModel.from_pretrained("princeton-nlp/sup-simcse-bert-base-uncased")

 

想动手试试的小伙伴们赶紧GitHub看看吧…

 

小结

 

本文提出了一个简单的对比学习的框架,SimCSE,用于学习句子表示。文中提出dropout+对比学习和NLI+对比学习,都非常有利于句子表示的学习。SimCSE大幅刷新STS任务榜单,取得了新一轮的SOTA。

 

这篇文章让小花很爱的一点是,明明是我们习以为常的dropuout和早就熟悉透了的的NLI数据,但是本文的作者们却能从一个全新的角度看待它们,将它们与比学习建立联系,取得非常显着的提升,并合理地解释为什幺work。

[1] Wang, T., & Isola, P. (2020). Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere. ICML. https://arxiv.org/pdf/2005.10242.pdf

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注