NLP系列之句子向量、語義匹配(三):BERT_avg/BERT_whitening/SBERT/SimCSE—實驗代碼
作者簡介
作者:ZHOU-JC (廣州云迪科技有限公司 NLP算法工程師)
原文:https://zhuanlan.zhihu.com/p/387271169
轉(zhuǎn)載者:楊夕
面筋地址:https://github.com/km1994/NLP-Interview-Notes
個人筆記:https://github.com/km1994/nlp_paper_study
前言
上篇主要討論了四種方法的原理,本篇通過中文數(shù)據(jù)集對四種方法的表現(xiàn)進(jìn)行對比。
項目實驗代碼地址:
Base BERT用的是哈工大科大訊飛聯(lián)合實驗室發(fā)布的6層RoBERTa。
用于驗證的是STS-B數(shù)據(jù)集(中文版本)的驗證集和測試集,監(jiān)督訓(xùn)練SBERT和SmiCSE用的是SNLI數(shù)據(jù)集(中文版本)。
數(shù)據(jù)集來源于github.com/pluto-junzen, 是從原英文數(shù)據(jù)集SNLI和STS-B通過翻譯加部分人工修正的方法得到的,感謝開源數(shù)據(jù)集的朋友。
下方為數(shù)據(jù)示例
SNLI數(shù)據(jù)集是三元組的方式,每個樣本為(原句,與原句有蘊(yùn)含關(guān)系的句子,與原句矛盾的句子)

STS-B數(shù)據(jù)集,句子的相似度分為0~5共六個等級

評測指標(biāo):斯皮爾曼等級相關(guān)系數(shù)Spearman's rank correlation coefficient
把句子對分別輸入模型編碼得到embedding對后,計算embedding對的余弦距離。
由于STS-B數(shù)據(jù)集是把句子對進(jìn)行0~5的打分,所以評測指標(biāo)采用斯皮爾曼等級相關(guān)系數(shù),指標(biāo)介紹可以看這篇博文
在python中只需要調(diào)用scipy庫則可計算,

