1. 程式人生 > >神經網絡(十四) 文本分類

神經網絡(十四) 文本分類

大量 clas 種類 現象 總結 linear acc shuf 工具

Kim Y’s Paper

模型結構及原理

模型的結構如下:

技術分享圖片

  • 輸入層

如圖所示,輸入層是句子中的詞語對應的word vector依次(從上到下)排列的矩陣,假設句子有 n 個詞,vector的維數為 k ,那麽這個矩陣就是 n×k 的。

這個矩陣的類型可以是靜態的(static),也可以是動態的(non static)。靜態就是word vector是固定不變的,而動態則是在模型訓練過程中,word vector也當做是可優化的參數,通常把反向誤差傳播導致word vector中值發生變化的這一過程稱為Fine tune

對於未登錄詞的vector,可以用0或者隨機小的正數來填充。

  • 第一層卷積層

輸入層通過卷積操作得到若幹個Feature Map,卷積窗口的大小為 h×k ,其中 h 表示縱向詞語的個數,而 k 表示word vector的維數。通過這樣一個大型的卷積窗口,將得到若幹個列數為1的Feature Map

  • 池化層

接下來的池化層,文中用了一種稱為Max-over-time Pooling的方法。這種方法就是簡單地從之前一維的Feature Map中提出最大的值,文中解釋最大值代表著最重要的信號。可以看出,這種Pooling方式可以解決可變長度的句子輸入問題(因為不管Feature Map中有多少個值,只需要提取其中的最大值)。

最終池化層的輸出為各個Feature Map

的最大值們,即一個一維的向量。

  • 全連接 + Softmax層

池化層的一維向量的輸出通過全連接的方式,連接一個Softmax層,Softmax層可根據任務的需要設置(通常反映著最終類別上的概率分布)。

最終實現時,我們可以在倒數第二層的全連接部分上使用Dropout技術,即對全連接層上的權值參數給予L2正則化的限制。這樣做的好處是防止隱藏層單元自適應(或者對稱),從而減輕過擬合的程度。

4.實驗部分

1. 數據

實驗用到的數據集如下(具體的名稱和來源可以參考論文):

技術分享圖片

2.模型訓練和調參

  • 修正線性單元(Rectified linear units)
  • 濾波器的h大小:3,4,5;對應的Feature Map的數量為100;
  • Dropout率為0.5,L2正則化限制權值大小不超過3;
  • mini-batch的大小為50;

這些參數的選擇都是基於SST-2 dev數據集,通過網格搜索方法(Grid Search)得到的最優參數。另外,訓練過程中采用隨機梯度下降方法,基於shuffled mini-batches之上的,使用了Adadelta update rule(Zeiler, 2012)。

3.預訓練的Word Vector

這裏的word vector使用的是公開的數據,即連續詞袋模型(COW)在Google News上的訓練結果。未登錄次的vector值是隨機初始化的。

4.實驗結果

實驗結果如下圖:

技術分享圖片

其中,前四個模型是上文中所提出的基本模型的各個變種:

  • CNN-rand: 所有的word vector都是隨機初始化的,同時當做訓練過程中優化的參數;
  • CNN-static: 所有的word vector直接使用無監督學習即Google的Word2Vector工具(COW模型)得到的結果,並且是固定不變的;
  • CNN-non-static: 所有的word vector直接使用無監督學習即Google的Word2Vector工具(COW模型)得到的結果,但是會在訓練過程中被Fine tuned
  • CNN-multichannel: CNN-static和CNN-non-static的混合版本,即兩種類型的輸入;

博主自己下載了論文作者的實現程序(Github地址),最終在MR數據集上的運行結果如下:

  • CNN-rand: 0.7669
  • CNN-static: 0.8076
  • CNN-non-static: 0.8151

和論文中的結果差不多。

5. 結論

  • CNN-static較與CNN-rand好,說明pre-training的word vector確實有較大的提升作用(這也難怪,因為pre-training的word vector顯然利用了更大規模的文本數據信息);
  • CNN-non-static較於CNN-static大部分要好,說明適當的Fine tune也是有利的,是因為使得vectors更加貼近於具體的任務;
  • CNN-multichannel較於CNN-single在小規模的數據集上有更好的表現,實際上CNN-multichannel體現了一種折中思想,即既不希望Fine tuned的vector距離原始值太遠,但同時保留其一定的變化空間。

值得註意的是,static的vector和non-static的相比,有一些有意思的現象如下表格:

技術分享圖片

  • 原始的word2vector訓練結果中,bad對應的最相近詞為good,原因是這兩個詞在句法上的使用是極其類似的(可以簡單替換,不會出現語句毛病);而在non-static的版本中,bad對應的最相近詞為terrible,這是因為在Fune tune的過程中,vector的值發生改變從而更加貼切數據集(是一個情感分類的數據集),所以在情感表達的角度這兩個詞會更加接近;
  • 句子中的!最接近一些表達形式較為激進的詞匯,如lush等;而,則接近於一些連接詞,這和我們的主觀感受也是相符的。

Kim Y的這個模型很簡單,但是卻有著很好的性能。後續Denny用TensorFlow實現了這個模型的簡單版本,可參考這篇博文;以及Ye Zhang等人對這個模型進行了大量的實驗,並給出了調參的建議,可參考這篇論文。

下面總結一下Ye Zhang等人基於Kim Y的模型做了大量的調參實驗之後的結論:

  • 由於模型訓練過程中的隨機性因素,如隨機初始化的權重參數,mini-batch,隨機梯度下降優化算法等,造成模型在數據集上的結果有一定的浮動,如準確率(accuracy)能達到1.5%的浮動,而AUC則有3.4%的浮動;
  • 詞向量是使用word2vec還是GloVe,對實驗結果有一定的影響,具體哪個更好依賴於任務本身;
  • Filter的大小對模型性能有較大的影響,並且Filter的參數應該是可以更新的;
  • Feature Map的數量也有一定影響,但是需要兼顧模型的訓練效率;
  • 1-max pooling的方式已經足夠好了,相比於其他的pooling方式而言;
  • 正則化的作用微乎其微。

Ye Zhang等人給予模型調參者的建議如下:

  • 使用non-static版本的word2vec或者GloVe要比單純的one-hot representation取得的效果好得多;
  • 為了找到最優的過濾器(Filter)大小,可以使用線性搜索的方法。通常過濾器的大小範圍在1-10之間,當然對於長句,使用更大的過濾器也是有必要的;
  • Feature Map的數量在100-600之間;
  • 可以盡量多嘗試激活函數,實驗發現ReLUtanh兩種激活函數表現較佳;
  • 使用簡單的1-max pooling就已經足夠了,可以沒必要設置太復雜的pooling方式;
  • 當發現增加Feature Map的數量使得模型的性能下降時,可以考慮增大正則的力度,如調高dropout的概率;
  • 為了檢驗模型的性能水平,多次反復的交叉驗證是必要的,這可以確保模型的高性能並不是偶然。

神經網絡(十四) 文本分類