【NLP】瞭解用於NLP的卷積神經網路(譯)

widiot1發表於2018-01-27

原文:Understanding Convolutional Neural Networks for NLP
作者:DENNY BRITZ
時間:2015/11/7

瞭解用於NLP的卷積神經網路


當我們聽到卷積神經網路(Convolutional Neural Network)時,我們通常會想到計算機視覺。從 Facebook 的自動標記照片到自動駕駛汽車,CNNs 在影象分類方面有重大突破,並且是當今大多數計算機視覺系統的核心。

最近,我們也開始將 CNNs 應用於自然語言處理中的問題,並得到了一些有趣的結果。在這篇文章中,我將嘗試總結一下 CNNs 是什麼,以及它們在 NLP 中的用法。CNNs 背後的直覺對於計算機視覺用例來說是比較容易理解的,所以我會從這裡開始,然後慢慢地轉向 NLP。

什麼是卷積?


對於我來說,理解卷積最簡單的方法就是把它看作是應用於矩陣的滑動視窗函式。這很拗口,但視覺化後看起來就很清晰:


與3×3濾波器卷積。圖片來源:
http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution

想象一下,左邊的矩陣表示黑白影象。每個條目對應一個畫素,0 表示黑色,1 表示白色(灰度影象的典型值在 0 到 255 之間)。滑動視窗被稱為核心(kernel)、過濾器(filter)或特徵檢測器(feature detector)。 這裡我們使用一個 3×3 的過濾器,將它的值乘以原始矩陣,然後將它們相加。為了得到完整的卷積,我們通過在整個矩陣上滑動過濾器來為每個元素做相同的操作。

你可能想知道你可以用這個做什麼。這裡有一些直觀的例子。

平均每個畫素與其相鄰的畫素值用於模糊影象:

取畫素與其相鄰畫素之間的差異檢測邊界:
(為了直觀地理解這一點,考慮一下影象中平滑的部分,畫素的顏色等於其鄰居的顏色:加法消除,結果值為 0 或黑色。如果亮度尖銳,例如從白色到黑色的過渡,會產生很大的差異,併產生白色的值)

GIMP手冊 有一些其他的例子。要更多地瞭解卷積如何工作,我還建議檢視 Chris Olah 在該話題上的文章。

什麼是卷積神經網路?


現在你知道什麼是卷積。但是 CNNs 呢?CNNs 基本上只是幾層具有非線性啟用函式的卷積, 如 ReLUtanh 應用於結果。在傳統的前饋神經網路中,我們將每個輸入神經元連線到下一層中的每個輸出神經元。這也被稱為完全連線層,或仿射層。在 CNNs 我們不這樣做。相反,我們使用輸入層上的卷積來計算輸出。這導致了區域性連線,其中輸入的每個區域連線到輸出中的神經元。 每層應用不同的過濾器,通常是數百或數千個,如上所示,並結合其結果。還有一些東西叫池化(subsampling)層,我會在稍後介紹。在訓練階段,CNNs 根據你想要執行的任務自動學習過濾器的值。例如,在影象分類中,CNNs 可以學習從第一層中的原始畫素檢測邊緣,然後使用邊緣檢測第二層中的簡單形狀,然後使用這些形狀來檢測(原文deter不知道是不是typo)更高階的特徵,例如面部形狀在更高層。最後一層是使用這些高層特徵的分類器。


卷積神經網路(Clarifai)

這個計算有兩個方面值得關注:位置不變性和組合性。假設你想分辨一幅影象中是否有一頭大象。因為你在整個影象上滑動你的過濾器,所以你並不在乎大象在哪裡出現。在實踐中, 池化還可以讓你不受平移、旋轉和縮放的影響,但是在後面更多。第二個關鍵方面是(區域性)組合性。每個過濾器組成將較低階別特徵的區域性補丁轉換為更高階的表示。這就是 CNNs 在計算機視覺領域如此強大的原因。從直觀的角度來看,你可以從畫素、邊緣形狀以及形狀中更復雜的物件構建邊緣。

那麼,這些如何適用於 NLP 呢?

