天天看點

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 機關矩陣

繼續閱讀