一、總結
二、詳細
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 機關矩陣