最近看了一篇最新的Sentence Embedding论文,今年4月份的,丹琦大神发表的《Simple Contrastive Learning of Sentence Embeddings》, 简称就是SimCSE,直译过来就是 基于简单对比学习句子嵌入。和没有对比学习的Bert相比,个人认为最大的区别就是:
- 考虑到了拉大当前样本和不相关样本的距离,uniformity。 而原始的Bert仅仅考虑了相似样本越相似越好,也就是Alignment。
整篇文章的关键词有两个,simple 和 Contrastive Learning。接下里,我们分别来看下,如何简单,又如何对比学习。
Contrastive Leaning
释义
对比学习,顾名思义,就是两个事物之间作比对,山羊和绵羊之间相似度高。 山羊和飞机之间相似度低。而其思想就是,让相似度更加拉近,不相似的之间距离更加远。有点类似于聚类的思想,类的内部距离越小越好,类的外部距离越大越好。
先看一下左边的无监督模型,一个句子通过encoder得到sentence embedding,而其他句子得到的sentence embedding是作为负例,而正例就很巧妙了,是同一个句子输入两遍,通过不同的drop mask机制得到的sentence embedding,dropout层在训练时是会随机drop一些输入的,因为具有一定的随机性,所以同一个句子输入两遍得到的sentence embedding是有一点区别的,但是总体上还是表达了同一个意思。
训练目标为:
sim函数是余弦相似度,其值越大越相似,
是一个温度超参数
所以这块可以等价于对相似的结果做交叉熵损失函数。
假设我们数据集中有两个相似样本,xi+和xi, 那么他们的输出为hi+和hi, 他们应该是相似的,越小越好,距离越近,即分子越小越好。
论文实验了一系列的dropout的p值,发现对于STS-B任务,p值为0.1时取得的效果最好,另外还有两个比较特殊的p值---0.0和Fixed 0.1,p值为0.0意味着dropout层没有使用,dropout层不会drop任何数值,输入值和输出值是一样的,而Fixed 0.1指的是dropout层的p值为0.1,但是drop的位置是不变的,也就是说,相同的输入肯定会有相同的输出,这就意味着正例就学不到东西了,只有负例,这也就是为什么会造成效果如此之差。
评价指标
总结
整篇论文,我觉的两个亮点:
1.考虑到了拉大当前样本和不相关样本的距离,uniformity。 而原始的Bert仅仅考虑了相似样本越相似越好,不会考虑不同的样本间的距离增大,也就是Alignment。
- Dropout在Encoder内部干预,要比源头增强更好,更直接。
训练代码参考:
引用:https://www.jianshu.com/p/ebe95c24bac0