LUSE: 无监督数据预训练短文本编码模型
LUSE: 無監(jiān)督數(shù)據(jù)預訓練短文本編碼模型
1 前言
本博文本應寫之前立的Flag:基于加密技術編譯一個自己的Python解釋器,經(jīng)過半個多月嘗試已經(jīng)成功,但考慮到安全性問題就不公開了,有興趣的朋友私聊討論吧。
從本篇博客開始,本人將轉化寫作模式,由話癆模式轉為極簡模式,力求三言兩語讓各位看的明白。
2 工作簡介
受到MOCO和SimCSE的啟發(fā), 基于自監(jiān)督,使用海量無監(jiān)督數(shù)據(jù)(nlp_chinese_corpus),預訓練了一個專門用于短文本表征的編碼器。該編碼器在分類任務尤其是短文本相似度任務上效果超過同級別BERT模型。該預訓練模型暫且叫LUSE.
本次實驗結果是僅在預訓練0.1輪(10萬步)情況下得到的,完全訓練后會得到更強的效果。
三層預訓練模型(torch)下載地址:
百度網(wǎng)盤:https://pan.baidu.com/s/1Do3ojovAe7VviSXdsk4mQQ 提取碼:luse
和彩云(不限速): https://caiyun.139.com/m/i?1A5ChPLNDFGuW 提取碼:tFK0
代碼地址: https://github.com/DunZhang/LUSE
預處理后的nlp_chinese_corpus下載地址: https://pan.baidu.com/s/11ddgvZ7QAbIlliJgUiau9g 提取碼:luse
使用方法:和正常BERT一樣加載使用,使用CLS作為句表征。text_vec = transformers.BertModel()(input_id,attention_mask,token_type_ids)[1]
3 算法詳情
算法偽代碼如下:
Input: sens: List[str], sen_encoder: torch.nn.Module
Output: None
aug_sens = data_augment(sens) # 數(shù)據(jù)增強, 每個句子均會增強固定數(shù)量相似句做為正例,剩余所有句子則為負例
sens_vecs = sen_encoder.forward(sens+aug_sens) # 將所有句子編碼為句向量
scores = compute_score(sens_vecs) # 計算所有向量間的相似度值
loss = multi_positive_multi_negative_func(scores) # 基于相似度值計算loss
update(sen_encoder,loss) # 更新模型權重
3.1 數(shù)據(jù)增強
本人將數(shù)據(jù)增強分為兩類, text-level和vector-level.
text-level:字詞句層面的數(shù)據(jù)增強, 本算法使用EDA
vector-level:句編碼層面的數(shù)據(jù)增強,可參考圖像, 本算法只使用隨機裁剪,對應NLP操作為置0,即dropout操作, SimCSE就是該方法. CV與NLP的完美融合!!!
3.2 損失函數(shù)
對于一個句子,自身和其增強而來的句子為正例,其他句子及其增強為負例. 優(yōu)化目標為讓這些正例的概率最高,如果有n個正例,那么希望這n個正例概率都很高,那就索性平分概率值1得了,讓其他負例概率都為0, 這其實就是均值不等式. 詳細推導公式和代碼實現(xiàn)見本人博客:一種基于均值不等式的Listwise損失函數(shù)
3.3 預訓練數(shù)據(jù)
預訓練數(shù)據(jù)為brightmart開源的nlp_chinese_corpus. 本人只做簡單分句和去除空白字符兩種清洗操作.然后將所有語料庫所有句子完全打散作為訓練集.最終約有1.1億個句子
3.4 訓練細節(jié)
batch_size為128, 每個句子增強8個相似問(4個EDA, 4個dropout),因此每個句子有9(8+1)個正例和(9*128-9)個負例,這變相擴大了batch_size, 也正是此原因, 本人未使用MOCO的負例隊列來增大batch_size. 忍不住再夸一波MOCO負例隊列的精巧設計,何凱明yyds.
優(yōu)化器為Adam, 學習率5e-5,最大長度64(本模型只考慮短文本),短文本表征的pooling_mode為CLS向量,有興趣的可以使用SentenceBERT, BERT-Whitening 和 SimCSE的pooling方式, 本開源項目已經(jīng)提供代碼.
GPU是租了一塊RTX3090,訓練了兩天兩夜,約12萬步,即1500萬個句子,離1.1億差的遠了,更別提多epoch了. 中途還遇上服務器宕機,不得不加載以前的模型重新訓練, 真是倒了血霉. 共花了約150塊大洋,要是訓練完一輪非得傾家蕩產(chǎn)不可,這就是只預訓練三層模型且0.1輪的原因.
3.5 小技巧:同義詞搜索加速
EDA里最耗時操作為選取同義詞, 本人使用騰訊800萬詞向量, 使用gensim選取同義詞速度比訓練還慢, 對于窮逼是無法接受.
解決方案: 預緩存同義詞詞典, 計算同義詞時不要用gensim庫, 使用faiss或milvus向量加速庫, 本人在不使用GPU的情況下僅耗時一夜就完成了緩存. 句向量加速指南可以看我的博客:[milvus和faiss安裝及其使用教程]. 或者直接用我計算好的也行,本人能開源的都開源了,就是希望有算力的同志把我的方法跑一波.
4 微調驗證
作為預訓練模型,總需要微調來證明效果的.
4.1 數(shù)據(jù)集
4個分類數(shù)據(jù)集:
| 數(shù)據(jù)集 | #Trian | #Dev | 任務類型 | 參考鏈接 |
|---|---|---|---|---|
| NLPCC情感分類 | 8000 | 2000 | 2分類 | https://www.luge.ai/ |
| 微博情感分類 | 99988 | 20000 | 2分類 | https://github.com/SophonPlus/ChineseNlpCorpus |
| 購物網(wǎng)站評論情感分類 | 52774 | 10000 | 2分類 | https://github.com/SophonPlus/ChineseNlpCorpus |
| 今日頭條新聞分類 | 53360 | 10000 | 15分類 | https://github.com/CLUEbenchmark/CLUE |
6個相似度數(shù)據(jù)集:
| 數(shù)據(jù)集 | #Train | #Dev | 參考鏈接 |
|---|---|---|---|
| LCQMC(哈工大通用聊天數(shù)據(jù)集) | 238766 | 8802 | http://icrc.hitsz.edu.cn/Article/show/171.html |
| ADAT(基于Adversarial Attack的問題等價性判別比賽數(shù)據(jù)集) | 36210 | 9027 | / |
| ATEC(螞蟻金服相似度數(shù)據(jù)集) | 81981 | 20496 | / |
| CHIP(平安醫(yī)療中文的疾病問答數(shù)據(jù)) | 16000 | 4000 | / |
| COVID(新冠句對) | 8747 | 2001 | https://aistudio.baidu.com/aistudio/datasetdetail/48492 |
| CCKS(微眾銀行智能客服問句匹配大賽) | 80000 | 20000 | / |
沒有鏈接的數(shù)據(jù)集可以自行搜索, 由于微調數(shù)據(jù)集可能設計到一些版權問題, 開源項目里就不再放出.
為了簡化操作只使用dev評估.
4.2 微調方法
對于分類數(shù)據(jù)集,使用交叉熵微調
對于相似度數(shù)據(jù)集,由于預訓練模型為短文本編碼器, 將兩個句子一起輸入做0/1分類是不合適的. 做法是單獨對兩個句子進行編碼,計算余弦相似度并歸一化至0-1之間作為概率值, 然后最大似然求解.
同時考慮到低計算資源情況, 訓練又分為全部微調和固定bert訓練上層神經(jīng)網(wǎng)絡兩種.
4.3 評價指標
分類數(shù)據(jù)集使用ACC和F1
相似度數(shù)據(jù)集使用Spearman相關系數(shù)
4.4 基線模型
哈工大的RBT3
4.4 實驗結果
分類實驗結果(ACC / F1):
| NLPCC情感分類 | 微博情感分類 | 購物網(wǎng)站評論情感分類 | 今日頭條新聞分類 | |
|---|---|---|---|---|
| ACC / F1 | ACC / F1 | ACC / F1 | ACC / F1 | |
| RBT3-TrainBERT | 0.786 / 0.784 | 0.979 / 0.979 | 0.945 / 0.945 | 0.554 / 0.538 |
| LUSE-TrainBERT | 0.791 / 0.789 | 0.979 / 0.979 | 0.944 / 0.944 | 0.556 / 0.541 |
| RBT3-FreezeBERT | 0.720 / 0.720 | 0.864 / 0.864 | 0.873 / 0.873 | 0.445 / 0.416 |
| LUSE-FreezeBERT | 0.740 / 0.740 | 0.804 / 0.804 | 0.888 / 0.888 | 0.482 / 0.460 |
文本相似度實驗結果(Spearman):
| ADAT | ATEC | CCKS微眾銀行 | CHIP | COVID | LCQMC | |
|---|---|---|---|---|---|---|
| RBT3-TrainBERT | 0.633 | 0.086 | 0.785 | 0.624 | 0.703 | 0.642 |
| LUSE-TrainBERT | 0.636 | 0.210 | 0.796 | 0.634 | 0.692 | 0.650 |
| RBT3-FreezeBERT | 0498 | 0.070 | 0.432 | 0.308 | 0.507 | 0.280 |
| LUSE-FreezeBERT | 0.556 | 0.200 | 0.675 | 0.527 | 0.653 | 0.497 |
行名解釋, RBT3代表使用的是哈工大的RBT3模型,LUSE代表本人預訓練的模型.
TrainBERT代表微調時整體訓練耗時但效果好, FreezeBERT代表凍結BERT訓練上層神經(jīng)網(wǎng)絡,省時省力但效果差些.
實驗結論: 專門針對短文本編碼預訓練的模型確實可以取得更好的效果, 尤其是在短文本相似度任務上
5 總結
LUSE模型是一個優(yōu)缺點非常明顯的模型, 成也預訓練任務敗也預訓練任務.
LUSE模型在需要進行短文本編碼的任務上能取得較好的效果,即便只訓練了0.1輪,效果也很明顯.
但是缺點同樣突出, 由于其預訓練任務, 使其適用場景變得很小, 在其他任務上LUSE怕是無能為力了, 估計在二分類的短文本相似度任務上,LUSE都未必效果好,后續(xù)可以做實驗看下.
即便如此, 本人構想還是對的,基于無監(jiān)督數(shù)據(jù), 借助對比學習, 還是可以預訓練出優(yōu)質文本編碼模型的, 挺好奇為什么SimCSE的作者不預訓練一個文本編碼模型.
圖像的好多東西都可以借鑒到NLP中,NLPer需要定期關注圖像領域的最新進展.
6 TODOList
MOCO負例隊列或許可以一試
能否基于GAN做vector-level的數(shù)據(jù)增強
使用百GB級別數(shù)據(jù)預訓練一次大模型
和MLM-Loss做交叉訓練
文本相似度微調模型可以嘗試Sentence-BERT的方式
alignment和uniformity驗證無監(jiān)督句向量效果
7 FAQ
Q: 為什么就放出了一個沒完全訓練的小模型?
A: 窮
Q: 后續(xù)還會放出新的預訓練模型嗎?
A: 會的, 一定會的. 該預訓練任務本人會一直嘗試下去的, 但是要等到顯卡回落到正常價格之后(萬惡的虛擬貨幣)
Q: 與simbert以及RoFormer-sim相比如何?
A: 沒有可比性,有監(jiān)督對無監(jiān)督就是降維打擊. 中文數(shù)據(jù)任務完全可以用SimBERT替代LUSE預訓練模型.
Q:接上一問題,那LUSE預訓練模型的意義何在呢?
A:如果沒有有監(jiān)督數(shù)據(jù)怎么辦?如果數(shù)據(jù)脫敏了怎么辦? 本文主要探索無監(jiān)督數(shù)據(jù)預訓練短文本編碼模型的可能性.
Q:EDA和dropout數(shù)據(jù)增強,那個更有用?
A:沒錢做消融實驗了,中庸了, 兩個都用. 個人猜測兩個都起正面作用, dropout可能會更強些, 畢竟simcse論文效果很好
Q:為什么實驗結果的好多F1和ACC一樣了?
A:其實不一樣,只是取了前三位恰好一樣罷了
8 致謝
特別感謝 數(shù)據(jù)集nlp_chinese_corpus, 沒有數(shù)據(jù)集一切免談.
還要感謝SimCSE和MOCO,正是這兩篇論文激發(fā)本人嘗試LUSE的興致.
總結
以上是生活随笔為你收集整理的LUSE: 无监督数据预训练短文本编码模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NAT模式实现虚拟机共享主机网络
- 下一篇: 怎么创建具有真实纹理的CG场景岩石?