真正的利器:对比学习SimCSE

最近看了一篇最新的Sentence Embedding论文,今年4月份的,丹琦大神发表的《Simple Contrastive Learning of Sentence Embeddings》, 简称就是SimCSE,直译过来就是 基于简单对比学习句子嵌入。和没有对比学习的Bert相比,个人认为最大的区别就是:

  • 考虑到了拉大当前样本和不相关样本的距离,uniformity。 而原始的Bert仅仅考虑了相似样本越相似越好,也就是Alignment。

整篇文章的关键词有两个,simple 和 Contrastive Learning。接下里,我们分别来看下,如何简单,又如何对比学习。

Contrastive Leaning

释义

对比学习,顾名思义,就是两个事物之间作比对,山羊和绵羊之间相似度高。 山羊和飞机之间相似度低。而其思想就是,让相似度更加拉近,不相似的之间距离更加远。有点类似于聚类的思想,类的内部距离越小越好,类的外部距离越大越好。其损失函数的设计也吻合了上面思想:

损失函数

假设我们数据集中有两个相似样本,xi+xi, 那么他们的输出为hi+hi, 他们应该是相似的,越小越好,距离越近,即分子越小越好。

而分母则是,xi和数据集中其他的样本的距离,不相识的样本,越大越好,即分母越大越好。
总起来说,就是这个损失越小,越能达到对比学习的思想。

评价指标

引入两个指标分别刻画对比学习的两个目标:

  • Alignment: 代表相似样本之间距离更近。
    其公式为:


    公式

    所有的样本和自己的相似样本做差平方,越小越相似。在下面图上更直观:


    image.png

    假设x和y是相似样本,那么输出的向量f(x)和f(y) 越近越好,最好到了一个点上。
  • uniformity
    uniformity是从另一个角度来考虑问题,不相关的样本越远越好。
    其公式为:


    公式

    这个公司可以近似看做熵, 假设x和y是不相似样本,那么输出的向量f(x)和f(y) 越远,uniformity越小,最好不相关都滚远点。
    下面图上更直观:

每一家都住在这个图上,家庭内部都住着相似样本,家之外都不相似,彼此离得越远越好,也许最理想的境界就是 每一家彼此都离的差不多远,比较平均的住在这个球上,这样整体的平均距离才能达到最大,这也就是熵的含义。 因为均匀分布信息熵最高,分布越均匀则保留的信息越多.

SimCSE

原理和损失函数都有了,接下来是如何构造正负例了。 在这文章中,分为两种情况,分别取构建自己的正负例。

Unsupervised SimCSE

image.png

实线箭头代表正例,虚线代表负例。

  • 正例构造: 给定输入,用Bert Encoder两次得到的两个向量和作为正例对。
    由于Bert本身就有随机DropOut 功能,所以同一句话 走两次Bert,得到的两个向量不同,但是是相似的。因为原样本和生成的正样本的语义是完全一致的,只是生成的embedding不同而已,可以看做Bert Encoder过程中,对数据做了一个小增强。
  • 负例构造:使用in-batch negatives的方式,即随机采样一个batch中另一个输入作为的负例。说白了就是batch中其他的样本就是负例。
  • 损失如下:


    image.png

而且这种dropoutmask 比数据增强也强很多,文章中实验指标如下:


image.png

为什么会强这么多呢?这是个好问题

可能是,增强嘛,无非对输入的原始词做改变,无论是删除,替换,回译等等吧,毕竟是源头上,离最后的输出太远了。而 Dropout基本上是最后的阶段,干掉一些神经元,可能效果更直接一些。

Supervised SimCSE

image.png

正例就是人工标注的相关的,负例就是batch中其他的负样本。
损失函数:


image.png

如下图:


image.png

Two dogs are running. 和 There are animals outdoors. 是人工标注的相关的两句话,所以是正例,用实线连接的。
其他的都是负例,用虚线连接的。同一个batch的中的。

总结

整篇论文,我觉的两个亮点:
1.考虑到了拉大当前样本和不相关样本的距离,uniformity。 而原始的Bert仅仅考虑了相似样本越相似越好,不会考虑不同的样本间的距离增大,也就是Alignment。

  1. Dropout在Encoder内部干预,要比源头增强更好,更直接。

你可能感兴趣的:(真正的利器:对比学习SimCSE)