NO IMAGE

這篇部落格是我看了半年的論文後,自己對 Deep Learning 在 NLP 領域中應用的理解和總結,在此分享。其中必然有侷限性,歡迎各種交流,隨便拍。

  Deep Learning 演算法已經在影象和音訊領域取得了驚人的成果,但是在 NLP 領域中尚未見到如此激動人心的結果。關於這個原因,引一條我比較贊同的微博。

@王威廉:Steve Renals算了一下icassp錄取文章題目中包含deep
learning的數量,發現有44篇,而naacl則有0篇。有一種說法是,語言(詞、句子、篇章等)屬於人類認知過程中產生的高層認知抽象實體,而語音和影象屬於較為底層的原始輸入訊號,所以後兩者更適合做deep learning來學習特徵。
2013年3月4日
14:46

  第一句就先不用管了,畢竟今年的 ACL 已經被灌了好多 Deep Learning 的論文了。第二句我很認同,不過我也有信心以後一定有人能挖掘出語言這種高層次抽象中的本質。不論最後這種方法是不是 Deep Learning,就目前而言,Deep Learning 在 NLP 領域中的研究已經將高深莫測的人類語言撕開了一層神祕的面紗。
  我覺得其中最有趣也是最基本的,就是“詞向量”了。

  將詞用“詞向量”的方式表示可謂是將 Deep Learning 演算法引入 NLP 領域的一個核心技術。大多數宣稱用了 Deep Learning 的論文,其中往往也用了詞向量。

本文目錄:
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 夾角來衡量。用這種方式表示的向量,“麥克”和“話筒”的距離會遠遠小於“麥克”和“天氣”。可能理想情況下“麥克”和“話筒”的表示應該是完全一樣的,但是由於有些人會把英文名“邁克”也寫成“麥克”,導致“麥克”一詞帶上了一些人名的語義,因此不會和“話筒”完全一致。

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 2008、M&H 2008、Mikolov 2010。當然在說這些工作之前,不得不介紹一下這一系列中 Bengio 的經典之作。

2.0 語言模型簡介

  插段廣告,簡單介紹一下語言模型,知道的可以無視這節。
  語言模型其實就是看一句話是不是正常人說出來的。這玩意很有用,比如機器翻譯、語音識別得到若干候選之後,可以利用語言模型挑一個儘量靠譜的結果。在 NLP 的其它任務裡也都能用到。
  語言模型形式化的描述就是給定一個字串,看它是自然語言的概率 P(w1,w2,…,wt)。w1 到 wt 依次表示這句話中的各個詞。有個很簡單的推論是:
P(w1,w2,…,wt)=P(w1)×P(w2|w1)×P(w3|w1,w2)×…×P(wt|w1,w2,…,wt−1)
  常用的語言模型都是在近似地求 P(wt|w1,w2,…,wt−1)。比如
n-gram 模型就是用 P(wt|wt−n+1,…,wt−1) 近似表示前者。
  順便提一句,由於後面要介紹的每篇論文使用的符號差異太大,本博文裡嘗試統一使用 Bengio 2003 的符號系統(略做簡化),以便在各方法之間做對比和分析。

2.1 Bengio 的經典之作

  用神經網路訓練語言模型的思想最早由百度 IDL 的徐偉於 2000 提出。(感謝 @餘凱_西二旗民工 博士指出。)其論文《Can
Artificial Neural Networks Learn Language Models?》提出一種用神經網路構建二元語言模型(即 P(wt|wt−1))的方法。文中的基本思路與後續的語言模型的差別已經不大了。

  訓練語言模型的最經典之作,要數 Bengio 等人在 2001 年發表在 NIPS 上的文章《A Neural Probabilistic Language Model》。當然現在看的話,肯定是要看他在 2003 年投到 JMLR 上的同名論文了。

  Bengio 用了一個三層的神經網路來構建語言模型,同樣也是 n-gram 模型。如圖1。

