卷積神經網絡(CNN)在句子建模上的應用

轉載:http://www.jeyzhang.com/cnn-apply-on-modelling-sentence.html

之前的博文已經介紹了CNN的基本原理,本文將大概總結一下最近CNN在NLP中的句子建模(或者句子表示)方面的應用情況,主要閱讀了以下的文獻:

Kim Y. Convolutional neural networks for sentence classification[J]. arXiv preprint arXiv:1408.5882, 2014.

Kalchbrenner N, Grefenstette E, Blunsom P. A convolutional neural network for modelling sentences[J]. arXiv preprint arXiv:1404.2188, 2014.

Hu B, Lu Z, Li H, et al. Convolutional neural network architectures for matching natural language sentences[C]//Advances in Neural Information Processing Systems. 2014: 2042-2050.

He H, Gimpel K, Lin J. Multi-perspective sentence similarity modeling with convolutional neural networks[C]//Proceedings of the 2015 Conference on Empirical Methods in Natural Language Processing. 2015: 1576-1586.

Wenpeng Yin, Hinrich Schütze. Convolutional Neural Network for Paraphrase Identification. The 2015 Conference of the North American Chapter of the Association for Computational Linguistics

Zhang Y, Wallace B. A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification[J]. arXiv preprint arXiv:1510.03820, 2015.

下面對文獻中CNN的結構和細節進行梳理。


Kim Y’s Paper

模型結構及原理

模型的結構如下:

說明如下:

  • 輸入層

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

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

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

  • 第一層卷積層

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

  • 池化層

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

最終池化層的輸出爲各個Feature Map的最大值們,即一個一維的向量。

  • 全連接 + Softmax層

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

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

實驗部分

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的概率;
  • 爲了檢驗模型的性能水平,多次反覆的交叉驗證是必要的,這可以確保模型的高性能並不是偶然。

論文附錄中還附上了各種調參結果,感興趣的可以前往閱讀之。

Kalchbrenner’s Paper

Kal的這篇文章引用次數較高,他提出了一種名爲DCNN(Dynamic Convolutional Neural Network)的網絡模型,在上一篇(Kim’s Paper)中的實驗結果部分也驗證了這種模型的有效性。這個模型的精妙之處在於Pooling的方式,使用了一種稱爲動態Pooling的方法。

下圖是這個模型對句子語義建模的過程,可以看到底層通過組合鄰近的詞語信息,逐步向上傳遞,上層則又組合新的Phrase信息,從而使得句子中即使相離較遠的詞語也有交互行爲(或者某種語義聯繫)。從直觀上來看,這個模型能夠通過詞語的組合,提取出句子中重要的語義信息(通過Pooling),某種意義上來說,層次結構的feature graph的作用類似於一棵語法解析樹。

DCNN能夠處理可變長度的輸入,網絡中包含兩種類型的層,分別是一維的卷積層動態k-max的池化層(Dynamic k-max pooling)。其中,動態k-max池化是最大化池化更一般的形式。之前LeCun將CNN的池化操作定義爲一種非線性的抽樣方式,返回一堆數中的最大值,原話如下:

The max pooling operator is a non-linear subsampling function that returns the maximum of a set of values (LuCun et al., 1998).

而文中的k-max pooling方式的一般化體現在:

  • pooling的結果不是返回一個最大值,而是返回k組最大值,這些最大值是原輸入的一個子序列;
  • pooling中的參數k可以是一個動態函數,具體的值依賴於輸入或者網絡的其他參數;

模型結構及原理

DCNN的網絡結構如下圖:

網絡中的卷積層使用了一種稱之爲寬卷積(Wide Convolution)的方式,緊接着是動態的k-max池化層。中間卷積層的輸出即Feature Map的大小會根據輸入句子的長度而變化。下面講解一下這些操作的具體細節:

1. 寬卷積

相比於傳統的卷積操作,寬卷積的輸出的Feature Map的寬度(width)會更寬,原因是卷積窗口並不需要覆蓋所有的輸入值,也可以是部分輸入值(可以認爲此時其餘的輸入值爲0,即填充0)。如下圖所示:

圖中的右圖即表示寬卷積的計算過程,當計算第一個節點即s1s1時,可以假使s1s1節點前面有四個輸入值爲0的節點參與卷積(卷積窗口爲5)。明顯看出,狹義上的卷積輸出結果是寬卷積輸出結果的一個子集。

2. k-max池化

給出數學形式化的表述是,給定一個kk值,和一個序列pRpp∈Rp(其中pkp≥k),k-max pooling選擇了序列pp中的前kk個最大值,這些最大值保留原來序列的次序(實際上是原序列的一個子序列)。

k-max pooling的好處在於,既提取除了句子中的較重要信息(不止一個),同時保留了它們的次序信息(相對位置)。同時,由於應用在最後的卷積層上只需要提取出kk個值,所以這種方法允許不同長度的輸入(輸入的長度應該要大於kk)。然而,對於中間的卷積層而言,池化的參數kk不是固定的,具體的選擇方法見下面的介紹。

3. 動態k-max池化

動態k-max池化操作,其中的kk輸入句子長度網絡深度兩個參數的函數,具體如下:

Kl=max(ktop,LlLs)Kl=max(ktop,⌈L−lLs⌉)

其中ll表示當前卷積的層數(即第幾個卷積層),LL是網絡中總共卷積層的層數;ktopktop爲最頂層的卷積層pooling對應的kk值,是一個固定的值。舉個例子,例如網絡中有三個卷積層,ktop=3ktop=3,輸入的句子長度爲18;那麼,對於第一層卷積層下面的pooling參數k1=12k1=12,而第二層卷積層對於的爲k2=6k2=6,而k3=ktop=3k3=ktop=3

動態k-max池化的意義在於,從不同長度的句子中提取出相應數量的語義特徵信息,以保證後續的卷積層的統一性。

4. 非線性特徵函數

pooling層與下一個卷積層之間,是通過與一些權值參數相乘後,加上某個偏置參數而來的,這與傳統的CNN模型是一樣的。

5. 多個Feature Map

和傳統的CNN一樣,會提出多個Feature Map以保證提取特徵的多樣性。

6. 摺疊操作(Folding)

之前的寬卷積是在輸入矩陣d×sd×s中的每一行內進行計算操作,其中dd是word vector的維數,ss是輸入句子的詞語數量。而Folding操作則是考慮相鄰的兩行之間的某種聯繫,方式也很簡單,就是將兩行的vector相加;該操作沒有增加參數數量,但是提前(在最後的全連接層之前)考慮了特徵矩陣中行與行之間的某種關聯。

模型的特點

  • 保留了句子中詞序信息和詞語之間的相對位置;
  • 寬卷積的結果是傳統卷積的一個擴展,某種意義上,也是n-gram的一個擴展;
  • 模型不需要任何的先驗知識,例如句法依存樹等,並且模型考慮了句子中相隔較遠的詞語之間的語義信息;

實驗部分

1. 模型訓練及參數

  • 輸出層是一個類別概率分佈(即softmax),與倒數第二層全連接;
  • 代價函數爲交叉熵,訓練目標是最小化代價函數;
  • L2正則化;
  • 優化方法:mini-batch + gradient-based (使用Adagrad update rule, Duchi et al., 2011)

2. 實驗結果

在三個數據集上進行了實驗,分別是(1)電影評論數據集上的情感識別,(2)TREC問題分類,以及(3)Twitter數據集上的情感識別。結果如下圖:

可以看出,DCNN的性能非常好,幾乎不遜色於傳統的模型;而且,DCNN的好處在於不需要任何的先驗信息輸入,也不需要構造非常複雜的人工特徵。

Hu’s Paper

模型結構與原理

1. 基於CNN的句子建模

這篇論文主要針對的是句子匹配(Sentence Matching)的問題,但是基礎問題仍然是句子建模。首先,文中提出了一種基於CNN的句子建模網絡,如下圖:

圖中灰色的部分表示對於長度較短的句子,其後面不足的部分填充的全是0值(Zero Padding)。可以看出,模型解決不同長度句子輸入的方法是規定一個最大的可輸入句子長度,然後長度不夠的部分進行0值的填充;圖中的卷積計算和傳統的CNN卷積計算無異,而池化則是使用Max-Pooling。

  • 卷積結構的分析