大多數 NLP 任務的輸入不是影象畫素,而是以矩陣表示的句子或文件。矩陣的每一行對應一個標記,通常是一個單詞,但它也可以是一個字元。也就是說,每一行都是代表一個單詞的向量。通常這些向量是像 word2vecGloVe 這樣的詞嵌入(低維表示),但是它們也可以是將單詞索引到詞彙表中的一個 one-hot 向量。對於使用 100 維嵌入的 10 個字的句子,我們將有一個 10×100 的矩陣作為我們的輸入。這就是是我們的“影象”。

在計算機視覺上,我們的過濾器在影象的區域性區域上滑動,但是在 NLP 中,我們通常使用滑過整行矩陣(單詞)的過濾器。因此,我們的濾波器的“寬度”通常與輸入矩陣的寬度相同。高度或區域大小可能會有所不同,通常使用一次滑動 2-5 個字的視窗。綜合以上所述,一個用於 NLP 的卷積神經網路可能看起來像這樣(花幾分鐘,試著理解這幅圖,以及這些維是如何計算的,現在可以忽略池化,我們將在後面解釋):

用於句子分類的卷積神經網路(CNN)體系結構圖。 這裡我們描述了三個過濾器的大小:2,3和4,每個大小都有2個過濾器。 每個過濾器對句子矩陣執行卷積並生成(可變長度)特徵對映。 然後在每個特徵圖上執行1-max池化,即記錄來自每個特徵圖的最大數。 因此,從六個特徵圖生成一元特徵向量,並且這六個特徵被連線以形成倒數第二層的特徵向量。 最後的softmax層接收這個特徵向量作為輸入,並用它來分類句子;這裡我們假設二進位制分類,因此描述了兩種可能的輸出狀態。 來源:Zhang, Y., & Wallace, B. (2015). A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification.

那麼我們對於計算機視覺的直覺呢?位置不變性和區域性合成對於影象來說是直觀的,但對於 NLP 來說並不那麼重要。你可能會在句子出現的地方做很多事情。彼此靠近的畫素可能在語義上是相關的(同一物件的一部分),但對於單詞而言,這並不總是對的。在很多語言中,部分短語可以被其他幾個詞分開。組合性方面也不明顯。顯然,在某些方面,詞彙構成了一個名詞形式的修飾形式,但是這個形式究竟是如何運作的,更高層次的表達實際上“意味著什麼”並不像計算機視覺中的那樣明顯。

考慮到這一切,CNNs 似乎不太適合 NLP 任務。迴圈神經網路(Recurrent Neural Networks)更直觀。它們類似於我們如何處理語言(或者至少我們如何認為我們處理語言):從左至右依次閱讀。幸運的是,這並不意味著 CNNs 不起作用。所有模型都是錯誤的,但有些是有用的。事實證明,應用於 NLP 問題的 CNNs 表現相當不錯。簡單的詞袋模型 是一個明顯過分簡化的假設,但卻是多年來的標準方法,取得了相當不錯的成績。

CNN的一個重要論點是,它們很快。非常快。卷積是計算機圖形的核心部分,並在 GPUs 上的硬體級別上實現。與 n-grams 相比,CNNs 在表達方面也是有效的。有了大量的詞彙,計算超過 3-grams 的任何東西都可能很快變得昂貴。即使是 Google 也不提供超過 5-grams 的任何東西。卷積過濾器自動學習好的表徵,而不需要表示整個詞彙表。我認為,第一層中的許多學習過濾器捕獲與 n-gram 非常相似(但不限於)的特徵,但是以更緊湊的方式表示它們。

CNN 超引數


在解釋如何將 CNNs 應用到 NLP 任務之前,讓我們看看在構建 CNNs 時需要做的一些選擇。希望這會幫助你更好地理解這個領域的文獻。

窄卷積 vs. 寬卷積

當我解釋上面的卷積時,忽略瞭如何應用過濾器的一些細節。在矩陣的中心應用一個 3×3 的過濾器可以正常工作,但是邊緣怎麼樣?你將如何把過濾器應用到矩陣的第一個元素,它的頂部和左側沒有任何相鄰的元素?你可以使用零填充。所有將落在矩陣之外的元素都取為零。通過這樣做,您可以將過濾器應用於輸入矩陣的每個元素,並獲得更大或相同大小的輸出。新增零填充也被稱為寬卷積,而不使用零填充將是一個窄卷積。1D 中的一個例子如下所示:

