當前位置:
首頁 > 最新 > 卷積神經網路文本分類

卷積神經網路文本分類

前言

卷積神經網路(CNN)在圖像處理領域取得了很大的成績,它的卷積和池化結構能很好提取圖像的信息,而在 NLP 領域循環神經網路(RNN)則使用的更多,RNN 及其各種變種因擁有記憶功能使得它們更擅長處理上下文。但 NLP 領域很多方面使用 CNN 取得了出色的效果,比如語義分析、查詢檢索、文本分類等任務。這篇文章看看如何用 CNN 進行文本分類。

模型結構

模型結構可以通過下圖一層層來看,總共由4部分組成,包括了輸入層、卷積層、池化層和全連接層。

這裡寫圖片描述


圖中最左邊的部分即為輸入層,總的來說輸入層就是句子對應的矩陣。一般不會使用 ont-hot 向量來表示單詞,而是使用 k 維的分散式詞向量。那麼對於一個長度為 n 的句子,則構成一個 n × k 的矩陣。

所以,可以設為句子的第 i 個單詞,它為 k 維向量。那麼一個句子為

,其中表示串聯的意思。

另外,根據對詞向量的作用可以分為兩種模式:靜態和非靜態。靜態模式的意思就是我直接使用第三方發布的詞向量或者自己訓練的詞向量來初始化矩陣,並且在每次訓練的過程中不對反向誤差傳播產生作用,不改變詞向量,整個訓練過程詞向量都是固定不變的。而非靜態模式則不同,同樣是使用詞向量來初始化矩陣後,在此後的每次訓練過程中,根據反向誤差傳播會對詞向量進行微調,整個訓練過程詞向量都會更新。


圖中第二部分為卷積層,卷積層的作用就是用於提取句子的特徵。主要是通過一個 h × k 的卷積核 w 在輸入層從上到下進行滑動進行卷積操作,通過該卷積操作得到一個 feature map。feature map 的列為1,行為 (n-h+1),即

,其中。

上圖中輸入層上紅色框框就是卷積操作的卷積核,可以看到它是 2 × k 維的,運算後變為 feature map 的一個元素。除此之外,還可以將 h 定為3,此時卷積核變為 3 × k 維,如圖中黃色框框部分。相同維度的可以有若干個參數不同的卷積核,所以最終在每種維度下都可以得到若干個 feature map。

卷積操作的意義是什麼?可以看到它其實是根據 h 大小不同提取不同長度相鄰單詞的特徵,這個其實可以跟 n-gram 語言模型對應起來。


圖中第三部分為池化層,池化層的作用是對特徵做進一步提取,將最重要的特徵提取出來。這裡使用的是 max-over-time pooling 操作,即取出 feature map 中的最大值作為最重要的特徵,即。所以最終對於每個 feature map 池化後都得到一個一維向量,取最大值作為特徵也解決了不同句子長短的問題,儘管短的句子會用 0 進行填充,但通過取最大值消除了該問題。

前面的通過卷積層的多個不同卷積核操作得到若干 feature map,而再經過池化層處理後得到若干個一維向量。


圖中最後部分為全連接層,全連接層通過使用 softmax 分類器得到各個分類的概率。前面的池化層的輸出以全連接的形式連到 softmax 層,softmax 層定義好分類。

防止過擬合

為了防止過擬合,訓練過程中在倒數第二層使用 dropout 技術,它將隨機丟棄隱含層的某些節點使其不 work。具體做法可以在網路向前傳輸時將一些節點設置為0,比如倒數第二層上,,這裡假設我們有 m 個卷積核。通過 dropout 後為,,其中o和 r 實現了掩碼的功能,即 r 是大小與 z 相同的一個向量,它的值為隨機的0或1,0對應的節點為丟棄的節點。

同時,還可以在全連接層使用L2正則化來約束權值向量w。

主要實現代碼

首先,構建需要的佔位符和常量,其中佔位符包括輸入佔位符、標籤佔位符和 dropout 佔位符,L2 正則損失常量。

接著我們會需要一個嵌入層將辭彙嵌入到指定的維度空間上,維度由 embedding_size 指定。同時 vocabulary_size 為辭彙大小,這樣就可以將所有單詞都映射到指定的維數空間上。嵌入層通過就能找到輸入對應的詞空間向量了,這裡稍微解釋下操作,它會從辭彙中取到 inputs 每個元素對應的詞向量,inputs 為2維的話,通過該操作後變為3維,因為已經將詞用 embedding_size 維向量表示了。此外,由於要調用卷積操作,這裡將結果擴展了一維。

接著開始做卷積操作及池化操作。由於我們會定義若干個卷積核,而且每個高度的都有若干個卷積核,所以我們會得到很多不同的 feature map,然後對這些 feature map 做 max-over-time pooling 操作,最終得到池化後的 feature。

現在網路就剩下全連接層了,其中要先進行 dropout 操作來暫時使得一些節點失效,接著做線性計算得到分數,從而得到預測。

最後計算損失,一個是L2正則損失一個是交叉熵損失,通過兩者求得總的損失。並且計算得到準確率。

github

github附上完整代碼。

https://github.com/sea-boat/nlp_lab/tree/master/cnn_text_classify

reference

Convolutional Neural Networks for Sentence Classification


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 遠洋號 的精彩文章:

從JDK角度認識枚舉enum

TAG:遠洋號 |