文字匹配之bert flow:On the Sentence Embeddings from Pre-trained Language Models
論文資訊
論文名:On the Sentence Embeddings from Pre-trained Language Models:
機構:位元組跳動AI Lab、CMU
下載:https://arxiv.org/abs/2011.05864
程式碼:https://github.com/bohanli/BERT-flow
內容解析
將一個句子編碼成固定維度的向量,慣例做法為:要麼取bert的上下文context的每個token編碼的平均(效果好於後者,本文使用這種),要麼直接使用CLS token的編碼。需要注意的是真正生成一個句向量時,這個句子是沒有masked,這和預訓練對句子masked不一樣。Reimers and Gurevych的論文證明bert在語義相似度上對句子的編碼效果還不如Glove。但我們不知道為什麼?下面將具體分析其原因。
語義相似度和bert預訓練
語言模型LM(Language modeling):
其中:
- x1:T = (x1, . . . , xT )表示tokens序列
- t為token的序號,最大值為token長度T
- ct= x1:t−1
解釋:傳統語言模型採用自迴歸方式來因式分解token 1到T出現的聯合概率p(x1:T ) 。例如句子x1x2x3出現的概率為p(x1) * p(x2|x1) * p(x3|x1x2),這就是最原始的語言模型建模,可以利用馬爾科夫鏈的無後效性假設,簡化為n-gram模型。
掩碼語言模型MLM(masked language modeling)
其中:
- maske意思是將句子序列中的某些token,直接用[mask]這個token替換,如,x1x2x3 maked後為x1[mask]x3
- x^為帶有被masked token的序列
- x- 為被masked的token
- mt 為該token是否被masked,如果是其值為1,否則為0
- ct為上下文序列,這裡為x^
解釋: 輸入帶掩碼的序列,預測掩碼出現的概率,即找出被masked的token是什麼,這個叫自編碼語言模型。和LM不同的是,LM為輸入完整序列,預測該單詞的下一個單詞是什麼,這個叫自迴歸語言模型。
這兩個模型都是基於給定上下文序列c,預測token x的概率,即條件概率。可以表示為:
其中:
- c為上下文token序列
- x為待預測的token
- hc為將c編碼成向量的函式,多為深度神經網路
- wx為編碼x的函式,如詞嵌入詞表embedding lookup table
兩個句子經過bert編碼成向量hc和hc’後,他們之間的相似度可以直接計算兩個向量的乘積hTchc’。因為這兩個向量歸一化到同一個超球體空間後,他們的乘積類似cos距離。
但如(1)式,bert預訓練時並沒有加入hTchc’這個計算。所以我們很難知道hTchc’計算到底代表了什麼。
統計共現來表示語義相似
我們不再直接計算hTchc’,而是考慮計算hTc wx
即上下文編碼和單詞詞嵌入的點積。該計算可以近似為:
其中:
- 為x和c的點式互資訊,PMI是共現(Co-Occurrence)關係的一種近似度量,實際上,"語義"這個概念的數學表達對應的就是某種能夠反映共現關係的統計量,因此計算詞嵌入和上下文嵌入的點積是能夠反映詞和上下文的語義相關性的。
- p(x)為單詞概率,是固定值。 λ c \lambda _{c} λc為c的固定引數。
再進一步,我們可以猜想如果兩個上下文c和c’與同一個詞w有共現關係,那麼c和c’也應該有相似的語義,具體來說,在訓練語言模型時,c和c’的共現會使得c和w相互靠近,對c’來說也同樣如此,因此hc和hc’就會變得接近,同時由於softmax標準化的原因,hc和xw’的距離會拉大,w’!=w。通過這樣的過程,模型可以建立上下文與上下文潛在的共現關係,這表明BERT的訓練過程和語義相似度計算的目標是很接近的,訓練得到的句向量應該包含了文字之間的語義相似度資訊。
因此我們繼續考慮下面的問題:「我們使用BERT句向量的方法是否不夠有效?」
各向異性向量與語義相似性
由於我們用的相似度度量都是很簡單的度量,比如cosine相似度,minkowski距離等,這些度量對語義分佈的性質可能會有一定的要求,而BERT句向量的分佈不一定滿足這些性質,或者說「BERT句向量隱含的語義相似度資訊沒那麼容易被抽取出來」,因此我們嘗試分析一下句向量在高維空間中的分佈情況。
目前已經出現了不少針對語義向量空間性質的研究,比如Representation Degeneration Problem in Training Natural Language Generation Models (ICLR 2019)[6]發現語言模型學習到的詞向量分佈通常是各向異性的(anisotropic),且詞嵌入常呈現錐形分佈,Towards Understanding Linear Word Analogies (ACL 2019)[7]在BERT和GPT2的詞向量分佈上也得到了同樣的結論。因此作者猜想BERT句向量同樣存在這樣的問題,作者在上述結論的基礎上,進一步發現了詞向量的非均勻分佈和詞頻的非均勻分佈有關。
為了方便,我們只探討詞向量空間,因為詞向量空間和句向量空間共享的是同一個高維空間,如果詞向量空間有什麼問題,那句向量空間也會有同樣的問題。
為了驗證BERT詞向量分佈是否和詞頻有關,作者計算了詞向量的L2範數和詞向量間的L2距離,如下表所示。
我們可以發現高頻詞的L2範數更小,說明高頻詞離原點更近,低頻詞離原點較遠,這會導致即使一個高頻詞和一個低頻詞的語義是等價的,但詞頻的差異也會帶來很大的距離偏差,從而詞向量的距離就不能很好地代表語義相關性。
我們還可以發現高頻詞與高頻詞之間的 L2 距離也更小,說明高頻詞分佈得更緊湊,低頻詞分佈得更稀疏,而稀疏性會導致一些詞向量之間的空間是"空"的,這些地方沒有明顯的語義對應,因為句向量是詞向量的平均池化,是一種保凸性運算,然而這些沒有語義定義的空間使得分佈不是凸性的,所以可以認為BERT句向量空間在一定程度上是「語義不平滑的(semantically non-smoothing)」,這導致句向量相似度不一定能夠準確表示句子的語義相似度。
BERT-flow
為了解決BERT句向量分佈不平整的問題,作者認為可以利用標準化流(Normalizing Flows)將BERT句向量分佈變換成一個光滑的,各向同性的標準高斯分佈。
動機Motivation
標準高斯分佈有一些很好的性質,首先,標準高斯分佈是各向同性的(isotropy),在傳統的詞嵌入方法中,研究表明詞向量矩陣的前面幾個奇異值通常和高頻詞高度相關,通過將嵌入分佈變換到各向同性的分佈上,奇異值就可以被壓縮。另外,標準高斯分佈是凸的,或者說是沒有"空洞",因此語義分佈更為光滑。
基於標準化流的生成模型Flow-based Generative Model
基於標準化流的生成模型定義了一個從潛在空間 z觀測空間 u 的可逆變換 ,標準化流的生成過程為:
pz(z)為先驗分佈,z->u是可逆變換。
通過變數代換定理,可觀測變數 x 的probabilistic density function PDF可以表示為:
在BERT-flow中:
- pz是標準高斯分佈
- u是BERT句向量分佈
- f ϕ f_{\phi } fϕ 是一個可逆神經網路
- det為矩陣的行列式
注意flow的訓練是無監督的,且BERT的引數不參與訓練,只有標準化流的引數被優化,訓練目標為最大化預先計算好的BERT句向量的似然函式:
其中:
- D為資料集,即句子集合
作者借鑑並簡化了Glow模型的設計,將Glow的仿射耦合變換替換為了加性耦合變換,將 1x1卷積替換為了隨機置換。最後我們學習到了一個雙射 f ϕ − 1 f_{\phi }^{-1} fϕ−1,它可以無損地將BERT句向量 u變換為潛在的高斯表示z ,而且不丟失語義資訊,這是由 f ϕ f_{\phi } fϕ的可逆性保證的。
實驗
為了驗證BERT-flow的有效性,作者以SBERT的實驗結果為基礎,在一系列文字語義相似度計算任務上進行了模型對比和評估。
語義相似Semantic Textual Similarity
作者利用SentEval Toolkit在STS-B,SICK-R,STS tasks 2012-2016的測試集上進行模型評估。與SBERT的評估過程一致,作者首先使用句子編碼器得到句向量,然後計算句向量對的cosine相似度作為語義相似度的預測值,最後計算預測相似度和人工標註相似度的Spearman秩相關係數。
無監督實驗Unsupervised Training
由於標準化流的訓練過程是完全無監督的,所以作者在整個目標資料集上(train+val+test)訓練了標準化流(flow(target)),為了與SBERT對比,作者也用SNLI和MNLI資料集(統稱為NLI)無監督地訓練標準化流(flow(NLI*)),注意在整個訓練過程中預訓練BERT部分的引數是不變的,實驗結果如下表所示。
可以發現,在目標資料集上訓練flow(BERT-flow(target))比在NLI資料集上訓練flow(BERT-flow(NLI*))要好不少,除了SICK-R資料集,這是因為SICK-R資料集包含了文字蘊含和文字相關兩類任務,而NLI資料集正好包含了文字蘊含任務,因此SICK-R和NLI資料集的差異可能很小,又因為NLI資料集比SICK-R大得多,所以這樣的結果是可以理解的。但在實際應用場景下,在目標資料集上訓練模型通常是更好的選擇。
有監督實驗Supervised Training
當前文字語義相似度計算的SOTA基線模型依舊是SBERT,SBERT同樣是在NLI資料集上以有監督的方式訓練的,為了和SBERT對比,作者首先以SBERT的訓練方式在相同的資料集上微調了BERT部分(BERT-NLI),然後再無監督地微調flow部分。「這實際上等價於在SBERT後面加了個flow,區別在於BERT-flow利用了目標資料集來無監督訓練flow,而SBERT並沒有以任何方式利用目標資料集」,所以BERT-flow好也是好得理所當然的。實驗結果如下表所示,可以認為BERT-flow是一個新的SOTA模型。
無監督QA實驗Unsupervised Question-Answer Entailment
上面的文字語義相似度計算任務是迴歸式的,而文字語義匹配任務是二分類式的,比如判斷某個答案是否能夠回答某個問題。因此作者在問答蘊含(QA entailment)任務上進一步測試了BERT-flow。作者在QNLI資料集上進行實驗,並計算出了不同模型在驗證集上的AUC,實驗結果表明flow的引入能夠較大幅度地提高模型表現。
對比其他詞嵌入基準Comparison with Other Embedding Calibration Baselines
針對句向量空間分佈不規整的問題,前人也提出了一些修正方法,比如對句向量做標準化(SN):
u
−
μ
δ
\frac{u-\mu }{\delta }
δu−μ,以及歸零前 k 個奇異向量來規避各向異性的問題(NATSV)。下面的實驗結果表明作者的flow是最先進的方法,雖然NATSV可以緩解各向異性的問題,但粗暴地丟棄前 k 個奇異向量會導致語義資訊的部分丟失,而flow的操作是無損的。
語義相似度與編輯距離關係Semantic Similarity Versus Lexical Similarity
作者進一步討論了文字的語義相似度和詞彙相似度(Lexical Similarity)的關係,作者將編輯距離(edit distance)作為文字詞彙相似度的度量,然後分別計算了人類標註的語義相似度、BERT語義相似度、BERT-flow語義相似度和詞彙相似度的Spearman相關係數
ρ
\rho
ρ。
我們可以發現真實的語義相似度和詞彙相似度的相關性很弱(),因為我們知道一個詞的變動就可能使得文字的語義完全相反(比如加入一個否定詞),而BERT計算的語義相似度和詞彙相似度表現出了較強的相關性(),尤其是當編輯距離小於4的時候(green)相關性非常強,這會導致BERT可能難以區分like和dislike的語義差別。而引入flow之後,可以發現上述情況有明顯的改善,尤其是當編輯距離小於4的時候改善更明顯,「這表明BERT-flow計算的相似度更接近於真實的語義相似度,而不是詞彙相似度。」
總結
標準化流用於規整分佈的思想挺有價值的,VAE和標準化流的結合就非常多,比如在CV裡面,Variational Autoencoders with Normalizing Flow Decoders (2020)[8]就把Glow和VAE結合起來同時解決Glow難以訓練和VAE生成影像偏模糊的問題。因此如何在其他模型裡面有效地利用標準化流的優秀性質也是值得一灌的方向。
tips:flow model建議看李宏毅老師視訊
參考文獻
[1] On the Sentence Embeddings from Pre-trained Language Models
[2] https://mp.weixin.qq.com/s/_bVG_9zJhFgD1GB_rcB8IA
相關文章
- 【機器學習】李宏毅——Flow-based Generative Models機器學習
- 大型語言模型(Large Language Models)的介紹模型
- [Paper Reading] KOSMOS: Language Is Not All You Need: Aligning Perception with Language Models
- CSS文字:layout-flow(轉)CSS
- Pixel Aligned Language Models論文閱讀筆記筆記
- Open vSwitch中的datapath flow匹配過程
- EMNLP’19-Mask-Predict: Parallel Decoding of Conditional Masked Language ModelsParallel
- Bert文字分類實踐(二):魔改Bert,融合TextCNN的新思路文字分類CNN
- sentence structures經典句型Struct
- 【論文系列】之 ---- BERT
- CSS匹配input text文字框CSS
- ACL20 | 讓笨重的BERT問答匹配模型變快!模型
- 【BERT】詳解BERT
- JDK 9新特性之Flow API 初探JDKAPI
- 使用Bert預訓練模型文字分類(內附原始碼)模型文字分類原始碼
- 文字匹配相關方向打卡點總結
- 模型訓練時間預測,計算量估計 Scaling Laws for Neural Language Models模型
- 不在models.py中的models
- Dockerfile 小記之FROMDocker
- 匹配純英文字元正規表示式字元
- 【python技巧】文字處理-re庫字元匹配Python字元
- Sublime Text提取正規表示式匹配的文字
- nginx之rewrite匹配需求Nginx
- Probabilistic Models
- 谷歌BERT遭遇對手,微軟UniLM AI突破大量文字處理瓶頸谷歌微軟AI
- 超詳細的 Bert 文字分類原始碼解讀 | 附原始碼文字分類原始碼
- .NET Framework 之 Common Language Runtime (轉)Framework
- ORA-01861: 文字與格式字串不匹配字串
- ORA-01861 【文字與格式字串不匹配 】字串
- ORA-01861_文字與格式字串不匹配字串
- Linux 中grep命令如何匹配中文字元Linux字元
- 大語言模型無法理解連結串列 Large Language Models Fails to Understand Chained Table[up to 202407017]模型AI
- 匹配純小寫英文字元正則程式碼字元
- Linux中使用正規表示式進行文字匹配Linux
- Java經典例項:在文字中匹配換行符Java
- 使用cstring實現中文字串模糊匹配字串
- Bert文字分類實踐(一):實現一個簡單的分類模型文字分類模型
- Git Dev FlowGitdev