©PaperWeekly 原创 · 作者 | 苏剑林
单位 | 追一科技
研究方向 | NLP、神经网络
学习句向量的方案大致上可以分为无监督和有监督两大类,其中有监督句向量比较主流的方案是 Facebook 提出的“InferSent” [1],而后的“Sentence-BERT” [2] 进一步在 BERT 上肯定了它的有效性。然而,不管是 InferSent 还是 Sentence-BERT,它们在理论上依然相当令人迷惑,因为它们虽然有效,但存在训练和预测不一致的问题,而如果直接优化预测目标 cos 值,效果往往特别差。
最近,笔者再次思考了这个问题,经过近一周的分析和实验,大致上确定了 InferSent 有效以及直接优化 cos 值无效的原因,并提出了一个优化 cos 值的新方案 CoSENT(Cosine Sentence)。实验显示,CoSENT 在收敛速度和最终效果上普遍都比 InferSent 和 Sentence-BERT 要好。
朴素思路
本文的场景是利用文本匹配的标注数据来构建句向量模型,其中所利用到的标注数据是常见的句子对样本,即每条样本是“(句子 1, 句子 2, 标签)”的格式,它们又大致上可以分类“是非类型”、“NLI 类型”、“打分类型”三种,参考《用开源的人工标注数据来增强 RoFormer-Sim》中的“分门别类”一节。
失效的Cos
简单起见,我们可以先只考虑“是非类型”的数据,即“(句子 1, 句子 2, 是否相似)”的样本。假设两个句子经过编码模型后分别得到向量 ,由于检索阶段计算的是余弦相似度 ,所以比较自然的想法是设计基于 的损失函数,比如
其中 表示是否相似。类似的 loss 还可以写出很多,大致的意思都是让正样本对的相似度尽可能大、负样本对的相似度尽可能小。然而,直接优化这些目标的实验结果往往特别差(至少明显比 InferSent 要差),在某些情况下甚至还不如随机初始化的效果。
难搞的阈值
这是因为,通常文本匹配语料中标注出来的负样本对都是“困难样本”,常见的是语义不相同但字面上有比较多的重合。此时,如果我们用式(1)作为损失函数,那么正样本对的目标是 1、负样本对的目标是 -1,如果我们用式(2)作为损失函数,那么正样本对的目标是 1、负样本对的目标是 0。
不管哪一种,负样本对的目标都“过低”了,因为对于“困难样本”来说,虽然语义不同,但依然是“相似”,相似度不至于 0 甚至 -1 那么低,如果强行让它们往 0、-1 学,那么通常的后果就是造成过度学习,从而失去了泛化能力,又或者是优化过于困难,导致根本学不动。
要验证这个结论很简单,只需要把训练集的负样本换成随机采样的样本对(视作更弱的负样本对),然后用上述 loss 进行训练,就会发现效果反而会变好。如果不改变负样本对,那么缓解这个问题的一个方法是给负样本对设置更高的阈值,比如