Bengio 2003
圖1(點選檢視大圖)

  圖中最下方的 wt−n+1,…,wt−2,wt−1 就是前 n−1 個詞。現在需要根據這已知的 n−1 個詞預測下一個詞 wt。C(w) 表示詞 w 所對應的詞向量,整個模型中使用的是一套唯一的詞向量,存在矩陣 C(一個 |V|×m 的矩陣)中。其中 |V| 表示詞表的大小(語料中的總詞數),m 表示詞向量的維度。w 到 C(w) 的轉化就是從矩陣中取出一行。
  網路的第一層(輸入層)是將 C(wt−n+1),…,C(wt−2),C(wt−1) 這 n−1 個向量首尾相接拼起來,形成一個 (n−1)m 維的向量,下面記為 x。
  網路的第二層(隱藏層)就如同普通的神經網路,直接使用 d+Hx 計算得到。d 是一個偏置項。在此之後,使用 tanh 作為啟用函式。
  網路的第三層(輸出層)一共有 |V| 個節點,每個節點 yi 表示
下一個詞為 i 的未歸一化
log 概率。最後使用 softmax 啟用函式將輸出值 y 歸一化成概率。最終,y 的計算公式為:

y=b+Wx+Utanh(d+Hx)

  式子中的 U(一個 |V|×h 的矩陣)是隱藏層到輸出層的引數,整個模型的多數計算集中在 U 和隱藏層的矩陣乘法中。後文的提到的
3 個工作,都有對這一環節的簡化,提升計算的速度。
  式子中還有一個矩陣 W(|V|×(n−1)m),這個矩陣包含了從輸入層到輸出層的直連邊。直連邊就是從輸入層直接到輸出層的一個線性變換,好像也是神經網路中的一種常用技巧(沒有仔細考察過)。如果不需要直連邊的話,將 W 置為
0 就可以了。在最後的實驗中,Bengio 發現直連邊雖然不能提升模型效果,但是可以少一半的迭代次數。同時他也猜想如果沒有直連邊,可能可以生成更好的詞向量。

  現在萬事俱備,用隨機梯度下降法把這個模型優化出來就可以了。需要注意的是,一般神經網路的輸入層只是一個輸入值,而在這裡,輸入層 x 也是引數(存在 C 中),也是需要優化的。優化結束之後,詞向量有了,語言模型也有了。
  這樣得到的語言模型自帶平滑,無需傳統 n-gram 模型中那些複雜的平滑演算法。Bengio 在 APNews 資料集上做的對比實驗也表明他的模型效果比精心設計平滑演算法的普通 n-gram 演算法要好 10% 到 20%。

  在結束介紹 Bengio 大牛的經典作品之前再插一段八卦。在其 JMLR 論文中的未來工作一段,他提了一個能量函式,把輸入向量和輸出向量統一考慮,並以最小化能量函式為目標進行優化。後來 M&H 工作就是以此為基礎展開的。
  他提到一詞多義有待解決,9 年之後 Huang 提出了一種解決方案。他還在論文中隨口(不是在 Future Work 中寫的)提到:可以使用一些方法降低引數個數,比如用迴圈神經網路。後來 Mikolov 就順著這個方向發表了一大堆論文,直到博士畢業。
  大牛就是大牛。

2.2 C&W 的 SENNA

  Ronan Collobert 和 Jason Weston 在 2008 年的 ICML 上發表的《A Unified Architecture for Natural Language Processing: Deep Neural Networks with Multitask Learning》裡面首次介紹了他們提出的詞向量的計算方法。和上一篇牛文類似,如果現在要看的話,應該去看他們在 2011 年投到 JMLR 上的論文《Natural Language Processing (Almost)
from Scratch》。文中總結了他們的多項工作,非常有系統性。這篇 JMLR 的論文題目也很霸氣啊:從頭開始搞 NLP。他們還把論文所寫的系統開源了,叫做 SENNA(主頁連結),3500
多行純 C 程式碼也是寫得非常清晰。我就是靠著這份程式碼才慢慢看懂這篇論文的。可惜的是,程式碼只有測試部分,沒有訓練部分。

  實際上 C&W 這篇論文主要目的並不是在於生成一份好的詞向量,甚至不想訓練語言模型,而是要用這份詞向量去完成 NLP 裡面的各種任務,比如詞性標註、命名實體識別、短語識別、語義角色標註等等。
  由於目的的不同,C&W 的詞向量訓練方法在我看來也是最特別的。他們沒有去近似地求 P(wt|w1,w2,…,wt−1),而是直接去嘗試近似 P(w1,w2,…,wt)。在實際操作中,他們並沒有去求一個字串的概率,而是求視窗連續 n 個詞的打分 f(wt−n+1,…,wt−1,wt)。打分 f 越高的說明這句話越是正常的話;打分低的說明這句話不是太合理;如果是隨機把幾個詞堆積在一起,那肯定是負分(差評)。打分只有相對高低之分,並沒有概率的特性。
  有了這個對 f 的假設,C&W
就直接使用 pair-wise 的方法訓練詞向量。具體的來說,就是最小化下面的目標函式。

∑x∈X∑w∈Dmax{0,1−f(x)+f(x(w))}

  X 為訓練集中的所有連續的 n 元短語,D 是整個字典。第一個求和列舉了訓練語料中的所有的 n元短語,作為正樣本。第二個對字典的列舉是構建負樣本。x(w) 是將短語 x 的最中間的那個詞,替換成 w。在大多數情況下,在一個正常短語的基礎上隨便找個詞替換掉中間的詞,最後得到的短語肯定不是正確的短語,所以這樣構造的負樣本是非常可用的(多數情況下確實是負樣本,極少數情況下把正常短語當作負樣本也不影響大局)。同時,由於負樣本僅僅是修改了正樣本中的一個詞,也不會讓分類面距離負樣本太遠而影響分類效果。再回顧這個式子,x 是正樣本,x(w) 是負樣本,f(x) 是對正樣本的打分,f(x(w)) 是對負樣本的打分。最後希望正樣本的打分要比負樣本的打分至少高
1 分。

  f 函式的結構和
Bengio 2003 中提到的網路結構基本一致。同樣是把視窗中的 n 個詞對應的詞向量串成一個長的向量,同樣是經過一層網路(乘一個矩陣)得到隱藏層。不同之處在於
C&W 的輸出層只有一個節點,表示得分,而不像 Bengio 那樣的有 |V| 個節點。這麼做可以大大降低計算複雜度,當然有這種簡化還是因為
C&W 並不想做一個真正的語言模型,只是借用語言模型的思想輔助他完成 NLP 的其它任務。(其實 C&W 的方法與 Bengio 的方法還有一個區別,他們為了程式的效率用 HardTanh 代替 tanh 啟用函式。)

  他們在實驗中取視窗大小 n=11,字典大小 |V|=130000,在維基百科英文語料和路透社語料中一共訓練了
7 周,終於得到了這份偉大的詞向量。
  如前面所說 C&W 訓練詞向量的動機與其他人不同,因此他公佈的詞向量與其它詞向量相比主要有兩個區別:
  1.他的詞表中只有小寫單詞。也就是說他把大寫開頭的單詞和小寫單詞當作同一個詞處理。其它的詞向量都是把他們當作不同的詞處理的。
  2.他公佈的詞向量並不直接是上述公式的優化結果,而是在此基礎上進一步跑了詞性標註、命名實體識別等等一系列任務的 Multi-Task Learning 之後,二次優化得到的。也可以理解為是半監督學習得到的,而非其他方法中純無監督學習得到的。

  不過好在 Turian 在 2010 年對 C&W 和 M&H 向量做對比時,重新訓練了一份詞向量放到了網上,那份就沒上面的兩個“問題”(確切的說應該是差別),也可以用的更放心。後面會詳細介紹 Turian 的工作。

  關於這篇論文其實還是有些東西可以吐槽的,不過訓練詞向量這一塊沒有,是論文其他部分的。把吐槽機會留給下一篇博文了。

2.3 M&H 的 HLBL

  Andriy Mnih 和 Geoffrey Hinton 在 2007 年和 2008 年各發表了一篇關於訓練語言模型和詞向量的文章。2007 年發表在 ICML 上的《Three new graphical models for statistical language modelling》表明了 Hinton 將 Deep Learning 戰場擴充套件到 NLP 領域的決心。2008 年發表在 NIPS 上的《A scalable hierarchical distributed language model》則提出了一種層級的思想替換了
Bengio 2003 方法中最後隱藏層到輸出層最花時間的矩陣乘法,在保證效果的基礎上,同時也提升了速度。下面簡單介紹一下這兩篇文章。

  Hinton 在 2006 年提出 Deep Learning 的概念之後,很快就來 NLP 最基礎的任務上試了一把。果然,有效。M&H 在 ICML 2007 上發表的這篇文章提出了“Log-Bilinear”語言模型。文章標題中可以看出他們其實一共提了 3 個模型。從最基本的 RBM 出發,一點點修改能量函式,最後得到了“Log-Bilinear”模型。
  模型如果用神經網路的形式寫出來,是這個樣子:

h=∑i=1t−1HiC(wi)

yj=C(wj)Th

  這裡的兩個式子可以合寫成一個 yj=∑i=1n−1C(wj)THiC(wi)。C(w) 是詞 w 對應的詞向量,形如xTMy 的模型叫做
Bilinear 模型,也就是 M&H 方法名字的來歷了。

  為了更好地理解模型的含義,還是來看這兩個拆解的式子。h 在這裡表示隱藏層,這裡的隱藏層比前面的所有模型都更厲害,直接有語義資訊。首先從第二個式子中隱藏層能和詞向量直接做內積可以看出,隱藏層的維度和詞向量的維度是一致的(都是 m 維)。Hi 就是一個 m×m 的矩陣,該矩陣可以理解為第 i 個詞經過 Hi 這種變換之後,對第 t 個詞產生的貢獻。因此這裡的隱藏層是對前 t−1 個詞的總結,也就是說隱藏層 h 是對下一個詞的一種預測。
  再看看第二個式子,預測下一個詞為 wj 的
log 概率是 yj,它直接就是 C(wj) 和 h 的內積。內積基本上就可以反應相似度,如果各詞向量的模基本一致的話,內積的大小能直接反應兩個向量的
cos 夾角的大小。這裡使用預測詞向量 h 和各個已知詞的詞向量的相似度作為
log 概率,將詞向量的作用發揮到了極致。這也是我覺得這次介紹的模型中最漂亮的一個。

  這種“Log-Bilinear”模型看起來每個詞需要使用上文所有的詞作為輸入,於是語料中最長的句子有多長,就會有多少個 H 矩陣。這顯然是過於理想化了。最後在實現模型時,還是迫於現實的壓力,用了類似
n-gram 的近似,只考慮了上文的 3 到 5 個詞作為輸入來預測下一個詞。

  M&H 的思路如前面提到,是 Bengio 2003 提出的。經過大牛的實現,效果確實不錯。雖然複雜度沒有數量級上的降低,但是由於是純線性模型,沒有啟用函式(當然在做語言模型的時候,最後還是對 yj跑了一個
softmax),因此實際的訓練和預測速度都會有很大的提升。同時隱藏層到輸出層的變數直接用了詞向量,這也就幾乎少了一半的變數,使得模型更為簡潔。最後論文中 M&H 用了和 Bengio 2003 完全一樣的資料集做實驗,效果有了一定的提升。

——————–兩篇文章中間是不是應該有個分割線?——————–

  2008 年 NIPS 的這篇論文,介紹的是“hierarchical log-bilinear”模型,很多論文中都把它稱作簡稱“HLBL”。和前作相比,該方法使用了一個層級的結構做最後的預測。可以簡單地設想一下把網路的最後一層變成一顆平衡二叉樹,二叉樹的每個非葉節點用於給預測向量分類,最後到葉節點就可以確定下一個詞是哪個了。這在複雜度上有顯著的提升,以前是對 |V| 個詞一一做比較,最後找出最相似的,現在只需要做 log2(|V|) 次判斷即可。

  這種層級的思想最初可見於 Frederic Morin 和 Yoshua Bengio 於 2005 年發表的論文《Hierarchical probabilistic neural network language model》中。但是這篇論文使用 WordNet 中的 IS-A 關係,轉化為二叉樹用於分類預測。實驗結果發現速度提升了,效果變差了。
  有了前車之鑑,M&H 就希望能從語料中自動學習出一棵樹,並能達到比人工構建更好的效果。M&H 使用一種 bootstrapping 的方法來構建這棵樹。從隨機的樹開始,根據分類結果不斷調整和迭代。最後得到的是一棵平衡二叉樹,並且同一個詞的預測可能處於多個不同的葉節點。這種用多個葉節點表示一個詞的方法,可以提升下一個詞是多義詞時候的效果。M&H 做的還不夠徹底,後面 Huang 的工作直接對每個詞學習出多個詞向量,能更好地處理多義詞。

2.4 Mikolov 的 RNNLM

  前文說到,Bengio 2003 論文裡提了一句,可以使用一些方法降低引數個數,比如用迴圈神經網路。Mikolov 就抓住了這個坑,從此與迴圈神經網路結下了不解之緣。他最早用迴圈神經網路做語言模型是在 INTERSPEECH 2010 上發表的《Recurrent neural network based language model》裡。Recurrent neural network 是迴圈神經網路,簡稱 RNN,還有個 Recursive neural networks 是遞迴神經網路(Richard
Socher 藉此發了一大堆論文),也簡稱 RNN。看到的時候需要注意區分一下。不過到目前為止,RNNLM 只表示迴圈神經網路做的語言模型,還沒有歧義。
  在之後的幾年中,Mikolov 在一直在RNNLM 上做各種改進,有速度上的,也有準確率上的。現在想了解 RNNLM,看他的博士論文《Statistical Language Models based on Neural Networks》肯定是最好的選擇。

  迴圈神經網路與前面各方法中用到的前饋網路在結構上有比較大的差別,但是原理還是一樣的。網路結構大致如圖2。

RNNLM
圖2(點選檢視大圖)

  左邊是網路的抽象結構,由於迴圈神經網路多用在時序序列上,因此裡面的輸入層、隱藏層和輸出層都帶上了“(t)”。w(t) 是句子中第 t 個詞的
One-hot representation 的向量,也就是說 w 是一個非常長的向量,裡面只有一個元素是
1。而下面的 s(t−1) 向量就是上一個隱藏層。最後隱藏層計算公式為:

s(t)=sigmoid(Uw(t)+Ws(t−1))

  從右圖可以看出迴圈神經網路是如何展開的。每來一個新詞,就和上一個隱藏層聯合計算出下一個隱藏層,隱藏層反覆利用,一直保留著最新的狀態。各隱藏層通過一層傳統的前饋網路得到輸出值。

  w(t) 是一個詞的
One-hot representation,那麼 Uw(t) 也就相當於從矩陣 U 中選出了一列,這一列就是該詞對應的詞向量。

  迴圈神經網路的最大優勢在於,可以真正充分地利用所有上文資訊來預測下一個詞,而不像前面的其它工作那樣,只能開一個 n 個詞的視窗,只用前 n 個詞來預測下一個詞。從形式上看,這是一個非常“終極”的模型,畢竟語言模型裡能用到的資訊,他全用上了。可惜的是,迴圈神經網路形式上非常好看,使用起來卻非常難優化,如果優化的不好,長距離的資訊就會丟失,甚至還無法達到開視窗看前若干個詞的效果。Mikolov
在 RNNLM 裡面只使用了最樸素的 BPTT 優化演算法,就已經比 n-gram 中的 state of the art 方法有更好的效果,這非常令人欣慰。如果用上了更強的優化演算法,最後效果肯定還能提升很多。

  對於最後隱藏層到輸出層的巨大計算量,Mikolov 使用了一種分組的方法:根據詞頻將 |V| 個詞分成 |V|−−−√ 組,先通過 |V|−−−√ 次判斷,看下一個詞屬於哪個組,再通過若干次判斷,找出其屬於組內的哪個元素。最後均攤複雜度約為 o(|V|−−−√),略差於
M&H 的 o(log(|V|)),但是其淺層結構某種程度上可以減少誤差傳遞,也不失為一種良策。

  Mikolov 的 RNNLM 也是開源的(網址)。非常演算法風格的程式碼,幾乎所有功能都在一個檔案裡,工程也很好編譯。比較好的是,RNNLM
可以完美支援中文,如果語料存成 UTF-8 格式,就可以直接用了。

  最後吐槽一句,我覺得他在隱藏層用 sigmoid 作為啟用函式不夠漂亮。因為隱藏層要和輸入詞聯合計算得到下一個隱藏層,如果當前隱藏層的值全是正的,那麼輸入詞對應的引數就會略微偏負,也就是說最後得到的詞向量的均值不在 0 附近。總感覺不好看。當然,從實驗效果看,是我太強迫症了。

2.5 Huang 的語義強化

  與前幾位大牛的工作不同,Eric H. Huang 的工作是在 C&W 的基礎上改進而成的,並非自成一派從頭做起。他這篇發表在 ACL 2012 上的《Improving Word Representations via Global Context and Multiple Word Prototypes》試圖通過對模型的改進,使得詞向量富含更豐富的語義資訊。他在文中提出了兩個主要創新來完成這一目標:(其實從論文標題就能看出來)第一個創新是使用全文資訊輔助已有的區域性資訊,第二個創新是使用多個詞向量來表示多義詞。下面逐一介紹。

  Huang 認為 C&W 的工作只利用了“區域性上下文(Local Context)”。C&W 在訓練詞向量的時候,只使用了上下文各 5 個詞,算上自己總共有 11 個詞的資訊,這些區域性的資訊還不能充分挖掘出中間詞的語義資訊。Huang 直接使用 C&W 的網路結構計算出一個得分,作為“區域性得分”。
  然後 Huang 提出了一個“全域性資訊”,這有點類似傳統的詞袋子模型。詞袋子模型是把文章中所有詞的 One-hot Representation 加起來,形成一個向量(就像把詞全都扔進一個袋子裡),用來表示文章。Huang 的全域性模型是將文章中所有詞的詞向量求個加權平均(權重是詞的 idf),作為文章的語義。他把文章的語義向量和當前詞的詞向量拼接起來,形成一個兩倍長度的向量作為輸入,之後還是用 C&W 的網路結構算出一個打分。
  有了 C&W 方法的得到的“區域性得分”,再加上在 C&W 方法基礎上改造得到的“全域性得分”,Huang 直接把兩個得分相加,作為最終得分。最終得分使用 C&W 提出的 pair-wise 目標函式來優化。
  加了這個全域性資訊有什麼用處呢?Huang 在實驗中發現,他的模型能更好地捕捉詞的語義資訊。比如 C&W 的模型中,與 markets 最相近的詞為 firms、industries;而 Huang 的模型得到的結果是 market、firms。很明顯,C&W 的方法由於只考慮了臨近詞的資訊,最後的結果是詞法特徵最相近的詞排在了前面(都是複數形式)。不過我覺得這個可能是英語才有的現象,中文沒有詞形變化,如果在中文中做同樣的實驗還不知道會有什麼效果。

  Huang 論文的第二個貢獻是將多義詞用多個詞向量來表示。Bengio 2003 在最後提過這是一個重要的問題,不過當時他還在想辦法解決,現在 Huang 給出了一種思路。
  將每個詞的上下文各 5 個詞拿出來,對這 10 個詞的詞向量做加權平均(同樣使用 idf 作為權重)。對所有得到的上下文向量做 k-means 聚類,根據聚類結果給每個詞打上標籤(不同類中的同一個詞,當作不同的詞處理),最後重新訓練詞向量。
  當然這個實驗的效果也是很不錯的,最後 star 的某一個表示最接近的詞是 movie、film;另一個表示最接近的詞是 galaxy、planet。
  
  這篇文章還做了一些對比實驗,在下一章評價裡細講。

2.999 總結

  //博主道:本節承上啟下,不知道應該放在第 2 章還是第 3 章,便將小節號寫為 2.999。

  講完了大牛們的各種方法,自己也忍不住來總結一把。當然,為了方便對比,我先列舉一下上面提到的各個系統的現有資源,見下表。對應的論文不在表中列出,可參見最後的參考文獻。

名稱
訓練語料及規模
詞向量
特點
資源
C&W English Wikipedia 
+ Reuters RCV1
共 631M + 221M 詞
130000 詞
50 維
不區分大小寫;
經過有監督修正;
訓練了 7 周
測試程式碼、
詞向量
[連結]
C&W – Turian Reuters RCV1
63M 詞
268810 詞
25、50、
100、200 維
區分大小寫;
訓練了若干周
訓練程式碼、
詞向量
[連結]
M&H – Turian Reuters RCV1 246122 詞
50、100 維
區分大小寫;
用GPU訓練了7天
詞向量
[連結]
Mikolov Broadcast news 82390 詞
80、640、
1600 維
不區分大小寫;
訓練了若干天
訓練、測試程式碼、
詞向量
[連結]
Huang 2012 English Wikipedia 100232 詞
50 維
不區分大小寫;
最高頻的6000詞,
每詞有10種表示
訓練、測試程式碼、
語料及詞向量
[連結]
顯示第 1 至 5 項結果,共 5 項

  Turian 的工作前面只是提了一下,他在做 C&W 向量與 H&M 向量的對比實驗時,自己按照論文重新實現了一遍他們的方法,並公佈了詞向量。後來 C&W 在主頁上強調了一下:儘管很多論文把 Turian 實現的結果叫做 C&W 向量,但是與我釋出的詞向量是不同的,我這個在更大的語料上訓練,還花了兩個月時間呢!
  Turian 公佈的 H&M 向量是直接請 Andriy Mnih 在 Turian 做好的語料上執行了一下 HLBL,所以沒有程式碼公佈。同時 Turian 自己實現了一份 LBL模型,但是沒有公佈訓練出來的詞向量。(這是根據他主頁上描述推測的結果,從 Turian 的論文中看,他應該是實現了 HLBL 演算法並且算出詞向量的。)
  RCV1 的詞數兩篇文章中所寫的資料差距較大,還不知道是什麼原因。

  Holger Schwenk 在詞向量和語言模型方面也做了一些工作,看起來大體相似,也沒仔細讀過他的論文。有興趣的讀作可以直接搜他的論文。

  事實上,除了 RNNLM 以外,上面其它所有模型在第一層(輸入層到隱藏層)都是等價的,都可以看成一個單層網路。可能形式最為特別的是 M&H 的模型,對前面的每個詞單獨乘以矩陣 Hi,而不是像其它方法那樣把詞向量串接起來乘以矩陣 H。但如果把 H 看成 Hi 的拼接: [H1H2…Ht],則會有以下等式:

[H1H2…Ht]⎡⎣⎢⎢⎢C(w1)C(w2)…C(wt)⎤⎦⎥⎥⎥=H1C(w1)+H2C(w2)+…+HtC(wt)

  這麼看來還是等價的。

  所以前面的這麼多模型,本質是非常相似的。都是從前若干個詞的詞向量通過線性變換抽象出一個新的語義(隱藏層),再通過不同的方法來解析這個隱藏層。模型的差別主要就在隱藏層到輸出層的語義。Bengio 2003 使用了最樸素的線性變換,直接從隱藏層對映到每個詞;C&W 簡化了模型(不求語言模型),通過線性變換將隱藏層轉換成一個打分;M&H 複用了詞向量,進一步強化了語義,並用層級結構加速;Mikolov 則用了分組來加速。

  每種方法真正的差別看起來並不大,當然裡面的這些創新,也都是有據可循的。下一章就直接來看看不同模型的效果如何。

3. 詞向量的評價

  詞向量的評價大體上可以分成兩種方式,第一種是把詞向量融入現有系統中,看對系統效能的提升;第二種是直接從語言學的角度對詞向量進行分析,如相似度、語義偏移等。

3.1 提升現有系統

  詞向量的用法最常見的有兩種:
  1. 直接用於神經網路模型的輸入層。如 C&W 的 SENNA 系統中,將訓練好的詞向量作為輸入,用前饋網路和卷積網路完成了詞性標註、語義角色標註等一系列任務。再如 Socher 將詞向量作為輸入,用遞迴神經網路完成了句法分析、情感分析等多項任務。
  2. 作為輔助特徵擴充現有模型。如 Turian 將詞向量作為額外的特徵加入到接近 state of the art 的方法中,進一步提高了命名實體識別和短語識別的效果。
  具體的用法理論上會在下一篇博文中細講。
  
  C&W 的論文中有一些對比實驗。實驗的結果表明,使用詞向量作為初始值替代隨機初始值,其效果會有非常顯著的提升(如:詞性標註準確率從 96.37% 提升到 97.20%;命名實體識別 F 值從 81.47% 提升到 88.67%)。同時使用更大的語料來訓練,效果也會有一些提升。

  Turian 發表在 ACL 2010 上的實驗對比了 C&W 向量與 M&H 向量用作輔助特徵時的效果。在短語識別和命名實體識別兩個任務中,C&W 向量的效果都有略微的優勢。同時他也發現,如果將這兩種向量融合起來,會有更好的效果。除了這兩種詞向量,Turian 還使用 Brown Cluster 作為輔助特徵做了對比,效果最好的其實是 Brown Cluster,不過這個已經超出本文的範圍了。

3.2 語言學評價

  Huang 2012 的論文提出了一些創新,能提升詞向量中的語義成分。他也做了一些實驗對比了各種詞向量的語義特性。實驗方法大致就是將詞向量的相似度與人工標註的相似度做比較。最後 Huang 的方法語義相似度最好,其次是 C&W 向量,再然後是 Turian 訓練的 HLBL 向量與 C&W 向量。這裡因為 Turian 訓練詞向量時使用的資料集(RCV1)與其他的對比實驗(Wiki)並不相同,因此並不是非常有可比性。但從這裡可以推測一下,可能更大更豐富的語料對於語義的挖掘是有幫助的。

  還有一個有意思的分析是 Mikolov 在 2013 年剛剛發表的一項發現。他發現兩個詞向量之間的關係,可以直接從這兩個向量的差裡體現出來。向量的差就是數學上的定義,直接逐位相減。比如 C(king)−C(queen)≈C(man)−C(woman)。更強大的是,與 C(king)−C(man)+C(woman) 最接近的向量就是 C(queen)。
  為了分析詞向量的這個特點, Mikolov 使用類比(analogy)的方式來評測。如已知 a 之於 b 猶如 c 之於 d。現在給出 a、b、c,看 C(a)−C(b)+C(c) 最接近的詞是否是
d。
  在文章 Mikolov 對比了詞法關係(名詞單複數 good-better:rough-rougher、動詞第三人稱單數、形容詞比較級最高階等)和語義關係(clothing-shirt:dish-bowl)。
  在詞法關係上,RNN 的效果最好,然後是 Turian 實現的 HLBL,最後是 Turian 的 C&W。(RNN-80:19%;RNN-1600:39.6%;HLBL-100:18.7%;C&W-100:5%;-100表示詞向量為100維)
  在語義關係上,表現最好的還是 RNN,然後是 Turian 的兩個向量,差距沒剛才的大。(RNN-80:0.211;C&W-100:0.154;HLBL-100:0.146)
  但是這個對比實驗用的訓練語料是不同的,也不能特別說明優劣。

  這些實驗結果中最容易理解的是:語料越大,詞向量就越好。其它的實驗由於缺乏嚴格控制條件進行對比,談不上哪個更好哪個更差。不過這裡的兩個語言學分析都非常有意思,尤其是向量之間存在這種線性平移的關係,可能會是詞向量發展的一個突破口。

參考文獻

Yoshua Bengio, Rejean Ducharme, Pascal Vincent, and Christian Jauvin. A neural probabilistic language model. Journal of Machine
Learning Research (JMLR), 3:1137–1155, 2003. [PDF]

Ronan Collobert, Jason Weston, Léon Bottou, Michael Karlen, Koray Kavukcuoglu and Pavel Kuksa.Natural Language Processing (Almost)
from Scratch. Journal of Machine Learning Research (JMLR), 12:2493-2537, 2011. [PDF]

Andriy Mnih & Geoffrey Hinton. Three new graphical models for statistical language modelling. International Conference on
Machine Learning (ICML). 2007. [PDF]
Andriy Mnih & Geoffrey Hinton. A scalable hierarchical distributed language model. The Conference on Neural Information Processing
Systems (NIPS) (pp. 1081–1088). 2008. [PDF]

Mikolov Tomáš. Statistical Language Models based on Neural Networks. PhD thesis, Brno University of Technology. 2012. [PDF]

Turian Joseph, Lev Ratinov, and Yoshua Bengio. Word representations: a simple and general method for semi-supervised learning.
Proceedings of the 48th Annual Meeting of the Association for Computational Linguistics (ACL). 2010. [PDF]

Eric Huang, Richard Socher, Christopher Manning and Andrew Ng. Improving word representations via global context and multiple word
prototypes. Proceedings of the 50th Annual Meeting of the Association for Computational Linguistics: Long Papers-Volume 1. 2012. [PDF]

Mikolov, Tomas, Wen-tau Yih, and Geoffrey Zweig. Linguistic regularities in continuous space word representations. Proceedings
of NAACL-HLT. 2013. [PDF]


  斷斷續續寫了這麼多,如果有人看加上自己有時間的話,還會有續集《Deep Learning in NLP (二)模型及用法》,也是介紹幾篇文章,從模型的層次做一些粗淺的分析。