知行编程网知行编程网  2022-02-07 13:00 知行编程网 隐藏边栏 |   抢沙发  270 
文章评分 0 次,平均分 0.0
对比学习,简单到只需要Dropout两下

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

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

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

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

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

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

对比学习,简单到只需要Dropout两下

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

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

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

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

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

论文题目:
SimCSE: Simple Contrastive Learning of Sentence Embeddings

论文链接:
https://arxiv.org/pdf/2104.08821.pdf

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

对比学习,简单到只需要Dropout两下对比学习为何work?对比学习,简单到只需要Dropout两下

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

  1. 正例之间表示保持较近距离
  2. 随机样例的表示应分散在超球面上。

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

下图可以直观理解这两个目标:对比学习,简单到只需要Dropout两下

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

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

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

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

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

对比学习,简单到只需要Dropout两下SimCSE对比学习,简单到只需要Dropout两下

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

无监督SimCSE

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

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

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

训练目标函数:

下图展示了Unsupervised SimCSE的样例:对比学习,简单到只需要Dropout两下

如何生成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

对比学习,简单到只需要Dropout两下

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

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

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

训练目标:

 

 

对比学习,简单到只需要Dropout两下实验结果对比学习,简单到只需要Dropout两下

Dropout优于传统数据增强?

下图中对比了使用Unsupervised SimCSE (第一行None)和常见的数据增强方法在STS-B验证集上的Spearman's Correlation。对比学习,简单到只需要Dropout两下

其中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两下

上图中对比了在不同数据增强/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。对比学习,简单到只需要Dropout两下表格中对比了各种建模句子向量的方法,包括简单的对Glove向量取平均,到前不久的SOTA:BERT-Flow和BERT-Whitening。可以看到,在各种编码器和有无监督模式下,SimCSE都取得了显著的提升。比如无监督时,和与BERT-Whitening相比,Avg. 分别提升了7.96%和14.77%。

此外,作者还对比了不同句子表示模型下 和与他们在STS任务上的结果:对比学习,简单到只需要Dropout两下可以看出:

  • Avg.BERT模型的较低,但较高;
  • 相反,对BERT表示进行后处理的BERT-flow和BERT-whitening的较低,但是却很高;
  • Unsup.SimCSE和SimCSE的两个值都是较低的,他们的STS的结果也更好。

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

迁移学习效果

除了STS任务上的评估外,本文还将训练好的句子向量迁移到7个任务上。对比学习,简单到只需要Dropout两下

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

对比学习,简单到只需要Dropout两下有开源嘛?对比学习,简单到只需要Dropout两下

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

GitHub链接:
https://github.com/princeton-nlp/SimCSE

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

 AutoModel, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("princeton-nlp/sup-simcse-bert-base-uncased")
model = AutoModel.from_pretrained("princeton-nlp/sup-simcse-bert-base-uncased")

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

对比学习,简单到只需要Dropout两下小结对比学习,简单到只需要Dropout两下

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

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

 

对比学习,简单到只需要Dropout两下

[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

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享