1. 程式人生 > >最新自然語言處理(NLP)四步流程:Embed->Encode->Attend->Predict

最新自然語言處理(NLP)四步流程:Embed->Encode->Attend->Predict

過去半年以來,自然語言處理領域進化出了一件神器。此神器乃是深度神經網路的一種新模式,該模式分為:embed、encode、attend、predict四部分。本文將對這四個部分娓娓道來,並且剖析它在兩個例項中的用法。

人們在談論機器學習帶來的提升時,往往只想到了機器在效率和準確率方面帶給人們的提升,然而最重要的一點卻是機器學習演算法的通用性。如果你想寫一段程式來識別社交媒體平臺上的侮辱性帖子,就把問題泛化為“需要輸入一段文字,預測出文字的類別ID”。這種分類與識別侮辱性帖子或是標記電子郵件類別之類的具體任務無關。如果兩個問題的輸入和輸出型別都一致,那我們就應複用同一套模型的程式碼,兩者的區別應該在於送入的訓練資料不同,就像我們使用同一個遊戲引擎玩不同的遊戲。

筆者用spaCy和Keras實現了自然語言推理的可分解注意力模型。程式碼已經上傳到github

假設你有一項強大的技術,可以預測實數稠密向量的類別標籤。只要輸入輸出的格式相同,你就能用這項技術解決所有的問題。與此同時,你有另一項技術,可以用一個向量和一個矩陣預測出另一個向量。那麼,現在你手裡就握著三類問題的解決方案了,而不是兩類。為什麼是三類呢?因為如果第三類問題是通過矩陣和一個向量,得到一個類別標籤,顯然你可以組合利用前兩種技術來解決。大多數NLP問題可以退化成輸入一條或多條文字的機器學習問題。如果我們能將這些文字轉化為向量,我們就可以複用現有的深度學習框架。接下來就是具體的做法。

文字類深度學習的四部曲

嵌入式詞語表示,也被稱為“詞向量”,是現在最廣泛使用的自然語言處理技術之一。詞向量表示是一種既能表示詞本身又可以考慮語義距離的表示方法。然而,大多數NLP問題面對的不是單個詞語,而是需要分析更長的文字內容。現在有一個簡單而靈活的解決方案,它在許多工上都表現出了卓越的效能,即RNN模型。將文字用一個向量的序列表示之後,使用雙向RNN模型將向量編碼為一個句子向量矩陣。這個矩陣的每一行可以理解為詞向量 —— 它們對句子的上下文敏感。最後一步被稱為注意力機制。這可以將句子矩陣壓縮成一個句子向量,用於預測。

第一步:詞向量

詞向量表將高維的稀疏二值向量對映成低維的稠密向量。舉個例子,假設我們收到的文字是一串ASCII字元,共有256種可能值,於是我們把每一種可能值表示為一個256維的二值向量。字元’a’的向量只有在第97維的值等於1,其它維度的值都等於0。字元’b’的向量只有在第98維的值等於1,其它維度的值都等於0。這種表示方法稱為’one hot’形式。不同字元的向量表示完全不一樣。

大部分神經網路模型首先都會把輸入文字切分成若干個詞語,然後將詞語都用詞向量表示。另一些模型用其它資訊擴充套件了詞向量表示。比如,除了詞語的ID之外,還會輸入一串標籤。然後可以學習得到標籤向量,將標籤向量拼接為詞向量。這可以讓你將一些位置敏感的資訊加入到詞向量表示中。然而,有一個更強大的方式來使詞語表示呈現出語境相關。

第二步:編碼

假設得到了詞向量的序列,編碼這一步是將其轉化為句子矩陣,矩陣的每一行表示每個詞在上下文中所表達的意思。

這一步用到了雙向RNN模型。LSTM和GRU結構的模型效果都不錯。每一行向量通過兩部分計算得到:第一部分是正向計算,第二部分是逆向計算,然後拼接兩部分得到完整的向量。計算過程如下圖程式碼所示:

我個人認為雙向RNN會是今後的主流。RNN的主要應用是讀入文字內容,然後從中預測出一些資訊。而我們是用它來計算一箇中間表達狀態。最重要的一點是得到的表達能夠反映詞語在文中的意義。理論上應該學到“pick up”與“pick on”這兩個詞語的意義有區別。這一直是NLP模型的巨大弱點。現在我們有了一個解決方案。

第三步:注意力機制

這一步是將上一步的矩陣表示壓縮為一個向量表示,因此可以被送入標準的前饋神經網路進行預測。注意力機制對於其它壓縮方法的優勢在於它輸入一個輔助的上下文向量:

Yang等人在2016年發表的論文提出了一種注意力機制,輸入一個矩陣,輸出一個向量。區別於從輸入內容中提取一個上下文向量,該機制的上下文向量是被當做模型的引數學習得到。這使得注意機制變成一個純粹的壓縮操作,可以替換任何的池化步驟。

第四步:預測

文字內容被壓縮成一個向量之後,我們可以學習最終的目標表達 —— 一種類別標籤、一個實數值或是一個向量等等。我們也可以將網路模型看做是狀態機的控制器,如一個基於轉移的解析器,來做結構化預測。

有趣的是,大部分的NLP模型通常更青睞淺層的前饋網路。這意味著近期在機器視覺領域取得的重要技術至今為止並沒有影響到NLP領域,比如residual connections 和 batch normalization。

例項1:自然語言推測的可分解注意力模型

