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

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

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

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

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.github

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的結構和細節進行梳理。app


Kim Y’s Paper

模型結構及原理

模型的結構以下:框架

說明以下:ide

  • 輸入層

如圖所示,輸入層是句子中的詞語對應的word vector依次(從上到下)排列的矩陣,假設句子有 個詞,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正則化的限制。這樣作的好處是防止隱藏層單元自適應(或者對稱),從而減輕過擬合的程度。

實驗部分

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)。以下圖所示:

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

2. k-max池化

給出數學形式化的表述是,給定一個k值,和一個序列pRp(其中pk),k-max pooling選擇了序列p中的前k個最大值,這些最大值保留原來序列的次序(其實是原序列的一個子序列)。

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

3. 動態k-max池化

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

 

Kl=max(ktop,LlLs)

 

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

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

4. 非線性特徵函數

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

5. 多個Feature Map

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

6. 摺疊操做(Folding)

以前的寬卷積是在輸入矩陣d×s中的每一行內進行計算操做,其中d是word vector的維數,s是輸入句子的詞語數量。而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

模型結構以下圖:

圖中能夠看出,這種結構提早了兩個句子間的交互行爲。

  • 第一層卷積層

第一層中,首先取一個固定的卷積窗口k1,而後遍歷 Sx 和 Sy 中全部組合的二維矩陣進行卷積,每個二維矩陣輸出一個值(文中把這個稱做爲一維卷積,由於其實是把組合中全部詞語的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的,卷積層有兩種卷積方式,池化層則有三種。

  • 卷積層

假設模型的輸入爲二維矩陣 SentSentRlen×Dim,其中 lenlen 表示句子切分爲Token List後的長度(Token能夠是詞/字),Dim 表示Token的Embedding表示的維度。由此有 Senti表示矩陣的第 i 行,即輸入中的第 i 個Token的Embedding表示;Senti:j 表示矩陣中的第 i到第 j 行的一個切片,也是一個子矩陣;Senti[k] 表示矩陣的第 i 行第 k 列的值,對應是Embedding的第 k 個值;而 Senti:j[k] 則是矩陣中第 i 行到第 j 行中的第 k 列的一個切片。

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

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

  • 池化層

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

假設 group(ws,pooling,sent) 表示卷積寬度爲 ws,使用 pooling 池化函數,應用在輸入的句子 sen上。咱們使用了兩種類型的building block,分別是 blockA 和 blockB上,定義以下

 

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

 

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

而 blockB 的定義以下:

 

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

 

這裏 blockB 有兩組卷積層,卷積窗口的寬度爲 wsb,兩組分別對應max-poolingmin-pooling的操做。值得說明的是,groupB() 中的卷積層對應有 Dim 個以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類型)的輸出作局部比較。

給出以下的符號假設:

算法的僞代碼以下:

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

須要注意的是,在算法二中相同類型的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

相關文章
相關標籤/搜索