1. 程式人生 > >如何基於谷歌的最強 NLP 模型進行影評分析?

如何基於谷歌的最強 NLP 模型進行影評分析?

640?wx_fmt=gif

谷歌此前釋出的NLP模型BERT,在知乎、Reddit上都引起了轟動。其模型效果極好,BERT論文的作者在論文裡做的幾個實驗資料集都被轟平了。要做那幾個資料集的人可以洗洗睡啦,直接被明明白白地安排了一波。

640?wx_fmt=png

坊間流傳BERT之於自然語言處理有如ResNet之於計算機視覺。谷歌還是谷歌呀,厲害!以後做NLP的實驗就簡單多了,可以先用BERT抽特徵,再接幾層客製化的神經網路後續實驗,可以把BERT看作是類似於word to vector那樣的工具。有人在知乎(https://www.zhihu.com/question/298203515/answer/509470502)上整理了跑一次BERT的成本:

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 = 12k

64 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? "

這還只是跑一次的時間,試想一下谷歌在調參、試不同神經網路結構時該需要多少時間與運算資源,太可怕了。

不禁讓人感慨,深度學習已經變為大公司之間的軍備競賽,也只有谷歌這樣的大公司才能做出這麼偉大的模型,那是不是意味著我們普通人就沒機會了呢?喜大普奔的是谷歌已經把訓練好的模型公佈出來,和大家分享他們的成果。我們可以運用大公司提前訓練好的模型做遷移學習,用於客製化的應用。

本文想通過一個實際案例來檢驗一下提前訓練好的BERT模型的威力,在已經訓練好的BERT模型上再連幾層神經網路做遷移學習。我們用的資料來源是Kaggle上的一個豆瓣影評分析資料集,目標是訓練出一個模型,輸入給模型一條影評的文字,模型能正確輸出這條影評所對應的評分。


640?wx_fmt=png

資料集


這個豆瓣電影短評資料集(https://www.kaggle.com/utmhikari/doubanmovieshortcomments/)裡面一共有28部電影,總共200多萬筆影評,每筆影評有對應的文字以及使用者給電影的評分(最高5分,最低1分)。下面是一些簡單的範例:

640?wx_fmt=png

前處理的時候,我們先把每條影評的標點符號去掉,然後用Jieba斷詞,Jieba是一個很方便的中文斷詞函式庫,安裝也很方面直接用PIP安裝就好。

最後把資料切為training,testing和validation set三部分,下表是三個set的一些簡單統計量:

640?wx_fmt=png

640?wx_fmt=png

模型結構


第一步,我們先用“Jieba”將影評斷詞,再把每個詞用一個one-hot vector表示。

第二步,再把每條影評對應的one-hot vector丟到如下圖的BERT模型抽出特徵。

640?wx_fmt=png

第三步,再把抽出的特徵丟進我們客製化設計的神經網路,最後輸出網路的預測。網路的預測是1-5分,我們分別做了迴歸和分類兩個實驗。分類的輸出結果是1-5分5類當中的某一類,迴歸輸出結果是介於1-5之間的一個數值。我們會用到如下圖所示的Bengio在2017年提出的自注意力模型做一些語義分析。

640?wx_fmt=png

第四步,定義損失函式,固定BERT的引數不變,再用梯度下降法更新我們客製化設計的網路。

PS:由於BERT和self-attention模型結構較為複雜,而且本文的目的是探討如何用BERT做遷移學習,所以我們不會贅述模型結構,我們會在文末附上論文連結,感興趣的小夥伴可以去看看。


640?wx_fmt=png

實驗結果


BERT 分類

  • 分類準確率:61%

  • 混淆矩陣:

640?wx_fmt=png

以第1行第二列的0.13為例:意思是真實標籤是第一類,被分類為第二類的佔總的第一類的個數的比例是0.13。可以看到1分,5分的大部分例子都能分類正確。大部分分類不正確的情況是被分到相鄰的等級了,例如真實標籤是2分的被分類為3分或是真實標籤是3分的被分類為2分。這種情況是合理的,針對某一條特定的影評,就算是人去預測,也很難斬釘截鐵地判定為是2分還是3分,所以也難怪機器分不出來。

我們對評價標準做了一點修改,將誤判為相鄰評分的例子判別為正確,結果如下:

  • 分類準確率:94.6%

  • 混淆矩陣:

640?wx_fmt=png

BERT 迴歸

同樣的架構,我們修改了一下最後一層的輸出,讓模型預測相應影評的評分,輸出一個實數值,重新訓練了模型。如果是分類的實驗,1分與5分這兩個類別用數值表示的話都是一個one-hot的類別,體現在損失函式裡沒有差別,模型不會對二者區別對待。如果是迴歸的實驗,模型的輸出是一個實數值,實數值具有連續性,1分和5分二者分數的高低能在實數上得到體現。

下面來看看實驗結果:

  • 分類準確率:95.3%

  • 混淆矩陣:

640?wx_fmt=png

  • 真實評分的分佈:

640?wx_fmt=png

  • 模型預測評分的分佈:

640?wx_fmt=png

我們也對BERT出來的特徵向量做了TSNE降維,視覺化結果如下:

640?wx_fmt=png

根據右上角的圖例,不同的顏色代表不同的評分,比如紫色代表五分。每一個點都是一筆影評的高維特徵降維後在二維平面上的體現。可以明顯看出,不同評分的影評被歸在了不同的群裡。相近的評分,比如5分和4分、4分與3分會有一些重疊部分。

  • 自注意力機制的一些視覺化結果:

640?wx_fmt=png640?wx_fmt=png

引入自注意力機制的模型在預測一句影評對應的評分的時候,能夠先通過注意力機制抓取一句話中的重要部分,給重要部分很多的比重。上述幾個例子就能看出來,再模型給一條影評5分的時候,會給“爆”、“動人”這樣的字眼予以高亮。在給2分的時候,會給“一般”這樣的字眼予以高亮。


640?wx_fmt=png

案例分析


接下來我們針對瘋狂動物城這部電影,做一些視覺化分析,來呈現訓練好之後的模型的效果。

  • 分類準確率:72.63%

  • 混淆矩陣:

640?wx_fmt=png

將誤判為相鄰評分的例子判別為正確的結果如下:

  • 分類準確率:98.56%

  • 混淆矩陣:

640?wx_fmt=png

  • 真實評分的分佈:

640?wx_fmt=png

  • 模型預測評分的分佈:

640?wx_fmt=png

  • TSNE降維後視覺化結果:

640?wx_fmt=png

  • 自注意力機制視覺化結果:

640?wx_fmt=png

針對瘋狂動物城這部電影,我們做了TF-IDF的詞頻分析。

  • 詞頻前三十的詞:

640?wx_fmt=png

  • 不同評分的高頻詞:

640?wx_fmt=png

第一行的1-5是評分,下面的詞後面的數字代表的是這個詞的出現個數。

最後,用一張詞雲歡快地結束案例分析:

640?wx_fmt=png

640?wx_fmt=png

結論


  • 本文用了目前自然語言界最強的模型BERT做遷移學習,效果看起來還挺okay的。

  • BERT模型可以很好地抽出文字的特徵,用於後續的實驗。如果小夥伴們有比較好的運算資源,可以把BERT當作是一個類似於word to vector的工具。

  • 自注意力機制不光能提高模型的效能,同時引入此機制能大大加強模型的可解釋性。

參考內容:

  • 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

萬水千山總是情,Github給顆星星行不行。我們想給大家提供可讀性好、簡單明瞭的程式碼,所以需要一點時間整理程式碼,但最近我們忙著準備期末考,等期末考一結束我們就把程式碼整理好再上傳。感興趣的小夥伴可以先收藏我們的Github,我們上傳程式碼之後各位就可以直接下載參考咯。

作者:臺灣大學網紅教授李巨集毅的三名愛徒,個人公眾號井森堡,歡迎志同道合的小夥伴關注,本公眾號會不定期更新機器學習技術文並附上質量佳且可讀性高的程式碼。

宣告:本文為作者投稿,版權歸其個人所有,編輯郭芮。



 熱 文 推 薦  

☞ 比特幣拒絕第 340 次“被死亡”

☞ “視覺化”的資料分析落伍了?

☞ Python 模擬微博登陸,親測有效!

☞ 從傾家蕩產到身價百億,這個85後只用了8年

☞ 難逃寒冬裁員的“大追殺”,30 歲女碼農該何去何從?

☞ OpenStack 2018 年終盤點

拼多多黃崢給陸奇“兼職”,欲挖掘這類AI人才

☞ 老程式設計師肺腑忠告:千萬別一輩子靠技術生存!


  

print_r('點個好看吧!');
var_dump('點個好看吧!');
NSLog(@"點個好看吧!");
System.out.println("點個好看吧!");
console.log("點個好看吧!");
print("點個好看吧!");
printf("點個好看吧!\n");
cout << "點個好看吧!" << endl;
Console.WriteLine("點個好看吧!");
fmt.Println("點個好看吧!");
Response.Write("點個好看吧!");
alert("點個好看吧!")
echo "點個好看吧!"

640?wx_fmt=gif點選“閱讀原文”,開啟 CSDN App 閱讀更貼心!

640?wx_fmt=png 喜歡就點選“好看”吧!