Stanford大學在2015年開設了一門Deep Learning for Natural Language Processing的課程,廣受好評。並在2016年春季再次開課。我將開始這門課程的學習,並做好每節課的課程筆記放在博客上。爭取做到每周一更吧。
本文是第一篇。
NLP簡介
NLP,全名Natural Language Processing(自然語言處理),是一門集計算機科學,人工智能,語言學三者於一身的交叉性學科。她的終極研究目標是讓計算機能夠處理甚至是“理解”人類的自然語言,進而幫助人類解決一些現實生活中遇到的實際問題。這里的語言“理解”是一個很抽象也很哲學的概念。在NLP中,我們將對語言的“理解”定義為是學習一個能夠解決具體問題的復雜函數的過程。
對NLP的研究通常在5個Level上進行:
- 語音/文本分析:包括語言識別技術、OCR技術、分詞技術等
- 詞形分析:例如分析一個word的前后綴、詞根等
- 語法分析:從語法結構上分析一個句子的構成
- 語義分析:理解一個句子或單詞的語義
- 篇章分析:理解一段篇章的含義
注意,雖然這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 in Neural Networks: An Overview
Deep Learning + NLP = Deep NLP
Deep Learning的技術首先是在語音識別和計算機視覺的領域里取得了重大突破,直到近些年才被廣泛地應用於NLP領域中。接下來,我們簡單看下深度學習模型是如何幫助解決NLP難題的 。
- 語音Phonology:
傳統的語音識別模型是通過人工建立一張語音詞表,將相似發音的字母划分為一類;並借助一個分類模型實現語音到字母的轉譯。而深度學習模型將語音表達為一個embedding向量,可以直接從語音的向量特征中預測相應的單詞。 - 詞形Morphology:
傳統的詞形學將一個單詞拆分為前綴、詞干、后綴的表達,這些前后綴和詞干統稱為Morpheme。而深度學習將每一個Morpheme都處理成一個向量的表達,並借助於一個Recursive Neural Network將不同的Morpheme向量拼接成一個向量——這個向量代表了相應的Morpheme拼接后得到的單詞。
這種將word表達成向量的思想在Deep NLP中十分基礎。如果我們將這些詞向量投影到一個二維平面上,會發現一些有趣的pattern。例如,相似的動詞集中出現在平面的同一片區域內。 - 句法分析Syntax
在得到了詞的表達后,接下來我們討論句子的結構。
傳統的句法分析將一個完整的句子解析成一棵語法樹——每一個節點對應着一個特定的語法單元(例如,NP或VP)。而在深度學習中,我們可以對詞向量進行計算,得到短語乃至整個句子的向量表達。並基於這些向量完成后續的分類預測等任務。 - 語義分析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的幾種常用模型。