文章来源 | 恒源云社区(恒源云,专注 AI 行业的共享算力平台)
原文地址 | Dropout
原文作者 | Mathor
要说2021年上半年NLP最火的论文,想必非《SimCSE: Simple Contrastive Learning of Sentence Embeddings》莫属。SimCSE的全称是Simple Contrastive Sentence Embedding
Sentence Embedding
Sentence Embedding一直是NLP领域的一个热门问题,主要是因为其应用范围比较广泛,而且作为很多任务的基石。获取句向量的方法有很多,常见的有直接将[CLS]位置的输出当做句向量,或者是对所有单词的输出求和、求平均等。但以上方法均被证明存在各向异性(Anisotropy)问题。通俗来讲就是模型训练过程中会产生Word Embedding各维度表征不一致的问题,从而使得获得的句向量也无法直接比较
目前比较流行解决这一问题的方法有:
- 线性变换:BERT-flow、BERT-Whitening。这两者更像是后处理,通过对BERT提取的句向量进行某些变换,从而缓解各向异性问题
- 对比学习:SimCSE。 对比学习的思想是拉近相似的样本,推开不相似的样本,从而提升模型的句子表示能力
Unsupervised SimCSE
SimCSE利用自监督学习来提升句子的表示能力。由于SimCSE没有标签数据(无监督),所以把每个句子本身视为相似句子。说白了,本质上就是 ( 自 己 , 自 己 ) (自己,自己) (自己,自己)作为正例、 ( 自 己 , 别 人 ) (自己,别人) (自己,别人)作为负例来训练对比学习模型。当然,其实远没有这么简单,如果仅仅只是完全相同的两个样本作正例,那么泛化能力会大打折扣。一般来说,我们会使用一些数据扩增手段,让正例的两个样本有所差异,但是在NLP中如何做数据扩增本身也是一个问题,SimCSE提出了一个极为简单优雅的方案:直接把Dropout当做数据扩增!
具体来说, N N N个句子经过带Dropout的Encoder得到向量 h 1 ( 0 ) , h 2 ( 0 ) , … , h N ( 0 ) \boldsymbol{h}_1^{(0)},\boldsymbol{h}_2^{(0)},…,\boldsymbol{h}_N^{(0)} h1(0),h2(0),…,hN(0),然后让这批句子再重新过一遍Encoder(这时候是另一个随机Dropout)得到向量 h 1 ( 1 ) , h 2 ( 1 ) , … , h N ( 1 ) \boldsymbol{h}_1^{(1)},\boldsymbol{h}_2^{(1)},…,\boldsymbol{h}_N^{(1)} h1(1),h2(1),…,hN(1) ,我们可以 ( h i ( 0 ) , h i ( 1 ) ) (\boldsymbol{h}_i^{(0)},\boldsymbol{h}_i^{(1)}) (hi(0),hi(1))视为一对(略有不同的)正例,那么训练目标为
其中, sim ( h 1 , h 2 ) = h 1 T h 2 ∥ h 1 ∥ ⋅ ∥ h 2 ∥ \text{sim}(\boldsymbol{h}_1, \boldsymbol{h}_2)=\frac{\boldsymbol{h}_1^T\boldsymbol{h}_2}{\Vert \boldsymbol{h}_1\Vert \cdot \Vert \boldsymbol{h}_2\Vert} sim(h1,h2)=∥h1∥⋅∥h2∥h1Th2。实际上式(1)如果不看 − log -\log −log和 τ \tau τ的部分,剩下的部分非常像是 Softmax \text{Softmax} Softmax。论文中设定 τ = 0.05 \tau = 0.05 τ=0.05,至于这个 τ \tau τ有什么作用,我在网上看到一些解释:
- 如果直接使用余弦相似度作为logits输入到 Softmax \text{Softmax} Softmax,由于余弦相似度的值域是 [ − 1 , 1 ] [-1,1] [−1,1],范围太小导致 Softmax \text{Softmax} Softmax无法对正负样本给出足够大的差距,最终结果就是模型训练不充分,因此需要进行修正,除以一个足够小的参数 τ \tau τ将值进行放大
- 超参数 τ \tau τ会将模型更新的重点,聚焦到有难度的负例,并对它们做相应的惩罚,难度越大,也即是与 h i ( 0 ) {h}_i^{(0)} h