一、总结
二、详细
1. abstract
sentence语义表达非常重要,但是直接用bert来做embedding效果比较差,如果来做呢?基于flow的方式有了不少的提升,本文发现传统的whitening操作的方式对sentence的语义表达也有着非常大的提升,实验表明,whitening方法还能给embedding进行降维并显著的提升检索的速度。
2. introducton
预训练提取到的sentence中word的表达不是各向同性的,造成直接计算cosine相似度效果不好,bert预训练有两个问题导致embedding效果有问题,一个是词频使embedding带有偏见,另一个是低频词的空间表达非常稀疏,导致不能直接用cosine或者dot product来计算。
改进:
• 1. bert-flow,通过高斯flow将bert的句子表达转化成一个各向同性的表达。
• 2. 本文:
• 不用做额外的训练,只需要一个whitening后处理就可以解决各项异性的问题
• 提出来降维的方法,减少计算量
贡献:
• 1.几个数据集,可以看到本文的方法可以达到state-of-the-art
• 2.降维操作也可以提升效果,并且提升检索速度
3. related work
- 早期解决各向异性的方法,先找到主方向,再把embedding往这个主方向上靠。
- 18年有篇文章是消除主方向和均值的影响,来提升embedding的表达。
- 19年有篇文章是对word matrix做正则化来降低各向异性。
- 19年有篇文章发现bert,elmo等预训练模型的高层的特异性更强,底层的embedding要弱一些,bert-flow就是沿着这个思想使其表达更平滑。
- 还有poly-encoder,siamese等方法
4. out approach
- cosine计算相似度的时候,要坐标轴是标准正交基才有意义,bert求出来的embedding不是。
- 均值为0的协方差矩阵 vs 标准正交分布
-
具体方法:x_std = (x-u)w
a. 其中u为平均值,减去平均值比较好操作
b. w为矩阵,重点是求这个转换矩阵将原来的句子转化成一个单位矩阵?x_std?
c. 参考svd奇异值分解的方法,将原始协方差矩阵分解成vAv^t的方式,目标是转化成单位矩阵,那么这样就好的到w的值了,居然这么简单,w=vsqrt(A),后面就可以进行cosine相似度的计算了。
- 如何降低维度,因为对角矩阵A代表的是维度转换后的特征值,这样每个特征值的数小,代表这个维度的方差小,所以就不是咋重要,所以考虑去掉这一维度的特征,如果按降序排列的话,意味着我们可以去topk个特征值来计算相似度就行了,有的降低维度效果还能提升。
- 计算量评估,计算u和协方差,可以采用递归的方式来实现,这样时间复杂度为O(n),空间复杂度为O(1)。
5. 实验
- 对比了原始的bert_cls特征,bert的最后一层平均特征,bert-flow,whitening方法,以及有监督的方式。
- 基本上bert_cls特征<bert的最后一层平均特征<bert-flow<whitening方法,其中bert_cls计算的话差的离谱。
-
代码
https://github.com/bojone/BERT-whitening
https://github.com/bohanli/BERT-flow
BERT-whitening语义相似检索神器:https://zhuanlan.zhihu.com/p/364412841
- 核心代码(看了想打人系列)
def compute_kernel_bias(vecs):
"""计算kernel和bias
最后的变换:y = (x + bias).dot(kernel)
"""
vecs = np.concatenate(vecs, axis=0)
mu = vecs.mean(axis=0, keepdims=True)
cov = np.cov(vecs.T)
u, s, vh = np.linalg.svd(cov)
W = np.dot(u, np.diag(1 / np.sqrt(s)))
return W, -mu
def transform_and_normalize(vecs, kernel=None, bias=None):
"""应用变换,然后标准化
"""
if not (kernel is None or bias is None):
vecs = (vecs + bias).dot(kernel)
norms = (vecs**2).sum(axis=1, keepdims=True)**0.5
return vecs / np.clip(norms, 1e-8, np.inf)
def compute_corrcoef(x, y):
"""Spearman相关系数
"""
return scipy.stats.spearmanr(x, y).correlation
7. english
isotropic 各向同性的
anisotropic 各向异性的
standard orthogonal basis 标准正交基
Hypothesis 假设
identity matrix 单位矩阵