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