下圖示意性地說明了卷積結構的作用,作者認爲卷積的作用是從句子中提取出局部的語義組合信息,而多張Feature Map則是從多種角度進行提取,也就是保證提取的語義組合的多樣性;而池化的作用是對多種語義組合進行選擇,過濾掉一些置信度低的組合(可能這樣的組合語義上並無意義)。

2. 基於CNN的句子匹配模型

下面是基於之前的句子模型,建立的兩種用於兩個句子的匹配模型。

2.1 結構I

模型結構如下圖:

簡單來說,首先分別單獨地對兩個句子進行建模(使用上文中的句子模型),從而得到兩個相同且固定長度的向量,向量表示句子經過建模後抽象得來的特徵信息;然後,將這兩個向量作爲一個多層感知機(MLP)的輸入,最後計算匹配的分數。

這個模型比較簡單,但是有一個較大的缺點:兩個句子在建模過程中是完全獨立的,沒有任何交互行爲,一直到最後生成抽象的向量表示後纔有交互行爲(一起作爲下一個模型的輸入),這樣做使得句子在抽象建模的過程中會喪失很多語義細節,同時過早地失去了句子間語義交互計算的機會。因此,推出了第二種模型結構。

2.2 結構II

模型結構如下圖:

圖中可以看出,這種結構提前了兩個句子間的交互行爲。

  • 第一層卷積層

第一層中,首先取一個固定的卷積窗口k1k1,然後遍歷 SxSx 和 SySy 中所有組合的二維矩陣進行卷積,每一個二維矩陣輸出一個值(文中把這個稱作爲一維卷積,因爲實際上是把組合中所有詞語的vector排成一行進行的卷積計算),構成Layer-2。下面給出數學形式化表述:

  • 第一層卷積層後的Max-Pooling層

從而得到Layer-2,然後進行2×2的Max-pooling:

  • 後續的卷積層

後續的卷積層均是傳統的二維卷積操作,形式化表述如下:

  • 二維卷積結果後的Pooling層

與第一層卷積層後的簡單Max-Pooling方式不同,後續的卷積層的Pooling是一種動態Pooling方法,這種方法來源於參考文獻[1]。

  • 結構II的性質
  1. 保留了詞序信息;
  2. 更具一般性,實際上結構I是結構II的一種特殊情況(取消指定的權值參數);

實驗部分

1. 模型訓練及參數

  • 使用基於排序的自定義損失函數(Ranking-based Loss)
  • BP反向傳播+隨機梯度下降;
  • mini-batch爲100-200,並行化;
  • 爲了防止過擬合,對於中型和大型數據集,會提前停止模型訓練;而對於小型數據集,還會使用Dropout策略;
  • Word2Vector:50維;英文語料爲Wikipedia(~1B words),中文語料爲微博數據(~300M words);
  • 使用ReLu函數作爲激活函數;
  • 卷積窗口爲3-word window;
  • 使用Fine tuning;

2. 實驗結果

一共做了三個實驗,分別是(1)句子自動填充任務,(2)推文與評論的匹配,以及(3)同義句識別;結果如下面的圖示:

其實結構I和結構II的結果相差不大,結構II稍好一些;而相比於其他的模型而言,結構I和結構II的優勢還是較大的。

He’s Paper

第四篇論文即He的文章中所提出的模型,是所有基於NN的模型中,在Paraphrase identification任務標準數據集MSRP上效果最佳的。下面我們來學習一下這個模型。

模型結構與原理

模型主要分爲兩個部分:

  • 句子的表徵模型:得到句子的表徵(representation),以供後續的相似度計算;
  • 相似度計算模型:使用多種相似度計算方法,針對句子表徵後的局部進行相應的計算;

模型不需要藉助WordNet, 句法解析樹等資源;但是可以選擇性地使用詞性標註、word embedding等方法來增強模型的性能;與之前的模型區別在於,文中的模型使用了多種類型的卷積、池化方法,以及針對得到的句子表徵的局部進行相應的相似度計算。(這樣做的優點在於能夠更加充分地挖掘出句子中的特徵信息,從而提升性能,但同時使得模型變得複雜、耗時)

模型的整體框架如下:

