【NLP】NLP 语义匹配:经典前沿方案整理
作者?|?周俊賢????
整理?|?NewBeeNLP
上一篇文章,討論了語義匹配的語義場景,NLP 語義匹配:業務場景、數據集及比賽
這篇跟大家討論相關的技術,主要包括BERT-avg、BERT-Whitening、SBERT、SimCES四個。
為了方便,還是從狹義的語義匹配的場景出發,輸入一對句子,輸出這對句子相似性(回歸,0~1)。
BERT-avg
BERT-avg做法很簡單,「直接拿預訓練后的預訓練模型來做相似度匹配」,因為默認經過預訓練后的模型含有知識,能夠編碼句子的語義。
但假如不經過fine-tuning的話,不能單純把它們拼接起來作為輸入,而是兩個句子要分別輸入BERT模型。具體的,我們可以采用
CLS token的的最后一層embedding計算余弦相似度;
最后一層序列的輸出求平均,再求余弦相似度(通常,做分類的時候,通常求max效果會較好,做語義的時候求mean效果較好);
把第一層和最后一層的輸出加起來后做平均(有研究表明開始幾層,主要蘊含詞匯信息,靠任務的層主要蘊含語義信息,把它們拼接起來,讓兩種信息得到融合)。
但實質上,這種效果并不好。原因在于「各向異性」。
什么叫各向異性?這里引入知乎某答主的回答。
我理解的是輸出的每個token是768維的(即向量空間的基向量由768個768維的向量組成),embedding的數值取決于當前選的坐標系,假如當前坐標系非標準正交基,則會出現空間上是正交的向量(空間正交不依賴于坐標系,無論你取哪個作為基底,在空間中它們就是正交),但在該坐標系下計算出的投影不為0。
BERT-Whitening
論文全稱:《Whitening Sentence Representations for Better Semantics and Faster Retrieval》
項目代碼:https://github.com/bojone/BERT-whitening
解決各向異性有BERT-flow、BERT-Whitening等方法,它們的目標都是通過基底變換,把當前的坐標系變換到標準正交基。其中BERT-Whitening尤為簡單,「本質上就是對語料數據求特征值分解,從而達到把當前坐標系變換到標準正交基的目的」。
特征值分解的好處還在于能降維,大家想想PCA的原理,假如目前是768維的向量空間,經過正交標準變換后,有一些方向的特征值是很小的,可以把這些維度拋棄,達到節約存儲空間,提高計算效率的目的。
上圖為步驟,把當前任務的語料,分別一句句地輸入到預訓練模型中得到各自的embedding,然后對embeddings做特征值分解,得到變換矩陣,然后存起來。應用時,輸入新的句子,把它們輸入預訓練模型,得到句子embedding,再用存起來的變換矩陣u和W做變換,這時候得到的embedding就是標準正交基表示的embedding。
SimCSE
論文全稱:《SimCSE: Simple Contrastive Learning of Sentence Embeddings》
項目代碼:https://github.com/princeton-nlp/SimCSE
上面提到的BERT-avg和BERT-whitening都是無監督的方法,這里提到的SimCSE有無監督和有監督兩種模式,其中的無監督模式是當前無監督的SOTA方法。
SimCSE的核心思想是當前較火的對比學習,如下圖所示。
無監督學習:如上圖左,同一個句子輸入模型兩次,由于有dropout隨機性影響,兩次的輸出不一樣。「當dropout較小時,可以認為兩個輸出的embedding語義是相似的」。借鑒這種思想,訓練目標就很簡單了,例如一個batch里面有16個句子,其中每個句子分別輸入模型兩次,得到和,其中同一個句子的輸出是相似的,即是相似的,拉近它們的余弦距離,而和是不一樣的語義,目標是拉大它們之間的距離,訓練函數如下:
有監督學習:如上圖右,不同于無監督學習通過dropout制作語義相同的句子對,論文中的有監督學習用的是NLI數據集,NLI數據集,針對推理前提(primise)與推理假設(hypothesis)之間是否存在邏輯關系,人工標注了三種標簽entailment蘊含、contradiction矛盾、neutral中立,如下圖為一些示例展示
本來NLI的任務是輸入一個句子對,輸出它們的label是【entailment、contradiction、neutral】中的一個。SimCSE里作了點小改動,label為entailment的句子對作為語義相近的樣本,目標拉近它們的余弦距離,而label為contradiction的句子對則作為語義不同的句子,要拉遠它們的距離。損失函數如下
這里再介紹一下論文里重要的一些細節:
dropout效果是最好的:無監督訓練時,除了用dropout生成語義相同的句子對,論文里還采用過如
等等,最后發現dropout效果是最好的,而且最容易實現。
Crop:隨機刪掉一段span
Word deletion:隨機刪除詞
MLM:用BERT預訓練任務之一,用一些隨機token或【MASK】token代替原序列的某些token
解決各向異性:論文里一章數據證明了對比學習的目標能有效平滑(論文里叫flatten)句子embedding矩陣的特征值分布。
從線性代數的角度講,特征值分布不均勻,代表這個矩陣所表示的線性變換在某些方向上變化大,某些方向上變化小,導致各向異性,而平滑特征值可以使得這個線性變換在各個方向的變化均勻化,有效減緩各向異性。
Pooling策略:以往的經驗,編碼句子embedding時最好用最后一層的輸出求平均,或第一層加最后一層的輸出求平均,但論文里發現,用CLS token最后一層的輸出作為embedding效果差不多,所以論文里采用這種CLS,畢竟較為簡單;
uniformity and alignment:
從下圖可以看出,訓練完的SimCSE無論是uniformity和alignment都表現不俗。
alignment表示對齊,則語義相同的句子在句子embedding的向量空間中已經方向相同,
uniformity即均勻性,表示不同句子在句子embedding的向量空間中應該盡可能分布均勻。
SBERT
論文全稱:《Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks》
項目代碼:https://github.com/UKPLab/sentence-transformers
SBERT是近年工業上應用很廣泛的方法,思想很簡單,就是如上圖左邊得雙塔模型,有的地方稱為Siamese network(孿生網絡)和Bi-Encoder。
有的朋友會疑問,這幾年句子相似度的算法競賽,發現都沒見到這種雙塔模型的身影,常常是上圖右邊這種Cross-Encoder的結構。原因是,雙塔模型相對Cross-Encoder結構效是稍差的,但落到工業應用上,它的優點就是快很多!
很簡單,回想上一篇博客檢索式機器人的場景,假設現在知識庫中有500個候選問題,現在傳來一個用戶的問題,Cross-Encoder結構要把用戶問題和500個候選問題,分別拼接后輸入模型,相當于要做500次前向計算。
而雙塔模型則只需要把500個候選問題的embeddings提前算好存儲起來,當有新問題時,只需要算這個問題的embedding,然后用新問題的embedding與500個embeddings做矩陣計算就OK了,相當于只進行了一次前向計算!
所以檢索的一種方法是,首先用SBERT做檢索,然后用Cross-Encoder做精排。
論文中的一些一些細節:
預測時,SBERT是對BERT的輸出做pooling來得到固定維度的句子embedding。作者實驗了三種做法:包括使用CLS token的embedding、求句子序列的輸出求mean、對句子序列的輸出求max。實驗發現,mean效果是最好的,個人經驗是,做分類任務時,max效果更好,求語義表征的時候,mean效果更好。
訓練的損失函數
使用哪種損失函數依據手頭數據集的形式,但無論采用哪種方式進行訓練,預測時,用的都是兩個句子分別輸入encoder,得到輸出后求pooling得到u和v,再求余弦相似度從而得到句子對的相似度。
Classification Objective Function:如上圖的左邊,當訓練集是分類數據集時,采用優化交叉熵損失。值得注意的是,這里的concatenation可以采用多種方式,如(u,v)、(|u-v|)及圖中的(u, v, |u-v|)等等,論文實驗證明,|u-v|是影響最大的因子。強調一下,concatenation只有在訓練采用交叉熵損失才考慮,預測時,用的只有u和v。
Regression Objective Function:如上圖右邊,采用平方損失。
Triplet Objective Function:三元組損失,當訓練的數據集是如NLI這種三元組數據集時(即包含原句、與原句語義相同的句子、與原句矛盾的句子組成一個三元組),就可以采用這種目標函數,損失計算如下
Semantic Textual Similarity庫
庫地址:https://www.sbert.net/examples/training/sts/README.html#training-data
該庫發布了用不同數據訓練的SBERT模型可供直接調用(不過沒看到中文的,只看到個多語言的),也封裝了用你自己數據訓練SBERT模型、Cross-Encoder模型的API,以及訓練完后如何調用的API。庫里還列舉了SBERT的使用場景,如下圖,包括計算句子的embedding、計算語義相似度、語義搜索、檢索重排、聚類等等應用,每個應用都有示例代碼。
總而言之,這個庫對工業應用十分友好,建議做做成的同學充分掌握,業務上就能快速實現閉環。
一起交流
想和你一起學習進步!『NewBeeNLP』目前已經建立了多個不同方向交流群(機器學習 / 深度學習 / 自然語言處理 / 搜索推薦 / 圖網絡 / 面試交流 /?等),名額有限,趕緊添加下方微信加入一起討論交流吧!(注意一定要備注信息才能通過)
-?END?-
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載黃海廣老師《機器學習課程》視頻課黃海廣老師《機器學習課程》711頁完整版課件本站qq群554839127,加入微信群請掃碼:
總結
以上是生活随笔為你收集整理的【NLP】NLP 语义匹配:经典前沿方案整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯视频如何退出登陆
- 下一篇: 【竞赛相关】特征/模型存储的5种方法