打脸!一个线性变换就能媲美“最强句子embedding”?
文 | 蘇劍林(追一科技)
編 | 小軼
小編:前幾周小屋剛推完《還在用[CLS]?從BERT得到最強句子Embedding的打開方式!》,蘇神就來打臉了_(:з」∠)_
BERT-flow來自論文《On the Sentence Embeddings from Pre-trained Language Models》[1],中了EMNLP 2020,主要是用flow模型校正了BERT出來的句向量的分布,從而使得計算出來的cos相似度更為合理一些。由于筆者定時刷Arixv的習慣,早在它放到Arxiv時筆者就看到了它,但并沒有什么興趣。想不到前段時間小火了一把,短時間內公眾號、知乎等地出現了不少的解讀,相信讀者們多多少少都被它刷屏了一下。
從實驗結果來看,BERT-flow確實是達到了一個新SOTA。但對于這一結果,筆者的第一感覺是:不大對勁! 當然,不是說結果有問題,而是根據筆者的理解,flow模型不大可能發揮關鍵作用。帶著這個直覺,筆者做了一些分析。果不其然,筆者發現盡管BERT-flow的思路沒有問題,但只要一個線性變換就可以達到相近的效果,flow模型并不是十分關鍵。
余弦相似度的假設
一般來說,我們語義相似度比較或檢索,都是給每個句子算出一個句向量出來,然后算它們的夾角余弦來比較或者排序。那么,我們有沒有思考過這樣的一個問題:余弦相似度對所輸入的向量提出了什么假設呢?或者說,滿足什么條件的向量用余弦相似度做比較效果會更好呢?
我們知道,兩個向量x,y的內積的幾何意義就是“各自的模長乘以它們的夾角余弦”,所以余弦相似度就是兩個向量的內積并除以各自的模長,對應的坐標計算公式是
然而,別忘了一件事情,上述等號只在“標準正交基”下成立。換句話說,向量的“夾角余弦”本身是具有鮮明的幾何意義的,但上式右端只是坐標的運算,坐標依賴于所選取的坐標基,基底不同,內積對應的坐標公式就不一樣,從而余弦值的坐標公式也不一樣。
因此,假定BERT句向量已經包含了足夠的語義(比如可以重構出原句子),那么如果它用上述公式算余弦值來比較句子相似度時表現不好,那么原因可能就是此時的句向量所屬的坐標系并非標準正交基。那么,我們怎么知道它具體用了哪種基底呢?原則上沒法知道,但是我們可以去猜。猜測的依據是我們在給向量集合選擇基底時,會盡量地用好每一個基向量,從統計學的角度看,這就體現為每個分量的使用都是獨立的、均勻的,如果這組基是標準正交基,那么對應的向量集應該表現出“各項同性”來。
當然,這不算是什么推導,只是一個啟發式引導,它告訴我們如果一個向量的集合滿足各向同性,那么我們可以認為它源于標準正交基,此時可以考慮用上述公式算相似度;反之,如果它并不滿足各向同性,那么可以想辦法讓它變得更加各向同性一些,然后再用該公式算相似度,而BERT-flow正是想到了“flow模型”這個辦法。
flow模型的碎碎念
依筆者來看,flow模型真的是一種讓人哭笑不得的模型了,關于它的碎碎念又可以寫上幾頁紙,這里盡量長話短說。2018年中,OpenAI發布了Glow模型,效果看起來很不錯,這吸引了筆者進一步去學習flow模型,甚至還去復現了一把Glow模型,相關工作記錄在《細水長flow之NICE:流模型的基本概念與實現》[2]和《細水長flow之RealNVP與Glow:流模型的傳承與升華》[3]中,如果還不了解flow模型的,歡迎去看看這兩篇博客。簡單來說,flow模型是一個向量變換模型,它可以將輸入數據的分布轉化為標準正態分布,而顯然標準正態分布是各向同性的,所以BERT-flow就選擇了flow模型。
為什么說flow模型讓人哭笑不得呢?其實之前在文章《細水長flow之可逆ResNet:極致的暴力美學》[4]就已經吐槽過了,這里重復一下:
(flow模型)通過比較巧妙的設計,使得模型每一層的逆變換比較簡單,而且雅可比矩陣是一個三角陣,從而雅可比行列式很容易計算。這樣的模型在理論上很優雅漂亮,但是有一個很嚴重的問題:由于必須保證逆變換簡單和雅可比行列式容易計算,那么每一層的非線性變換能力都很弱。事實上像Glow這樣的模型,每一層只有一半的變量被變換,所以為了保證充分的擬合能力,模型就必須堆得非常深(比如256的人臉生成,Glow模型堆了大概600個卷積層,兩億參數量),計算量非常大。
看到這里,讀者就能理解為什么筆者開頭說看到BERT-flow的第一感覺就是“不對勁”了。上述吐槽告訴我們,flow模型其實是很弱的;然后BERT-flow里邊所用的flow模型是多大呢?是一個level=2、depth=3的Glow模型,這兩個參數大家可能沒什么概念,反正就是很小,以至于整個模型并沒有增加什么計算量。所以,筆者的“不對勁”直覺就是:
flow模型本身很弱,BERT-flow里邊使用的flow模型更弱,所以flow模型不大可能在BERT-flow中發揮至關重要的作用。反過來想,那就是也許我們可以找到更簡單直接的方法達到BERT-flow的效果。
標準化協方差矩陣
經過探索,筆者還真找到了這樣的方法,正如本文標題所說,它只是一個線性變換。
其實思想很簡單,我們知道標準正態分布的均值為0、協方差矩陣為單位陣,那么我們不妨將句向量的均值變換為0、協方差矩陣變換為單位陣試試看?假設(行)向量集合為,我們執行變換
μ
使得的均值為0、協方差矩陣為單位陣。了解傳統數據挖掘的讀者可能知道,這實際上就相當于傳統數據挖掘中的白化操作(Whitening),所以該方法筆者稱之為BERT-whitening。
均值為0很簡單,讓μ即可,有點難度的是矩陣的求解。將原始數據的協方差矩陣記為
μμ
那么不難得到變換后的數據協方差矩陣為,所以我們實際上要解方程
我們知道協方差矩陣是一個正定對稱矩陣,正定對稱矩陣都具有如下形式的SVD分解
其中是一個對角陣,并且對角線元素都是正的,因此直接讓就可以完成求解。
Numpy的參考代碼為:
def?compute_kernel_bias(vecs):"""計算kernel和biasvecs.shape?=?[num_samples,?embedding_size],最后的變換:y =?(x + bias).dot(kernel)"""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(s**0.5))W?=?np.linalg.inv(W.T)return?W,?-mu相比于BERT-flow
現在,我們就可以測試一下上述BERT-whitening的效果了。為了跟BERT-flow對比,筆者用bert4keras在STS-B任務上進行了測試,參考腳本在:
Github鏈接:https://github.com/bojone/BERT-whitening
效果比較如下:
可以看到,簡單的BERT-whitening確實能取得跟BERT-flow媲美的結果。除了STS-B之外,筆者的同事在中文業務數據內做了類似的比較,結果都表明BERT-flow帶來的提升跟BERT-whitening是相近的,這表明,flow模型的引入可能沒那么必要了,因為flow模型的層并非常見的層,它需要專門的實現,并且訓練起來也有一定的工作量,而BERT-whitening的實現很簡單,就一個線性變換,可以輕松套到任意的句向量模型中。(當然,非要辯的話,也可以說whitening是用線性變換實現的flow模型...)
注:這里順便補充一句,BERT-flow論文里邊說的last2avg,本來含義是最后兩層輸出的平均向量,但它的代碼實際上是“第一層+最后一層”輸出的平均向量,相關討論參考[5]。
所以最終結論就是
所以,目前的結果就是:筆者的若干實驗表明,通過簡單的線性變換(BERT-whitening)操作,效果基本上能媲美BERT-flow模型,這表明往句向量模型里邊引入flow模型可能并非那么關鍵,它對分布的校正可能僅僅是淺層的,而通過線性變換直接校正句向量的協方差矩陣就能達到相近的效果。
后臺回復關鍵詞【入群】
加入賣萌屋NLP/IR/Rec與求職討論群
后臺回復關鍵詞【頂會】
獲取ACL、CIKM等各大頂會論文集!
?
[1]On the Sentence Embeddings from Pre-trained Language Models:(https://arxiv.org/abs/2011.05864)
[2]《細水長flow之NICE:流模型的基本概念與實現》:(https://kexue.fm/archives/5776)
[3]《細水長flow之RealNVP與Glow:流模型的傳承與升華》:(https://kexue.fm/archives/5807)
[4]《細水長flow之可逆ResNet:極致的暴力美學》:(https://kexue.fm/archives/6482)
[5] https://github.com/bohanli/BERT-flow/issues/11
總結
以上是生活随笔為你收集整理的打脸!一个线性变换就能媲美“最强句子embedding”?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Facebook、阿里等大佬现身说法,N
- 下一篇: Step-by-step to Tran