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

75 篇文章 7 订阅
61 篇文章 2 订阅

一、总结

在这里插入图片描述

二、详细

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奇异值分解的方法,将原始协方差矩阵分解成v
    Av^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 单位矩阵

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值