下面具體看看這兩個模型是如何實現的。

  1. 句子的表徵模型

模型是基於CNN的,卷積層有兩種卷積方式,池化層則有三種。

  • 卷積層

假設模型的輸入爲二維矩陣 SentSentSentRlen×DimSent∈Rlen×Dim,其中 lenlen 表示句子切分爲Token List後的長度(Token可以是詞/字),DimDim 表示Token的Embedding表示的維度。由此有 SentiSenti 表示矩陣的第 ii 行,即輸入中的第 ii 個Token的Embedding表示;Senti:jSenti:j 表示矩陣中的第 ii 到第 jj 行的一個切片,也是一個子矩陣;Sent[k]iSenti[k] 表示矩陣的第 ii 行第 kk 列的值,對應是Embedding的第 kk 個值;而 Sent[k]i:jSenti:j[k] 則是矩陣中第 ii 行到第 jj 行中的第 kk 列的一個切片。

卷積層有兩種卷積的方式:(1)粒度爲word的卷積;(2)粒度爲embedding 維度上的卷積。如下圖:

其中,第一種卷積方式與之前的Kim Y提出模型中的相同,相當於是n-gram特徵的抽取;而對於第二種卷積方式,論文作者給出的解釋是,(1)這種方式有助於充分地提取出輸入的特徵信息;(2)由於粒度更小,所以在學習過程中的參數調整上,每一個維度能夠得到不同程度的參數調整。(第二種卷積方式從直觀上沒有太多的物理意義,而作者也是直說不能夠給出符合人直觀想法上的解釋)。

  • 池化層

模型除了使用傳統的max-pooling,還使用了min-poolingmean-pooling方式。

假設 group(ws,pooling,sent)group(ws,pooling,sent) 表示卷積寬度爲 wsws,使用 poolingpooling 池化函數,應用在輸入的句子 sentsent 上。我們使用了兩種類型的building block,分別是 blockAblockA 和 blockBblockB 上,定義如下

blockA={groupA(wsa,p,sent):pmax,min,mean}blockA={groupA(wsa,p,sent):p∈max,min,mean}

這裏 blockAblockA 有三組卷積層,卷積窗口的寬度一致(都是 wsawsa ),每一組對應一種池化操作。這裏池化操作和卷積層是一一對應的,也就是說並不是一個卷積層上實施三種池化操作(雖然也可以這麼做,作者沒有這麼做的原因是由於激活函數的存在,對每個卷積結果都進行max-poolingmin-pooling是沒有必要的)。

而 blockBblockB 的定義如下:

blockB={groupB(wsb,p,sent):pmax,min}blockB={groupB(wsb,p,sent):p∈max,min}

這裏 blockBblockB 有兩組卷積層,卷積窗口的寬度爲 wsbwsb,兩組分別對應max-poolingmin-pooling的操作。值得說明的是,groupB()groupB(∗) 中的卷積層對應有 DimDim 個以embedding dimension爲粒度的卷積窗口,也就是對embedding的每一維度做卷積運算。

這裏只所以要組合這些多樣的卷積和池化操作,原因是希望能夠從多個方面來提取出輸入中的特徵信息,以供後續的決策任務。

  • 多種窗口尺寸

與傳統的n-gram模型相似,這裏在building block中使用了多種尺寸的卷積窗口。如下圖所示:

其中 wsws 表示卷積時卷積的n-gram長度,而 ws=ws=∞ 表示卷積窗口爲整個word embedding矩陣。wsws 的值及Feature Map 的數量都是需要調參的。

  1. 相似度計算模型

下面介紹在得到句子的表徵向量之後,如何計算它們的相似度。直觀的想法是,我們可以使用傳統的相似度計算方法如餘弦相似度等來計算兩個句子向量的相似度。但是,直接應用這種做法在兩個句子向量上並不是最優的,原因在於最後生成的句子向量中的每一個部分的意義各不相同,這樣簡單粗暴的計算勢必會影響效果,所以做法是對句子向量中的各個部分進行相應的比較和計算(Structured Comparision)。爲了使得句子向量中的局部間的比較和計算更加有效,我們需要考慮如下方面:

