卷积神经网络在自然语言处理的应用
卷積神經網絡在自然語言處理的應用
發表于2015-11-13 12:22| 1388次閱讀| 來源WildML| 4 條評論| 作者Denny Britz
自然語言處理神經網絡卷積神經網絡圖像處理CNNNLP width="22" height="16" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-11-11%2F2826192&type=3&count=&appkey=&title=CNN%E4%BD%9C%E4%B8%BA%E5%BD%93%E4%BB%8A%E7%BB%9D%E5%A4%A7%E5%A4%9A%E6%95%B0%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%EF%BC%8C%E5%9C%A8%E5%9B%BE%E5%83%8F%E5%88%86%E7%B1%BB%E9%A2%86%E5%9F%9F%E5%81%9A%E5%87%BA%E4%BA%86%E5%B7%A8%E5%A4%A7%E8%B4%A1%E7%8C%AE%E3%80%82%E6%9C%AC%E6%96%87%E4%BB%8E%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E7%9A%84%E7%94%A8%E4%BE%8B%E5%BC%80%E5%A7%8B%EF%BC%8C%E4%BB%8B%E7%BB%8DCNN%E5%8F%8A%E5%85%B6%E5%9C%A8%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86%E4%B8%AD%E7%9A%84%E4%BC%98%E5%8A%BF%E5%92%8C%E5%8F%91%E6%8C%A5%E7%9A%84%E4%BD%9C%E7%94%A8%E3%80%82&pic=&ralateUid=&language=zh_cn&rnd=1447593975593" frameborder="0" scrolling="no" allowtransparency="true">摘要:CNN作為當今絕大多數計算機視覺系統的核心技術,在圖像分類領域做出了巨大貢獻。本文從計算機視覺的用例開始,介紹CNN及其在自然語言處理中的優勢和發揮的作用。當我們聽到卷積神經網絡(Convolutional?Neural?Network,?CNNs)時,往往會聯想到計算機視覺。CNNs在圖像分類領域做出了巨大貢獻,也是當今絕大多數計算機視覺系統的核心技術,從Facebook的圖像自動標簽到自動駕駛汽車都在使用。
最近我們開始在自然語言處理(Natural?Language?Processing)領域應用CNNs,并取得了一些引人注目的成果。我將在本文中歸納什么是CNNs,怎樣將它們應用于NLP。CNNs背后的直覺知識在計算機視覺的用例里更容易被理解,因此我就先從那里開始,然后慢慢過渡到自然語言處理。
什么是卷積運算?
對我來說,最容易的理解方式就是把卷積想象成作用于矩陣的一個滑動窗口函數。這么說有些拗口,但是用動畫顯示就很直觀了。
3x3的濾波器做卷積運算。圖片來源:?http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution
把左側的矩陣想象成一幅黑白圖像。每一個元素對應一個像素點,0表示黑點,1表示白點(灰度圖的像素值一般是0~255)。移動窗口又稱作核、濾波器或是特征檢測器。這里我們使用3x3的濾波器,將濾波器與矩陣對應的部分逐元素相乘,然后求和。我們平移窗口,使其掃過矩陣的所有像素,對整幅圖像做卷積運算。
你也許有些疑惑,剛才的操作究竟會有什么效果呢。我們就來看幾個直觀的例子。
用鄰近點像素值的均值替換其原值,實現圖像模糊的效果:
? ? ? ? ? ??
用鄰近點像素值與自身的差值替換其原值,實現邊緣檢測的效果:
(為了直觀地來理解,想想圖像中平滑的那些部分,那些像素點與周圍像素的顏色幾乎一致:求和的結果趨近于0,相當于黑色。如果有一條明顯的邊緣線,比如黑白分界線,那么像素值的差值將會很大,相當于白色)
??
GIMP手冊里還有一些其它的例子。想要深入了解卷積運算的原理,我推薦閱讀Chris?Olah寫的專題博客。
什么是卷積神經網絡?
現在你明白了什么是卷積運算了吧。那CNNs又是什么呢?CNNs本質上就是多層卷積運算,外加對每層的輸出用非線性激活函數做轉換,比如用ReLU和tanh。在傳統的前饋神經網絡中,我們把每個輸入神經元與下一層的輸出神經元相連接。這種方式也被稱作是全連接層,或者仿射層。在CNNs中我們不這樣做,而是用輸入層的卷積結果來計算輸出。這相當于是局部連接,每塊局部的輸入區域與輸出的一個神經元相連接。對每一層應用不同的濾波器,往往是如上圖所示成百上千個,然后匯總它們的結果。這里也涉及到池化層(降采樣),我會在后文做解釋。在訓練階段,CNN基于你想完成的任務自動學習濾波器的權重值。舉個例子,在圖像分類問題中,第一層CNN模型或許能學會從原始像素點檢測到一些邊緣線條,然后根據邊緣線條在第二層檢測出一些簡單的形狀,然后基于這些形狀檢測出更高級的特征,比如臉部輪廓等。最后一層是利用這些高級特征的一個分類器。
這種計算方式有兩點值得我們注意:位置不變性和組合性。比如說你想對圖片中是否包含大象做分類。因為濾波器是在全圖范圍內平移,所以并不用關心大象究竟在圖片的什么位置。事實上,池化也有助于平移、旋轉和縮放的不變性,它對克服縮放因素的效果尤其好。第二個關鍵因素是(局部)組合性。每個濾波器對一小塊局部區域的低級特征組合形成更高級的特征表示。這也是CNNs對計算機視覺作用巨大的原因。我們可以很直觀地理解,線條由像素點構成,基本形狀又由線條構成,更復雜的物體又源自基本的形狀。
那么,如何將它們用于NLP呢?
NLP任務的輸入不再是像素點了,大多數情況下是以矩陣表示的句子或者文檔。矩陣的每一行對應于一個分詞元素,一般是一個單詞,也可以是一個字符。也就是說每一行是表示一個單詞的向量。通常,這些向量都是word?embeddings(一種底維度表示)的形式,如word2vec和GloVe,但是也可以用one-hot向量的形式,也即根據詞在詞表中的索引。若是用100維的詞向量表示一句10個單詞的句子,我們將得到一個10x100維的矩陣作為輸入。這個矩陣相當于是一幅“圖像”。
在計算機視覺的例子里,我們的濾波器每次只對圖像的一小塊區域運算,但在處理自然語言時濾波器通常覆蓋上下幾行(幾個詞)。因此,濾波器的寬度也就和輸入矩陣的寬度相等了。盡管高度,或者區域大小可以隨意調整,但一般滑動窗口的覆蓋范圍是2~5行。綜上所述,處理自然語言的卷積神經網絡結構是這樣的(花幾分鐘時間理解這張圖片,以及維度是如何變化的。你可以先暫時忽略池化操作,我們在稍后會解釋它):
用于句子分類器的卷積神經網絡(CNN)結構示意圖。這里我們對濾波器設置了三種尺寸:2、3和4行,每種尺寸各有兩種濾波器。每個濾波器對句子矩陣做卷積運算,得到(不同程度的)特征字典。然后對每個特征字典做最大值池化,也就是只記錄每個特征字典的最大值。這樣,就由六個字典生成了一串單變量特征向量(univariate?feature?vector),然后這六個特征拼接形成一個特征向量,傳給網絡的倒數第二層。最后的softmax層以這個特征向量作為輸入,用其來對句子做分類;我們假設這里是二分類問題,因此得到兩個可能的輸出狀態。來源:Zhang,?Y.,?&?Wallace,?B.?(2015).?A?Sensitivity?Analysis?of?(and?Practitioners’?Guide?to)?Convolutional?Neural?Networks?for?Sentence?Classification.
計算機視覺完美的直觀感受這里還存在嗎?位置不變性和局部組合性對圖像來說很直觀,但對NLP卻并非如此。你也許會很在意一個詞在句子中出現的位置。相鄰的像素點很有可能是相關聯的(都是物體的同一部分),但單詞并不總是如此。在很多種語言里,短語之間會被許多其它詞所隔離。同樣,組合性也不見得明顯。單詞顯然是以某些方式組合的,比如形容詞修飾名詞,但若是想理解更高級特征真正要表達的含義是什么,并不像計算機視覺那么明顯了。
由此看來,卷積神經網絡似乎并不適合用來處理NLP任務。遞歸神經網絡(Recurrent?Neural?Network)更直觀一些。它們模仿我們人類處理語言的方式(至少是我們自己所認為的方式):從左到右的順序閱讀。慶幸的是,這并不意味著CNNs沒有效果。所有的模型都是錯的,只是一些能被利用。實際上CNNs對NLP問題的效果非常理想。正如詞袋模型(Bag?of?Words?model),它明顯是基于錯誤假設的過于簡化模型,但這不影響它多年來一直被作為NLP的標準方法,并且取得了不錯的效果。
CNNs的主要特點在于速度快。非常的快。卷積運算是計算機圖像的核心部分,在GPU級別的硬件層實現。相比于n-grams,CNNs表征方式的效率也更勝一籌。由于詞典龐大,任何超過3-grams的計算開銷就會非常的大。即使Google也最多不超過5-grams。卷積濾波器能自動學習好的表示方式,不需要用整個詞表來表征。那么用尺寸大于5行的濾波器完全合情合理了。我個人認為許多在第一層學到的濾波器撲捉到的特征與n-grams非常相似(但不局限),但是以更緊湊的方式表征。
CNN的超參數
在解釋如何將CNNs用于NLP任務之前,先來看一下構建CNN網絡時需要面臨的幾個選擇。希望這能幫助你更好地理解相關文獻。
窄卷積?vs?寬卷積
在上文中解釋卷積運算的時候,我忽略了如何使用濾波器的一個小細節。在矩陣的中部使用3x3的濾波器沒有問題,在矩陣的邊緣該怎么辦呢?左上角的元素沒有頂部和左側相鄰的元素,該如何濾波呢?解決的辦法是采用補零法(zero-padding)。所有落在矩陣范圍之外的元素值都默認為0。這樣就可以對輸入矩陣的每一個元素做濾波了,輸出一個同樣大小或是更大的矩陣。補零法又被稱為是寬卷積,不使用補零的方法則被稱為窄卷積。1D的例子如圖所示:
窄卷積?vs?寬卷積。濾波器長度為5,輸入長度為7。來源:A?Convolutional?Neural?Network?for?Modelling?Sentences?(2014)
當濾波器長度相對輸入向量的長度較大時,你會發現寬卷積很有用,或者說很有必要。在上圖中,窄卷積輸出的長度是?(7-5)+1=3,寬卷積輸出的長度是(7+2*4-5)+1=11。一般形式為
步長
卷積運算的另一個超參數是步長,即每一次濾波器平移的距離。上面所有例子中的步長都是1,相鄰兩個濾波器有重疊。步長越大,則用到的濾波器越少,輸出的值也越少。下圖來自斯坦福的cs231課程網頁,分別是步長為1和2的情況:
卷積步長。左側:步長為1,右側:步長為2。來源:?http://cs231n.github.io/convolutional-networks/
在文獻中我們常常見到的步長是1,但選擇更大的步長會讓模型更接近于遞歸神經網絡,其結構就像是一棵樹。
池化層
卷積神經網絡的一個重要概念就是池化層,一般是在卷積層之后。池化層對輸入做降采樣。常用的池化做法是對每個濾波器的輸出求最大值。我們并不需要對整個矩陣都做池化,可以只對某個窗口區間做池化。例如,下圖所示的是2x2窗口的最大值池化(在NLP里,我們通常對整個輸出做池化,每個濾波器只有一個輸出值):
CNN的最大池化。來源:?http://cs231n.github.io/convolutional-networks/#pool
為什么要池化呢?有許多原因。?
池化的特點之一就是它輸出一個固定大小的矩陣,這對分類問題很有必要。例如,如果你用了1000個濾波器,并對每個輸出使用最大池化,那么無論濾波器的尺寸是多大,也無論輸入數據的維度如何變化,你都將得到一個1000維的輸出。這讓你可以應用不同長度的句子和不同大小的濾波器,但總是得到一個相同維度的輸出結果,傳入下一層的分類器。
池化還能降低輸出結果的維度,(理想情況下)卻能保留顯著的特征。你可以認為每個濾波器都是檢測一種特定的特征,例如,檢測句子是否包含諸如“not?amazing”等否定意思。如果這個短語在句子中的某個位置出現,那么對應位置的濾波器的輸出值將會非常大,而在其它位置的輸出值非常小。通過采用取最大值的方式,能將某個特征是否出現在句子中的信息保留下來,但是無法確定它究竟在句子的哪個位置出現。這個信息出現的位置真的很重要嗎?確實是的,它有點類似于一組n-grams模型的行為。盡管丟失了關于位置的全局信息(在句子中的大致位置),但是濾波器捕捉到的局部信息卻被保留下來了,比如“not?amazing”和“amazing?not”的意思就大相徑庭。
在圖像識別領域,池化還能提供平移和旋轉不變性。若對某個區域做了池化,即使圖像平移/旋轉幾個像素,得到的輸出值也基本一樣,因為每次最大值運算得到的結果總是一樣的。
通道
我們需要了解的最后一個概念是通道。通道即是輸入數據的不同“視角”。比如說,做圖像識別時一般會用到RGB通道(紅綠藍)。你可以對每個通道做卷積運算,賦予相同或不同的權值。你也同樣可以把NLP想象成有許多個通道:把不同類的詞向量表征(例如word2vec和GloVe)看做是獨立的通道,或是把不同語言版本的同一句話看作是一個通道。
卷積神經網絡在自然語言處理的應用
我們接下來看看卷積神經網絡模型在自然語言處理領域的實際應用。我試圖去概括一些研究成果。希望至少能夠涵蓋大部分主流的成果,難免也會遺漏其它一些有意思的應用(請在評論區提醒我)。
最適合CNNs的莫過于分類任務,如語義分析、垃圾郵件檢測和話題分類。卷積運算和池化會丟失局部區域某些單詞的順序信息,因此純CNN的結構框架不太適用于PoS?Tagging和Entity?Extraction等順序標簽任務(也不是不可能,你可以嘗試輸入位置相關的特征)。
文獻[1>在不同的分類數據集上評估CNN模型,主要是基于語義分析和話題分類任務。CNN模型在各個數據集上的表現非常出色,甚至有個別刷新了目前最好的結果。令人驚訝的是,這篇文章采用的網絡結構非常簡單,但效果相當棒。輸入層是一個表示句子的矩陣,每一行是word2vec詞向量。接著是由若干個濾波器組成的卷積層,然后是最大池化層,最后是softmax分類器。該論文也嘗試了兩種不同形式的通道,分別是靜態和動態詞向量,其中一個通道在訓練時動態調整而另一個不變。文獻[2]中提到了一個類似的結構,但更復雜一些。文獻[6]在網絡中又額外添加了一個層,用于語義聚類。
Kim,?Y.?(2014).?卷積神經網絡用來語句分類
文獻[4]從原始數據訓練CNN模型,不需要預訓練得到word2vec或GloVe等詞向量表征。它直接對one-hot向量進行卷積運算。作者對輸入數據采用了節省空間的類似詞袋表征方式,以減少網絡需要學習的參數個數。在文獻[5]中作者用了CNN學習得到的非監督式“region?embedding”來擴展模型,預測文字區域的上下文內容。這些論文中提到的方法對處理長文本(比如影評)非常有效,但對短文本(比如推特)的效果還不清楚。憑我的直覺,對短文本使用預訓練的詞向量應該能比長文本取得更好的效果。
搭建一個CNN模型結構需要選擇許多個超參數,我在上文中已經提到了一些:輸入表征(word2vec,?GloVe,?one-hot),卷積濾波器的數量和尺寸,池化策略(最大值、平均值),以及激活函數(ReLU,?tanh)。文獻[7]通過多次重復實驗,比較了不同超參數對CNN模型結構在性能和穩定性方面的影響。如果你想自己實現一個CNN用于文本分類,可以借鑒該論文的結果。其主要的結論有最大池化效果總是好于平均池化;選擇理想的濾波器尺寸很重要,但也根據任務而定需;正則化在NLP任務中的作用并不明顯。需要注意的一點是該研究所用文本集里的文本長度都相近,因此若是要處理不同長度的文本,上述結論可能不具有指導意義。
文獻[8]探索了CNNs在關系挖掘和關系分類任務中的應用。除了詞向量表征之外,作者還把詞與詞的相對位置作為卷積層的輸入值。這個模型假設了所有文本元素的位置已知,每個輸入樣本只包含一種關系。文獻[9]和文獻[10]使用的模型類似。
來自微軟研究院的文獻[11]和?[12]介紹了CNNs在NLP的另一種有趣的應用方式。這兩篇論文介紹了如何學習將句子表示成包含語義的結構,它能被用來做信息檢索。論文中給出的例子是基于用戶當前的閱讀內容,為其推薦其它感興趣的文檔。句子的表征是基于搜索引擎的日志數據訓練得到的。
大多數CNN模型以這樣或是那樣的訓練方式來學習單詞和句子的詞向量表征,它是訓練過程的一部分。并不是所有論文都關注這一步訓練過程,也并不在乎學到的表征意義有多大。文獻[13]介紹了用CNN模型對Facebook的日志打標簽。這些學到的詞向量隨后又被成功應用于另一個任務?——?基于點擊日志給用戶推薦感興趣的文章。
字符層面的CNNs模型
至此,所有的模型表征都是在單詞的層面上。另外有一些團隊則研究如何將CNNs模型直接用于字符。文獻[14]學到了字符層面的向量表征,將它們與預訓練的詞向量結合,用來給語音打標簽。文獻[15]和[16]研究了直接用CNNs模型直接從字符學習,而不必預訓練詞向量了。值得注意的是,作者使用了一個相對較深的網絡結構,共有9層,用來完成語義分析和文本分類任務。結果顯示,用字符級輸入直接在大規模數據集(百萬級)上學習的效果非常好,但用簡單模型在小數據集(十萬級)上的學習效果一般。文獻[17]是關于字符級卷積運算在語言建模方面的應用,將字符級CNN模型的輸出作為LSTM模型每一步的輸入。同一個模型用于不同的語言。
令人驚訝的是,上面所有論文幾乎都是發表于近兩年。顯然CNNs模型在NLP領域已經有了出色的表現,新成果和頂級系統還在層出不窮地出現。
若有疑問或是反饋,請在評論區留言。謝謝閱讀!?
參考文獻
?[1]?Kim,?Y.?(2014).?Convolutional?Neural?Networks?for?Sentence?Classification.?Proceedings?
of?the?2014?Conference?on?Empirical?Methods?in?Natural?Language?Processing?(EMNLP?2014),?1746–1751.
?[2]?Kalchbrenner,?N.,?Grefenstette,?E.,?&?Blunsom,?P.?(2014).?A?Convolutional?Neural
?Network?for?Modelling?Sentences.?Acl,?655–665.
?[3]?Santos,?C.?N.?dos,?&?Gatti,?M.?(2014).?Deep?Convolutional?Neural?Networks
?for?Sentiment?Analysis?of?Short?Texts.?In?COLING-2014?(pp.?69–78).
?[4]?Johnson,?R.,?&?Zhang,?T.?(2015).?Effective?Use?of?Word?Order?for?Text?
Categorization?with?Convolutional?Neural?Networks.?To?Appear:?NAACL-2015,?(2011).
?[5]?Johnson,?R.,?&?Zhang,?T.?(2015).?Semi-supervised?Convolutional?Neural?Networks?for?Text?Categorization?via?Region?Embedding.
?[6]?Wang,?P.,?Xu,?J.,?Xu,?B.,?Liu,?C.,?Zhang,?H.,?Wang,?F.,?&?Hao,?H.?(2015).?Semantic?
Clustering?and?Convolutional?Neural?Network?for?Short?Text?Categorization.?Proceedings?ACL?2015,?352–357.
?[7]?Zhang,?Y.,?&?Wallace,?B.?(2015).?A?Sensitivity?Analysis?of?(and?Practitioners’?Guide?to)
?Convolutional?Neural?Networks?for?Sentence?Classification,
?[8]Nguyen,?T.?H.,?&?Grishman,?R.?(2015).?Relation?Extraction:?Perspective?from?Convolutional
?Neural?Networks.?Workshop?on?Vector?Modeling?for?NLP,?39–48.
?[9]?Sun,?Y.,?Lin,?L.,?Tang,?D.,?Yang,?N.,?Ji,?Z.,?&?Wang,?X.?(2015).?Modeling?Mention?,?Context
?and?Entity?with?Neural?Networks?for?Entity?Disambiguation,?(Ijcai),?1333–1339.
?[10]?Zeng,?D.,?Liu,?K.,?Lai,?S.,?Zhou,?G.,?&?Zhao,?J.?(2014).?Relation?Classification?via
?Convolutional?Deep?Neural?Network.?Coling,?(2011),?2335–2344.?
?[11]?Gao,?J.,?Pantel,?P.,?Gamon,?M.,?He,?X.,?&?Deng,?L.?(2014).?Modeling?Interestingness?with?Deep?Neural?Networks.
?[12]Shen,?Y.,?He,?X.,?Gao,?J.,?Deng,?L.,?&?Mesnil,?G.?(2014).?A?Latent?Semantic?Model?with?Convolutional-Pooling?Structure?for?Information?Retrieval.?Proceedings?of?the?23rd?ACM?International?Conference?on
?Conference?on?Information?and?Knowledge?Management?–?CIKM?’14,?101–110.?
[13]Weston,?J.,?&?Adams,?K.?(2014).?#?T?AG?S?PACE?:?Semantic?Embeddings?from?Hashtags,?1822–1827.
[14]?Santos,?C.,?&?Zadrozny,?B.?(2014).?Learning?Character-level?Representations?for?Part-of-Speech?Tagging.?Proceedings?of?the?31st?International?Conference?on?Machine?Learning,?ICML-14(2011),?1818–1826.?
[15]?Zhang,?X.Zhao,?J.,?&?LeCun,?Y.?(2015).?Character-level?Convolutional?Networks?for?Text?Classification,?1–9.
[16]?Zhang,?X.,?&?LeCun,?Y.?(2015).?Text?Understanding?from?Scratch.?arXiv?E-Prints,?3,?011102.
[17]?Kim,?Y.,?Jernite,?Y.,?Sontag,?D.,?&?Rush,?A.?M.?(2015).?Character-Aware?Neural?Language?Models.
總結
以上是生活随笔為你收集整理的卷积神经网络在自然语言处理的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一看就明白的爬虫入门讲解:基础理论篇
- 下一篇: 巴黎事件发生后,Facebook、Twi