這篇博客是我看了半年的論文后,自己對(duì) Deep Learning 在自然語(yǔ)言處理領(lǐng)域中應(yīng)用的理解和總結(jié),在此分享。其中必然有局限性,歡迎各種交流,隨便拍。
Deep Learning 算法已經(jīng)在圖像和音頻領(lǐng)域取得了驚人的成果,但是在NLP領(lǐng)域中尚未見(jiàn)到如此激動(dòng)人心的結(jié)果。關(guān)于這個(gè)原因,引一條我比較贊同的微博。
@王威廉:Steve Renals算了一下icassp錄取文章題目中包含deep learning的數(shù)量,發(fā)現(xiàn)有44篇,而naacl則有0篇。有一種說(shuō)法是,語(yǔ)言(詞、句子、篇章等)屬于人類認(rèn)知過(guò)程中產(chǎn)生的高層認(rèn)知抽象實(shí)體,而語(yǔ)音和圖像屬于較為底層的原始輸入信號(hào),所以后兩者更適合做deep learning來(lái)學(xué)習(xí)特征。
2013年3月4日 14:46
第一句就先不用管了,畢竟今年的 ACL 已經(jīng)被灌了好多 Deep Learning 的論文了。第二句我很認(rèn)同,不過(guò)我也有信心以后一定有人能挖掘出語(yǔ)言這種高層次抽象中的本質(zhì)。不論最后這種方法是不是 Deep Learning,就目前而言,Deep Learning 在自然語(yǔ)言處理領(lǐng)域中的研究已經(jīng)將高深莫測(cè)的人類語(yǔ)言撕開(kāi)了一層神秘的面紗。
我覺(jué)得其中最有趣也是最基本的,就是“詞向量”了。
將詞用“詞向量”的方式表示可謂是將 Deep Learning 算法引入NLP領(lǐng)域的一個(gè)核心技術(shù)。大多數(shù)宣稱用了 Deep Learning 的論文,其中往往也用了詞向量。
0. 詞向量是什么
1.詞向量的來(lái)歷
2.詞向量的訓(xùn)練
2.0 語(yǔ)言模型簡(jiǎn)介
2.1 Bengio 的經(jīng)典之作
2.2 C&W 的 SENNA
2.3 M&H 的 HLBL
2.4 Mikolov 的 RNNLM
2.5 Huang 的語(yǔ)義強(qiáng)化
2.999 總結(jié)
3. 詞向量的評(píng)價(jià)
3.1 提升現(xiàn)有系統(tǒng)
3.2 語(yǔ)言學(xué)評(píng)價(jià)
參考文獻(xiàn)
0. 詞向量是什么
自然語(yǔ)言理解的問(wèn)題要轉(zhuǎn)化為機(jī)器學(xué)習(xí)的問(wèn)題,第一步肯定是要找一種方法把這些符號(hào)數(shù)學(xué)化。
自然語(yǔ)言處理中最直觀,也是到目前為止最常用的詞表示方法是 One-hot Representation,這種方法把每個(gè)詞表示為一個(gè)很長(zhǎng)的向量。這個(gè)向量的維度是詞表大小,其中絕大多數(shù)元素為 0,只有一個(gè)維度的值為 1,這個(gè)維度就代表了當(dāng)前的詞。
舉個(gè)栗子,
“話筒”表示為 [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 …]
每個(gè)詞都是茫茫 0 海中的一個(gè) 1。
這種 One-hot Representation 如果采用稀疏方式存儲(chǔ),會(huì)是非常的簡(jiǎn)潔:也就是給每個(gè)詞分配一個(gè)數(shù)字 ID。比如剛才的例子中,話筒記為 3,麥克記為 8(假設(shè)從 0 開(kāi)始記)。如果要編程實(shí)現(xiàn)的話,用 Hash 表給每個(gè)詞分配一個(gè)編號(hào)就可以了。這么簡(jiǎn)潔的表示方法配合上最大熵、SVM、CRF 等等算法已經(jīng)很好地完成了 NLP 領(lǐng)域的各種主流任務(wù)。
當(dāng)然這種表示方法也存在一個(gè)重要的問(wèn)題就是“詞匯鴻溝”現(xiàn)象:任意兩個(gè)詞之間都是孤立的。光從這兩個(gè)向量中看不出兩個(gè)詞是否有關(guān)系,哪怕是話筒和麥克這樣的同義詞也不能幸免于難。
Deep Learning 中一般用到的詞向量并不是剛才提到的用 One-hot Representation 表示的那種很長(zhǎng)很長(zhǎng)的詞向量,而是用?Distributed Representation(不知道這個(gè)應(yīng)該怎么翻譯,因?yàn)檫€存在一種叫“Distributional Representation”的表示方法,又是另一個(gè)不同的概念)表示的一種低維實(shí)數(shù)向量。這種向量一般長(zhǎng)成這個(gè)樣子:[0.792, ?0.177, ?0.107, 0.109, ?0.542, …]。維度以 50 維和 100 維比較常見(jiàn)。這種向量的表示不是唯一的,后文會(huì)提到目前計(jì)算出這種向量的主流方法。
(個(gè)人認(rèn)為)Distributed representation 最大的貢獻(xiàn)就是讓相關(guān)或者相似的詞,在距離上更接近了。向量的距離可以用最傳統(tǒng)的歐氏距離來(lái)衡量,也可以用 cos 夾角來(lái)衡量。用這種方式表示的向量,“麥克”和“話筒”的距離會(huì)遠(yuǎn)遠(yuǎn)小于“麥克”和“天氣”。可能理想情況下“麥克”和“話筒”的表示應(yīng)該是完全一樣的,但是由于有些人會(huì)把英文名“邁克”也寫成“麥克”,導(dǎo)致“麥克”一詞帶上了一些人名的語(yǔ)義,因此不會(huì)和“話筒”完全一致。
?1. 詞向量的來(lái)歷
Distributed representation 最早是 Hinton 在 1986 年的論文《Learning distributed representations of concepts》中提出的。雖然這篇文章沒(méi)有說(shuō)要將詞做 Distributed representation,(甚至我很無(wú)厘頭地猜想那篇文章是為了給他剛提出的 BP 網(wǎng)絡(luò)打廣告,)但至少這種先進(jìn)的思想在那個(gè)時(shí)候就在人們的心中埋下了火種,到 2000 年之后開(kāi)始逐漸被人重視。
Distributed representation 用來(lái)表示詞,通常被稱為“Word Representation”或“Word Embedding”,中文俗稱“詞向量”。真的只能叫“俗稱”,算不上翻譯。半年前我本想翻譯的,但是硬是想不出 Embedding 應(yīng)該怎么翻譯的,后來(lái)就這么叫習(xí)慣了-_-||| 如果有好的翻譯歡迎提出。(更新:@南大周志華?在微博中給了一個(gè)合適的翻譯:詞嵌入)Embedding 一詞的意義可以參考維基百科的相應(yīng)頁(yè)面(鏈接)。后文提到的所有“詞向量”都是指用 Distributed Representation 表示的詞向量。
如果用傳統(tǒng)的稀疏表示法表示詞,在解決某些任務(wù)的時(shí)候(比如構(gòu)建語(yǔ)言模型)會(huì)造成維數(shù)災(zāi)難[Bengio 2003]。使用低維的詞向量就沒(méi)這樣的問(wèn)題。同時(shí)從實(shí)踐上看,高維的特征如果要套用 Deep Learning,其復(fù)雜度幾乎是難以接受的,因此低維的詞向量在這里也飽受追捧。
同時(shí)如上一節(jié)提到的,相似詞的詞向量距離相近,這就讓基于詞向量設(shè)計(jì)的一些模型自帶平滑功能,讓模型看起來(lái)非常的漂亮。
2. 詞向量的訓(xùn)練
要介紹詞向量是怎么訓(xùn)練得到的,就不得不提到語(yǔ)言模型。到目前為止我了解到的所有訓(xùn)練方法都是在訓(xùn)練語(yǔ)言模型的同時(shí),順便得到詞向量的。
這也比較容易理解,要從一段無(wú)標(biāo)注的自然文本中學(xué)習(xí)出一些東西,無(wú)非就是統(tǒng)計(jì)出詞頻、詞的共現(xiàn)、詞的搭配之類的信息。而要從自然文本中統(tǒng)計(jì)并建立一個(gè)語(yǔ)言模型,無(wú)疑是要求最為精確的一個(gè)任務(wù)(也不排除以后有人創(chuàng)造出更好更有用的方法)。既然構(gòu)建語(yǔ)言模型這一任務(wù)要求這么高,其中必然也需要對(duì)語(yǔ)言進(jìn)行更精細(xì)的統(tǒng)計(jì)和分析,同時(shí)也會(huì)需要更好的模型,更大的數(shù)據(jù)來(lái)支撐。目前最好的詞向量都來(lái)自于此,也就不難理解了。
這里介紹的工作均為從大量未標(biāo)注的普通文本數(shù)據(jù)中無(wú)監(jiān)督地學(xué)習(xí)出詞向量(語(yǔ)言模型本來(lái)就是基于這個(gè)想法而來(lái)的),可以猜測(cè),如果用上了有標(biāo)注的語(yǔ)料,訓(xùn)練詞向量的方法肯定會(huì)更多。不過(guò)視目前的語(yǔ)料規(guī)模,還是使用未標(biāo)注語(yǔ)料的方法靠譜一些。
詞向量的訓(xùn)練最經(jīng)典的有 3 個(gè)工作,C&W 2008、M&H 2008、Mikolov 2010。當(dāng)然在說(shuō)這些工作之前,不得不介紹一下這一系列中 Bengio 的經(jīng)典之作。
2.0 語(yǔ)言模型簡(jiǎn)介
插段廣告,簡(jiǎn)單介紹一下語(yǔ)言模型,知道的可以無(wú)視這節(jié)。
語(yǔ)言模型其實(shí)就是看一句話是不是正常人說(shuō)出來(lái)的。這玩意很有用,比如機(jī)器翻譯、語(yǔ)音識(shí)別得到若干候選之后,可以利用語(yǔ)言模型挑一個(gè)盡量靠譜的結(jié)果。在 自然語(yǔ)言處理的其它任務(wù)里也都能用到。
語(yǔ)言模型形式化的描述就是給定一個(gè)字符串,看它是自然語(yǔ)言的概率?P(w1,w2,…,wt)P(w1,w2,…,wt)。w1w1到?wtwt?依次表示這句話中的各個(gè)詞。有個(gè)很簡(jiǎn)單的推論是:
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)
常用的語(yǔ)言模型都是在近似地求?P(wt|w1,w2,…,wt?1)P(wt|w1,w2,…,wt?1)。比如 n-gram 模型就是用?P(wt|wt?n+1,…,wt?1)P(wt|wt?n+1,…,wt?1)?近似表示前者。
順便提一句,由于后面要介紹的每篇論文使用的符號(hào)差異太大,本博文里嘗試統(tǒng)一使用 Bengio 2003 的符號(hào)系統(tǒng)(略做簡(jiǎn)化),以便在各方法之間做對(duì)比和分析。
2.1 Bengio 的經(jīng)典之作
用神經(jīng)網(wǎng)絡(luò)訓(xùn)練語(yǔ)言模型的思想最早由百度 IDL 的徐偉于 2000 提出。(感謝?@余凱_西二旗民工博士指出。)其論文《Can Artificial Neural Networks Learn Language Models?》提出一種用神經(jīng)網(wǎng)絡(luò)構(gòu)建二元語(yǔ)言模型(即?P(wt|wt?1)P(wt|wt?1))的方法。文中的基本思路與后續(xù)的語(yǔ)言模型的差別已經(jīng)不大了。
訓(xùn)練語(yǔ)言模型的最經(jīng)典之作,要數(shù) Bengio 等人在 2001 年發(fā)表在 NIPS 上的文章《A Neural Probabilistic Language Model》。當(dāng)然現(xiàn)在看的話,肯定是要看他在 2003 年投到 JMLR 上的同名論文了。
Bengio 用了一個(gè)三層的神經(jīng)網(wǎng)絡(luò)來(lái)構(gòu)建語(yǔ)言模型,同樣也是 n-gram 模型。如圖1。

