讀了一篇文章,用到卷積神經網絡的方法來進行文本分類,故寫下一點自己的學習筆記:
本文在事先進行單詞向量的學習的基礎上,利用卷積神經網絡(CNN)進行句子分類,然后通過微調學習任務特定的向量,提高性能。
在從無監督神經語言模型中獲得單詞向量(Tomas Mikolov等人做過相關工作,即谷歌的word2vector完成,將原始的1/V模型變化為分布式低維表示)后利用一層卷積層的CNN進行學習。
模型結構:

首先輸入具有兩個通道,分別對應static和non-static的方式,其中static方式表明單詞向量不會隨着訓練過程而發生變化,我們可以采用各種各樣的固定長度編碼,包括one-hot(數據量很小的時候可以用),本文中采用的是google的word2vec的word embedding,將單詞轉化為維度固定的向量表達。
在卷積層當中,這里與圖像識別中的CNN不同的是:這里的卷積核的寬度是一定的(即詞向量的維數),而高度代表了詞語的個數。例如h=3,即代表了3-gram的上下詞信息,h=4,就代表4-gram的信息,h=n表示n-gram。每一個卷積核(Filter)的參數是共享的,代表着一個卷積核只能識別同一類特征。依次順序往下掃描生成
,卷積后生成的feature map不再是一個矩陣,而是一個寬度只有1的列向量(圖中的一豎列)。
然后在池化層的pooling采用max pooling,即將每一個Filter卷積得到列向量中的最大值ci取出來,其他的丟棄,因此能得到一個維度為X(X為Filter的數目,例如設置了h=3,4,5三個Filter,X就等於3)。這樣做有一個好處,即文中原本只對單詞進行了embedding,生成了維度固定的編碼,但沒有對文本進行這樣的操作,因此沒一段文本當中包含的單詞數也是不同的,如果不進行maxpooling池化的話,會造成維度不一樣的情況(實際上也可以對文本進行同維度編碼,但是這樣做有些復雜,又是一個研究方向了;另外也可以對文本進行padding,即設定一個固定的長度,多了就截掉,少了就補上,我在另外一篇字符級CNN的論文中看到這樣的操作,就把長度設置為1014,認為能表達大部分的含義),在進行了maxpooling操作之后,從池化層出來的向量的維度統一變成了X。
經過一個池化層之后有一個全連接層,即通常的三層神經網絡結構中隱層連接輸出層的操作,采用softmax函數輸出從屬於不同類的分布概率,同時還加了一個dropout操作來防止過擬合,即對全連接層上的權值參數給予L2正則化的限制。
還要提到的一點就是前文所說的“兩種通道”,實際上第一種通道就是static的,利用word2vec將單詞統一編碼,而另外一種通道就是non-static,這種方法中所有的單詞向量並不是產生后就不發生變化的,而是在訓練的過程中會被微調。
實際上本文的模型比較簡單,但是實際效果非常好。在實驗結果中可以看到non-static的方法大多數時候都是要比static方法稍好的,而static方法比rand的方法要好(rand是指word embedding過程中詞的編碼隨機給出)。而結合static和non-static的multichannel方法相較於單純的static和non-static方法,在較小的數據集上表現比他們都要好(因為這種混合的方法體現了一種折衷的想法,即不希望被微調的單詞向量與原始產生的單詞向量差距太大,也希望保持一定的動態變化空間)。
