過去半年以來,自然語言處理領域進化出了一件神器。此神器乃是深度神經網絡的一種新模式,該模式分為:embed、encode、attend、predict四部分。本文將對這四個部分娓娓道來,并且剖析它在兩個實例中的用法。
人們在談論機器學習帶來的提升時,往往只想到了機器在效率和準確率方面帶給人們的提升,然而重要的一點卻是機器學習算法的通用性。如果你想寫一段程序來識別社交媒體平臺上的侮辱性帖子,就把問題泛化為“需要輸入一段文本,預測出文本的類別ID”。這種分類與識別侮辱性帖子或是標記電子郵件類別之類的具體任務無關。如果兩個問題的輸入和輸出類型都一致,那我們就應復用同一套模型的代碼,兩者的區別應該在于送入的訓練數據不同,就像我們使用同一個游戲引擎玩不同的游戲。
筆者用spaCy和Keras實現了自然語言推理的可分解注意力模型。代碼已經上傳到github
假設你有一項強大的技術,可以預測實數稠密向量的類別標簽。只要輸入輸出的格式相同,你就能用這項技術解決所有的問題。與此同時,你有另一項技術,可以用一個向量和一個矩陣預測出另一個向量。那么,現在你手里就握著三類問題的解決方案了,而不是兩類。為什么是三類呢?因為如果第三類問題是通過矩陣和一個向量,得到一個類別標簽,顯然你可以組合利用前兩種技術來解決。大多數NLP問題可以退化成輸入一條或多條文本的機器學習問題。如果我們能將這些文本轉化為向量,我們就可以復用現有的深度學習框架。接下來就是具體的做法。
嵌入式詞語表示,也被稱為“詞向量”,是現在廣泛使用的自然語言處理技術之一。詞向量表示是一種既能表示詞本身又可以考慮語義距離的表示方法。然而,大多數NLP問題面對的不是單個詞語,而是需要分析更長的文本內容?,F在有一個簡單而靈活的解決方案,它在許多任務上都表現出了卓越的性能,即RNN模型。將文本用一個向量的序列表示之后,使用雙向RNN模型將向量編碼為一個句子向量矩陣。這個矩陣的每一行可以理解為詞向量 —— 它們對句子的上下文敏感。后一步被稱為注意力機制。這可以將句子矩陣壓縮成一個句子向量,用于預測。
詞向量表將高維的稀疏二值向量映射成低維的稠密向量。舉個例子,假設我們收到的文本是一串ASCII字符,共有256種可能值,于是我們把每一種可能值表示為一個256維的二值向量。字符’a’的向量只有在第97維的值等于1,其它維度的值都等于0。字符’b’的向量只有在第98維的值等于1,其它維度的值都等于0。這種表示方法稱為’one hot’形式。不同字符的向量表示完全不一樣。
大部分神經網絡模型首先都會把輸入文本切分成若干個詞語,然后將詞語都用詞向量表示。另一些模型用其它信息擴展了詞向量表示。比如,除了詞語的ID之外,還會輸入一串標簽。然后可以學習得到標簽向量,將標簽向量拼接為詞向量。這可以讓你將一些位置敏感的信息加入到詞向量表示中。然而,有一個更強大的方式來使詞語表示呈現出語境相關。
假設得到了詞向量的序列,編碼這一步是將其轉化為句子矩陣,矩陣的每一行表示每個詞在上下文中所表達的意思。
這一步用到了雙向RNN模型。LSTM和GRU結構的模型效果都不錯。每一行向量通過兩部分計算得到:部分是正向計算,第二部分是逆向計算,然后拼接兩部分得到完整的向量。計算過程如下圖代碼所示:
# bidirectional RNN def encode(fwd_rnn, bwd_rnn, word_vectors): fwd_out = ndarray((len(word_vectors), fwd_rnn.nr_hidden, dtype='float32')
bwd_out = ndarray((len(word_vecors), bwd_rnn.nr_hidden), dtype='float32')
fwd_state = fwd_rnn.initial_state()
bwd_state = bwd_rnn.initial_state() for i in range(len(word_vectors)):
fwd_state = fwd_rnn(word_vectors[i], fwd_state)
bwd_state = bwd_rnn(word_vectors[-(i+1)], bwd_state)
fwd_out[i] = fwd_state
bwd_out[-(i+1)] = bwd_state return concatenate([fwd_state, bwd_state])
我個人認為雙向RNN會是今后的主流。RNN的主要應用是讀入文本內容,然后從中預測出一些信息。而我們是用它來計算一個中間表達狀態。重要的一點是得到的表達能夠反映詞語在文中的意義。理論上應該學到“pick up”與“pick on”這兩個詞語的意義有區別。這一直是NLP模型的巨大弱點。現在我們有了一個解決方案。
這一步是將上一步的矩陣表示壓縮為一個向量表示,因此可以被送入標準的前饋神經網絡進行預測。注意力機制對于其它壓縮方法的優勢在于它輸入一個輔助的上下文向量:
Yang等人在2016年發表的論文提出了一種注意力機制,輸入一個矩陣,輸出一個向量。區別于從輸入內容中提取一個上下文向量,該機制的上下文向量是被當做模型的參數學習得到。這使得注意機制變成一個純粹的壓縮操作,可以替換任何的池化步驟。
文本內容被壓縮成一個向量之后,我們可以學習終的目標表達 —— 一種類別標簽、一個實數值或是一個向量等等。我們也可以將網絡模型看做是狀態機的控制器,如一個基于轉移的解析器,來做結構化預測。
有趣的是,大部分的NLP模型通常更青睞淺層的前饋網絡。這意味著近期在機器視覺領域取得的重要技術至今為止并沒有影響到NLP領域,比如residual connections 和 batch normalization。
自然語言推測是給一對句子預測類別標簽的問題,類別標簽則表示它們兩者的邏輯關系。斯坦福自然語言預測文本集使用三種類別標簽:
Bowman等人在論文中給出了幾條例子:
| 文本內容 | 假設內容 | 標簽 |
|---|---|---|
| 某人正在檢查一位來自中亞國家人士的服裝 | 此人正在睡覺 | 矛盾 |
| 一位長者和一位青年在微笑 | 兩個人在笑,嘲笑地板上玩耍的貓 | 中性 |
| 一輛黑色賽車在人群前面啟動 | 一個男人正沿著一條孤獨的路行駛 | 矛盾 |
| 一種多個男性玩的足球游戲 | 幾位男性正在進行體育運動 | 推演 |
| 一位微笑盛裝打扮的女性拿著一把傘 | 一位快樂的女性在一個童話服裝會上握著一把傘 | 中性 |
這份語料庫的目的之一是為我們提供一個新的、規模合適的語料庫用于研發將句子編碼為向量的模型。例如,Bowman在2016年發表的論文介紹了一種基于轉移的模型,它依次讀入句子,構建一種樹形結構的內部表達。
Bowman他們的準確率達到了83.2%,比之前的工作成果提升了一大截。過了不到半年,Parikh的論文提出的模型取得了86.8%的準確率,而使用的模型參數數量只有Bowman模型的10%。不久之后,Chen等人發表的論文提出了一種效果更好的系統,準確率達到88.3%。當我次閱讀Parikh的論文時,我無法理解他們的模型如何取得這么好的效果。原因在于他們的模型用獨特的注意力機制融合了兩個句子矩陣:
關鍵的優勢是他們講句子轉為向量的壓縮步驟合并完成,而Bowman他們則是分別將兩個句子轉為向量。請記住Vapnik的原則:
“當解決一個關鍵問題時,不要解決一個更一般的問題作為中間步驟”
—— VLADIMIR VAPNIK
Parikh的論文將自然語言推測任務當做是關鍵問題。他們想辦法直接解決這個問題,因此比單獨給句子編碼有巨大的優勢。Bowman等人則更關注問題的泛化,也是針對此構建模型。他們的模型適用的場景也就比Parikh的模型更廣泛。比如說,利用Bowman的模型,你可以緩存句子向量,使得計算句子相似度的效率更高。
給文檔分類是我接觸到的個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編碼器,它創建了位置敏感的特點。作者通過將注意力機制替換為平均池化,證明了上述觀點。使用平均池化的方法,該模型在所有測試數據上仍然優于以前的好模型。然而,注意力機制進一步普遍地提高了性能。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。