(1) 是否來自相同的building block
(2) 是否來自相同卷積窗口大小下的卷積結果;
(3) 是否來自相同的pooling層
(4) 是否來自相同的Feature Map

最終比較句子中的相應部分時,需要至少滿足以上兩個條件。爲了識別句子中的哪些對應部分需要參與到相似度計算,文中提供了兩種算法。

2.1. 相似度計算單元(Unit)

兩種相似度計算單元如下:

2.2. 基於句子局部的相似度計算

算法1和算法2爲句子表徵向量的兩種計算方法,其中算法1僅用在 blockAblockA 上;而算法2則都用在 blockAblockA 和 blockBblockB 上,兩種算法都是針對相同類型(pooling和block類型)的輸出做局部比較。

給出如下的符號假設:

算法的僞代碼如下:

下面的圖示說明了在 blockAblockA 上,兩種算法的計算方式的區別,算法一表現了向量在水平方向上的比較;而算法二則是在垂直方向。

需要注意的是,在算法二中相同類型的pooling的輸出groups中,向量是兩兩進行比較的(圖中的紅色虛線只是爲了說明比較的方向,並不是只針對group中相同大小的卷積窗口作比較);而算法一中的每一行都要作比較,不僅僅是第一行。

  1. 模型的其他細節
  • 相似度向量輸出 + 全連接層

基於句子局部的相似度計算之後,得到相應的相似度向量;然後這組向量之後連接一個全連接層,最後softmax對應輸出。如果是計算相似度度量值,可以用softmax輸出的類別概率值。

  • 激活函數

使用tanh函數作爲激活函數。

實驗部分

  1. 實驗數據集

用於評測同義句檢測 (Paraphrase Identification) 任務的經典數據集,數據集來源於新聞;包含5801對句子對,其中4076對用於模型訓練,而1725對用於測試;每一對句子擁有一個標籤,0或者1,0表示兩個句子不是互爲同義句,而1則表示兩個句子互爲同義句。因此這是一個二分類的任務。

數據來源於2014年SemEval比賽,數據集有9927對句子對,其中4500對用於模型訓練,500對用於模型驗證,而剩下的4927對用於模型測試。這些句子都是在圖片和視頻描述中抽取得到的,每一對句子對有一個相關分數,區間在[1, 5],分數越高表示句子越相關。

數據集來源於2012年的SemEval比賽,包含1500對短文本(用於描述視頻信息)。其中一般用於模型訓練,一半用於模型測試,每一對句子有一個相關性分數,區間在[0, 5],分數越高表示句子越相關。

  1. 模型訓練

針對MSRP和其他兩個數據集,分別使用兩種損失函數。對於MSRP數據集,損失函數(Hinge Loss)如下:

對於其餘兩個數據集,損失函數(KL-divergence Loss)如下:

  1. 實驗參數設置
  • wsws 的值ws[1,3]ws∈[1,3]和 ws=ws=∞.
  • Word Embedding: 300維的GloVe word embedding;對於MSRP數據集,還額外使用了200維的POS embedding(Standford POS tagger)和25維的Paragram Vectors (Wieting et al., 2015 PDF數據下載地址)。因此對於MSRP任務而言,word embedding的維數爲525維 (200+300+25);而其餘兩個任務則對應是300維。
  • 在MSRP上使用了5-折交叉驗證的方式,對模型參數進行tuningTuning好的模型參數將會用在另外兩個數據集任務上。
  • 只有在MSRP數據集任務上,允許模型參數進行更新。
  • 輸出的全連接層,MSRP有250個神經元節點,而SICK和MSRVID則是150個。
  • 在 blockAblockA 中,Feature Map 的數量與輸入的embedding維數相同,即MSRP是525個,而SICK和MSRVID則是300個。
  • 優化算法使用隨機梯度下降方法。
  • 學習率爲0.01,而正則化參數 λ=104λ=10−4.
  1. 實驗結果
  • MSRP數據集

可以看出,文中的模型是所有基於NN的方法中在MSRP數據集上性能最好的。

  • SICK數據集

  • MSRVID數據集

而模型在SICK和MSRVID數據集上的表現也很好。

  1. 模型的敏感度分析

下面的表格說明了在不使用某種技術下,模型性能在實驗數據集上的變化情況。

