bert 中文 代码 谷歌_如何用最强模型BERT做NLP迁移学习?
作者 | 臺(tái)灣大學(xué)網(wǎng)紅教授李宏毅的三名愛徒
來源 |?井森堡,不定期更新機(jī)器學(xué)習(xí)技術(shù)文并附上質(zhì)量佳且可讀性高的代碼。
編輯 | Jane
谷歌此前發(fā)布的NLP模型BERT,在知乎、Reddit上都引起了轟動(dòng)。其模型效果極好,BERT論文的作者在論文里做的幾個(gè)實(shí)驗(yàn)數(shù)據(jù)集都被轟平了。要做那幾個(gè)數(shù)據(jù)集的人可以洗洗睡啦,直接被明明白白地安排了一波。
坊間流傳 BERT 之于自然語言處理有如 ResNet 之于計(jì)算機(jī)視覺。谷歌還是谷歌呀,厲害!以后做 NLP 的實(shí)驗(yàn)就簡(jiǎn)單多了,可以先用 BERT 抽特征,再接幾層客制化的神經(jīng)網(wǎng)絡(luò)后續(xù)實(shí)驗(yàn),可以把 BERT 看作是類似于 word to vector 那樣的工具。有人在知乎上整理了跑一次BERT的成本:
https://www.zhihu.com/question/298203515/answer/509470502
For?TPU?pods:4?TPUs?*?~$2/h?(preemptible)?*?24?h/day?*?4?days?=?$768?(base?model)16?TPUs?=?~$3k?(large?model)
For?TPU:16?tpus?*?$8/hr?*?24?h/day?*?4?days?=?12k64?tpus?*?$8/hr?*?24?h/day?*?4?days?=?50k
For?GPU:"BERT-Large?is?24-layer,?1024-hidden?and?was?trained?for?40?epochs?over?a?3.3?billion?word?corpus.?So?maybe?1?year?to?train?on?8?P100s??"
這還只是跑一次的時(shí)間,試想一下谷歌在調(diào)參、試不同神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)時(shí)該需要多少時(shí)間與運(yùn)算資源,太可怕了。
不禁讓人感慨,深度學(xué)習(xí)已經(jīng)變?yōu)榇蠊局g的軍備競(jìng)賽,也只有谷歌這樣的大公司才能做出這么偉大的模型,那是不是意味著我們普通人就沒機(jī)會(huì)了呢?喜大普奔的是谷歌已經(jīng)把訓(xùn)練好的模型公布出來,和大家分享他們的成果。我們可以運(yùn)用大公司提前訓(xùn)練好的模型做遷移學(xué)習(xí),用于客制化的應(yīng)用。
本文想通過一個(gè)實(shí)際案例來檢驗(yàn)一下提前訓(xùn)練好的 BERT 模型的威力,在已經(jīng)訓(xùn)練好的 BERT 模型上再連幾層神經(jīng)網(wǎng)絡(luò)做遷移學(xué)習(xí)。我們用的數(shù)據(jù)來源是 Kaggle 上的一個(gè)豆瓣影評(píng)分析數(shù)據(jù)集,目標(biāo)是訓(xùn)練出一個(gè)模型,輸入給模型一條影評(píng)的文字,模型能正確輸出這條影評(píng)所對(duì)應(yīng)的評(píng)分。
數(shù)據(jù)集
這個(gè)豆瓣電影短評(píng)數(shù)據(jù)集里面一共有28部電影,總共200多萬筆影評(píng),每筆影評(píng)有對(duì)應(yīng)的文字以及用戶給電影的評(píng)分(最高5分,最低1分)。下面是一些簡(jiǎn)單的范例:
https://www.kaggle.com/utmhikari/doubanmovieshortcomments/
前處理的時(shí)候,我們先把每條影評(píng)的標(biāo)點(diǎn)符號(hào)去掉,然后用 Jieba 斷詞,Jieba 是一個(gè)很方便的中文斷詞函數(shù)庫,安裝也很方面直接用 PIP 安裝就好。
最后把數(shù)據(jù)切為 training,testing 和 validation set 三部分,下表是三個(gè) set 的一些簡(jiǎn)單統(tǒng)計(jì)量:
模型結(jié)構(gòu)
第一步,我們先用“Jieba”將影評(píng)斷詞,再把每個(gè)詞用一個(gè) one-hot vector 表示。
第二步,再把每條影評(píng)對(duì)應(yīng)的 one-hot vector 丟到如下圖的 BERT 模型抽出特征。
第三步,再把抽出的特征丟進(jìn)我們客制化設(shè)計(jì)的神經(jīng)網(wǎng)絡(luò),最后輸出網(wǎng)絡(luò)的預(yù)測(cè)。網(wǎng)絡(luò)的預(yù)測(cè)是 1-5 分,我們分別做了回歸和分類兩個(gè)實(shí)驗(yàn)。分類的輸出結(jié)果是 1-5 分 5 類當(dāng)中的某一類,回歸輸出結(jié)果是介于 1-5 之間的一個(gè)數(shù)值。我們會(huì)用到如下圖所示的 Bengio 在 2017 年提出的自注意力模型做一些語義分析。
第四步,定義損失函數(shù),固定 BERT 的參數(shù)不變,再用梯度下降法更新我們客制化設(shè)計(jì)的網(wǎng)絡(luò)。
PS:由于 BERT 和 self-attention 模型結(jié)構(gòu)較為復(fù)雜,而且本文的目的是探討如何用 BERT 做遷移學(xué)習(xí),所以我們不會(huì)贅述模型結(jié)構(gòu),我們會(huì)在文末附上論文鏈接,感興趣的小伙伴可以去看看。
實(shí)驗(yàn)結(jié)果
BERT 分類
分類準(zhǔn)確率:61%
混淆矩陣:
以第 1 行第二列的 0.13 為例:意思是真實(shí)標(biāo)簽是第一類,被分類為第二類的占總的第一類的個(gè)數(shù)的比例是 0.13。可以看到 1 分,5 分的大部分例子都能分類正確。大部分分類不正確的情況是被分到相鄰的等級(jí)了,例如真實(shí)標(biāo)簽是 2 分的被分類為 3 分或是真實(shí)標(biāo)簽是 3 分的被分類為 2 分。這種情況是合理的,針對(duì)某一條特定的影評(píng),就算是人去預(yù)測(cè),也很難斬釘截鐵地判定為是 2 分還是 3 分,所以也難怪機(jī)器分不出來。
我們對(duì)評(píng)價(jià)標(biāo)準(zhǔn)做了一點(diǎn)修改,將誤判為相鄰評(píng)分的例子判別為正確,結(jié)果如下:
分類準(zhǔn)確率:94.6%
混淆矩陣:
BERT 回歸
同樣的架構(gòu),我們修改了一下最后一層的輸出,讓模型預(yù)測(cè)相應(yīng)影評(píng)的評(píng)分,輸出一個(gè)實(shí)數(shù)值,重新訓(xùn)練了模型。如果是分類的實(shí)驗(yàn),1 分與 5 分這兩個(gè)類別用數(shù)值表示的話都是一個(gè) one-hot 的類別,體現(xiàn)在損失函數(shù)里沒有差別,模型不會(huì)對(duì)二者區(qū)別對(duì)待。如果是回歸的實(shí)驗(yàn),模型的輸出是一個(gè)實(shí)數(shù)值,實(shí)數(shù)值具有連續(xù)性,1 分和 5 分二者分?jǐn)?shù)的高低能在實(shí)數(shù)上得到體現(xiàn)。
下面來看看實(shí)驗(yàn)結(jié)果:
分類準(zhǔn)確率:95.3%
混淆矩陣:
真實(shí)評(píng)分的分布:
模型預(yù)測(cè)評(píng)分的分布:
我們也對(duì) BERT 出來的特征向量做了 TSNE 降維,可視化結(jié)果如下:
根據(jù)右上角的圖例,不同的顏色代表不同的評(píng)分,比如紫色代表五分。每一個(gè)點(diǎn)都是一筆影評(píng)的高維特征降維后在二維平面上的體現(xiàn)。可以明顯看出,不同評(píng)分的影評(píng)被歸在了不同的群里。相近的評(píng)分,比如 5 分和 4 分、4 分與 3 分會(huì)有一些重疊部分。
自注意力機(jī)制的一些可視化結(jié)果:
引入自注意力機(jī)制的模型在預(yù)測(cè)一句影評(píng)對(duì)應(yīng)的評(píng)分的時(shí)候,能夠先通過注意力機(jī)制抓取一句話中的重要部分,給重要部分很多的比重。上述幾個(gè)例子就能看出來,再模型給一條影評(píng) 5 分的時(shí)候,會(huì)給“爆”、“動(dòng)人”這樣的字眼予以高亮。在給 2 分的時(shí)候,會(huì)給“一般”這樣的字眼予以高亮。
案例分析
接下來我們針對(duì)瘋狂動(dòng)物城這部電影,做一些可視化分析,來呈現(xiàn)訓(xùn)練好之后的模型的效果。
分類準(zhǔn)確率:72.63%
混淆矩陣:
將誤判為相鄰評(píng)分的例子判別為正確的結(jié)果如下:
分類準(zhǔn)確率:98.56%
混淆矩陣:
真實(shí)評(píng)分的分布:
模型預(yù)測(cè)評(píng)分的分布:
TSNE 降維后可視化結(jié)果:
自注意力機(jī)制可視化結(jié)果:
針對(duì)瘋狂動(dòng)物城這部電影,我們做了 TF-IDF 的詞頻分析。
詞頻前三十的詞:
不同評(píng)分的高頻詞:
第一行的 1-5 是評(píng)分,下面的詞后面的數(shù)字代表的是這個(gè)詞的出現(xiàn)個(gè)數(shù)。
最后,用一張?jiān)~云歡快地結(jié)束案例分析:
結(jié)論
本文用了目前自然語言界最強(qiáng)的模型BERT做遷移學(xué)習(xí),效果看起來還挺 okay 的。
BERT 模型可以很好地抽出文字的特征,用于后續(xù)的實(shí)驗(yàn)。如果小伙伴們有比較好的運(yùn)算資源,可以把 BERT 當(dāng)作是一個(gè)類似于 word to vector 的工具。
自注意力機(jī)制不光能提高模型的效能,同時(shí)引入此機(jī)制能大大加強(qiáng)模型的可解釋性。
參考內(nèi)容:
https://www.zhihu.com/question/298203515/answer/509470502
https://arxiv.org/abs/1810.04805
https://arxiv.org/abs/1703.03130
Github:https://github.com/Chung-I/Douban-Sentiment-Analysis
(本文為AI科技大本營(yíng)轉(zhuǎn)載文章,轉(zhuǎn)載請(qǐng)聯(lián)系作者。)
推薦閱讀:
AI被“橫掃”反噬?
如何幫新手程序員快速分析 Error?
ProgPow:以太坊上浮世繪
名下企業(yè)比老板劉強(qiáng)東還多,京東“最強(qiáng)女助理”張雱什么來頭?
互聯(lián)網(wǎng)巨頭的春晚江湖
一萬多條拼車數(shù)據(jù),看春運(yùn)遷移大軍
30個(gè)讓程序員崩潰的瞬間,笑死我了
程序員給銀行植入病毒,分 1300 次盜取 718 萬,被判 10 年半!
總結(jié)
以上是生活随笔為你收集整理的bert 中文 代码 谷歌_如何用最强模型BERT做NLP迁移学习?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: open()的模块
- 下一篇: java实现dex转jar_dex转ja