以前的博文已經介紹了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
模型的結構以下:框架
說明以下:ide
如圖所示,輸入層是句子中的詞語對應的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層可根據任務的須要設置(一般反映着最終類別上的機率分佈)。
最終實現時,咱們能夠在倒數第二層的全鏈接部分上使用Dropout
技術,即對全鏈接層上的權值參數給予L2正則化
的限制。這樣作的好處是防止隱藏層單元自適應(或者對稱),從而減輕過擬合的程度。
1. 數據
實驗用到的數據集以下(具體的名稱和來源能夠參考論文):
2. 模型訓練和調參
這些參數的選擇都是基於SST-2 dev數據集,經過網格搜索方法(Grid Search)獲得的最優參數。另外,訓練過程當中採用隨機梯度降低方法,基於shuffled mini-batches之上的,使用了Adadelta update rule(Zeiler, 2012)。
3. 預訓練的Word Vector
這裏的word vector使用的是公開的數據,即連續詞袋模型(COW)在Google News上的訓練結果。未登陸次的vector值是隨機初始化的。
4. 實驗結果
實驗結果以下圖:
其中,前四個模型是上文中所提出的基本模型的各個變種:
Fine tuned
;博主本身下載了論文做者的實現程序(Github地址),最終在MR數據集上的運行結果以下:
和論文中的結果差很少。
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的相比,有一些有意思的現象以下表格:
bad
對應的最相近詞爲good
,緣由是這兩個詞在句法上的使用是極其相似的(能夠簡單替換,不會出現語句毛病);而在non-static
的版本中,bad
對應的最相近詞爲terrible
,這是由於在Fune tune
的過程當中,vector的值發生改變從而更加貼切數據集(是一個情感分類的數據集),因此在情感表達的角度這兩個詞會更加接近;!
最接近一些表達形式較爲激進的詞彙,如lush
等;而,
則接近於一些鏈接詞,這和咱們的主觀感覺也是相符的。Kim Y的這個模型很簡單,可是卻有着很好的性能。後續Denny用TensorFlow實現了這個模型的簡單版本,可參考這篇博文;以及Ye Zhang等人對這個模型進行了大量的實驗,並給出了調參的建議,可參考這篇論文。
下面總結一下Ye Zhang等人基於Kim Y的模型作了大量的調參實驗以後的結論:
Ye Zhang等人給予模型調參者的建議以下:
non-static
版本的word2vec
或者GloVe
要比單純的one-hot representation
取得的效果好得多;1-10
之間,固然對於長句,使用更大的過濾器也是有必要的;Feature Map
的數量在100-600
之間;ReLU
和tanh
兩種激活函數表現較佳;1-max pooling
就已經足夠了,能夠不必設置太複雜的pooling方式;Feature Map
的數量使得模型的性能降低時,能夠考慮增大正則的力度,如調高dropout
的機率;論文附錄中還附上了各類調參結果,感興趣的能夠前往閱讀之。
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方式的通常化體如今:
DCNN的網絡結構以下圖:
網絡中的卷積層使用了一種稱之爲寬卷積(Wide Convolution)
的方式,緊接着是動態的k-max池化層。中間卷積層的輸出即Feature Map
的大小會根據輸入句子的長度而變化。下面講解一下這些操做的具體細節:
1. 寬卷積
相比於傳統的卷積操做,寬卷積的輸出的Feature Map
的寬度(width)會更寬,緣由是卷積窗口並不須要覆蓋全部的輸入值,也能夠是部分輸入值(能夠認爲此時其他的輸入值爲0,即填充0)。以下圖所示:
圖中的右圖即表示寬卷積的計算過程,當計算第一個節點即s1時,能夠假使s1s1節點前面有四個輸入值爲0的節點參與卷積(卷積窗口爲5)。明顯看出,狹義上的卷積輸出結果是寬卷積輸出結果的一個子集。
2. k-max池化
給出數學形式化的表述是,給定一個k值,和一個序列p∈Rp(其中p≥k),k-max pooling
選擇了序列p中的前k個最大值,這些最大值保留原來序列的次序(其實是原序列的一個子序列)。
k-max pooling
的好處在於,既提取除了句子中的較重要信息(不止一個),同時保留了它們的次序信息(相對位置)。同時,因爲應用在最後的卷積層上只須要提取出k個值,因此這種方法容許不一樣長度的輸入(輸入的長度應該要大於k)。然而,對於中間的卷積層而言,池化的參數k不是固定的,具體的選擇方法見下面的介紹。
3. 動態k-max池化
動態k-max池化操做,其中的k是輸入句子長度
和網絡深度
兩個參數的函數,具體以下:
其中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相加;該操做沒有增長參數數量,可是提早(在最後的全鏈接層以前)考慮了特徵矩陣中行與行之間的某種關聯。
1. 模型訓練及參數
2. 實驗結果
在三個數據集上進行了實驗,分別是(1)電影評論數據集上的情感識別,(2)TREC問題分類,以及(3)Twitter數據集上的情感識別。結果以下圖:
能夠看出,DCNN的性能很是好,幾乎不遜色於傳統的模型;並且,DCNN的好處在於不須要任何的先驗信息輸入,也不須要構造很是複雜的人工特徵。
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。下面給出數學形式化表述:
從而獲得Layer-2,而後進行2×2的Max-pooling:
後續的卷積層均是傳統的二維卷積操做,形式化表述以下:
與第一層卷積層後的簡單Max-Pooling方式不一樣,後續的卷積層的Pooling是一種動態Pooling方法,這種方法來源於參考文獻[1]。
1. 模型訓練及參數
2. 實驗結果
一共作了三個實驗,分別是(1)句子自動填充任務,(2)推文與評論的匹配,以及(3)同義句識別;結果以下面的圖示:
其實結構I和結構II的結果相差不大,結構II稍好一些;而相比於其餘的模型而言,結構I和結構II的優點仍是較大的。
第四篇論文即He的文章中所提出的模型,是全部基於NN的模型中,在Paraphrase identification任務標準數據集MSRP上效果最佳的。下面咱們來學習一下這個模型。
模型主要分爲兩個部分:
模型不須要藉助WordNet, 句法解析樹等資源;可是能夠選擇性地使用詞性標註、word embedding等方法來加強模型的性能;與以前的模型區別在於,文中的模型使用了多種類型的卷積、池化方法,以及針對獲得的句子表徵的局部進行相應的類似度計算。(這樣作的優勢在於可以更加充分地挖掘出句子中的特徵信息,從而提高性能,但同時使得模型變得複雜、耗時)
模型的總體框架以下:
下面具體看看這兩個模型是如何實現的。
模型是基於CNN的,卷積層有兩種卷積方式,池化層則有三種。
假設模型的輸入爲二維矩陣 Sent,Sent∈Rlen×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-pooling
和mean-pooling
方式。
假設 group(ws,pooling,sent) 表示卷積寬度爲 ws,使用 pooling 池化函數,應用在輸入的句子 sent 上。咱們使用了兩種類型的building block
,分別是 blockA 和 blockB上,定義以下
這裏 blockA 有三組卷積層,卷積窗口的寬度一致(都是 wsa ),每一組對應一種池化操做。這裏池化操做和卷積層是一一對應的,也就是說並非一個卷積層上實施三種池化操做(雖然也能夠這麼作,做者沒有這麼作的緣由是因爲激活函數的存在,對每一個卷積結果都進行max-pooling
和min-pooling
是沒有必要的)。
而 blockB 的定義以下:
這裏 blockB 有兩組卷積層,卷積窗口的寬度爲 wsb,兩組分別對應max-pooling
和min-pooling
的操做。值得說明的是,groupB(∗) 中的卷積層對應有 Dim 個以embedding dimension
爲粒度的卷積窗口,也就是對embedding
的每一維度作卷積運算。
這裏只因此要組合這些多樣的卷積和池化操做,緣由是但願可以從多個方面來提取出輸入中的特徵信息,以供後續的決策任務。
與傳統的n-gram模型類似,這裏在building block
中使用了多種尺寸的卷積窗口。以下圖所示:
其中 wsws 表示卷積時卷積的n-gram長度,而 ws=∞ws=∞ 表示卷積窗口爲整個word embedding
矩陣。wsws 的值及Feature Map
的數量都是須要調參的。
下面介紹在獲得句子的表徵向量以後,如何計算它們的類似度。直觀的想法是,咱們可使用傳統的類似度計算方法如餘弦類似度等來計算兩個句子向量的類似度。可是,直接應用這種作法在兩個句子向量上並非最優的,緣由在於最後生成的句子向量中的每個部分的意義各不相同,這樣簡單粗暴的計算勢必會影響效果,因此作法是對句子向量中的各個部分進行相應的比較和計算(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中相同大小的卷積窗口做比較);而算法一中的每一行都要做比較,不只僅是第一行。
基於句子局部的類似度計算以後,獲得相應的類似度向量;而後這組向量以後鏈接一個全鏈接層,最後softmax對應輸出。若是是計算類似度度量值,能夠用softmax輸出的類別機率值。
使用tanh
函數做爲激活函數。
用於評測同義句檢測 (Paraphrase Identification) 任務的經典數據集,數據集來源於新聞;包含5801對句子對,其中4076對用於模型訓練,而1725對用於測試;每一對句子擁有一個標籤,0或者1,0表示兩個句子不是互爲同義句,而1則表示兩個句子互爲同義句。所以這是一個二分類的任務。
數據來源於2014年SemEval比賽,數據集有9927對句子對,其中4500對用於模型訓練,500對用於模型驗證,而剩下的4927對用於模型測試。這些句子都是在圖片和視頻描述中抽取獲得的,每一對句子對有一個相關分數,區間在[1, 5],分數越高表示句子越相關。
數據集來源於2012年的SemEval比賽,包含1500對短文本(用於描述視頻信息)。其中通常用於模型訓練,一半用於模型測試,每一對句子有一個相關性分數,區間在[0, 5],分數越高表示句子越相關。
針對MSRP和其餘兩個數據集,分別使用兩種損失函數。對於MSRP數據集,損失函數(Hinge Loss)以下:
對於其他兩個數據集,損失函數(KL-divergence Loss)以下:
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維。Feature Map
的數量與輸入的embedding
維數相同,即MSRP是525個,而SICK和MSRVID則是300個。能夠看出,文中的模型是全部基於NN的方法中在MSRP數據集上性能最好的。
而模型在SICK和MSRVID數據集上的表現也很好。
下面的表格說明了在不使用某種技術下,模型性能在實驗數據集上的變化狀況。
從中能夠得出如下結論:
POS Embedding
和Paragram Vector
效果顯著;Horizontal
和Vertical
算法均有必定的提高效果,而Vertical
算法的提高程度更高;max-pooling
方式確實要比min-pooling
和mean-pooling
強太多。文中的模型包含兩個部分:卷積-池化模型和類似度計算模型。實驗部分已經驗證了模型的有效性,在MSRP數據集上模型取得了僅次於state-of-art的結果,而且在基於NN的方法中是最好的。模型中的類似度計算層是有必要的,由於對卷積池化處理後的句子成分進行了針對性的比較,從直觀上要比直接扔進全鏈接層更合理,而實驗結果也代表了這一點。
然而,我的以爲,文中的模型結構較爲複雜,並且其中有不少trick的地方,好比爲何要對word embedding中的每一維度作卷積,blockBblockB 中的pooling
方式爲何只用了max和min,不用mean的方式等問題,而這些方式或許是做者本身作了大量實驗後,從果到於是使用的。
Yin的這篇論文提出了一種叫Bi-CNN-MI
的架構,其中Bi-CNN
表示兩個使用Siamese
框架的CNN模型;MI
表示多粒度的交互特徵。Bi-CNN-MI
包含三個部分:
這部分模型主要使用了上述Kal在2014年提出的模型,針對句子自己提取出四種粒度的特徵表示:詞、短ngram、長ngram和句子粒度。多種粒度的特徵表示是很是必要的,一方面提升模型的性能,另外一方面加強模型的魯棒性。
這部分模型主要是基於2011年Socher提出的RAE模型,作了一些簡化,即僅對同一種粒度下的提取特徵作兩兩比較。
論文提出的模型主要是基於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.
推薦資料
Implementing a CNN for Text Classification in TensorFlow
Kim Y’s Implement: Convolutional Neural Networks for Sentence Classification