網(wǎng)絡(luò)的第一層(輸入層)是將?C(wt?n+1),…,C(wt?2),C(wt?1)C(wt?n+1),…,C(wt?2),C(wt?1)?這?n?1n?1?個(gè)向量首尾相接拼起來(lái),形成一個(gè)?(n?1)m(n?1)m?維的向量,下面記為?xx。
網(wǎng)絡(luò)的第二層(隱藏層)就如同普通的神經(jīng)網(wǎng)絡(luò),直接使用?d+Hxd+Hx?計(jì)算得到。dd?是一個(gè)偏置項(xiàng)。在此之后,使用?tanhtanh?作為激活函數(shù)。
網(wǎng)絡(luò)的第三層(輸出層)一共有?|V||V|?個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)?yiyi?表示 下一個(gè)詞為?ii?的未歸一化 log 概率。最后使用 softmax 激活函數(shù)將輸出值?yy?歸一化成概率。最終,yy?的計(jì)算公式為:
式子中還有一個(gè)矩陣?WW(|V|×(n?1)m|V|×(n?1)m),這個(gè)矩陣包含了從輸入層到輸出層的直連邊。直連邊就是從輸入層直接到輸出層的一個(gè)線性變換,好像也是神經(jīng)網(wǎng)絡(luò)中的一種常用技巧(沒(méi)有仔細(xì)考察過(guò))。如果不需要直連邊的話,將?WW?置為 0 就可以了。在最后的實(shí)驗(yàn)中,Bengio 發(fā)現(xiàn)直連邊雖然不能提升模型效果,但是可以少一半的迭代次數(shù)。同時(shí)他也猜想如果沒(méi)有直連邊,可能可以生成更好的詞向量。
現(xiàn)在萬(wàn)事俱備,用隨機(jī)梯度下降法把這個(gè)模型優(yōu)化出來(lái)就可以了。需要注意的是,一般神經(jīng)網(wǎng)絡(luò)的輸入層只是一個(gè)輸入值,而在這里,輸入層?xx?也是參數(shù)(存在?CC?中),也是需要優(yōu)化的。優(yōu)化結(jié)束之后,詞向量有了,語(yǔ)言模型也有了。
這樣得到的語(yǔ)言模型自帶平滑,無(wú)需傳統(tǒng) n-gram 模型中那些復(fù)雜的平滑算法。Bengio 在 APNews 數(shù)據(jù)集上做的對(duì)比實(shí)驗(yàn)也表明他的模型效果比精心設(shè)計(jì)平滑算法的普通 n-gram 算法要好 10% 到 20%。
在結(jié)束介紹 Bengio 大牛的經(jīng)典作品之前再插一段八卦。在其 JMLR 論文中的未來(lái)工作一段,他提了一個(gè)能量函數(shù),把輸入向量和輸出向量統(tǒng)一考慮,并以最小化能量函數(shù)為目標(biāo)進(jìn)行優(yōu)化。后來(lái) M&H 工作就是以此為基礎(chǔ)展開(kāi)的。
他提到一詞多義有待解決,9 年之后 Huang 提出了一種解決方案。他還在論文中隨口(不是在 Future Work 中寫的)提到:可以使用一些方法降低參數(shù)個(gè)數(shù),比如用循環(huán)神經(jīng)網(wǎng)絡(luò)。后來(lái) Mikolov 就順著這個(gè)方向發(fā)表了一大堆論文,直到博士畢業(yè)。
大牛就是大牛。
2.2 C&W 的 SENNA
Ronan Collobert 和 Jason Weston 在 2008 年的 ICML 上發(fā)表的《A Unified Architecture for Natural Language Processing: Deep Neural Networks with Multitask Learning》里面首次介紹了他們提出的詞向量的計(jì)算方法。和上一篇牛文類似,如果現(xiàn)在要看的話,應(yīng)該去看他們?cè)?2011 年投到 JMLR 上的論文《Natural Language Processing (Almost) from Scratch》。文中總結(jié)了他們的多項(xiàng)工作,非常有系統(tǒng)性。這篇 JMLR 的論文題目也很霸氣啊:從頭開(kāi)始搞 NLP。他們還把論文所寫的系統(tǒng)開(kāi)源了,叫做 SENNA(主頁(yè)鏈接),3500 多行純 C 代碼也是寫得非常清晰。我就是靠著這份代碼才慢慢看懂這篇論文的。可惜的是,代碼只有測(cè)試部分,沒(méi)有訓(xùn)練部分。
實(shí)際上 C&W 這篇論文主要目的并不是在于生成一份好的詞向量,甚至不想訓(xùn)練語(yǔ)言模型,而是要用這份詞向量去完成 NLP 里面的各種任務(wù),比如詞性標(biāo)注、命名實(shí)體識(shí)別、短語(yǔ)識(shí)別、語(yǔ)義角色標(biāo)注等等。
由于目的的不同,C&W 的詞向量訓(xùn)練方法在我看來(lái)也是最特別的。他們沒(méi)有去近似地求?P(wt|w1,w2,…,wt?1)P(wt|w1,w2,…,wt?1),而是直接去嘗試近似?P(w1,w2,…,wt)P(w1,w2,…,wt)。在實(shí)際操作中,他們并沒(méi)有去求一個(gè)字符串的概率,而是求窗口連續(xù)?nn?個(gè)詞的打分f(wt?n+1,…,wt?1,wt)f(wt?n+1,…,wt?1,wt)。打分?ff?越高的說(shuō)明這句話越是正常的話;打分低的說(shuō)明這句話不是太合理;如果是隨機(jī)把幾個(gè)詞堆積在一起,那肯定是負(fù)分(差評(píng))。打分只有相對(duì)高低之分,并沒(méi)有概率的特性。
有了這個(gè)對(duì)?ff?的假設(shè),C&W 就直接使用 pair-wise 的方法訓(xùn)練詞向量。具體的來(lái)說(shuō),就是最小化下面的目標(biāo)函數(shù)。
ff?函數(shù)的結(jié)構(gòu)和 Bengio 2003 中提到的網(wǎng)絡(luò)結(jié)構(gòu)基本一致。同樣是把窗口中的?nn?個(gè)詞對(duì)應(yīng)的詞向量串成一個(gè)長(zhǎng)的向量,同樣是經(jīng)過(guò)一層網(wǎng)絡(luò)(乘一個(gè)矩陣)得到隱藏層。不同之處在于 C&W 的輸出層只有一個(gè)節(jié)點(diǎn),表示得分,而不像 Bengio 那樣的有?|V||V|?個(gè)節(jié)點(diǎn)。這么做可以大大降低計(jì)算復(fù)雜度,當(dāng)然有這種簡(jiǎn)化還是因?yàn)?C&W 并不想做一個(gè)真正的語(yǔ)言模型,只是借用語(yǔ)言模型的思想輔助他完成 自然語(yǔ)言處理的其它任務(wù)。(其實(shí) C&W 的方法與 Bengio 的方法還有一個(gè)區(qū)別,他們?yōu)榱顺绦虻男视?HardTanhHardTanh?代替?tanhtanh?激活函數(shù)。)
他們?cè)趯?shí)驗(yàn)中取窗口大小?n=11n=11,字典大小?|V|=130000|V|=130000,在維基百科英文語(yǔ)料和路透社語(yǔ)料中一共訓(xùn)練了 7 周,終于得到了這份偉大的詞向量。
如前面所說(shuō) C&W 訓(xùn)練詞向量的動(dòng)機(jī)與其他人不同,因此他公布的詞向量與其它詞向量相比主要有兩個(gè)區(qū)別:
1.他的詞表中只有小寫單詞。也就是說(shuō)他把大寫開(kāi)頭的單詞和小寫單詞當(dāng)作同一個(gè)詞處理。其它的詞向量都是把他們當(dāng)作不同的詞處理的。
2.他公布的詞向量并不直接是上述公式的優(yōu)化結(jié)果,而是在此基礎(chǔ)上進(jìn)一步跑了詞性標(biāo)注、命名實(shí)體識(shí)別等等一系列任務(wù)的 Multi-Task Learning 之后,二次優(yōu)化得到的。也可以理解為是半監(jiān)督學(xué)習(xí)得到的,而非其他方法中純無(wú)監(jiān)督學(xué)習(xí)得到的。
不過(guò)好在 Turian 在 2010 年對(duì) C&W 和 M&H 向量做對(duì)比時(shí),重新訓(xùn)練了一份詞向量放到了網(wǎng)上,那份就沒(méi)上面的兩個(gè)“問(wèn)題”(確切的說(shuō)應(yīng)該是差別),也可以用的更放心。后面會(huì)詳細(xì)介紹 Turian 的工作。
關(guān)于這篇論文其實(shí)還是有些東西可以吐槽的,不過(guò)訓(xùn)練詞向量這一塊沒(méi)有,是論文其他部分的。把吐槽機(jī)會(huì)留給下一篇博文了。
?2.3 M&H 的 HLBL
Andriy Mnih 和 Geoffrey Hinton 在 2007 年和 2008 年各發(fā)表了一篇關(guān)于訓(xùn)練語(yǔ)言模型和詞向量的文章。2007 年發(fā)表在 ICML 上的《Three new graphical models for statistical language modelling》表明了 Hinton 將 Deep Learning 戰(zhàn)場(chǎng)擴(kuò)展到 NLP 領(lǐng)域的決心。2008 年發(fā)表在 NIPS 上的《A scalable hierarchical distributed language model》則提出了一種層級(jí)的思想替換了 Bengio 2003 方法中最后隱藏層到輸出層最花時(shí)間的矩陣乘法,在保證效果的基礎(chǔ)上,同時(shí)也提升了速度。下面簡(jiǎn)單介紹一下這兩篇文章。
Hinton 在 2006 年提出 Deep Learning 的概念之后,很快就來(lái) NLP 最基礎(chǔ)的任務(wù)上試了一把。果然,有效。M&H 在 ICML 2007 上發(fā)表的這篇文章提出了“Log-Bilinear”語(yǔ)言模型。文章標(biāo)題中可以看出他們其實(shí)一共提了 3 個(gè)模型。從最基本的 RBM 出發(fā),一點(diǎn)點(diǎn)修改能量函數(shù),最后得到了“Log-Bilinear”模型。
模型如果用神經(jīng)網(wǎng)絡(luò)的形式寫出來(lái),是這個(gè)樣子:
為了更好地理解模型的含義,還是來(lái)看這兩個(gè)拆解的式子。hh?在這里表示隱藏層,這里的隱藏層比前面的所有模型都更厲害,直接有語(yǔ)義信息。首先從第二個(gè)式子中隱藏層能和詞向量直接做內(nèi)積可以看出,隱藏層的維度和詞向量的維度是一致的(都是?mm?維)。HiHi?就是一個(gè)?m×mm×m?的矩陣,該矩陣可以理解為第?ii?個(gè)詞經(jīng)過(guò)?HiHi?這種變換之后,對(duì)第?tt?個(gè)詞產(chǎn)生的貢獻(xiàn)。因此這里的隱藏層是對(duì)前?t?1t?1個(gè)詞的總結(jié),也就是說(shuō)隱藏層?hh?是對(duì)下一個(gè)詞的一種預(yù)測(cè)。
再看看第二個(gè)式子,預(yù)測(cè)下一個(gè)詞為?wjwj?的 log 概率是?yjyj,它直接就是?C(wj)C(wj)?和?hh?的內(nèi)積。內(nèi)積基本上就可以反應(yīng)相似度,如果各詞向量的?;疽恢碌脑?,內(nèi)積的大小能直接反應(yīng)兩個(gè)向量的 cos 夾角的大小。這里使用預(yù)測(cè)詞向量?hh?和各個(gè)已知詞的詞向量的相似度作為 log 概率,將詞向量的作用發(fā)揮到了極致。這也是我覺(jué)得這次介紹的模型中最漂亮的一個(gè)。
這種“Log-Bilinear”模型看起來(lái)每個(gè)詞需要使用上文所有的詞作為輸入,于是語(yǔ)料中最長(zhǎng)的句子有多長(zhǎng),就會(huì)有多少個(gè)?HH?矩陣。這顯然是過(guò)于理想化了。最后在實(shí)現(xiàn)模型時(shí),還是迫于現(xiàn)實(shí)的壓力,用了類似 n-gram 的近似,只考慮了上文的 3 到 5 個(gè)詞作為輸入來(lái)預(yù)測(cè)下一個(gè)詞。
M&H 的思路如前面提到,是 Bengio 2003 提出的。經(jīng)過(guò)大牛的實(shí)現(xiàn),效果確實(shí)不錯(cuò)。雖然復(fù)雜度沒(méi)有數(shù)量級(jí)上的降低,但是由于是純線性模型,沒(méi)有激活函數(shù)(當(dāng)然在做語(yǔ)言模型的時(shí)候,最后還是對(duì)?yjyj?跑了一個(gè) softmax),因此實(shí)際的訓(xùn)練和預(yù)測(cè)速度都會(huì)有很大的提升。同時(shí)隱藏層到輸出層的變量直接用了詞向量,這也就幾乎少了一半的變量,使得模型更為簡(jiǎn)潔。最后論文中 M&H 用了和 Bengio 2003 完全一樣的數(shù)據(jù)集做實(shí)驗(yàn),效果有了一定的提升。
這種層級(jí)的思想最初可見(jiàn)于 Frederic Morin 和 Yoshua Bengio 于 2005 年發(fā)表的論文《Hierarchical probabilistic neural network language model》中。但是這篇論文使用 WordNet 中的 IS-A 關(guān)系,轉(zhuǎn)化為二叉樹用于分類預(yù)測(cè)。實(shí)驗(yàn)結(jié)果發(fā)現(xiàn)速度提升了,效果變差了。
有了前車之鑒,M&H 就希望能從語(yǔ)料中自動(dòng)學(xué)習(xí)出一棵樹,并能達(dá)到比人工構(gòu)建更好的效果。M&H 使用一種 bootstrapping 的方法來(lái)構(gòu)建這棵樹。從隨機(jī)的樹開(kāi)始,根據(jù)分類結(jié)果不斷調(diào)整和迭代。最后得到的是一棵平衡二叉樹,并且同一個(gè)詞的預(yù)測(cè)可能處于多個(gè)不同的葉節(jié)點(diǎn)。這種用多個(gè)葉節(jié)點(diǎn)表示一個(gè)詞的方法,可以提升下一個(gè)詞是多義詞時(shí)候的效果。M&H 做的還不夠徹底,后面 Huang 的工作直接對(duì)每個(gè)詞學(xué)習(xí)出多個(gè)詞向量,能更好地處理多義詞。
2.4 Mikolov 的 RNNLM
前文說(shuō)到,Bengio 2003 論文里提了一句,可以使用一些方法降低參數(shù)個(gè)數(shù),比如用循環(huán)神經(jīng)網(wǎng)絡(luò)。Mikolov 就抓住了這個(gè)坑,從此與循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)下了不解之緣。他最早用循環(huán)神經(jīng)網(wǎng)絡(luò)做語(yǔ)言模型是在 INTERSPEECH 2010 上發(fā)表的《Recurrent neural network based language model》里。Recurrent neural network 是循環(huán)神經(jīng)網(wǎng)絡(luò),簡(jiǎn)稱 RNN,還有個(gè) Recursive neural networks 是遞歸神經(jīng)網(wǎng)絡(luò)(Richard Socher 借此發(fā)了一大堆論文),也簡(jiǎn)稱 RNN??吹降臅r(shí)候需要注意區(qū)分一下。不過(guò)到目前為止,RNNLM 只表示循環(huán)神經(jīng)網(wǎng)絡(luò)做的語(yǔ)言模型,還沒(méi)有歧義。
在之后的幾年中,Mikolov 在一直在RNNLM 上做各種改進(jìn),有速度上的,也有準(zhǔn)確率上的?,F(xiàn)在想了解 RNNLM,看他的博士論文《Statistical Language Models based on Neural Networks》肯定是最好的選擇。
循環(huán)神經(jīng)網(wǎng)絡(luò)與前面各方法中用到的前饋網(wǎng)絡(luò)在結(jié)構(gòu)上有比較大的差別,但是原理還是一樣的。網(wǎng)絡(luò)結(jié)構(gòu)大致如圖2。