BERT-avg
BERT-avg實現(xiàn)了
使用CLS-token最后一層的輸出作為embedding(沒有用BERT做NSP任務(wù)得到的CLS-pooling層)
使用第一層和最后一層的輸出求平均作為embedding
| STS-B(dev) | STS-B(test) | |
|---|---|---|
| BERT-avg(CLS-token) | 54.39 | 48.34 |
| BERT-avg(First-last avg.) | 40.35 | 38.20 |
Bert-Whitening
把STS-B訓(xùn)練集輸入BERT,用第一層和最后一層的輸出求平均得到句子的embeddings,然后計算得到u和變換矩陣W保存下來。
預(yù)測時先得到句子的embedding,再用保存好的u和W做變換,還實驗了降維為512和256的版本,效果如下:
| STS-B(dev) | STS-B(test) | |
|---|---|---|
| BERT-whitening | 74.70 | 66.98 |
| BERT-whitening(512) | 74.97 | 67.04 |
| BERT-whitening(256) | 74.18 | 67.21 |
BERT-Whitening論文里提到降維到原來的1/3效果是最好的。因為特征值小的方向,噪聲成份多(通常有用信息的方差大,噪聲方差?。?,因此降維不僅能起到節(jié)約存儲空間、提高計算效率的好處,還能降噪。但實驗發(fā)現(xiàn),768、512、256維的效果都差不多,在差不多的情況下,當(dāng)然是取維度小的。
SBERT
訓(xùn)練用到SentenceTransformers庫,提供了模型、數(shù)據(jù)集、損失函數(shù)、評價器,訓(xùn)練,預(yù)測等接口。庫十分豐富,其中損失函數(shù)就有如下這么多種,遠(yuǎn)遠(yuǎn)不止SBERT論文里提到的SoftmaxLoss、MSELoss、TripletLoss。

損失函數(shù)的選擇需要根據(jù)自己手頭訓(xùn)練集的特性。但無論采用哪種,預(yù)測的時候只用到BERT的輸出得到句子的embeddings,求它們的余弦距離作為相似度。
SBERT(SNLI) :用SNLI訓(xùn)練集進(jìn)行監(jiān)督訓(xùn)練SBERT,因為SNLI是三元組(anchor, positive, negative)的形式,所以這里損失函數(shù)為TripleLoss
SBERT(STS-B):用STS-B訓(xùn)練集進(jìn)行監(jiān)督訓(xùn)練SBERT,因為把STS-B標(biāo)簽的0·5映射為相似度0, 0.2, 0.4, 0.6, 0.8, 1。損失函數(shù)采用與評價指標(biāo)一樣的CosineSimilarLoss
學(xué)習(xí)率都用庫默認(rèn)的默認(rèn)參數(shù),SBERT(SNLI) 訓(xùn)練2個epoch,SBERT(STS-B)訓(xùn)練8個epoch,驗證集都使用STS-B(dev),評價指標(biāo)就為Spearman's rank correlation coefficient,庫提供了很好的封裝,保存在驗證集上分?jǐn)?shù)最好的模型,然后對測試集進(jìn)行計算。
| STS-B(dev) | STS-B(test) | |
|---|---|---|
| SBERT(SNLI) | 72.97 | 68.78 |
| SBERT(STS-B) | 80.39 | 74.21 |
SmiCSE
比較兩種方法
SmiCSE(unsupervised):用STS-B訓(xùn)練集無監(jiān)督訓(xùn)練,訓(xùn)練細(xì)節(jié)為attention層和hidden層的dropout都設(shè)為0.3,batch_size=128,epoch=8,學(xué)習(xí)率=4e-5,每20個step在STS-B(dev)上計算Spearman's rank correlation coefficient,保存最佳的模型,用最佳模型在STS-B(test)計算分?jǐn)?shù)
SmiCSE(supervised):用SNLI訓(xùn)練集監(jiān)督訓(xùn)練,訓(xùn)練細(xì)節(jié)為batch_size=64,epoch=2,學(xué)習(xí)率=4e-5,每200個step在STS-B(dev)上計算Spearman's rank correlation coefficient,保存最佳的模型,設(shè)置了早停策略,用最佳模型在STS-B(test)計算分?jǐn)?shù)
| STS-B(dev) | STS-B(test) | |
|---|---|---|
| SmiCSE(unsupervised) | 63.12 | 60.57 |
| SmiCSE(supervised) | 75.42 | 73.61 |
總結(jié)
這里還是從實際可能遇到的場景出發(fā),假如現(xiàn)在要做一個相似度檢索的場景,
場景1:沒有任務(wù)相關(guān)的labeled數(shù)據(jù),只能用unlabeled數(shù)據(jù)做無監(jiān)督訓(xùn)練,或者從其它相似的labeled數(shù)據(jù)集上進(jìn)行監(jiān)督訓(xùn)練。例如目前有SNLI這個已標(biāo)注好的數(shù)據(jù)集,目標(biāo)場景是STS-B數(shù)據(jù)集。
| STS-B(dev) | STS-B(test) | |
|---|---|---|
| BERT-avg(CLS-token) | 54.39 | 48.34 |
| BERT-avg(First-last avg.) | 40.35 | 38.20 |
| BERT-whitening | 74.70 | 66.98 |
| BERT-whitening(512) | 74.97 | 67.04 |
| BERT-whitening(256) | 74.18 | 67.21 |
| SBERT(SNLI) | 72.97 | 68.78 |
| SmiCSE(unsupervised) | 63.12 | 60.57 |
| SmiCSE(supervised) | 75.42 | 73.61 |
場景2:有任務(wù)相關(guān)的labeled數(shù)據(jù)集,那當(dāng)然是用任務(wù)相關(guān)的數(shù)據(jù)進(jìn)行監(jiān)督訓(xùn)練好,或者先在相關(guān)數(shù)據(jù)集上做監(jiān)督訓(xùn)練,再在任務(wù)相關(guān)的數(shù)據(jù)集上繼續(xù)做監(jiān)督訓(xùn)練。
| STS-B(dev) | STS-B(test) | |
|---|---|---|
| SBERT(STS-B) | 80.39 | 74.21 |
總的來說,SmiCSE(supervised)和SBERT(STS-B) 效果是較好的。不過做具體的業(yè)務(wù)時,還需要多根據(jù)業(yè)務(wù)的數(shù)據(jù)特點(diǎn),選擇最優(yōu)的方法,并根據(jù)實驗科學(xué)地選擇最佳的超參。
參考資料:
zhengyanzhao1997/NLP-model
autoliuweijie/BERT-whitening-pytorch
中文任務(wù)還是SOTA嗎?我們給SimCSE補(bǔ)充了一些實驗 - 科學(xué)空間|Scientific Spaces
