萬字長文概述NLP中的深度學習技術(上)

該項目是對基於深度學習的自然語言處理(NLP)的概述,包括用來解決不同 NLP 任務和應用的深度學習模型(如循環神經網絡、卷積神經網絡和強化學習)的理論介紹和實現細節,以及對 NLP 任務(機器翻譯、問答和對話系統)當前最優結果的總結。

該項目的主要動機如下:

  • 維護最新 NLP 研究學習資源,如當前最優結果、新概念和應用、新的基準數據集、代碼/數據集發佈等。
  • 創建開放性資源,幫助指引研究者和對 NLP 感興趣的人。
  • 這是一個合作性項目,專家研究人員可以基於他們近期的研究和實驗結果提出變更建議。

第一章:簡介

自然語言處理(NLP)是指對人類語言進行自動分析和表示的計算技術,這種計算技術由一系列理論驅動。NLP 研究從打孔紙帶和批處理的時代就開始發展,那時分析一個句子需要多達 7 分鐘的時間。到了現在谷歌等的時代,數百萬網頁可以在不到一秒鐘內處理完成。NLP 使計算機能夠執行大量自然語言相關的任務,如句子結構解析、詞性標註、機器翻譯和對話系統等。

深度學習架構和算法為計算機視覺與傳統模式識別領域帶來了巨大進展。跟隨這一趨勢,現在的 NLP 研究越來越多地使用新的深度學習方法(見圖 1)。之前數十年,用於解決 NLP 問題的機器學習方法一般都基於淺層模型(如 SVM 和 logistic 迴歸),這些模型都在非常高維和稀疏的特徵(one-hot encoding)上訓練得到。而近年來,基於稠密向量表徵的神經網絡在多種 NLP 任務上得到了不錯結果。這一趨勢取決了詞嵌入和深度學習方法的成功。深度學習使多級自動特徵表徵學習成為可能。而基於傳統機器學習的 NLP 系統嚴重依賴手動製作的特徵,它們及其耗時,且通常並不完備。

萬字長文概述NLP中的深度學習技術(上)

圖 1:過去 6 年 ACL、EMNLP、EACL、NAACL 會議上深度學習論文的比例(長論文)。

Ronan Collobert 等人 2011 年的研究《Natural Language Processing (Almost) from Scratch》展示了在多個 NLP 任務上優於當時最優方法的簡單深度學習框架,比如命名實體識別(NER)、語義角色標註(SRL)和詞性標註。之後,研究人員提出了大量基於複雜深度學習的算法,用於解決有難度的 NLP 任務。本文綜述了用於自然語言任務的主要深度學習模型和方法,如卷積神經網絡、循環神經網絡和遞歸神經網絡。本文還討論了記憶增強策略、注意力機制,以及如何使用無監督模型、強化學習方法和深度生成模型解決語言任務。

本文綜述了 NLP 研究中最流行的深度學習方法,結構如下:第二章介紹分佈式表徵的概念,它們是複雜深度學習模型的基礎;第 3、4、5 章討論了流行的模型(如卷積、循環、遞歸神經網絡)及其在不同 NLP 任務中的應用;第 6 章列舉了強化學習在 NLP 中的近期應用,以及無監督句子表徵學習的近期發展;第 7 章介紹了深度學習模型結合記憶模塊這一近期趨勢;第 8 章概述了多種深度學習方法在 NLP 任務標準數據集上的性能。機器之心選取了第 2、3、4、8 章進行重點介紹。

第二章:分佈式表徵

基於統計的 NLP 已經成為建模複雜自然語言任務的首要選擇。然而在它剛興起的時候,基於統計的 NLP 經常遭受到維度災難,尤其是在學習語言模型的聯合概率函數時。這為構建能在低維空間中學習分佈式詞表徵的方法提供了動力,這種想法也就導致了詞嵌入方法的誕生。

第一種在低維空間中學習密集型的分佈式詞表徵是 Yoshua Bengio 等人在 2003 年提出的 A Neural Probabilistic Language Model,這是一種基於學習而對抗維度災難的優美想法。

詞嵌入

如下圖 2 所示,分佈式向量或詞嵌入向量基本上遵循分佈式假設,即具有相似語義的詞傾向於具有相似的上下文詞,因此這些詞向量嘗試捕獲鄰近詞的特徵。分佈式詞向量的主要優點在於它們能捕獲單詞之間的相似性,使用餘弦相似性等度量方法評估詞向量之間的相似性也是可能的。

詞嵌入常用於深度學習中的第一個數據預處理階段,一般我們可以在大型無標註文本語料庫中最優化損失函數,從而獲得預訓練的詞嵌入向量。例如基於上下文預測具體詞(Mikolov et al., 2013b, a)的方法,它能學習包含了一般句法和語義的詞向量。這些詞嵌入方法目前已經被證明能高效捕捉上下文相似性,並且由於它們的維度非常小,因此在計算核心 NLP 任務是非常快速與高效的。


萬字長文概述NLP中的深度學習技術(上)

圖 2:分佈式詞向量表徵,其中每一個詞向量只有 D 維,且遠小於詞彙量大小 V,即 D<<V。

多年以來,構建這種詞嵌入向量的模型一般是淺層神經網絡,並沒有必要使用深層神經網絡構建更好的詞嵌入向量。不過基於深度學習的 NLP 模型常使用這些詞嵌入表示短語甚至句子,這實際上是傳統基於詞統計模型和基於深度學習模型的主要差別。目前詞嵌入已經是 NLP 任務的標配,大多數 NLP 任務的頂尖結果都需要藉助它的能力。

本身詞嵌入就能直接用於搜索近義詞或者做詞義的類推,而下游的情感分類、機器翻譯、語言建模等任務都能使用詞嵌入編碼詞層面的信息。最近比較流行的預訓練語言模型其實也參考了詞嵌入的想法,只不過預訓練語言模型在詞嵌入的基礎上進一步能編碼句子層面的語義信息。總的而言,詞嵌入的廣泛使用早已體現在眾多文獻中,它的重要性也得到一致的認可。

分佈式表示(詞嵌入)主要通過上下文或者詞的「語境」來學習本身該如何表達。上個世紀 90 年代,就有一些研究(Elman, 1991)標誌著分佈式語義已經起步,後來的一些發展也都是對這些早期工作的修正。此外,這些早期研究還啟發了隱狄利克雷分配等主題建模(Blei et al., 2003)方法和語言建模(Bengio et al., 2003)方法。

在 2003 年,Bengio 等人提出了一種神經語言模型,它可以學習單詞的分佈式表徵。他們認為這些詞表徵一旦使用詞序列的聯合分佈構建句子表徵,那麼就能構建指數級的語義近鄰句。反過來,這種方法也能幫助詞嵌入的泛化,因為未見過的句子現在可以通過近義詞而得到足夠多的信息。

萬字長文概述NLP中的深度學習技術(上)

圖 3:神經語言模型(圖源:http://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf)。

Collobert 和 Weston(2008) 展示了第一個能有效利用預訓練詞嵌入的研究工作,他們提出的神經網絡架構構成了當前很多方法的基礎。這一項研究工作還率先將詞嵌入作為 NLP 任務的高效工具,不過詞嵌入真正走向 NLP 主流還是 Mikolov 等人在 2013 年做出的研究《Distributed Representations of Words and Phrases and their Compositionality》。

Mikolov 等研究者在這篇論文中提出了連續詞袋模型(CBOW)和 Skip-Gram 模型,這兩種方法都能學習高質量的分佈式詞表徵。此外,令這兩種方法受到極大關注的是另一種附加屬性:語義合成性,即兩個詞向量相加得到的結果是語義相加的詞,例如「man」+「royal」=「king」。這種語義合成性的理論依據最近已經由 Gittens et al. (2017) 給出,他們表示只有保證某些特定的假設才能滿足語義合成性,例如詞需要在嵌入空間中處於均勻分佈。

Pennington et al. (2014) 提出了另一個非常出名的詞嵌入方法 GloVe,它基本上是一種基於詞統計的模型。在有些情況下,CBOW 和 Skip-Gram 採用的交叉熵損失函數有劣勢。因此 GloVe 採用了平方損失,它令詞向量擬合預先基於整個數據集計算得到的全局統計信息,從而學習高效的詞詞表徵。

一般 GloVe 模型會先對單詞計數進行歸一化,並通過對數平滑來最終得到詞共現矩陣,這個詞共現矩陣就表示全局的統計信息。這個矩陣隨後可以通過矩陣分解得到低維的詞表徵,這一過程可以通過最小化重構損失來獲得。下面將具體介紹目前仍然廣泛使用的 CBOW 和 Skip-Gram 兩種 Word2Vec 方法(Mikolov et al., 2013)。

Word2Vec

可以說 Mikolov 等人徹底變革了詞嵌入,尤其是他們提出的 CBOW 和 Skip-Gram 模型。CBOW 會在給定上下文詞的情況下計算目標詞(或中心詞)的條件概率,其中上下文詞的選取範圍通過窗口大小 k 決定。而 Skip-Gram 的做法正好與 CBOW 相反,它在給定目標詞或中心詞的情況下預測上下文詞。一般上下文詞都會以目標詞為中心對稱地分佈在兩邊,且在窗口內的詞與中心詞的距離都相等。也就是說不能因為某個上下文詞離中心詞比較遠,就認為它對中心詞的作用比較弱。

在無監督的設定中,詞嵌入的維度可以直接影響到預測的準確度。一般隨著詞嵌入維度的增加,預測的準確度也會增加,直到準確率收斂到某個點。一般這樣的收斂點可以認為是最佳的詞嵌入維度,因為它在不影響準確率的情況下最精簡。通常情況下,我們使用的詞嵌入維度可以是 128、256、300、500 等,相比於幾十萬的詞彙庫大小已經是很小的維度了。

下面我們可以考慮 CBOW 的簡化版,上下文只考慮離中心詞最近的一個單詞,這基本上就是二元語言模型的翻版。

萬字長文概述NLP中的深度學習技術(上)

圖 4:CBOW 模型。

如圖 4 所示,CBOW 模型就是一個簡單的全連接神經網絡,它只有一個隱藏層。輸入層是上下文詞的 one-hot 向量,它有 V 個神經元(詞彙量),而中間的隱藏層只有 N 個神經元,N 是要遠遠小於 V 的。最後的輸出層是所有詞上的一個 Softmax 函數。層級之間的權重矩陣分別是 V*N 階的 W 和 N*V 階的 W',詞彙表中的每一個詞最終會表徵為兩個向量:v_c 和 v_w,它們分別對應上下文詞表徵和目標詞表徵。若輸入的是詞表中第 k 個詞,那麼我們有:

萬字長文概述NLP中的深度學習技術(上)

總體而言,在給定上下文詞 c 作為輸入的情況下,對於任意詞 w_i 有:

萬字長文概述NLP中的深度學習技術(上)

參數 θ={V_w, V_c} 都是通過定義目標函數而學習到的,一般目標函數可以定義為對數似然函數,且通過計算以下梯度更新權重:

萬字長文概述NLP中的深度學習技術(上)

在更廣泛的 CBOW 模型中,所有上下文詞的 one-hot 向量都會同時作為輸入,即:

萬字長文概述NLP中的深度學習技術(上)

詞嵌入的一個侷限是它們無法表示短語(Mikolov et al., 2013),即兩個詞或多個詞的組合並不表示對應的短語意義,例如「人民」+「大學」並不能組合成「人民大學」。Mikolov 提出的一種解決辦法是基於詞共現識別這些短語,併為它們單獨地學一些詞嵌入向量,而 Rie Johnson 等研究者在 15 年更是提出直接從無監督數據中學習 n-gram 詞嵌入。

另一種侷限性在於學習的詞嵌入僅基於周圍詞的小窗口,有時候「good」和「bad」幾乎有相同的詞嵌入,這對於情感分析等下游任務很不友好。有時候這些相似的詞嵌入有正好相反的情感,這對於需要區別情感的下游任務簡直是個災難,它甚至比用 One-hot 向量的表徵方法還要有更差的性能。Duyu Tang(2014)等人通過提出特定情感詞嵌入(SSWE)來解決這個問題,他們在學習嵌入時將損失函數中的監督情感納入其中。

一個比較重要的觀點是,詞嵌入應該高度依賴於他們要使用的領域。Labutov 和 Lipson(2013) 提出了一種用於特定任務的詞嵌入,他們會重新訓練詞嵌入,因此將詞嵌入與將要進行的下游任務相匹配,不過這種方法對計算力的需求比較大。而 Mikolov 等人嘗試使用負採樣的方法來解決這個問題,負採樣僅僅只是基於頻率對負樣本進行採樣,這個過程直接在訓練中進行。

此外,傳統的詞嵌入算法為每個詞分配不同的向量,這使得其不能解釋多義詞。在最近的一項工作中,Upadhyay 等人 (2017) 提出了一種新方法來解決這個問題,他們利用多語平行數據來學習多語義詞嵌入。例如英語的「bank」在翻譯到法語時有兩種不同的詞:banc 和 banque,它們分別表示金融和地理意義,而多語言的分佈信息能幫助詞嵌入解決一詞多義的問題。

下表 1 提供了用於創建詞嵌入的現有框架,它們都可以訓練詞嵌入並進一步與深度學習模型相結合:

萬字長文概述NLP中的深度學習技術(上)

說到這裡,小編不得不宣傳一波我們的小項目,我們主要使用維基的中文語料訓練了一箇中文詞嵌入,並提供了 Skip-Gram 和 GloVe 兩種模型的訓練方法。讀者可以簡單地使用我們已訓練的詞嵌入,或者根據我們提供的 Jupyter Notebook 教程學習如何訓練詞嵌入。簡單而言,訓練主要可以分為 5 個步驟,即下載維基中文語料、將繁體轉化為簡體、採用結巴分詞、預處理並構建數據集、開始訓練。

當然我們放在 Colab 的示例代碼只是訓練部分維基語料,但也能做出了較為合理的中文詞嵌入。

項目地址:https://github.com/HoratioJSY/cn-words

相關推薦

推薦中...