圖2
從右圖可以看出循環(huán)神經(jīng)網(wǎng)絡(luò)是如何展開(kāi)的。每來(lái)一個(gè)新詞,就和上一個(gè)隱藏層聯(lián)合計(jì)算出下一個(gè)隱藏層,隱藏層反復(fù)利用,一直保留著最新的狀態(tài)。各隱藏層通過(guò)一層傳統(tǒng)的前饋網(wǎng)絡(luò)得到輸出值?! ?span id="MathJax-Element-95-Frame" class="mjx-chtml MathJax_CHTML" style="box-sizing: border-box; display: inline-block; line-height: 0; text-indent: 0px; text-align: left; text-transform: none; font-style: normal; font-weight: normal; font-size: 19.52px; letter-spacing: normal; word-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; margin: 0px; padding: 1px 0px; position: relative;" tabindex="0" data-mathml="<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>w</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></math>">w(t)w(t)?是一個(gè)詞的 One-hot representation,那么?Uw(t)Uw(t)?也就相當(dāng)于從矩陣?UU?中選出了一列,這一列就是該詞對(duì)應(yīng)的詞向量。
循環(huán)神經(jīng)網(wǎng)絡(luò)的最大優(yōu)勢(shì)在于,可以真正充分地利用所有上文信息來(lái)預(yù)測(cè)下一個(gè)詞,而不像前面的其它工作那樣,只能開(kāi)一個(gè) n 個(gè)詞的窗口,只用前 n 個(gè)詞來(lái)預(yù)測(cè)下一個(gè)詞。從形式上看,這是一個(gè)非?!敖K極”的模型,畢竟語(yǔ)言模型里能用到的信息,他全用上了??上У氖牵h(huán)神經(jīng)網(wǎng)絡(luò)形式上非常好看,使用起來(lái)卻非常難優(yōu)化,如果優(yōu)化的不好,長(zhǎng)距離的信息就會(huì)丟失,甚至還無(wú)法達(dá)到開(kāi)窗口看前若干個(gè)詞的效果。Mikolov 在 RNNLM 里面只使用了最樸素的 BPTT 優(yōu)化算法,就已經(jīng)比 n-gram 中的 state of the art 方法有更好的效果,這非常令人欣慰。如果用上了更強(qiáng)的優(yōu)化算法,最后效果肯定還能提升很多。
對(duì)于最后隱藏層到輸出層的巨大計(jì)算量,Mikolov 使用了一種分組的方法:根據(jù)詞頻將?|V||V|?個(gè)詞分成?√|V||V|?組,先通過(guò)?√|V||V|?次判斷,看下一個(gè)詞屬于哪個(gè)組,再通過(guò)若干次判斷,找出其屬于組內(nèi)的哪個(gè)元素。最后均攤復(fù)雜度約為?o(√|V|)o(|V|),略差于 M&H 的?o(log(|V|))o(log?(|V|)),但是其淺層結(jié)構(gòu)某種程度上可以減少誤差傳遞,也不失為一種良策。
Mikolov 的 RNNLM 也是開(kāi)源的(網(wǎng)址)。非常算法風(fēng)格的代碼,幾乎所有功能都在一個(gè)文件里,工程也很好編譯。比較好的是,RNNLM 可以完美支持中文,如果語(yǔ)料存成 UTF-8 格式,就可以直接用了。
最后吐槽一句,我覺(jué)得他在隱藏層用 sigmoid 作為激活函數(shù)不夠漂亮。因?yàn)殡[藏層要和輸入詞聯(lián)合計(jì)算得到下一個(gè)隱藏層,如果當(dāng)前隱藏層的值全是正的,那么輸入詞對(duì)應(yīng)的參數(shù)就會(huì)略微偏負(fù),也就是說(shuō)最后得到的詞向量的均值不在 0 附近。總感覺(jué)不好看。當(dāng)然,從實(shí)驗(yàn)效果看,是我太強(qiáng)迫癥了。
?2.5 Huang 的語(yǔ)義強(qiáng)化
與前幾位大牛的工作不同,Eric H. Huang 的工作是在 C&W 的基礎(chǔ)上改進(jìn)而成的,并非自成一派從頭做起。他這篇發(fā)表在 ACL 2012 上的《Improving Word Representations via Global Context and Multiple Word Prototypes》試圖通過(guò)對(duì)模型的改進(jìn),使得詞向量富含更豐富的語(yǔ)義信息。他在文中提出了兩個(gè)主要?jiǎng)?chuàng)新來(lái)完成這一目標(biāo):(其實(shí)從論文標(biāo)題就能看出來(lái))第一個(gè)創(chuàng)新是使用全文信息輔助已有的局部信息,第二個(gè)創(chuàng)新是使用多個(gè)詞向量來(lái)表示多義詞。下面逐一介紹。
Huang 認(rèn)為 C&W 的工作只利用了“局部上下文(Local Context)”。C&W 在訓(xùn)練詞向量的時(shí)候,只使用了上下文各 5 個(gè)詞,算上自己總共有 11 個(gè)詞的信息,這些局部的信息還不能充分挖掘出中間詞的語(yǔ)義信息。Huang 直接使用 C&W 的網(wǎng)絡(luò)結(jié)構(gòu)計(jì)算出一個(gè)得分,作為“局部得分”。
然后 Huang 提出了一個(gè)“全局信息”,這有點(diǎn)類似傳統(tǒng)的詞袋子模型。詞袋子模型是把文章中所有詞的 One-hot Representation 加起來(lái),形成一個(gè)向量(就像把詞全都扔進(jìn)一個(gè)袋子里),用來(lái)表示文章。Huang 的全局模型是將文章中所有詞的詞向量求個(gè)加權(quán)平均(權(quán)重是詞的 idf),作為文章的語(yǔ)義。他把文章的語(yǔ)義向量和當(dāng)前詞的詞向量拼接起來(lái),形成一個(gè)兩倍長(zhǎng)度的向量作為輸入,之后還是用 C&W 的網(wǎng)絡(luò)結(jié)構(gòu)算出一個(gè)打分。
有了 C&W 方法的得到的“局部得分”,再加上在 C&W 方法基礎(chǔ)上改造得到的“全局得分”,Huang 直接把兩個(gè)得分相加,作為最終得分。最終得分使用 C&W 提出的 pair-wise 目標(biāo)函數(shù)來(lái)優(yōu)化。
加了這個(gè)全局信息有什么用處呢?Huang 在實(shí)驗(yàn)中發(fā)現(xiàn),他的模型能更好地捕捉詞的語(yǔ)義信息。比如 C&W 的模型中,與 markets 最相近的詞為 firms、industries;而 Huang 的模型得到的結(jié)果是 market、firms。很明顯,C&W 的方法由于只考慮了臨近詞的信息,最后的結(jié)果是詞法特征最相近的詞排在了前面(都是復(fù)數(shù)形式)。不過(guò)我覺(jué)得這個(gè)可能是英語(yǔ)才有的現(xiàn)象,中文沒(méi)有詞形變化,如果在中文中做同樣的實(shí)驗(yàn)還不知道會(huì)有什么效果。
Huang 論文的第二個(gè)貢獻(xiàn)是將多義詞用多個(gè)詞向量來(lái)表示。Bengio 2003 在最后提過(guò)這是一個(gè)重要的問(wèn)題,不過(guò)當(dāng)時(shí)他還在想辦法解決,現(xiàn)在 Huang 給出了一種思路。
將每個(gè)詞的上下文各 5 個(gè)詞拿出來(lái),對(duì)這 10 個(gè)詞的詞向量做加權(quán)平均(同樣使用 idf 作為權(quán)重)。對(duì)所有得到的上下文向量做 k-means 聚類,根據(jù)聚類結(jié)果給每個(gè)詞打上標(biāo)簽(不同類中的同一個(gè)詞,當(dāng)作不同的詞處理),最后重新訓(xùn)練詞向量。
當(dāng)然這個(gè)實(shí)驗(yàn)的效果也是很不錯(cuò)的,最后 star 的某一個(gè)表示最接近的詞是 movie、film;另一個(gè)表示最接近的詞是 galaxy、planet。
這篇文章還做了一些對(duì)比實(shí)驗(yàn),在下一章評(píng)價(jià)里細(xì)講。
2.999 總結(jié)
//博主道:本節(jié)承上啟下,不知道應(yīng)該放在第 2 章還是第 3 章,便將小節(jié)號(hào)寫為 2.999。
講完了大牛們的各種方法,自己也忍不住來(lái)總結(jié)一把。
Turian 的工作前面只是提了一下,他在做 C&W 向量與 H&M 向量的對(duì)比實(shí)驗(yàn)時(shí),自己按照論文重新實(shí)現(xiàn)了一遍他們的方法,并公布了詞向量。后來(lái) C&W 在主頁(yè)上強(qiáng)調(diào)了一下:盡管很多論文把 Turian 實(shí)現(xiàn)的結(jié)果叫做 C&W 向量,但是與我發(fā)布的詞向量是不同的,我這個(gè)在更大的語(yǔ)料上訓(xùn)練,還花了兩個(gè)月時(shí)間呢!
Turian 公布的 H&M 向量是直接請(qǐng) Andriy Mnih 在 Turian 做好的語(yǔ)料上運(yùn)行了一下 HLBL,所以沒(méi)有代碼公布。同時(shí) Turian 自己實(shí)現(xiàn)了一份 LBL模型,但是沒(méi)有公布訓(xùn)練出來(lái)的詞向量。(這是根據(jù)他主頁(yè)上描述推測(cè)的結(jié)果,從 Turian 的論文中看,他應(yīng)該是實(shí)現(xiàn)了 HLBL 算法并且算出詞向量的。)
RCV1 的詞數(shù)兩篇文章中所寫的數(shù)據(jù)差距較大,還不知道是什么原因。
Holger Schwenk 在詞向量和語(yǔ)言模型方面也做了一些工作,看起來(lái)大體相似,也沒(méi)仔細(xì)讀過(guò)他的論文。有興趣的讀者可以直接搜他的論文。
事實(shí)上,除了 RNNLM 以外,上面其它所有模型在第一層(輸入層到隱藏層)都是等價(jià)的,都可以看成一個(gè)單層網(wǎng)絡(luò)。可能形式最為特別的是 M&H 的模型,對(duì)前面的每個(gè)詞單獨(dú)乘以矩陣?HiHi,而不是像其它方法那樣把詞向量串接起來(lái)乘以矩陣?HH。但如果把?HH?看成?HiHi?的拼接:?[H1H2…Ht][H1H2…Ht],則會(huì)有以下等式:
這么看來(lái)還是等價(jià)的?! ∷郧懊娴倪@么多模型,本質(zhì)是非常相似的。都是從前若干個(gè)詞的詞向量通過(guò)線性變換抽象出一個(gè)新的語(yǔ)義(隱藏層),再通過(guò)不同的方法來(lái)解析這個(gè)隱藏層。模型的差別主要就在隱藏層到輸出層的語(yǔ)義。Bengio 2003 使用了最樸素的線性變換,直接從隱藏層映射到每個(gè)詞;C&W 簡(jiǎn)化了模型(不求語(yǔ)言模型),通過(guò)線性變換將隱藏層轉(zhuǎn)換成一個(gè)打分;M&H 復(fù)用了詞向量,進(jìn)一步強(qiáng)化了語(yǔ)義,并用層級(jí)結(jié)構(gòu)加速;Mikolov 則用了分組來(lái)加速。
每種方法真正的差別看起來(lái)并不大,當(dāng)然里面的這些創(chuàng)新,也都是有據(jù)可循的。下一章就直接來(lái)看看不同模型的效果如何。
3. 詞向量的評(píng)價(jià)
詞向量的評(píng)價(jià)大體上可以分成兩種方式,第一種是把詞向量融入現(xiàn)有系統(tǒng)中,看對(duì)系統(tǒng)性能的提升;第二種是直接從語(yǔ)言學(xué)的角度對(duì)詞向量進(jìn)行分析,如相似度、語(yǔ)義偏移等。
3.1 提升現(xiàn)有系統(tǒng)
詞向量的用法最常見(jiàn)的有兩種:
1. 直接用于神經(jīng)網(wǎng)絡(luò)模型的輸入層。如 C&W 的 SENNA 系統(tǒng)中,將訓(xùn)練好的詞向量作為輸入,用前饋網(wǎng)絡(luò)和卷積網(wǎng)絡(luò)完成了詞性標(biāo)注、語(yǔ)義角色標(biāo)注等一系列任務(wù)。再如 Socher 將詞向量作為輸入,用遞歸神經(jīng)網(wǎng)絡(luò)完成了句法分析、情感分析等多項(xiàng)任務(wù)。
2. 作為輔助特征擴(kuò)充現(xiàn)有模型。如 Turian 將詞向量作為額外的特征加入到接近 state of the art 的方法中,進(jìn)一步提高了命名實(shí)體識(shí)別和短語(yǔ)識(shí)別的效果。
具體的用法理論上會(huì)在下一篇博文中細(xì)講。
C&W 的論文中有一些對(duì)比實(shí)驗(yàn)。實(shí)驗(yàn)的結(jié)果表明,使用詞向量作為初始值替代隨機(jī)初始值,其效果會(huì)有非常顯著的提升(如:詞性標(biāo)注準(zhǔn)確率從 96.37% 提升到 97.20%;命名實(shí)體識(shí)別 F 值從 81.47% 提升到 88.67%)。同時(shí)使用更大的語(yǔ)料來(lái)訓(xùn)練,效果也會(huì)有一些提升。
Turian 發(fā)表在 ACL 2010 上的實(shí)驗(yàn)對(duì)比了 C&W 向量與 M&H 向量用作輔助特征時(shí)的效果。在短語(yǔ)識(shí)別和命名實(shí)體識(shí)別兩個(gè)任務(wù)中,C&W 向量的效果都有略微的優(yōu)勢(shì)。同時(shí)他也發(fā)現(xiàn),如果將這兩種向量融合起來(lái),會(huì)有更好的效果。除了這兩種詞向量,Turian 還使用 Brown Cluster 作為輔助特征做了對(duì)比,效果最好的其實(shí)是 Brown Cluster,不過(guò)這個(gè)已經(jīng)超出本文的范圍了。
3.2 語(yǔ)言學(xué)評(píng)價(jià)
Huang 2012 的論文提出了一些創(chuàng)新,能提升詞向量中的語(yǔ)義成分。他也做了一些實(shí)驗(yàn)對(duì)比了各種詞向量的語(yǔ)義特性。實(shí)驗(yàn)方法大致就是將詞向量的相似度與人工標(biāo)注的相似度做比較。最后 Huang 的方法語(yǔ)義相似度最好,其次是 C&W 向量,再然后是 Turian 訓(xùn)練的 HLBL 向量與 C&W 向量。這里因?yàn)?Turian 訓(xùn)練詞向量時(shí)使用的數(shù)據(jù)集(RCV1)與其他的對(duì)比實(shí)驗(yàn)(Wiki)并不相同,因此并不是非常有可比性。但從這里可以推測(cè)一下,可能更大更豐富的語(yǔ)料對(duì)于語(yǔ)義的挖掘是有幫助的。
還有一個(gè)有意思的分析是 Mikolov 在 2013 年剛剛發(fā)表的一項(xiàng)發(fā)現(xiàn)。他發(fā)現(xiàn)兩個(gè)詞向量之間的關(guān)系,可以直接從這兩個(gè)向量的差里體現(xiàn)出來(lái)。向量的差就是數(shù)學(xué)上的定義,直接逐位相減。比如?C(king)?C(queen)≈C(man)?C(woman)C(king)?C(queen)≈C(man)?C(woman)。更強(qiáng)大的是,與?C(king)?C(man)+C(woman)C(king)?C(man)+C(woman)?最接近的向量就是?C(queen)C(queen)。
為了分析詞向量的這個(gè)特點(diǎn), Mikolov 使用類比(analogy)的方式來(lái)評(píng)測(cè)。如已知 a 之于 b 猶如 c 之于 d。現(xiàn)在給出 a、b、c,看?C(a)?C(b)+C(c)C(a)?C(b)+C(c)?最接近的詞是否是 d。
在文章 Mikolov 對(duì)比了詞法關(guān)系(名詞單復(fù)數(shù) good-better:rough-rougher、動(dòng)詞第三人稱單數(shù)、形容詞比較級(jí)最高級(jí)等)和語(yǔ)義關(guān)系(clothing-shirt:dish-bowl)。
在詞法關(guān)系上,RNN 的效果最好,然后是 Turian 實(shí)現(xiàn)的 HLBL,最后是 Turian 的 C&W。(RNN-80:19%;RNN-1600:39.6%;HLBL-100:18.7%;C&W-100:5%;-100表示詞向量為100維)
在語(yǔ)義關(guān)系上,表現(xiàn)最好的還是 RNN,然后是 Turian 的兩個(gè)向量,差距沒(méi)剛才的大。(RNN-80:0.211;C&W-100:0.154;HLBL-100:0.146)
但是這個(gè)對(duì)比實(shí)驗(yàn)用的訓(xùn)練語(yǔ)料是不同的,也不能特別說(shuō)明優(yōu)劣。
這些實(shí)驗(yàn)結(jié)果中最容易理解的是:語(yǔ)料越大,詞向量就越好。其它的實(shí)驗(yàn)由于缺乏嚴(yán)格控制條件進(jìn)行對(duì)比,談不上哪個(gè)更好哪個(gè)更差。不過(guò)這里的兩個(gè)語(yǔ)言學(xué)分析都非常有意思,尤其是向量之間存在這種線性平移的關(guān)系,可能會(huì)是詞向量發(fā)展的一個(gè)突破口。
參考文獻(xiàn)
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]
斷斷續(xù)續(xù)寫了這么多,如果有人看加上自己有時(shí)間的話,還會(huì)有續(xù)集《Deep Learning in NLP (二)模型及用法》,也是介紹幾篇文章,從模型的層次做一些粗淺的分析。
轉(zhuǎn)載來(lái)源:http://licstar.net/archives/328#s24