自然語言推測是給一對句子預測類別標籤的問題,類別標籤則表示它們兩者的邏輯關係。斯坦福自然語言預測文字集使用三種類別標籤:

  • 1.推演(Entailment):如果第一句話是真的,那麼第二句話一定為真。

  • 2.矛盾(Contradiction):如果第一句話是真的,那麼第二句話一定為假。

  • 3.中性(Neutral):上述兩者都不是。

Bowman等人在論文中給出了幾條例子:

文字內容 假設內容 標籤
某人正在檢查一位來自中亞國家人士的服裝 此人正在睡覺 矛盾
一位長者和一位青年在微笑 兩個人在笑,嘲笑地板上玩耍的貓 中性
一輛黑色賽車在人群前面啟動 一個男人正沿著一條孤獨的路行駛 矛盾
一種多個男性玩的足球遊戲 幾位男性正在進行體育運動 推演
一位微笑盛裝打扮的女性拿著一把傘 一位快樂的女性在一個童話服裝會上握著一把傘 中性

這份語料庫的目的之一是為我們提供一個新的、規模合適的語料庫用於研發將句子編碼為向量的模型。例如,Bowman在2016年發表的論文介紹了一種基於轉移的模型,它依次讀入句子,構建一種樹形結構的內部表達。

Bowman他們的準確率達到了83.2%,比之前的工作成果提升了一大截。過了不到半年,Parikh的論文提出的模型取得了86.8%的準確率,而使用的模型引數數量只有Bowman模型的10%。不久之後,Chen等人發表的論文提出了一種效果更好的系統,準確率達到88.3%。當我第一次閱讀Parikh的論文時,我無法理解他們的模型如何取得這麼好的效果。原因在於他們的模型用獨特的注意力機制融合了兩個句子矩陣:

關鍵的優勢是他們講句子轉為向量的壓縮步驟合併完成,而Bowman他們則是分別將兩個句子轉為向量。請記住Vapnik的原則:

“當解決一個關鍵問題時,不要解決一個更一般的問題作為中間步驟” —— VLADIMIR VAPNIK

Parikh的論文將自然語言推測任務當做是關鍵問題。他們想辦法直接解決這個問題,因此比單獨給句子編碼有巨大的優勢。Bowman等人則更關注問題的泛化,也是針對此構建模型。他們的模型適用的場景也就比Parikh的模型更廣泛。比如說,利用Bowman的模型,你可以快取句子向量,使得計算句子相似度的效率更高。

例項2:文件分類的分層注意力網路

給文件分類是我接觸到的第一個NLP專案。澳大利亞的類似證券交易所的機構資助了一個專案,爬取澳大利亞的網站頁面,並且自動檢測金融詐騙。儘管這個專案已經過去了一段時間,但是文件分類的方法在之後的十年中幾乎沒有變化。這也是我看到Yang等人發表的分層注意力網路模型之後如此興奮的原因。這是繼詞袋模型之後,我看到的第一篇真正有通用性改進的論文。下面是它的原理。

該模型接收一篇文件作為輸入,文件由句子的序列組成,其中每個句子是一個詞語的序列。每句話的每個詞語分別編碼,生成兩個詞向量序列,每個序列表示一個句子。這兩個序列分別編碼成兩個句子矩陣。然後由注意力機制將句子矩陣壓縮為句子向量,多個句子向量又組成文字矩陣。最後一步注意力操作將文字矩陣壓縮為文字向量,然後送入最終的預測網路來預測類別標籤。

該模型使用注意機制作為一個純粹的壓縮步驟:它學會了把矩陣作為輸入,然後將其概括成一個向量。這種學習過程是通過學習上下文向量的兩個注意力轉換,我們可以將這種轉換理解為表示模型認為相關的詞語或者句子,該模型會找到理想相關。或者,你也可以把整個壓縮過程看做是特徵提取的過程。按照這種觀點,上下文向量只是另一個不透明的引數。

作者 方法 YELP ‘13 YELP ‘14 YELP ‘15 IMDB
Yang et al. (2016) HN-ATT 68.2 70.5 71 49.4
Yang et al. (2016) HN-AVE 67 69.3 69.9 47.8
Tang et al. (2015) Paragraph Vector 57.7 59.2 60.5 34.1
Tang et al. (2015) SVM + Bigrams 57.6 61.6 62.4 40.9
Tang et al. (2015) SVM + Unigrams 58.9 60 61.1 39.9
Tang et al. (2015) CNN-word 59.7 61 61.5 37.6

將yang等人的模型與卷積神經網路做比較,可以得到有意思的結果。兩個模型都能自動提取位置敏感特徵。然而,CNN模型既不通用,效率也較低。而雙向RNN模型只需要對每個句子讀入兩次 ——正向一次,反向一次。LSTM編碼還能提取任意長度的特徵,因為句子上下文的任何資訊都有可能被揉入詞語的向量表示。將句子矩陣壓縮成向量的步驟簡單並且有效的。要構建文件向量,只需要對句子向量再進行一次同樣的操作。

提升模型準確率的主要因素是雙向LSTM編碼器,它建立了位置敏感的特點。作者通過將注意力機制替換為平均池化,證明了上述觀點。使用平均池化的方法,該模型在所有測試資料上仍然優於以前的最好模型。然而,注意力機制進一步普遍地提高了效能。

後續內容

我已經用我們自己的NLP庫spaCy實現了第一個例子,我正在實現文字分類的系統。我們還計劃開發一個SpaCy版的通用雙向LSTM模型,能夠方便地將預訓練的詞向量用於實際問題中。