從中可以得出以下結論:

  • 對於MSRP數據集任務而言,增加POS EmbeddingParagram Vector效果顯著;
  • 移除相似度計算層的影響顯著,說明結構化的句子局部比較方法是有效且必要的;
  • HorizontalVertical算法均有一定的提升效果,而Vertical算法的提升程度更高;
  • max-pooling方式確實要比min-poolingmean-pooling強太多。
  1. 總結

文中的模型包含兩個部分:卷積-池化模型和相似度計算模型。實驗部分已經驗證了模型的有效性,在MSRP數據集上模型取得了僅次於state-of-art的結果,並且在基於NN的方法中是最好的。模型中的相似度計算層是有必要的,因爲對卷積池化處理後的句子成分進行了針對性的比較,從直觀上要比直接扔進全連接層更合理,而實驗結果也表明了這一點。

然而,個人覺得,文中的模型結構較爲複雜,而且其中有很多trick的地方,比如爲什麼要對word embedding中的每一維度做卷積,blockBblockB 中的pooling方式爲什麼只用了max和min,不用mean的方式等問題,而這些方式或許是作者自己做了大量實驗後,從果到因而使用的。

Yin’s Paper

Yin的這篇論文提出了一種叫Bi-CNN-MI的架構,其中Bi-CNN表示兩個使用Siamese框架的CNN模型;MI表示多粒度的交互特徵。Bi-CNN-MI包含三個部分:

  • 句子分析模型 (CNN-SM)

這部分模型主要使用了上述Kal在2014年提出的模型,針對句子本身提取出四種粒度的特徵表示:詞、短ngram、長ngram和句子粒度。多種粒度的特徵表示是非常必要的,一方面提高模型的性能,另一方面增強模型的魯棒性。

  • 句子交互計算模型 (CNN-IM)

這部分模型主要是基於2011年Socher提出的RAE模型,做了一些簡化,即僅對同一種粒度下的提取特徵做兩兩比較。

  • LR或Softmax網絡層以適配任務

模型結構

論文提出的模型主要是基於Kal的模型及Socher的RAE模型的結合體,如下圖:

通過模型圖可以看出模型的主要思想:一方面利用Kal的模型進行多種粒度上的特徵提取,另一方面採取RAE模型的思想,對提取出來的特徵進行兩兩的相似度計算,計算完成的結果通過dynamic pooling的方式進一步提取少量特徵,然後各個層次的pooling計算結果平攤爲一組向量,通過全連接的方式與LR(或者softmax)層連接,從而適配同義句檢測任務本身。

這個模型具體的計算細節不再贅述了,感興趣的讀者可以直接去看論文。除了提出這種模型結構之外,論文還有一個亮點在於使用了一種類似於語言模型的CNN-LM來對上述CNN部分的模型進行預訓練,從而提前確定模型的參數。CNN-LM的網絡結構如下圖:

CNN-LM模型的訓練預料使用了最終的實驗數據集,即MSRP;另外,由於MSRP的數據規模較小,所以作者又增加了100,000個英文句子語料。CNN-LM模型最終能夠得到word embedding, 模型權值等參數。需要注意的是,這些參數並不是固定的,在之後的句子匹配任務中是會不斷更新的。從後面的實驗結果中可以看出,CNN-LM的作用是顯著的。

實驗結果

論文僅使用了一種數據集,即公認的PI (Paraphrase Identification)任務數據集,MSRP。實驗結果如下:

可以看出,CNN-LM的預訓練效果顯著,預訓練後的模型性能很強(但是結果上比之前He提出的模型稍差一些)。


本文結束,感謝欣賞。

歡迎轉載,請註明本文的鏈接地址:

http://www.jeyzhang.com/cnn-apply-on-modelling-sentence.html

參考文獻

[1] R. Socher, E. H. Huang, and A. Y. Ng. Dynamic pooling and unfolding recursive autoencoders for paraphrase detection. In Advances in NIPS, 2011.

推薦資料

A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification

Implementing a CNN for Text Classification in TensorFlow

Kim Y’s Implement: Convolutional Neural Networks for Sentence Classification

發佈了36 篇原創文章 · 獲贊 39 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章