這篇博客是我看了半年的論文後,本身對 Deep Learning 在 NLP 領域中應用的理解和總結,在此分享。其中必然有侷限性,歡迎各類交流,隨便拍。web
Deep Learning 算法已經在圖像和音頻領域取得了驚人的成果,可是在 NLP 領域中還沒有見到如此激動人心的結果。關於這個緣由,引一條我比較贊同的微博。算法
2013年3月4日 14:46
第一句就先不用管了,畢竟今年的 ACL 已經被灌了好多 Deep Learning 的論文了。第二句我很認同,不過我也有信心之後必定有人能挖掘出語言這種高層次抽象中的本質。不論最後這種方法是否是 Deep Learning,就目前而言,Deep Learning 在 NLP 領域中的研究已經將高深莫測的人類語言撕開了一層神祕的面紗。
我以爲其中最有趣也是最基本的,就是「詞向量」了。編程
將詞用「詞向量」的方式表示可謂是將 Deep Learning 算法引入 NLP 領域的一個核心技術。大多數宣稱用了 Deep Learning 的論文,其中每每也用了詞向量。bootstrap
0. 詞向量是什麼
1. 詞向量的來歷
2. 詞向量的訓練
2.0 語言模型簡介
2.1 Bengio 的經典之做
2.2 C&W 的 SENNA
2.3 M&H 的 HLBL
2.4 Mikolov 的 RNNLM
2.5 Huang 的語義強化
2.999 總結
3. 詞向量的評價
3.1 提高現有系統
3.2 語言學評價
參考文獻
0. 詞向量是什麼
天然語言理解的問題要轉化爲機器學習的問題,第一步確定是要找一種方法把這些符號數學化。
NLP 中最直觀,也是到目前爲止最經常使用的詞表示方法是 One-hot Representation,這種方法把每一個詞表示爲一個很長的向量。這個向量的維度是詞表大小,其中絕大多數元素爲 0,只有一個維度的值爲 1,這個維度就表明了當前的詞。
舉個栗子,
「話筒」表示爲 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …]
「麥克」表示爲 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …]
每一個詞都是茫茫 0 海中的一個 1。
這種 One-hot Representation 若是採用稀疏方式存儲,會是很是的簡潔:也就是給每一個詞分配一個數字 ID。好比剛纔的例子中,話筒記爲 3,麥克記爲 8(假設從 0 開始記)。若是要編程實現的話,用 Hash 表給每一個詞分配一個編號就能夠了。這麼簡潔的表示方法配合上最大熵、SVM、CRF 等等算法已經很好地完成了 NLP 領域的各類主流任務。
固然這種表示方法也存在一個重要的問題就是「詞彙鴻溝」現象:任意兩個詞之間都是孤立的。光從這兩個向量中看不出兩個詞是否有關係,哪怕是話筒和麥克這樣的同義詞也不能倖免於難。網絡
Deep Learning 中通常用到的詞向量並非剛纔提到的用 One-hot Representation 表示的那種很長很長的詞向量,而是用 Distributed Representation(不知道這個應該怎麼翻譯,由於還存在一種叫「Distributional Representation」的表示方法,又是另外一個不一樣的概念)表示的一種低維實數向量。這種向量通常長成這個樣子:[0.792, −0.177, −0.107, 0.109, −0.542, …]。維度以 50 維和 100 維比較常見。這種向量的表示不是惟一的,後文會提到目前計算出這種向量的主流方法。
(我的認爲)Distributed representation 最大的貢獻就是讓相關或者類似的詞,在距離上更接近了。向量的距離能夠用最傳統的歐氏距離來衡量,也能夠用 cos 夾角來衡量。用這種方式表示的向量,「麥克」和「話筒」的距離會遠遠小於「麥克」和「天氣」。可能理想狀況下「麥克」和「話筒」的表示應該是徹底同樣的,可是因爲有些人會把英文名「邁克」也寫成「麥克」,致使「麥克」一詞帶上了一些人名的語義,所以不會和「話筒」徹底一致。app
1. 詞向量的來歷
Distributed representation 最先是 Hinton 在 1986 年的論文《Learning distributed representations of concepts》中提出的。雖然這篇文章沒有說要將詞作 Distributed representation,(甚至我很無厘頭地猜測那篇文章是爲了給他剛提出的 BP 網絡打廣告,)但至少這種先進的思想在那個時候就在人們的心中埋下了火種,到 2000 年以後開始逐漸被人重視。
Distributed representation 用來表示詞,一般被稱爲「Word Representation」或「Word Embedding」,中文俗稱「詞向量」。真的只能叫「俗稱」,算不上翻譯。半年前我本想翻譯的,可是硬是想不出 Embedding 應該怎麼翻譯的,後來就這麼叫習慣了-_-||| 若是有好的翻譯歡迎提出。(更新:@南大周志華 在這篇微博中給了一個合適的翻譯:詞嵌入)Embedding 一詞的意義能夠參考維基百科的相應頁面(連接)。後文提到的全部「詞向量」都是指用 Distributed Representation 表示的詞向量。機器學習
若是用傳統的稀疏表示法表示詞,在解決某些任務的時候(好比構建語言模型)會形成維數災難[Bengio 2003]。使用低維的詞向量就沒這樣的問題。同時從實踐上看,高維的特徵若是要套用 Deep Learning,其複雜度幾乎是難以接受的,所以低維的詞向量在這裏也飽受追捧。
同時如上一節提到的,類似詞的詞向量距離相近,這就讓基於詞向量設計的一些模型自帶平滑功能,讓模型看起來很是的漂亮。函數
2. 詞向量的訓練
要介紹詞向量是怎麼訓練獲得的,就不得不提到語言模型。到目前爲止我瞭解到的全部訓練方法都是在訓練語言模型的同時,順便獲得詞向量的。
這也比較容易理解,要從一段無標註的天然文本中學習出一些東西,無非就是統計出詞頻、詞的共現、詞的搭配之類的信息。而要從天然文本中統計並創建一個語言模型,無疑是要求最爲精確的一個任務(也不排除之後有人創造出更好更有用的方法)。既然構建語言模型這一任務要求這麼高,其中必然也須要對語言進行更精細的統計和分析,同時也會須要更好的模型,更大的數據來支撐。目前最好的詞向量都來自於此,也就不難理解了。
這裏介紹的工做均爲從大量未標註的普通文本數據中無監督地學習出詞向量(語言模型原本就是基於這個想法而來的),能夠猜想,若是用上了有標註的語料,訓練詞向量的方法確定會更多。不過視目前的語料規模,仍是使用未標註語料的方法靠譜一些。
詞向量的訓練最經典的有 3 個工做,C&W 200八、M&H 200八、Mikolov 2010。固然在說這些工做以前,不得不介紹一下這一系列中 Bengio 的經典之做。
2.0 語言模型簡介
插段廣告,簡單介紹一下語言模型,知道的能夠無視這節。
語言模型其實就是看一句話是否是正常人說出來的。這玩意頗有用,好比機器翻譯、語音識別獲得若干候選以後,能夠利用語言模型挑一個儘可能靠譜的結果。在 NLP 的其它任務裏也都能用到。
語言模型形式化的描述就是給定一個字符串,看它是天然語言的機率 P(w1,w2,…,wt)
P(w1,w2,…,wt)。w1w1到 wtwt 依次表示這句話中的各個詞。有個很簡單的推論是:
P(w1,w2,…,wt)=P(w1)×P(w2|w1)×P(w3|w1,w2)×…×P(wt|w1,w2,…,wt−1)P(w1,w2,…,wt)=P(w1)×P(w2|w1)×P(w3|w1,w2)×…×P(wt|w1,w2,…,wt−1)
經常使用的語言模型都是在近似地求 P(