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了。
單純的做相似度匹配,這種方式需要優化。
在不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: