当我们通过基于transformer模型提取句子的特征向量做语义相似度计算时,比如计算向量的余弦相似度,会发现任意两个句子的相似度都非常高,根本起不到根据相似度进行筛选过滤的目的。
原因可能是通过transformer类模型,比如Bert,获取的向量其分布具有非线性和奇异性,一般做余弦相似度计算时,我们默认向量所属的坐标系为标准正交基,显然从模型中直接提取的向量不并满足这一条件,所以我们需要对向量做一些变换。
目前有很多方法,用于解决语义相似度计算效果差的方法吗,如Bert - flow、对比学习等,可查看这些回答:(38 封私信 / 80 条消息) BERT模型可以使用无监督的方法做文本相似度任务吗? - 知乎 (zhihu.com)Bert encoder产生的句子向量具有各向异性和分布不均的特点,整体成一个圆锥形,低频词和高频词聚集在锥的不同区域,高频词高密度地聚集在锥的头部靠近顶点(原点)附近,而低频词稀疏地散布在距离顶点较远的位置。文本表达进击:从Bert-flow到Bert-white、SimCSE - 知乎 (zhihu.com)
Berting-whitening解决这种向量分布不均的问题,方法十分简单易行,就是将原有的向量空间转换为均值为0,协方差矩阵为单位阵的分布中,思路清晰,代码简单。
大神的公式推导及代码实现:你可能不需要BERT-flow:一个线性变换媲美BERT-flow - 科学空间|Scientific Spacest
通过白化操作后,再计算余弦相似性,结果就合理多了。