原文轉載:http://licstar.net/archives/328 web
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 領域中的研究已經將高深莫測的人類語言撕開了一層神祕的面紗。
我以爲其中最有趣也是最基本的,就是「詞向量」了。bootstrap
將詞用「詞向量」的方式表示可謂是將 Deep Learning 算法引入 NLP 領域的一個核心技術。大多數宣稱用了 Deep Learning 的論文,其中每每也用了詞向量。 網絡
天然語言理解的問題要轉化爲機器學習的問題,第一步確定是要找一種方法把這些符號數學化。
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 領域的各類主流任務。
固然這種表示方法也存在一個重要的問題就是「詞彙鴻溝」現象:任意兩個詞之間都是孤立的。光從這兩個向量中看不出兩個詞是否有關係,哪怕是話筒和麥克這樣的同義詞也不能倖免於難。 app
Deep Learning 中通常用到的詞向量並非剛纔提到的用 One-hot Representation 表示的那種很長很長的詞向量,而是用 Distributed Representation(不知道這個應該怎麼翻譯,由於還存在一種叫「Distributional Representation」的表示方法,又是另外一個不一樣的概念)表示的一種低維實數向量。這種向量通常長成這個樣子:[0.792, −0.177, −0.107, 0.109, −0.542, …]。維度以 50 維和 100 維比較常見。這種向量的表示不是惟一的,後文會提到目前計算出這種向量的主流方法。
(我的認爲)Distributed representation 最大的貢獻就是讓相關或者類似的詞,在距離上更接近了。向量的距離能夠用最傳統的歐氏距離來衡量,也能夠用 cos 夾角來衡量。用這種方式表示的向量,「麥克」和「話筒」的距離會遠遠小於「麥克」和「天氣」。可能理想狀況下「麥克」和「話筒」的表示應該是徹底同樣的,可是因爲有些人會把英文名「邁克」也寫成「麥克」,致使「麥克」一詞帶上了一些人名的語義,所以不會和「話筒」徹底一致。 機器學習
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,其複雜度幾乎是難以接受的,所以低維的詞向量在這裏也飽受追捧。
同時如上一節提到的,類似詞的詞向量距離相近,這就讓基於詞向量設計的一些模型自帶平滑功能,讓模型看起來很是的漂亮。 性能
要介紹詞向量是怎麼訓練獲得的,就不得不提到語言模型。到目前爲止我瞭解到的全部訓練方法都是在訓練語言模型的同時,順便獲得詞向量的。
這也比較容易理解,要從一段無標註的天然文本中學習出一些東西,無非就是統計出詞頻、詞的共現、詞的搭配之類的信息。而要從天然文本中統計並創建一個語言模型,無疑是要求最爲精確的一個任務(也不排除之後有人創造出更好更有用的方法)。既然構建語言模型這一任務要求這麼高,其中必然也須要對語言進行更精細的統計和分析,同時也會須要更好的模型,更大的數據來支撐。目前最好的詞向量都來自於此,也就不難理解了。
這裏介紹的工做均爲從大量未標註的普通文本數據中無監督地學習出詞向量(語言模型原本就是基於這個想法而來的),能夠猜想,若是用上了有標註的語料,訓練詞向量的方法確定會更多。不過視目前的語料規模,仍是使用未標註語料的方法靠譜一些。
詞向量的訓練最經典的有 3 個工做,C&W 200八、M&H 200八、Mikolov 2010。固然在說這些工做以前,不得不介紹一下這一系列中 Bengio 的經典之做。 學習
插段廣告,簡單介紹一下語言模型,知道的能夠無視這節。
語言模型其實就是看一句話是否是正常人說出來的。這玩意頗有用,好比機器翻譯、語音識別獲得若干候選以後,能夠利用語言模型挑一個儘可能靠譜的結果。在 NLP 的其它任務裏也都能用到。
語言模型形式化的描述就是給定一個字符串,看它是天然語言的機率 $P(w_1,w_2,\dots,w_t)$。$w_1 $到 $w_t$ 依次表示這句話中的各個詞。有個很簡單的推論是:
\[P(w_1,w_2,\dots,w_t)=P(w_1)\times P(w_2|w_1)\times P(w_3|w_1,w_2)\times\dots\times P(w_t|w_1,w_2,\dots,w_{t−1})\]
經常使用的語言模型都是在近似地求 $P(w_t|w_1,w_2,\dots,w_{t−1})$。好比 n-gram 模型就是用 $P(w_t|w_{t−n+1},\dots,w_{t−1})$ 近似表示前者。
順便提一句,因爲後面要介紹的每篇論文使用的符號差別太大,本博文裏嘗試統一使用 Bengio 2003 的符號系統(略作簡化),以便在各方法之間作對比和分析。
用神經網絡訓練語言模型的思想最先由百度 IDL 的徐偉於 2000 提出。(感謝 @餘凱_西二旗民工 博士指出。)其論文《Can Artificial Neural Networks Learn Language Models?》提出一種用神經網絡構建二元語言模型(即 $P(w_t|w_{t−1})$)的方法。文中的基本思路與後續的語言模型的差異已經不大了。
訓練語言模型的最經典之做,要數 Bengio 等人在 2001 年發表在 NIPS 上的文章《A Neural Probabilistic Language Model》。固然如今看的話,確定是要看他在 2003 年投到 JMLR 上的同名論文了。
Bengio 用了一個三層的神經網絡來構建語言模型,一樣也是 n-gram 模型。如圖1。
圖中最下方的 $w_{t−n+1},…,w_{t−2},w_{t−1}$ 就是前 n−1 個詞。如今須要根據這已知的 n−1 個詞預測下一個詞 $w_t$。C(w) 表示詞 w 所對應的詞向量,整個模型中使用的是一套惟一的詞向量,存在矩陣 C(一個 |V|×m 的矩陣)中。其中 |V| 表示詞表的大小(語料中的總詞數),m 表示詞向量的維度。w 到 C(w) 的轉化就是從矩陣中取出一行。
網絡的第一層(輸入層)是將 $C(w_{t−n+1}),\dots,C(w_{t−2}),C(w_{t−1}) $這 n−1 個向量首尾相接拼起來,造成一個 (n−1)m 維的向量,下面記爲 x。
網絡的第二層(隱藏層)就如同普通的神經網絡,直接使用 d+Hx 計算獲得。d 是一個偏置項。在此以後,使用 $\tanh$ 做爲激活函數。
網絡的第三層(輸出層)一共有 |V| 個節點,每一個節點 yi 表示 下一個詞爲 i 的未歸一化 log 機率。最後使用 softmax 激活函數將輸出值 y 歸一化成機率。最終,y 的計算公式爲:
\[y=b+Wx+U\tanh(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 就順着這個方向發表了一大堆論文,直到博士畢業。
大牛就是大牛。
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(w_t|w_1,w_2,…,w_{t−1})$,而是直接去嘗試近似 $P(w_1,w_2,…,w_t)$。在實際操做中,他們並無去求一個字符串的機率,而是求窗口連續 n 個詞的打分 $f(w_{t−n+1},\dots,w_{t−1},w_t)$。打分 f 越高的說明這句話越是正常的話;打分低的說明這句話不是太合理;若是是隨機把幾個詞堆積在一塊兒,那確定是負分(差評)。打分只有相對高低之分,並無機率的特性。
有了這個對 f 的假設,C&W 就直接使用 pair-wise 的方法訓練詞向量。具體的來講,就是最小化下面的目標函數。
\[\sum\limits_{x\in \mathfrak{X}} { \sum\limits_{w\in \mathfrak{D}} {\max \{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 的工做。
關於這篇論文其實仍是有些東西能夠吐槽的,不過訓練詞向量這一塊沒有,是論文其餘部分的。把吐槽機會留給下一篇博文了。
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 = \sum\limits_{i=1}^{t-1}{H_i C(w_i)}\]
\[y_j = C(w_j)^T h\]
這裏的兩個式子能夠合寫成一個 $y_j = \sum\limits_{i=1}^{n-1}{C(w_j)^T H_i C(w_i)}$。C(w) 是詞 w 對應的詞向量,形如 $x^TMy$ 的模型叫作 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 的工做直接對每一個詞學習出多個詞向量,能更好地處理多義詞。
前文說到,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。
左邊是網絡的抽象結構,因爲循環神經網絡多用在時序序列上,所以裏面的輸入層、隱藏層和輸出層都帶上了「(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 附近。總感受很差看。固然,從實驗效果看,是我太強迫症了。
與前幾位大牛的工做不一樣,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。
這篇文章還作了一些對比實驗,在下一章評價裏細講。
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],則會有如下等式:
\[[H_1 H_2 … H_t] \left[ \begin{array}{c} C(w_1)\\ C(w_2)\\ …\\ C(w_t) \end{array} \right] = H_1 C(w_1) + H_2 C(w_2) +… +H_t C(w_t)\]
這麼看來仍是等價的。
因此前面的這麼多模型,本質是很是類似的。都是從前若干個詞的詞向量經過線性變換抽象出一個新的語義(隱藏層),再經過不一樣的方法來解析這個隱藏層。模型的差異主要就在隱藏層到輸出層的語義。Bengio 2003 使用了最樸素的線性變換,直接從隱藏層映射到每一個詞;C&W 簡化了模型(不求語言模型),經過線性變換將隱藏層轉換成一個打分;M&H 複用了詞向量,進一步強化了語義,並用層級結構加速;Mikolov 則用了分組來加速。
每種方法真正的差異看起來並不大,固然裏面的這些創新,也都是有據可循的。下一章就直接來看看不一樣模型的效果如何。
詞向量的評價大致上能夠分紅兩種方式,第一種是把詞向量融入現有系統中,看對系統性能的提高;第二種是直接從語言學的角度對詞向量進行分析,如類似度、語義偏移等。
詞向量的用法最多見的有兩種:
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,不過這個已經超出本文的範圍了。
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]