天天看点

Whitening Sentence Representations for Better Semantics and Faster Retrieval论文学习

一、总结

Whitening Sentence Representations for Better Semantics and Faster Retrieval论文学习

二、详细

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

  1. 早期解决各向异性的方法,先找到主方向,再把embedding往这个主方向上靠。
  2. 18年有篇文章是消除主方向和均值的影响,来提升embedding的表达。
  3. 19年有篇文章是对word matrix做正则化来降低各向异性。
  4. 19年有篇文章发现bert,elmo等预训练模型的高层的特异性更强,底层的embedding要弱一些,bert-flow就是沿着这个思想使其表达更平滑。
  5. 还有poly-encoder,siamese等方法

4. out approach

  1. cosine计算相似度的时候,要坐标轴是标准正交基才有意义,bert求出来的embedding不是。
  2. 均值为0的协方差矩阵 vs 标准正交分布
  3. 具体方法:x_std = (x-u)w

    a. 其中u为平均值,减去平均值比较好操作

    b. w为矩阵,重点是求这个转换矩阵将原来的句子转化成一个单位矩阵?x_std?

    c. 参考svd奇异值分解的方法,将原始协方差矩阵分解成vAv^t的方式,目标是转化成单位矩阵,那么这样就好的到w的值了,居然这么简单,w=vsqrt(A),后面就可以进行cosine相似度的计算了。

  4. 如何降低维度,因为对角矩阵A代表的是维度转换后的特征值,这样每个特征值的数小,代表这个维度的方差小,所以就不是咋重要,所以考虑去掉这一维度的特征,如果按降序排列的话,意味着我们可以去topk个特征值来计算相似度就行了,有的降低维度效果还能提升。
  5. 计算量评估,计算u和协方差,可以采用递归的方式来实现,这样时间复杂度为O(n),空间复杂度为O(1)。

5. 实验

  1. 对比了原始的bert_cls特征,bert的最后一层平均特征,bert-flow,whitening方法,以及有监督的方式。
  2. 基本上bert_cls特征<bert的最后一层平均特征<bert-flow<whitening方法,其中bert_cls计算的话差的离谱。
  3. 代码

    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 单位矩阵

继续阅读