点击下面卡片,关注我呀,每天给你送来AI技术干货!
文 | 苏剑林(追一科技)
编 | 小戏源 | 夕小瑶的卖萌屋
小编注:他来了他来了,苏神带着他的文章走来了!在小屋这篇《丹琦女神新作:对比学习,简单到只需要Dropout两下》推出后,苏神发来了他在 SimCSE 上的中文实验,实验结果表明在不少任务上 SimCSE 确实相当优秀,能明显优于 BERT-whitening。那么话不多说,让我们接着前篇的讨论,来看看苏神的文章吧~
今年年初,笔者受到 BERT-flow 的启发,构思了 BERT-whitening 方法,一度成为了语义相似度的新 SOTA——参考《你可能不需要 BERT-flow :一个线性变换媲美 BERT-flow 》[1],对应论文为《Whitening Sentence Representations for Better Semantics and Faster Retrieval》[2]。
。然而“好景不长”,在 BERT-whitening 提交到 Arxiv 的不久之后,笔者刷到了至少有两篇新论文里边的结果明显优于 BERT-whitening 了。
第一篇是《 Generating Datasets with Pretrained Language Models 》,这篇借助模板从 GPT2_XL 中无监督地构造了数据对来训练相似度模型,个人认为虽然有一定的启发而且效果还可以,但是复现的成本和变数都太大。另一篇则是本文的主角《 SimCSE: Simple Contrastive Learning of Sentence Embeddings 》,它提出的 SimCSE 在英文数据上显著超过了 BERT-flow 和 BERT-whitening ,并且方法特别简单~
那么,SimCSE 在中文上同样有效吗?能大幅提高中文语义相似度的效果吗?本文就来做些补充实验。
首先,简单对 SimCSE 做个介绍。事实上,SimCSE 可以看成是 SimBERT 的简化版(关于 SimBERT 请阅读《鱼与熊掌兼得:融合检索和生成的 SimBERT 模型》[3]),它简化的部分如下:
1、SimCSE 去掉了 SimBERT 的生成部分,仅保留检索模型;
2、由于 SimCSE 没有标签数据,所以把每个句子自身视为相似句传入。
说白了,本质上来说就是(自己,自己)作为正例、(自己,别人)作为负例来训练对比学习模型。当然,事实上还没那么简单,如果仅仅是完全相同的两个样本作为正例,那么泛化能力会大打折扣。一般来说,我们会使用一些数据扩增手段,让正例的两个样本有所差异,但是在 NLP 中如何做数据扩增本身又是一个难搞的问题,SimCSE 则提出了一个极为简单的方案:直接把 Dropout 当作数据扩增!
具体来说, 个句子经过带 Dropout 的 Encoder 得到向量 ,然后再过一遍 Encoder (这时候是另一个随机 Dropout )得到向量 ,我们可以将 视为一对(略有不同的)正例了,那么训练目标为:
原论文的(英文)实验还是颇为丰富的,读者可以仔细阅读原文。但是要注意的是,原论文正文表格的评测指标跟 BERT-flow 、 BERT-whitening 的不一致,指标一致的表格在附录:
▲SimCSE与BERT-flow、BERT-whitening的效果对比不管怎样比,SimCSE 还是明显优于 BERT-flow 和 BERT-whitening 的。那么 SimCSE 的这个优势是不是普遍的呢?在中文上有没有这个优势呢?我们马上就来做实验。
我们的中文实验基本与《无监督语义相似度哪家强?我们做了个比较全面的评测》[4]对齐,包括之前测试的 5 个任务、4 种 Pooling 以及所有 base、small、tiny 版的模型,large 没有跑是因为相同配置下 large 模型 OOM 了。
经过调参,笔者发现中文任务上 SimCSE 的最优参数跟原论文中的不完全一致,具体区别如下:
1、原论文batch_size=512,这里是batch_size=64(实在跑不起这么壕的batch_size);
2、原论文的学习率是5e-5,这里是1e-5;
3、原论文的最优dropout比例是0.1,这里是0.3;
4、原论文的无监督 SimCSE 是在额外数据上训练的,这里直接随机选了1万条任务数据训练。
最后一点再说明一下,原论文的无监督 SimCSE 是从维基百科上挑了 100 万个句子进行训练的,至于中文实验,为了实验上的方便以及对比上的公平,直接用任务数据训练(只用了句子,没有用标签,还是无监督的)。
不过除了 PAWSX 之外,其他 4 个任务都不需要全部数据都拿来训练,经过测试,只需要随机选 1 万个训练样本训练一个 epoch 即可训练到最有效果(更多样本更少样本效果都变差)。
开源地址:
https://github.com/bojone/SimCSE
SimCSE 的所有中文实验结果如下:
其中每个单元的数据是 “a/b/c” 的形式,a 是不加任何处理的原始结果,b 是 BERT-whitening 的结果(没有降维),c 则是 SimCSE 的结果,如果 c > b,那么 c 显示为绿色,否则为红色,也就是说绿色越多,说明 SimCSE 比 BERT-whitening 好得越多。
关于其他实验细节,可以看原代码以及《无监督语义相似度哪家强?我们做了个比较全面的评测》[4]。注意由于又有 Dropout ,训练时又是只采样 1 万个样本,因此结果具有随机性,重跑代码结果肯定会有波动,请读者知悉。
从实验结果可以看出,除了 PAWSX 这个“异类”外, SimCSE 相比 BERT-whitening 确实有压倒性优势,有些任务下还能好 10 个点以上,而且像 SimBERT 这种已经经过监督训练的模型还能获得进一步的提升,确实强大。(至于 PAWSX 为什么“异”,文章《无监督语义相似度哪家强?我们做了个比较全面的评测》[4]已经做过简单分析。)
同时,我们还可以看出在 SimCSE 之下,在 BERT-flow 和 BERT-whitening 中表现较好的 first-last-avg 这种 Pooling 方式已经没有任何优势了,反而较好的是直接取[ CLS ]向量,但让人意外的是,Pooler (取[ CLS ]的基础上再加个 Dense )的表现又比较差,真让人迷惘~
由于 BERT-whiteing 只是一个线性变换,所以笔者还实验了 SimCSE 是否能浮现这个线性变换的效果。具体来说,就是固定 Encoder 的权重,然后接一个不加激活函数的 Dense 层,然后以 SimCSE 为目标,只训练最后接的 Dense 层。结果发现这种情况下的 SimCSE 并不如 BERT-whitening 。那就意味着, SimCSE 要有效必须要把 Encoder 微调才行,同时也说明 BERT-whitening 可能包含了 SimCSE 所没有东西的,也许两者以某种方式进行结合会取得更好的效果(构思中...)。
简单调研了一下,发现 “自己与自己做正样本” 这个思想的工作,最近都出现好几篇论文了,除了SimCSE之外,同期出现的还有《Augmented SBERT: Data Augmentation Method for Improving Bi-Encoders for Pairwise Sentence Scoring Tasks》[5]、《Semantic Re-tuning with Contrastive Tension》[6]都是极度相似的。其实类似的idea笔者也想过,只不过没想到真的能work(就没去做实验了),也没想到关键点是 Dropout ,看来还是得多多实验啊~
本文分享了笔者在 SimCSE 上的中文实验,结果表明不少任务上 SimCSE 确实相当优秀,能明显优于 BERT-whiteining 。
说个正事哈
由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:
(1)点击页面最上方“深度学习自然语言处理”,进入公众号主页。
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。
方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。
记得备注呦
点击上面卡片,关注我呀,每天推送AI技术干货~
整理不易,还望给个在看!
[1] https://kexue.fm/archives/8069.
[2] Jianlin Su et al. Whitening Sentence Representations for Better Semantics and Faster Retrieval. https://arxiv.org/abs/2103.15316.
[3] https://kexue.fm/archives/7427.
[4] https://kexue.fm/archives/8321.
[5] https://arxiv.org/abs/2010.08240.
[6] https://openreview.net/forum?id=Ov_sMNau-PF.