小数据福音!BERT在极小数据下带来显著提升的开源实现
作者丨金立達(dá)
單位丨笨鳥社交 AI Lab
學(xué)校丨英國帝國理工學(xué)院
研究方向丨自然語言處理、知識圖譜
標(biāo)注數(shù)據(jù),可以說是 AI 模型訓(xùn)練里最艱巨的一項(xiàng)工作了。自然語言處理的數(shù)據(jù)標(biāo)注更是需要投入大量人力。相對計(jì)算機(jī)視覺的圖像標(biāo)注,文本的標(biāo)注通常沒有準(zhǔn)確的標(biāo)準(zhǔn)答案,對句子理解也是因人而異,讓這項(xiàng)工作更是難上加難。?
但是,谷歌最近發(fā)布的 BERT [1]?大大地解決了這個問題!根據(jù)我們的實(shí)驗(yàn),BERT 在文本多分類的任務(wù)中,能在極小的數(shù)據(jù)下帶來顯著的分類準(zhǔn)確率提升。并且,實(shí)驗(yàn)主要對比的是僅僅 5 個月前發(fā)布的 State-of-the-Art 語言模型遷移學(xué)習(xí)模型 – ULMFiT [2],結(jié)果有著明顯的提升。我們先看結(jié)果:
▲?圖1.?實(shí)驗(yàn)結(jié)果對比,BERT在極少的數(shù)據(jù)集上表現(xiàn)非常出色
從上圖我們可以看出,在不同的數(shù)據(jù)集中,BERT 都有非常出色的表現(xiàn)。我們用的實(shí)驗(yàn)數(shù)據(jù)分為 1000、 6700 和 12000 條,并且各自包含了測試數(shù)據(jù),訓(xùn)練測試分割為 80%-20%。數(shù)據(jù)集從多個網(wǎng)頁來源獲得,并經(jīng)過了一系列的分類映射。但 Noisy 數(shù)據(jù)集帶有較為顯著的噪音,抽樣統(tǒng)計(jì)顯示噪音比例在 20% 左右。
實(shí)驗(yàn)對比了幾個模型,從最基礎(chǔ)的卷積網(wǎng)絡(luò)作為 Baseline,到卷積網(wǎng)絡(luò)加上傳統(tǒng)的詞向量 Glove embedding, 然后是 ULMFiT 和 BERT。為了防止過擬合,CNN 與 CNN+Glove 模型訓(xùn)練時加入了 Early stopping。
值得注意的是,這里用的 BERT 模型均為基礎(chǔ)版本,“BERT-Base, Uncased”,12 層,110M?參數(shù),對比的是 ULMFiT 調(diào)整過的最優(yōu)化參數(shù)。可見 BERT 在此任務(wù)中的強(qiáng)大。?
然而,在 12000 條樣本的數(shù)據(jù)集上,BERT 的結(jié)果相對 6700 條并沒有顯著的提升。數(shù)據(jù)分類不平衡可能是導(dǎo)致此結(jié)果的一大因素。
BERT 開源的多個版本的模型:
▲?圖2.?開源的多個版本的BERT模型
接下來,我們直奔主題 – 如何在自己的機(jī)器上實(shí)現(xiàn) BERT 的文本 25 分類任務(wù)。教程分為以下幾部分:
運(yùn)行環(huán)境
硬件配置
下載模型
輸入數(shù)據(jù)準(zhǔn)備
實(shí)現(xiàn)細(xì)節(jié)
運(yùn)行環(huán)境
TensorFlow 版本為 Windows 1.10.0 GPU,具體安裝教程可以參考此鏈接:
https://www.tensorflow.org/install/pip?lang=python3
Anaconda 版本為 1.9.2。
硬件配置
實(shí)驗(yàn)用的機(jī)器顯卡為 NVIDIA GeoForce GTX 1080 Ti,BERT base 模型占用顯存約為 9.5G。
下載模型
所有的運(yùn)行環(huán)境設(shè)置好后,在這里可以下載到我們實(shí)驗(yàn)用的 BERT base:
https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip
下載完后,放在 BERT_BASE_DIR 中。
輸入數(shù)據(jù)準(zhǔn)備
我們需要將文本數(shù)據(jù)分為三部分:
Train: train.tsv
Evaluate: dev.tsv
Test: test.tsv
下面可以看到每個文件的格式,非常簡單,一列為需要做分類的文本數(shù)據(jù),另一列則是對應(yīng)的 Label。
▲?圖3. 輸入文本格式樣板
并將這三個文件放入 DATA_DIR 中。
實(shí)現(xiàn)細(xì)節(jié)
首先我們 Clone 官方的 BERT Github repo:
https://github.com/google-research/bert
由于我們要做的是文本多分類任務(wù),可以在 run_classifier.py 基礎(chǔ)上面做調(diào)整。
這里簡單介紹一下這個腳本本來的任務(wù),也就是 BERT 示范的其中一個任務(wù)。這個例子是在 Microsoft Research Paraphrase Corpus (MRPC) corpus 數(shù)據(jù)集上面做微調(diào),數(shù)據(jù)集僅包含 3600 個樣本,在 GPU 上面幾分鐘就可完成微調(diào)。
此數(shù)據(jù)集可以用以下腳本下載:
https://gist.github.com/W4ngatang/60c2bdb54d156a41194446737ce03e2e
注意運(yùn)行的時候要用 --tasks all 參數(shù)來下載。
▲?圖4.?運(yùn)行腳本下載MRPC數(shù)據(jù)集
可以打開看一下輸入數(shù)據(jù)的結(jié)構(gòu),都是以 tsv 的形式保存:
▲?圖5.?MRPC數(shù)據(jù)集輸入數(shù)據(jù)樣本
▲?圖6.?MRPC數(shù)據(jù)集結(jié)構(gòu)樣本
這里 MRPC 的任務(wù)是 Paraphrase Identification,輸入為兩個句子,然后判斷二者是否表示相同的意思,輸出為二分類:是和不是。我們的分類任務(wù)只需要一個輸入,而不是一對句子,這個在讀取的過程中可以自動識別,并調(diào)整相應(yīng)的 Sentence Embedding 如下圖所示:
▲?圖7.?BERT Sentence Embedding自動調(diào)整過程
run_classifier.py 的腳本中,由于輸入格式和之前有少許不同,我們需要更改 _create_examples 函數(shù)里面的讀取順序,原本的讀取位置為:
▲?圖8.?MRPC數(shù)據(jù)集輸入文本讀取方式
我們需要讓 text_a 讀取被分類的文本,而 label 讀取我們的標(biāo)注:
▲?圖9.?在文本多分類的任務(wù)中,讀取輸入的方式
同時由于沒有 text_b,我們需要在后面制作 example 的時候?qū)⑺x值為 None:
▲?圖10.?由于沒有Sentence Pair輸入,在這里需要將text_b定義為None
接下來,相對于原本的二分類,我們需要針對多分類做出一些調(diào)整。代碼中原本將標(biāo)簽列表手動設(shè)置為 0 和 1:
▲?圖11.?原本直接將標(biāo)注列表定義為0和1
這里我們加入一個新的輸入,然后將輸出調(diào)整如下:
▲?圖12.?調(diào)整get_labels的輸入和輸出
這里 labels 輸入為新添加的所有訓(xùn)練樣本的 Label,然后通過 set() 返回所有 25 個標(biāo)簽的列表。調(diào)整之后,代碼可以自動根據(jù)分類數(shù)量定義標(biāo)簽列表,可以適配多種多分類任務(wù)。?
同時,在 _create_examples 中,我們增加兩個返回值,labels 和 labels_test:
▲?圖13.?_create_examples函數(shù)增加兩個返回值,labels和label_test
labels 返回的是所有訓(xùn)練樣本的 label,用來輸入到之前提到的 get_labels()。Labels 的定義如下圖所示:
▲?圖14.?新添加的變量labels
接下來我們需要調(diào)整 main() function 里面的一些順序,因?yàn)楝F(xiàn)在的 get_labels() 需要額外的輸入(讀取的完整 label list),我們需要把讀取訓(xùn)練集的步驟放到前面。原來的順序:
1. 獲取 label_list;
▲?圖15.?第一步
2. 如果在訓(xùn)練模式,再讀取訓(xùn)練集。
▲?圖16.?第二步
現(xiàn)在需要調(diào)整為:?
1. 無論什么模式都讀取訓(xùn)練集,因?yàn)樾枰玫接?xùn)練標(biāo)簽,注意新添加的輸出變量 train_labels;
▲?圖17.?第一步
2. 然后再獲取 label_list,用前面的 train_labels。
▲?圖18.?第二步
最后,我們在開頭設(shè)置好參數(shù),可以直接輸入默認(rèn)值來運(yùn)行。下面拿 DATA_DIR 來舉例:
▲?圖19.?原始參數(shù)
調(diào)整后的輸入?yún)?shù):
▲?圖20.?調(diào)整后的參數(shù)
1000 條樣本數(shù)據(jù) 10 分類,BERT 運(yùn)行結(jié)果如下:
▲?圖21.?1000條樣本數(shù)據(jù)10分類BERT結(jié)果
總結(jié)
本文介紹了如何實(shí)現(xiàn) BERT 的文本多分類任務(wù),并對比了 Baseline 以及不久前的?State-of-the-Art?模型 ULMFiT。實(shí)驗(yàn)結(jié)果可以看出 BERT 在此任務(wù)中,可以輕松打敗先前的 SOTA。
這里附上本教程的開源代碼:
https://github.com/Socialbird-AILab/BERT-Classification-Tutorial
我們依然會在 BERT 的基礎(chǔ)上不斷嘗試,繼續(xù)努力研究,也歡迎大家積極交流。
參考文獻(xiàn)
[1] Devlin, Jacob and Chang, Ming-Wei and Lee, Kenton and Toutanova, Kristina.?BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding.?arXiv preprint arXiv:1810.04805.
[2]?Jeremy Howard and Sebastian Ruder. 2018. Universal language model fine-tuning for text classification. In ACL. Association for Computational Linguistics.
點(diǎn)擊以下標(biāo)題查看作者其他文章:?
自動機(jī)器學(xué)習(xí)(AutoML)最新綜述
自然語言處理中的語言模型預(yù)訓(xùn)練方法
從傅里葉分析角度解讀深度學(xué)習(xí)的泛化能力
深度解讀DeepMind新作:史上最強(qiáng)GAN圖像生成器
兩行代碼玩轉(zhuǎn)Google BERT句向量詞向量
這16篇最新論文,幫你輕松積攢知識點(diǎn)
TensorSpace:超酷炫3D神經(jīng)網(wǎng)絡(luò)可視化框架
關(guān)于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報(bào)道人工智能前沿論文成果的學(xué)術(shù)平臺。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號后臺點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點(diǎn)擊 |?閱讀原文?| 獲取最新論文推薦
總結(jié)
以上是生活随笔為你收集整理的小数据福音!BERT在极小数据下带来显著提升的开源实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NIPS 2018论文解读 | 基于条件
- 下一篇: EMNLP2018论文解读 | 三种提升