窄與寬卷積。 來源:A Convolutional Neural Network for Modelling Sentences (2014)

你可以看到當你有一個相對於輸入大小的大過濾器時,寬卷積是有用的,甚至是必要的。在上面,窄卷積產生尺寸輸出為:(7-5)+ 1 = 3;寬卷積尺寸輸出為:(7 + 2 * 4 - 5)+ 1 = 11。更一般地說,輸出大小的公式是

步長大小

卷積的另一個超引數是步長大小,定義你想在每一步移動你的過濾器的數量。在上面所有的例子中,步長大小都是 1,並且過濾器的連續應用是重疊的。較大的步長導致較少的過濾器應用和較小的輸出尺寸。來自 Stanford cs231 website 的以下內容顯示了 1 和 2 的步長大小適用於一維輸入:

卷積步幅大小。 左:步幅 1;右:步幅 2。資料來源:http://cs231n.github.io/convolutional-networks/

在文獻中,我們通常會看到步幅為 1,但更大的步幅可能允許您建立一個與遞迴神經網路有點相似的模型,即看起來像一棵樹。

池化層

卷積神經網路的一個關鍵方面是池化層, 通常應用在卷積層之後。池化層對其輸入進行子取樣。最常用的方法是將 max 操作應用於每個過濾器的結果。你不一定需要把整個矩陣放在一起,你也可以把它放在一個視窗上。例如,以下顯示了 2×2 視窗的最大池化(在 NLP 中,我們通常將整個輸出應用於池化,每個過濾器只產生一個數字):

在CNN最大化池。資料來源:http://cs231n.github.io/convolutional-networks/#pool

為什麼要池化?有幾個原因。池化的一個特性是它提供了一個固定大小的輸出矩陣,這通常是分類所必需的。例如,如果你有 1000 個過濾器,並且將最大池化應用於每個過濾器,則無論過濾器的大小或輸入的大小如何,都將獲得 1000 維輸出。這使您可以使用可變大小的句子和可變大小的過濾器,但始終可以獲得相同的輸出大小以輸入分類器。

池化也會降低輸出的維度,但是(希望)會保留最顯著的資訊。你可以將每個過濾器都視為檢測某個特定特徵,例如檢測句子是否包含“not amazing”等否定。如果這個短語出現在句子的某個地方,那麼將過濾器應用到該區域的結果將會產生一個大的值,而在其他的區域中則會產生一個小的值。通過執行最大池化操作,你可以儲存有關該特徵是否出現在句子中的資訊,但是你正在丟失關於它出現的位置的資訊。但這不是關於地方的資訊真的有用嗎?是的,這和詞袋 n-gram 模型有點相似。你正在失去關於地方的全域性資訊(在一個句子中發生了什麼),但你保持由你的過濾器獲取的區域性資訊,如”not amazing”是非常不同於”amazing not”的。

在想象認識中,池化還提供了平移(移位)和旋轉的基本不變性。當你在一個區域上池化時,即使你將影象移位/旋轉幾個畫素,輸出也將保持大致相同,因為無論如何執行 max 操作都會選取相同的值。

通道

我們需要了解的最後一個概念是通道。通道是你的輸入資料的不同的“檢視”。例如,在影象識別中,通常有 RGB(紅,綠,藍)通道。你可以跨通道應用卷積,可以使用不同或相等的權重。在 NLP 中,你可以想象有不同的通道:你可以有不同的單詞嵌入通道(例如 word2vec 和 GloVe),或者你可以為不同語言表達的同一句子建立一個通道,或者用不同的方式表達不同的通道。

卷積神經網路應用於 NLP


現在我們來看看 CNNs 在自然語言處理中的一些應用。我將嘗試總結一些研究成果。我總是會錯過許多有趣的應用程式(請在評論中告訴我),但我希望至少涵蓋一些更受歡迎的結果。

對於 CNNs 來說,最自然的選擇似乎是分類任務,如情感分析,垃圾郵件檢測或主題分類。卷積和池化操作會丟失有關本地字詞順序的資訊,因此像 PoS 標記或實體提取中的序列標記有點難以適應純粹的 CNNs 體​​繫結構(儘管不是不可能的,你可以向輸入新增位置特徵)。

