轉(zhuǎn)帖|實(shí)施案例|編輯:龔雪|2017-03-28 17:47:43.000|閱讀 6480 次
概述:用深度學(xué)習(xí)(CNN RNN Attention)解決大規(guī)模文本分類問題 - 綜述和實(shí)踐
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
案例分享|用深度學(xué)習(xí)(CNN RNN Attention)解決大規(guī)模文本分類問題 (一)
詞向量解決了文本表示的問題,該部分介紹的文本分類模型則是利用CNN/RNN等深度學(xué)習(xí)網(wǎng)絡(luò)及其變體解決自動特征提取(即特征表達(dá))的問題。
fastText fastText
是上文提到的 word2vec 作者 Mikolov 轉(zhuǎn)戰(zhàn) Facebook 后16年7月剛發(fā)表的一篇論文 Bag of Tricks for Efficient Text Classification。把 fastText 放在此處并非因?yàn)樗俏谋痉诸惖闹髁髯龇ǎ撬鼧O致簡單,模型圖見下:
原理是把句子中所有的詞向量進(jìn)行平均(某種意義上可以理解為只有一個(gè)avg pooling特殊CNN),然后直接接 softmax 層。其實(shí)文章也加入了一些 n-gram 特征的 trick 來捕獲局部序列信息。文章倒沒太多信息量,算是“水文”吧,帶來的思考是文本分類問題是有一些“線性”問題的部分[from項(xiàng)亮],也就是說不必做過多的非線性轉(zhuǎn)換、特征組合即可捕獲很多分類信息,因此有些任務(wù)即便簡單的模型便可以搞定了。
TextCNN
本篇文章的題圖選用的就是14年這篇文章提出的TextCNN的結(jié)構(gòu)(見下圖)。fastText 中的網(wǎng)絡(luò)結(jié)果是完全沒有考慮詞序信息的,而它用的 n-gram 特征 trick 恰恰說明了局部序列信息的重要意義。卷積神經(jīng)網(wǎng)絡(luò)(CNN Convolutional Neural Network)最初在圖像領(lǐng)域取得了巨大成功,CNN原理就不講了,核心點(diǎn)在于可以捕捉局部相關(guān)性,具體到文本分類任務(wù)中可以利用CNN來提取句子中類似 n-gram 的關(guān)鍵信息。
TextCNN的詳細(xì)過程原理圖見下:
TextCNN詳細(xì)過程:第一層是圖中最左邊的7乘5的句子矩陣,每行是詞向量,維度=5,這個(gè)可以類比為圖像中的原始像素點(diǎn)了。然后經(jīng)過有 filter_size=(2,3,4) 的一維卷積層,每個(gè)filter_size 有兩個(gè)輸出 channel。第三層是一個(gè)1-max pooling層,這樣不同長度句子經(jīng)過pooling層之后都能變成定長的表示了,最后接一層全連接的 softmax 層,輸出每個(gè)類別的概率。
特征:這里的特征就是詞向量,有靜態(tài)(static)和非靜態(tài)(non-static)方式。static方式采用比如word2vec預(yù)訓(xùn)練的詞向量,訓(xùn)練過程不更新詞向量,實(shí)質(zhì)上屬于遷移學(xué)習(xí)了,特別是數(shù)據(jù)量比較小的情況下,采用靜態(tài)的詞向量往往效果不錯。non-static則是在訓(xùn)練過程中更新詞向量。推薦的方式是 non-static 中的 fine-tunning方式,它是以預(yù)訓(xùn)練(pre-train)的word2vec向量初始化詞向量,訓(xùn)練過程中調(diào)整詞向量,能加速收斂,當(dāng)然如果有充足的訓(xùn)練數(shù)據(jù)和資源,直接隨機(jī)初始化詞向量效果也是可以的。
通道(Channels):圖像中可以利用 (R, G, B) 作為不同channel,而文本的輸入的channel通常是不同方式的embedding方式(比如 word2vec或Glove),實(shí)踐中也有利用靜態(tài)詞向量和fine-tunning詞向量作為不同channel的做法。
一維卷積(conv-1d):圖像是二維數(shù)據(jù),經(jīng)過詞向量表達(dá)的文本為一維數(shù)據(jù),因此在TextCNN卷積用的是一維卷積。一維卷積帶來的問題是需要設(shè)計(jì)通過不同 filter_size 的 filter 獲取不同寬度的視野。
Pooling層:利用CNN解決文本分類問題的文章還是很多的,比如這篇 A Convolutional Neural Network for Modelling Sentences 最有意思的輸入是在 pooling 改成 (dynamic) k-max pooling ,pooling階段保留 k 個(gè)最大的信息,保留了全局的序列信息。比如在情感分析場景,舉個(gè)例子:
“ 我覺得這個(gè)地方景色還不錯,但是人也實(shí)在太多了 ”
雖然前半部分體現(xiàn)情感是正向的,全局文本表達(dá)的是偏負(fù)面的情感,利用 k-max pooling能夠很好捕捉這類信息。
TextRNN
盡管TextCNN能夠在很多任務(wù)里面能有不錯的表現(xiàn),但CNN有個(gè)最大問題是固定 filter_size 的視野,一方面無法建模更長的序列信息,另一方面 filter_size 的超參調(diào)節(jié)也很繁瑣。CNN本質(zhì)是做文本的特征表達(dá)工作,而自然語言處理中更常用的是遞歸神經(jīng)網(wǎng)絡(luò)(RNN, Recurrent Neural Network),能夠更好的表達(dá)上下文信息。具體在文本分類任務(wù)中,Bi-directional RNN(實(shí)際使用的是雙向LSTM)從某種意義上可以理解為可以捕獲變長且雙向的的 “n-gram” 信息。
雙向LSTM算是在自然語言處理領(lǐng)域非常一個(gè)標(biāo)配網(wǎng)絡(luò)了,在序列標(biāo)注/命名體識別/seq2seq模型等很多場景都有應(yīng)用,下圖是Bi-LSTM用于分類問題的網(wǎng)絡(luò)結(jié)構(gòu)原理示意圖,黃色的節(jié)點(diǎn)分別是前向和后向RNN的輸出,示例中的是利用最后一個(gè)詞的結(jié)果直接接全連接層softmax輸出了。
TextRNN + Attention
CNN和RNN用在文本分類任務(wù)中盡管效果顯著,但都有一個(gè)不足的地方就是不夠直觀,可解釋性不好,特別是在分析badcase時(shí)候感受尤其深刻。而注意力(Attention)機(jī)制是自然語言處理領(lǐng)域一個(gè)常用的建模長時(shí)間記憶機(jī)制,能夠很直觀的給出每個(gè)詞對結(jié)果的貢獻(xiàn),基本成了Seq2Seq模型的標(biāo)配了。實(shí)際上文本分類從某種意義上也可以理解為一種特殊的Seq2Seq,所以考慮把Attention機(jī)制引入近來,研究了下學(xué)術(shù)界果然有類似做法。
Attention機(jī)制介紹: 詳細(xì)介紹Attention恐怕需要一小篇文章的篇幅,感興趣的可參考14年這篇paper NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE。
以機(jī)器翻譯為例簡單介紹下,下圖中 xt 是源語言的一個(gè)詞,yt是目標(biāo)語言的一個(gè)詞,機(jī)器翻譯的任務(wù)就是給定源序列得到目標(biāo)序列。翻譯t的過程產(chǎn)生取決于上一個(gè)詞 yt-1 和源語言的詞的表示 hj(xj的 bi-RNN 模型的表示),而每個(gè)詞所占的權(quán)重是不一樣的。比如源語言是中文 “我 / 是 / 中國人” 目標(biāo)語言 “i / am / Chinese”,翻譯出“Chinese”時(shí)候顯然取決于“中國人”,而與“我 / 是”基本無關(guān)。下圖公式, αij 則是翻譯英文第 i 個(gè)詞時(shí),中文第 j 個(gè)詞的貢獻(xiàn),也就是注意力。顯然在翻譯“Chinese”時(shí),“中國人”的注意力值非常大。
Attention的核心point是在翻譯每個(gè)目標(biāo)詞(或 預(yù)測商品標(biāo)題文本所屬類別)所用的上下文是不同的,這樣的考慮顯然是更合理的。
TextRNN + Attention 模型:
我們參考了這篇文章 Hierarchical Attention Networks for Document Classification,下圖是模型的網(wǎng)絡(luò)結(jié)構(gòu)圖,它一方面用層次化的結(jié)構(gòu)保留了文檔的結(jié)構(gòu),另一方面在word-level和sentence-level。淘寶標(biāo)題場景只需要 word-level 這一層的 Attention 即可。
加入Attention之后最大的好處自然是能夠直觀的解釋各個(gè)句子和詞對分類類別的重要性。
TextRCNN(TextRNN + CNN)
我們參考的是中科院15年發(fā)表在AAAI上的這篇文章 Recurrent Convolutional Neural Networks for Text Classification 的結(jié)構(gòu):
利用前向和后向RNN得到每個(gè)詞的前向和后向上下文的表示:
這樣詞的表示就變成詞向量和前向后向上下文向量concat起來的形式了,即:
最后再接跟TextCNN相同卷積層,pooling層即可,唯一不同的是卷積層 filter_size = 1就可以了,不再需要更大 filter_size 獲得更大視野,這里詞的表示也可以只用雙向RNN輸出。
更多行業(yè)資訊,更新鮮的技術(shù)動態(tài),盡在。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn