文字分類之深度學習應用總結
總覽
本教程分為五個部分,分別是:
- 詞嵌入(Word Embeddings) + 卷積神經網路(CNN,Convolutional Neural Network) = 文字分類
- 使用一個單層 CNN 架構
- 調整 CNN 超引數
- 考慮字元級的 CNN
- 考慮用更深層的 CNN 進行分類
1.詞嵌入 + CNN = 文字分類
文字分類的操作方法包括:使用詞嵌入來表示單詞,使用卷積神經網路(CNN)來學習如何辨別分類問題中的文字。
在 Yoav Goldberg 的關於自然語言處理的深度學習的入門書中,他評論道,神經網路通常比傳統的線性分類器具有更好的效能,特別是將其與預訓練過的詞嵌入結合使用時。
網路的非線性,及其易整合預先訓練的詞嵌入的能力,使得它通常具有更高的分類準確性。
他還評論道,卷積神經網路對於文字分類有效的,這是因為它們能夠在不改變輸入序列的位置的情況下提取出顯著的特徵(例如詞 [譯者注:Token,在自然語言處理中,它表示對句子分詞後得到的單個詞] 或詞序列)。
具有卷積層和池化(Pooling)層的網路對於分類任務非常有用,我們希望在分類任務中找到關於類成員的強力區域性線索,但這些線索可以在輸入資料中的不同位置出現。[...] 我們想知道,哪些字詞序列是關於該話題的很好的指標,但並不一定會關心它們在文字中出現的位置。卷積層和池化層使得模型可以學習到找到這種區域性指標的能力,同時忽略它們所在的位置。
因此,該架構由三個關鍵部分組成:
- 詞嵌入(Word Embedding)
- 卷積模型(Convolutional Model):一種特徵提取模型,這種模型可學習從使用詞嵌入表示的文字中提取顯著特徵。
- 全連線模型(Fully Connected Model):從需要預測的輸出的角度來解釋提取到的特徵。
Yoav Goldberg 在他的書中強調了 CNN 作為一個特徵提取模型的作用:
CNN 本質上是一個特徵提取架構。它本身並不構成一個獨立且有用的網路,而它會被整合到一個更大的網路中,並接受訓練與之協同工作,以產生最終結果。CNN 層的責任是提取對於當前整體預測任務有用的有意義的子結構。
以上三個要素的結合,可能是最受廣泛引用的組合例項之一,我們在下一節中會對其進行描述。
2.使用一個單層 CNN 架構
您可以通過使用一個單層 CNN 來獲得對於文件分類的良好結果,或者在過濾器(Filter)中使用不同大小的卷積核(Kernel),從而能在不同的規模上對詞表示進行分組。
Yoon Kim 在研究對卷積神經網路使用預訓練(Pre-trained)詞向量進行分類任務時,發現用預訓練的靜態詞向量的確能得到很好的結果。他建議對於龐大的文字語料庫,可以預先訓練出詞嵌入(例如在 Google 新聞中的 1000 億個詞上訓練得到的 word2vec 向量), 如此可以獲得在自然語言處理中良好且通用的特徵。
儘管對超引數進行了微調,但具有單個卷積層的簡單 CNN 表現依舊非常好。我們所得的結果成為了一個有力的證明:即無監督的詞向量預訓練是 NLP 深度學習的一個重要組成部分。
他還發現,對特定任務進一步地調整詞向量,可以在效能方面提供一些額外的改進。
Kim 介紹了將 CNN 用於自然語言處理的一般方法。我們將句子對映到嵌入向量,並以矩陣的形式輸入到模型中。再適當地使用不同大小的卷積核(例如一次 2 或 3 個詞)對所有輸入的詞執行卷積操作。最後使用最大池化層處理得到的特徵對映,將提取到的特徵進行濃縮或彙總。
該架構基於 Ronan Collobert 等人使用的方法。這個方法是他們在 2011 年發表的論文 “Natural Language Processing (almost) from Scratch(從零開始自然語言處理)” 中提出的。他們開發了一個單一的端到端神經網路模型,這一模型具有卷積層和池化層,並可以用於解決一系列基本的自然語言處理問題。
Kim 提供了一個示意圖,以幫助您直觀地看到使用不同大小的卷積核(以紅色和黃色區分)時的過濾器取樣過程。
自然語言處理的 CNN 過濾器和池化架構的一個例子上圖摘自 2014 年發表的 “Convolutional Neural Networks for Sentence Classification(用於語句分類的卷積神經網路)”。
有用的是,他公佈了自己的模型引數與配置,這些引數是通過網格搜尋找到的,並用於進行 7 個文字分類任務,現總結如下:
- 傳遞函式 :線性整流
- 卷積核大小:2, 4, 5
- 過濾器數量:100
- 丟棄率(Dropout rate):0.5
- 正則化權重(L2):3
- 批大小:50
- 更新規則:Adadelta
對於你自己的實驗來說,這些配置可以用於激發你的靈感,使你找到一個合適的起點。
3.調整 CNN 超引數
在調整你用於文字分類問題的卷積神經網路時,有一些超引數比其他超引數更重要。
Ye Zhang 和 Byron Wallace 對使用單層卷積神經網路進行文字分類所需要的超引數進行了靈敏度分析。他們聲稱這些模型對其配置很敏感,這便是他們進行此研究的動機。
不幸的是,基於 CNN 的模型(甚至一個簡單模型)有一個缺點,就是它們要求從業者指定要使用的確切的模型架構,並設定模型所需要的超引數。對於外行人來說,做出這樣的決定就如同魔法一般,因為模型中有許多的自由引數。
他們的目標是提供可用於在新的文字分類任務上進行配置 CNN 的通用配置。
他們提供了關於模型架構以及模型配置的決策點的很好的描述,下面將其轉載過來。
用於語句分類的卷積神經網路架構圖片源自 2015 年發表的 “A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification”。
這項研究提出了許多有用的發現,這些發現可以作為配置淺層 CNN 模型進行文字分類的出發點。
相關的發現綜述如下:
- 對於不同的問題來說,對預訓練的 word2vec 和 GloVe 嵌入的選擇是不同的,並且它們都比使用一位有效編碼(One-hot encoded)的詞向量表現更好。
- 卷積核的大小很重要,我們應該針對不同問題對其進行相應調整。
- 特徵對映的數量也很重要,也應該進行相應調整。
- 1-max 池化通常比其他型別的池化技術表現得要好。
- Dropout 對模型的效能影響不大。
他們接著提供了更具體的一些探索,如下:
- 使用 word2vec 或 GloVe 詞嵌入作為出發點,並在擬合模型時對它們進行調整。
- 在不同的卷積核大小上進行網格搜尋,從而找到關於該問題的最佳配置,其範圍在 1-10 之間。
- 在 100-600 的區間中搜索過濾器的數量,並對作為搜尋的一部分的 dropout 在 0.0-0.5 區間內進行了探索。
- 探索了幾種啟用函式:tanh,ReLU(Rectified Linear Units,線性整流單元) 以及線性啟用函式。
關鍵需要注意的是,該研究結果是基於二元文字分類問題的經驗結果,並且這個分類問題是以單句作為輸入的。
要了解更多的細節,我建議閱讀完整的論文:
4.考慮字元級的 CNN
我們可以使用能夠學習單詞,句子,段落等相關的分層結構的卷積神經網路,在字元級別(Character level)上對文字文件進行建模。
Xiang Zhang 等人使用一個基於字元的文字表示作為卷積神經網路的輸入。這種方法可以保證,如果 CNN 能夠學習抽象出顯著的細節,那麼所有需要清理文字和準備文字勞動密集型(Labor-intensive)工作就可以被克服。
......深層次的卷積網路不需要關於詞彙的知識,除此之外,在以前的研究結論中我們知道,卷積網路也不需要關於語言的句法或語義結構的知識。在工程上,這種簡化方式對於可以用於不同語言的單個系統是至關重要的,因為無論是否能分割成為單詞,字元都是一個必要的組成結構。僅對字元進行處理還具一些優點,它可以自然地學習諸如拼寫錯誤和表情符號之類的不規則字元組合。
該模型根據固定大小的字母表讀取一位有效編碼字元。編碼字元以 1024 個字元為一塊或一個序列,以進行讀取。為作出預測,我們在網路的輸出端連線了 3 個全連線層以及 6 個卷積層(以及池化層)的堆疊。
用於文字分類的基於字元的卷積神經網路摘自 2015 年,“Character-level Convolutional Networks for Text Classification”。
該模型取得了一些成功,它在提供了更大的文字語料庫的問題上表現得更好。
...分析表明,字元級的卷積網路是一個有效的方法。[...] 我們的模型如何很好地進行比較,這取決於許多因素,比如資料集的大小,文字是否是組織化的,以及對字母表的選擇。
在下一節中,我們將看到一篇後續的論文,該論文中使用了上述方法的一個擴充套件版本並得到了一個更高水準的結果。
5.考慮用更深的 CNN 進行分類
儘管標準及可重用架構尚未適用於分類任務,但我們可以使用非常深的卷積神經網路來實現更高的效能。
Alexis Conneau 等人對用於自然語言處理的相對較淺層的網路,以及用於計算機視覺應用的更深層網路的成功進行了評論。例如,Kim(如上圖所述)將模型限制在單一的卷積層上。
本文所述的其他用於自然語言的架構大多僅限於 5 層和 6 層。這與計算機視覺中使用的成功的架構形成鮮明對比,它們具有 19 層,甚至能達到 152 層。
他們提出並證明了,用非常深度的卷積神經網路模型(稱為 VDCNN)進行分層特徵學習是有好處的。
... 我們建議,使用多達 29 層的多卷積層的深層架構來實現這個目標。我們這一架構的設計靈感源自計算機視覺領域的最新進展 [...] 我們所提出的深層卷積網路表現出比其以往的卷積網路方法有顯著提升的結果。
他們所提出的方法的關鍵,是嵌入單個字元,而非一個詞嵌入。
我們提出了一個用於文字處理的新架構(VDCNN),它直接在字元級運作,並且只使用小的卷積和池化操作。
通過對一組 8 個大型文字分類任務的結果進行比較,更深層的網路比起大多較淺的網路顯示出了更好的效能。具體而言,在撰寫論文時,除了兩個測試資料集外,其他所有資料集都獲得了最先進的結果。
一般來說,他們通過探索更深層次的架構方法而得到了一些重要發現:
- 非常深的架構在小型和大型資料集上都能有不錯的結果。
- 更深層網路的分類錯誤降低了。
- Max-pooling 可以比其他更復雜的池化型別獲得更好的結果。
- 一般情況下,精度會隨著深度增加而降低。在架構中使用的快捷連線非常重要。
... 這是第一次在 NLP 中展示卷積神經網路的“深度優勢”。
進一步閱讀
如果你想更深入地研究,本節提供了更多的相關資料:
總結
在這篇文章中,您瞭解到了關於開發文字分類的深度學習模型的一些最佳實踐。
具體來說,你學到了:
- 一個關鍵的方法,是使用詞嵌入和卷積神經網路來進行文字分類。
- 單層模型在中等大小的問題上表現是出色的,以及關於如何對其進行配置的一些思路。
- 直接對文字進行操作的更深層的模型可能會是自然語言處理未來的發展方向。