[1]在各種分類資料集上評估 CNNs 體系結構,主要由情感分析和主題分類任務組成。CNNs 體系結構在資料集之間取得了非常好的效能,並且在一些資料集上還有最新的技術。令人驚訝的是,本文使用的網路非常簡單,這就是它的強大之處。輸入層是一個由連線的 word2vec 單詞嵌入。接下來是一個帶有多個過濾器的卷積層,然後是一個最大池化層,最後是一個 softmax 分類器。本文還以靜態和動態詞嵌入的形式對兩個不同的通道進行了實驗,其中一個通道在訓練期間進行了調整,另一個則沒有。文獻[2]中曾經提出過一個類似但是比較複雜的結構。[6]新增一個額外的層,執行“語義聚類”到這個網路架構。

Kim,Y.(2014)。卷積神經網路用於句子分類

[4]從零開始訓練 CNNs,而不需要像 word2vec 或 GloVe 這樣的預先訓練的詞向量。它將卷積直接應用於一個 one-hot 向量。作者還為輸入資料提出了一種節省空間的詞袋錶示法,減少了網路需要學習的引數數量。在[5]作者擴充套件模型與另外一個無監督的“區域嵌入”,這是通過使用 CNNs 預測文字區域的上下文來學習的。這些論文中的方法似乎對於長篇文字(如電影評論)來說效果不錯,但是他們在短文字(比如推文)上的表現還不清楚。直觀地說,對於短文字使用預先訓練的單詞嵌入會比使用長文字產生更大的收益。

構建一個 CNN 體系結構意味著有許多超引數可供選擇,其中一些是我在上面介紹的:輸入表示(word2vec,GloVe,one-hot),卷積過濾器的數量和大小,池化策略(最大值,平均值)和啟用函式(ReLU,tanh)。[7]對 CNN 體系結構中各種超引數的影響進行了實證評估,研究了它們在多次執行中對效能和方差的影響。如果你正在尋求實現你自己的 CNN 文字分類,以本文的結果為出發點將是一個很好的主意。一些突出的結果是,最大池化總是擊敗平均池化,理想的過濾器大小是重要的,但任務依賴,正則化似乎並沒有在所考慮的 NLP 任務大大不同。

[8]探討 CNNs 的關係提取和關係分類任務。除了單詞向量之外,作者還使用詞的相對位置作為卷積層的輸入。這個模型假設實體的位置是給定的,並且每個示例輸入包含一個關係。[9]和[10]探索了類似的模型。

另外一個有趣的使用情況是 NLP 中的 CNNs 可以在[11]和[12]中找到。這些論文描述瞭如何學習可用於資訊檢索的句子的語義上有意義的表示。論文中給出的例子包括根據使用者正在閱讀的內容向使用者推薦可能感興趣的文件。句子表示是根據搜尋引擎日誌資料進行訓練的。

大多數 CNN 體系結構都以某種方式學習單詞和句子的嵌入(低維表示)作為其訓練過程的一部分。並不是所有的論文都把重點放在訓練的這個方面,或者研究學習嵌入的意義。[13]提出了 CNN 架構來預測 Facebook 帖子的主題標籤,同時為單詞和句子生成有意義的嵌入。 然後將這些學習到的嵌入成功地應用於另一項任務 - 向使用者推薦可能感興趣的文件,並根據點選流資料進行培訓。

字元級CNN

到目前為止,所有提供的模型都是基於單詞的。但也有一些將 CNNs 直接應用於字元的研究。學習字元級別的嵌入,將它們與預先訓練的單詞嵌入相結合,並將 CNNs 用於詞性標註。[15] [16]探索使用 CNNs 直接從字元學習,而不需要任何預先訓練的嵌入。值得注意的是,作者使用了總共​​9層的相對較深的網路,並將其應用於情感分析和文字分類任務。結果顯示,直接從字元級輸入學習在大型資料集(數百萬個示例)上工作得非常好,但是在較小的資料集(數十萬個示例)上表現不佳。[17]探討了字元級卷積在語言建模中的應用,在每個時間步使用字元級 CNNs 的輸出作為 LSTM 的輸入。相同的模型適用於各種語言。

令人驚奇的是,基本上所有的論文都是在過去的1 - 2年內發表的。很顯然,在自然語言處理(幾乎是從頭開始)之前,與 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.

相關文章