CoSENT(三):作为交互式相似度的损失函数
By 苏剑林 | 2022-11-09 | 31079位读者 |在《CoSENT(一):比Sentence-BERT更有效的句向量方案》中,笔者提出了名为“CoSENT”的有监督句向量方案,由于它是直接训练cos相似度的,跟评测目标更相关,因此通常能有着比Sentence-BERT更好的效果以及更快的收敛速度。在《CoSENT(二):特征式匹配与交互式匹配有多大差距?》中我们还比较过它跟交互式相似度模型的差异,显示它在某些任务上的效果还能直逼交互式相似度模型。
然而,当时笔者是一心想找一个更接近评测目标的Sentence-BERT替代品,所以结果都是面向有监督句向量的,即特征式相似度模型。最近笔者突然反应过来,CoSENT其实也能作为交互式相似度模型的损失函数。那么它跟标准选择交叉熵相比孰优孰劣呢?本文来补充这部分实验。
基础回顾 #
CoSENT提出之初,是作为一个有监督句向量的损失函数:
\begin{equation}\log \left(1 + \sum\limits_{\text{sim}(i,j) \gt \text{sim}(k,l)} e^{\lambda(\cos(u_k, u_l) - \cos(u_i, u_j))}\right)\end{equation}
其中$i,j,k,l$是四个训练样本(比如四个句子),$u_i, u_j, u_k, u_l$是它们想要学习的句向量(比如它们经过BERT后的[CLS]向量),$\cos(\cdot,\cdot)$代表两个向量的余弦相似度,$\text{sim}(\cdot,\cdot)$则代表它们的相似度标签。所以这个损失函数的定义也很清晰,就是如果你认为$(i,j)$的相似度应该大于$\text{sim}(k,l)$的相似度,那么就往$\log$里边加入一项$e^{\lambda(\cos(u_k, u_l) - \cos(u_i, u_j))}$。
从这个形式就可以看出,当时CoSETN就是为了有监督训练余弦相似度的特征式模型的,包括“CoSENT”这个名字也是这样来的(Cosine Sentence)。然而,抛开余弦相似度这一层面不谈,CoSENT本质上是一个只依赖于标签相对顺序的损失函数,它跟余弦相似度没有必然联系,我们可以将它一般化为
\begin{equation}\log \left(1 + \sum\limits_{\text{sim}(i,j) \gt \text{sim}(k,l)} e^{\lambda(f(k,l) - f(i,j))}\right)\end{equation}
其中$f(\cdot,\cdot)$是任意标量输出函数(一般不需要加激活函数),代表要学习的相似度模型,包括将两个输入拼接成一个文本输入到BERT中的“交互式相似度”模型!
实验比较 #
训练交互式相似度的常规方式是最后构建一个两节点的输出,然后加上softmax,用交叉熵(下表简称CE)作为损失函数,这也等价于在前面的$f(\cdot,\cdot)$上加sigmoid激活,然后用单节点的二分类交叉熵。不过这种做法也就适合二分类形式的标签,如果连续型的打分(比如STS-B是1~5分),就不大适合了,此时通常要转化为回归问题。但CoSENT没有这个限制,因为它只需要标签的序信息,这个特点跟常用的评测指标spearman系数是一致的。
两者的对比实验,参考代码如下:
实验结果为
$$\begin{array}{c}
\text{评测指标为spearman系数} \\
{\begin{array}{c|ccccc}
\hline
& \text{ATEC} & \text{BQ} & \text{LCQMC} & \text{PAWSX} & \text{avg}\\
\hline
\text{BERT + CE} & 48.01 & 71.96 & 78.53 & 68.59 & 66.77 \\
\text{BERT + CoSENT} & 48.09 & 72.25 & 78.70 & 69.34 & 67.10 \\
\hline
\text{RoBERTa + CE} & 49.70 & 73.20 & 79.13 & 70.52 & 68.14 \\
\text{RoBERTa + CoSENT} & 49.82 & 73.09 & 78.78 & 70.54 & 68.06 \\
\hline
\end{array}} \\
\\
\text{评测指标为accuracy} \\
{\begin{array}{c|ccccc}
\hline
& \text{ATEC} & \text{BQ} & \text{LCQMC} & \text{PAWSX} & \text{avg}\\
\hline
\text{BERT + CE} & 85.38 & 83.57 & 88.10 & 81.45 & 84.63 \\
\text{BERT + CoSENT} & 85.55 & 83.73 & 87.92 & 81.85 & 84.76 \\
\hline
\text{RoBERTa + CE} & 85.97 & 84.67 & 88.14 & 82.85 & 85.41 \\
\text{RoBERTa + CoSENT} & 86.06 & 84.23 & 88.14 & 83.03 & 85.37 \\
\hline
\end{array}}
\end{array}$$
可以看到,没有惊喜,CE和CoSENT的效果基本一致。非要挖掘一些细致区别的话,可以看到在BERT中,CoSENT的效果相对好些,在RoBERTa中基本没区别了,以及在PAWSX这个任务上,CoSENT的提升相对明显些,其他任务基本持平。如此,可以“弱弱地”下一个结论:
当模型较弱(BERT弱于RoBERTa)或者任务较难(PAWSX相对来说比其他三个任务都难)时,CoSENT或许能取得比CE更好的效果。
注意,是“或许”,笔者也不能保证。实事求是地说,我也不认为两者构成什么显著差异。不过可以猜测,因为两种损失函数的形式有明显的差异,所以哪怕最终指标上差不多,模型内部应该也有一定差异,这时候或许可以考虑模型融合?
文章小结 #
本文主要思考和实验了CoSENT在交互式相似度模型中的可行性,最终结论是“可行但效果没什么提升”。
转载到请包括本文地址:https://kexue.fm/archives/9341
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Nov. 09, 2022). 《CoSENT(三):作为交互式相似度的损失函数 》[Blog post]. Retrieved from https://kexue.fm/archives/9341
@online{kexuefm-9341,
title={CoSENT(三):作为交互式相似度的损失函数},
author={苏剑林},
year={2022},
month={Nov},
url={\url{https://kexue.fm/archives/9341}},
}
November 9th, 2022
例如我手中的数据集同时有相似tag:1,不相似tag:2,无关tag:3,应该如何训练呢?
如果你认为相似 > 不相似 > 无关,那么就构造对应地构造打分3(相似)、2(不相似)、1(无关),然后作为y_true代入损失函数就行。当然,3、2、1不是绝对了,你选6、5、4也行,10、7、1也行,反正只要一个序关系。
November 24th, 2022
苏神,分享一篇文章,有兴趣看看。基于有效样本的类别不平衡损失CB-Loss
设计了一种重新加权的方案,使用每个类的有效样本数量来重新为每个类的Loss分配权重。
利用每个类的有效样本数来重新平衡损失。
https://mp.weixin.qq.com/s/hFKiUwAUNZzlDcaQ7fc4lw
看了看,前面的思路很不错,但是后面直接将$\beta$当成参数来调,而没有什么理论指导来估计,使得文章的高度出现断崖式下跌的感觉~
May 4th, 2023
苏神好,我最近想做一个长文本的推荐模型,数据有文本A和文本数据B,它们都比较长,有很多超过512个token,A和B之间的文本对有标签[4,3,2,1],4最好,1最差。模型我打算试一试CoSENT和huggingface的LlamaForSequenceClassification。CoSENT的优点您的3篇博客都有讨论。我想再请教一下苏神对于用llama这样一个decoder来做类似任务的看法,目前好像没有相关的工作,只有huggingface给了一个这个接口。谢谢!
你就把decoder的最后一个token对应的feature当作句向量来训练就行了,以前RNN时代不都是这样做的嘛
谢谢苏神回复,没错,是把最后一个token的feature当做句向量。您之前讨论过decoder-only的结构,attention矩阵一定是满秩的,这是一个优势。我在想从理论上来看用decoder做还有没有啥优势或者劣势,导致这个方向没有啥工作出来
以往这类工作都是双向Encoder为主流(默认),事实上GPT类架构在sentence embedding上应该没有充分实验过。
一个有可能弊端是纯Decoder可能过于关注尾部的局部信息,导致全局聚合能力不强?(纯猜测)
February 24th, 2024
苏神好!请问有研究过Embedding模型输出的高维向量表征的压缩相关的吗?我最近在研究能否进一步压缩模型输出的句向量的维度而不损失检索性能,我做实验的过程中发现一个神奇的现象,比如一个模型输出的是1024维的向量,我直接随机截取出256维用于检索,发现检索的recall下降很少。然后我又从数据集中采样了很多对向量,按同样的方法截取出的256维,512维等,发现截取前后这对向量之间的cosine similarity都几乎没变。我目前没想明白如何解释这个现象,苏神有何高见?谢谢!
一般没有经过特殊处理的情况下,神经网络的特征本身是高度均匀的,因此随机选一部分是最朴素的降维方法。这大致也跟诸如LSH之后的随机投影方法相关(即随机选一个近似正交的投影矩阵,也可以用来降维),而“随机选一部分维度”这个操作,也可以表示为与一个随机正交矩阵相乘。
另外,如果想简单地降维,并最大程度上保持效果,建议使用Whitening操作,选取奇异值最大的维度,参考:https://kexue.fm/archives/9079