用BERT做語義相似度匹配任務:計算相似度的方式


 

1. 自然地使用[CLS]

2. cosine similairity

3. 長短文本的區別

4. sentence/word embedding

5. siamese network 方式

 

 

1. 自然地使用[CLS]

BERT可以很好的解決sentence-level的建模問題,它包含叫做Next Sentence Prediction的預訓練任務,即成對句子的sentence-level問題。BERT也給出了此類問題的Fine-tuning方案:

 

這一類問題屬於Sentence Pair Classification Task.

 

計算相似度:

上圖中,我們將輸入送入BERT前,在首部加入[CLS],在兩個句子之間加入[SEP]作為分隔。

然后,取到BERT的輸出(句子對的embedding),取[CLS]即可完成多分類任務/相似度計算任務。

對應的:

假設我們取到的[CLS]對應的embedding為c,

多分類任務,需進行:P = softmax(cW')

相似度計算,需進行:P = sigmoid(cW')

然后,就可以去計算各自所需的loss了。

 

c可一定程度表示整個句子的語義,原文中有提到“ The final hidden state (i.e., output of Transformer) corresponding to this token is used as the aggregate sequence representation for classification tasks.”這句話中的“this token”就是CLS位。
 
 

2. cosine similairity

單純的做相似度匹配,這種方式需要優化。

在不finetune的情況下,cosine similairty絕對值沒有實際意義。

bert pretrain計算的cosine similairty都是很大的,如果直接以cosine similariy>0.5之類的閾值來判斷相似不相似那肯定效果很差。如果用做排序,也就是cosine(a,b)>cosine(a,c)->b相較於c和a更相似,是可以用的。

模型評價的標准應該使用auc,而不是accuracy。

 

3. 長短文本的區別

短文本(新聞標題)語義相似度任務用先進的word embedding(英文fasttext/glove,中文tencent embedding)mean pooling后的效果就已經不錯;

而對於長文本(文章)用simhash這種純詞頻統計的完全沒語言模型的簡單方法也可以。

 

4. sentence/word embedding

bert pretrain模型直接拿來用作 sentence embedding效果甚至不如word embedding,cls的emebdding效果最差(也就是pooled output)。把所有普通token embedding做pooling勉強能用(這個也是開源項目bert-as-service的默認做法),但也不會比word embedding更好。

 

5. siamese network 方式

除了直接使用bert的句對匹配之外,還可以只用bert來對每個句子求embedding,再通過向Siamese Network這樣的經典模式去求相似度。

用siamese的方式訓練bert,上層通過cosine做判別,能夠讓bert學習到一種適用於cosine作為最終相似度判別的sentence embedding,效果優於word embedding,但因為缺少sentence pair之間的特征交互,比原始bert sentence pair fine tune還是要差些。

參考Siamese bert:

[相關論文]

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM