1. 程式人生 > >(Stanford CS224d) Deep Learning and NLP課程筆記(一):Deep NLP

(Stanford CS224d) Deep Learning and NLP課程筆記(一):Deep NLP

Stanford大學在2015年開設了一門Deep Learning for Natural Language Processing的課程,廣受好評。並在2016年春季再次開課。我將開始這門課程的學習,並做好每節課的課程筆記放在部落格上。爭取做到每週一更吧。
本文是第一篇。

NLP簡介

NLP,全名Natural Language Processing(自然語言處理),是一門集電腦科學,人工智慧,語言學三者於一身的交叉性學科。她的終極研究目標是讓計算機能夠處理甚至是“理解”人類的自然語言,進而幫助人類解決一些現實生活中遇到的實際問題。這裡的語言“理解”是一個很抽象也很哲學的概念。在NLP中,我們將對語言的“理解”定義為是學習一個能夠解決具體問題的複雜函式的過程。

對NLP的研究通常在5個Level上進行:

  1. 語音/文字分析:包括語言識別技術、OCR技術、分詞技術等
  2. 詞形分析:例如分析一個word的前後綴、詞根等
  3. 語法分析:從語法結構上分析一個句子的構成
  4. 語義分析:理解一個句子或單詞的語義
  5. 篇章分析:理解一段篇章的含義

注意,雖然這5個Level在研究的物件和難度上是一種遞進的關係,但對這5個Level的研究並不一定是連續的——例如,我們可以跳過對一個句子語法結構的分析而直接去理解句子的語義。

接下來簡單列舉一些NLP技術的應用,以讓大家對NLP能夠處理什麼樣的問題有一個感性的認識:

  • 簡單的任務:拼寫檢查,關鍵詞檢索,同義詞檢索等
  • 複雜一點的任務:資訊提取(比如從網頁中提取價格,產地,公司名等資訊),情感分析,文字分類等
  • 更復雜的任務:機器翻譯,人機對話,QA系統

最後討論一個問題:Why is NLP so HARD?為什麼要把NLP從機器學習的任務列表中單獨抽取出來做為一門課程甚至是研究的物件?根本原因在於語言用於表達客觀世界的內在複雜性和多義性。舉一個簡單的例子:"Jane hit June and then she [fell/ran]"。當she所伴隨的動作不同(fell or ran),其所指代的物件也發生了變化(June or Jane)。這樣的例子太多,顯然我們無法通過列舉所有的規則來解決語言內在的複雜性。另一個多義性的例子是:"I made her duck"。我們可以理解為:"I cooked her a duck",或是"I curved her a wooden duck",也可以理解為:"I transformed her into a duck with some magic"。

Deep Learning簡介

深度學習是機器學習的一個研究子領域。傳統機器學習演算法面臨的一個問題是,模型的優劣往往很大程度上依賴於特徵的選取。例如,對於一個NER問題(Named Entity Recognition,命名實體識別),傳統的機器學習演算法(如CRF)通常需要輸入目標詞的大小寫特徵,詞性特徵,以及其上下文環境裡的詞性分佈等特徵。人工挑選一組合適的特徵是一件非常瑣碎的活。此外,這些特徵往往是data-specific,這意味著,在處理一份新的資料集,比方說是另一門語言的語料,你需要再一次坐下來審視這批資料,以挑選新的特徵組合。

毫不誇張的說,在傳統機器學習領域,90%的時間被用於資料的處理。演算法和模型只是簡單的權重優化。

而深度學習的魅力在於,她將特徵的提取變成了一個自動化的學習過程。

深度學習是一類特徵學習(Representation Learning)。她可以從原始資料(比如原始的畫素點,原始的單詞甚至是字元)中自動學習到多個層次上的特徵表達,並完成最終的分類或翻譯的任務。(這裡的“深度”一詞可能會帶來歧義:例如對於我們下一節課將要學習到的word2vec模型。她其實是一個非常淺層的網路模型。)

神經網路家族是深度學習演算法的主流模型。我們的課程也主要以介紹不同種類的神經網路及其在NLP領域中的應用為主。也許有人會問,神經網路不過是一組logistic regression單元的堆砌,為什麼會有如此優異的特徵學習的能力呢?原因在於,我們同時引入了一些基本的建模原則,比如端對端的訓練機制。這些指導性原則可以幫助神經元更好地從最終結果中學習到原始輸入的特徵。此外,人工神經網路模型和神經科學裡的腦模型也有著千絲萬縷的聯絡。這些聯絡在NLP問題中不是那麼明顯,但在計算機視覺領域(卷積神經網路,CNN)扮演著很重要的角色。

為什麼我們要採用深度學習模型對NLP問題進行建模?這是因為,與傳統的機器學習演算法相比,深度學習模型通常不需要特定領域的先驗知識,因此可以快速高效地進行特徵的學習。與此同時,深度學習提供了一套靈活通用的特徵學習框架(適用於包括語音、文字、視覺資訊在內的多種資料的學習)。最後,深度學習可以有監督或無監督地從大量原始語料中學習到有用的特徵。

另一個有趣的問題是:考慮到神經網路並不是近些年才提出的新技術,為什麼直到現在深度學習才突然被人們所關注呢?這主要得益於近些年大資料的興起和高速CPU/GPU的發展。資料是深度學習的食物。而高效能的計算資源可以幫助深度學習更好地消化這些食物。當然,深度學習的發展也離不開一些新的模型演算法的提出(比如end-to-end的模型框架,機器翻譯中的attention機制等)。

Deep Learning + NLP = Deep NLP

Deep Learning的技術首先是在語音識別和計算機視覺的領域裡取得了重大突破,直到近些年才被廣泛地應用於NLP領域中。接下來,我們簡單看下深度學習模型是如何幫助解決NLP難題的 。

  1. 語音Phonology:
    傳統的語音識別模型是通過人工建立一張語音詞表,將相似發音的字母劃分為一類;並藉助一個分類模型實現語音到字母的轉譯。而深度學習模型將語音表達為一個embedding向量,可以直接從語音的向量特徵中預測相應的單詞。
  2. 詞形Morphology:
    傳統的詞形學將一個單詞拆分為字首、詞幹、字尾的表達,這些前後綴和詞幹統稱為Morpheme。而深度學習將每一個Morpheme都處理成一個向量的表達,並藉助於一個Recursive Neural Network將不同的Morpheme向量拼接成一個向量——這個向量代表了相應的Morpheme拼接後得到的單詞。
    這種將word表達成向量的思想在Deep NLP中十分基礎。如果我們將這些詞向量投影到一個二維平面上,會發現一些有趣的pattern。例如,相似的動詞集中出現在平面的同一片區域內。
  3. 句法分析Syntax
    在得到了詞的表達後,接下來我們討論句子的結構。
    傳統的句法分析將一個完整的句子解析成一棵語法樹——每一個節點對應著一個特定的語法單元(例如,NP或VP)。而在深度學習中,我們可以對詞向量進行計算,得到短語乃至整個句子的向量表達。並基於這些向量完成後續的分類預測等任務。
  4. 語義分析Semantics
    傳統的語義分析藉助於一種叫做Lambda Calculus的技術。基本思想是在一棵句法樹上遞迴地呼叫人工事先設定的Lambda函式進行語義的計算。而在深度學習中,同樣地,我們對每一個單詞,每一個短語,乃至每一個邏輯關係(比如\(A \in B\))都用一個向量去表達。藉助於神經網路的計算,我們可以準確地預測兩個句子之間的邏輯關係(例如,if "all reptiles walk" then "some turtles move")。有趣的是,在深度學習中,我們並不需要事先指定"reptiles"和"turtles","walk"和"move"之間的邏輯關係。

可以看出,與傳統的NLP技術相比,Deep NLP核心思想在於 :everything can be a vector。無論是low level的音訊,還是high level的短語。深度神經網路模型將低level的vector組裝成更高level的vector,進一步完成分類、翻譯等高階任務。

本節課的內容不多,主要是對NLP和深度學習技術的一個概要性介紹。下一節課,我們將開始學習計算word vector的幾種常用模型。