從今天起死宣,我們一起來學習詞向量word2vector(簡稱w2v)相關的知識絮重。雖然痕檬,對于NLP來說霎槐,w2v技術和操作已經爛大街了,隨便一個NLP任務谆棺,底層基本都要搞一個w2v栽燕,但是到底為什么需要w2v,它背后的思想是什么改淑,是怎么訓練得到的碍岔,也許很多經常使用w2v的人都不一定很清楚。不清楚朵夏,就會導致我們知道w2v很好用很神奇蔼啦,但是出了問題卻不知道從哪里去改善。
所以仰猖,我會邊學習斯坦福cs224n的NLP課程的詞向量內容捏肢,邊查閱其他的資料,并結合自己的實踐經驗來寫下關于w2v的一系列筆記饥侵。
本文介紹兩個方面:
- 為什么我們需要w2v——WHY
- 得到w2v的大致思路是怎樣的——HOW
一鸵赫、WHY
詞,是NLP要對付的一個基本語言單位躏升,我們在用計算機處理海量文本的時候辩棒,希望盡可能地讓機器明白詞蘊含的信息,這樣可以大大地提高文本分類膨疏、文本聚類一睁、文本生成、對話佃却、翻譯等等任務的準確性者吁。所以,我們需要解決一個基本問題:
如何表示一個詞?
1.WordNet
在英文中饲帅,我們可以借助WordNet复凳,來導出一個詞的同義詞、近義詞等等各種信息洒闸。
WordNet是由Princeton 大學的心理學家染坯,語言學家和計算機工程師聯(lián)合設計的一種基于認知語言學的英語詞典。
網址:https://wordnet.princeton.edu/
我們可以下載wordnet丘逸,也可以通過NLTK等等包來獲取单鹿,便可以在計算機程序里查詢我們想要的詞。
對于中文的話深纲,也有類似的對應的wordnet仲锄。下面展示的這個Chinese wordnet由臺灣國立大學的學者們設計搭建劲妙。而且,他們還做了相應的知識圖譜儒喊,更加直觀地表達詞之間的關系镣奋。不過都是繁體中文。
網址:http://lope.linguistics.ntu.edu.tw/cwn/
這些資源都十分地優(yōu)秀怀愧,而且都是花費研究機構多年的心血才搭建手工而成侨颈,所以質量也很高,在很多情況下可以滿足我們的需求芯义。
但是通過wordnet來進行詞義表示有什么問題呢哈垢?
- 難以更新,畢竟這個靠人力搭建,無法應對新詞或者詞的新含義
- 難以定量地計算不同詞之間的相似度
所以扛拨,wordnet更多地是作為一個“詞典”耘分,提供一個詞意思的參考或者補充,而往往無法應對現(xiàn)在NLP的許多任務绑警。
所以我們需要其他的表示方法求泰。
2.One-hot表示
假設我們要研究的一個問題,涉及到的語料共有10000個不同的詞计盒。比如把它們按照首字母排序:
[阿渴频,愛,······北启,明天枉氮,······,你暖庄,······,智能楼肪,職業(yè)]
那么每個詞可以表示成一個10000維的向量培廓。比如:
“阿”可以表示為這樣的向量:
[1,0,0,0,......,0]
“愛”可以表示為:
[0,1,0,0,......,0]
最后一個詞“職業(yè)”可以表示為:
[0,0,0,0,......,1]
因為每個詞對應的向量只有一個位置為1,故稱為“獨熱編碼(one-hot)”春叫。
說白了肩钠,這種向量表示的就是這個詞在我們語料庫中的一個index。
這種方法是很流行的暂殖,在很多機器學習應用中价匠,都是對詞語進行這樣的處理的。
但是這樣做一個最大的問題就在于:任何兩個不同的詞的向量呛每,都是“正交”的踩窖,內積為0.
這樣的話,即使是意思十分相似的詞晨横,也無法從one-hot詞向量中看出它們的聯(lián)系洋腮。因此箫柳,這種表示方法,我們無法衡量兩個詞的相似度啥供。而相似度無法計算悯恍,很多NLP任務就無法進行。
3.Word2Vector詞向量模型
上面的one-hot表示伙狐,其實也是一種“詞向量”涮毫,只不過這個詞向量,就是由該詞的index決定的贷屎,而僅由index決定罢防,就導致了無法表示詞義的問題。
因此豫尽,我們想篙梢,為何不讓詞向量表示的信息更加豐富一點呢?
比如美旧,我們可以定義一些維度渤滞,然后對一個詞在每個維度上打分,這樣一個詞的意思不就豐富啦榴嗅?
比如妄呕,我們定義“男”,“女”嗽测,“水果”绪励,“產品”,“地址”唠粥,這幾個維度疏魏,對項目幾個詞來定義詞向量:
Dimension | 國王 | 皇后 | 蘋果 | 酒店 |
---|---|---|---|---|
男 | 0.98 | 0.02 | 0.15 | 0.3 |
女 | 0 | 0.99 | 0.27 | 0.2 |
水果 | 0.03 | 0.07 | 0.97 | 0 |
產品 | 0.11 | 0.12 | 0.89 | 0.23 |
地址 | 0.07 | 0.28 | 0.04 | 0.99 |
... | ... | ... | ... | ... |
上面只是我隨便編的幾個維度,只是舉個例子晤愧,我們可以讓一個詞在多個維度上表示大莫,這個維度上的數越大,就代表越具有某種屬性官份。這樣的方法只厘,就可以讓意思相近的詞,擁有相近的屬性值舅巷,它們之間的相似度就可以很容易的表示了羔味,比如用余弦相似度來計算向量之間的距離。
這是個很好的思路钠右,這樣就可以很好地表示一個詞在各個維度的含義赋元,可以盡可能地表達一個詞的含義。
但是,如何定義維度呢们陆?
實際上寒瓦,我們幾乎不可能定義一個完善的維度。這么多的詞匯坪仇,維度根本無法定義杂腰。而且,這種定義是仁者見仁智者見智椅文,每個人對詞的屬性的定義都是不一樣的喂很。
這個時候,我們就會自然而然地想到“深度學習”了皆刺。
因為詞的屬性(即我說的維度)少辣,相當于一個詞的一個“特征”,定義詞的屬性的過程羡蛾,其實就是“特征工程”漓帅,當特征工程難以實施的時候,就是深度學習大展拳腳的時候了痴怨。我們用大量的文本喂給深度學習模型忙干,然后自動訓練,學得詞向量浪藻。
下面我們來講解捐迫,怎么利用深度學習的方法,來學習詞向量爱葵。
二施戴、HOW
我們怎么構造一個模型,來“學習”詞向量呢萌丈?
如果你有機器學習或者深度學習經驗的話赞哗,應該,知道辆雾,最重要的是要明確目標函數懈玻,也就是我們要調整模型的參數,讓什么目標最大/最小乾颁。
針對詞的表示,有語言學家提出艺栈,“一個詞的意思英岭,應該由和它一起出現(xiàn)的周圍的詞來表現(xiàn)”。故湿右,一個詞的含義诅妹,應該由這個詞的各種各樣的上下文來構建。
所以我們有兩個思路來構造一個模型:
- 輸入上下文的詞,預測中心詞是什么
- 輸入中心詞吭狡,預測上下文長什么樣
實際上尖殃,后面我們會講到,這就是詞向量訓練的兩種基本模型划煮,前者為CBOW送丰,后者為Skip-Gram(SG)。我們這里暫時用后者弛秋,也就是SG的方式來構建器躏。
于是我們構建一個神經網絡模型,可以輸入一個句子中的某個詞蟹略,輸出其他所有詞出現(xiàn)在這個詞周圍的概率槽袄。也就是說定欧,既輸出這個詞附近的上下文的詞,也輸出跟這個詞完全不相干八竿子打不著的詞。
我們希望三幻,這個原本來語料庫中這個中心詞周圍的詞的概率的乘積越大越好,因為這個乘積就是這幾個詞同時出現(xiàn)的概率眷细,用極大似然的思想立轧,我們希望這個概率盡可能大。
而這個網絡的參數矩陣空闲,實際上就是輸入文本的特征令杈,也就是我們想要得到的詞向量。
所以碴倾,我們通過梯度下降法不斷更新詞向量逗噩,就可以使得概率越來越大,最終就得到一組很好的詞向量跌榔。
下面异雁,畫個圖來示意、講解:
假設我們從我們的語料庫里面隨便挑出一句話僧须。我們想預測如果中心詞是natural的話纲刀,那么什么詞應該出現(xiàn)在它的周圍呢?或者說担平,其他詞出現(xiàn)在natural周圍的概率為大多呢示绊?概率越大,說明越可能出現(xiàn)在附近暂论。
另外面褐,什么叫“周圍、附近”呢取胎?我們就用window來定義展哭。
所以湃窍,我們的神經網絡模型是這樣的:
注意:我們的輸出,是輸出所有的詞的概率匪傍,比如我們的語料庫中有10000個不同的詞您市,那么這里的輸出就有10000個。但是我們更關心我們附近的詞的概率役衡,也就是圖中所示的“窗口內的詞”茵休。
窗口內的詞,本來就是一個自然的語言組合映挂,所以他們這些詞在一起出現(xiàn)的概率應該高泽篮,所以他們的概率乘積就應該高。
這就是詞向量怎么得來的基本思路柑船∶背牛總結一下就是這張圖:
當然鞍时,這個示意圖亏拉,只是示意了一個詞。實際上逆巍,我們要把我們的語料庫中的所有的詞及塘,全部遍歷一次,分別計算“窗口內概率的乘積”锐极,然后求和笙僚,最后是要使得這個所有概率之和盡可能大。
用cs224n課堂上的例子:
語料庫中的句子:
我們設當前中心詞的位置為t灵再,而語料庫總長度為T肋层。設窗口大小為m,那么對于中心詞
但是,我們需要遍歷整個語料庫汪榔,也就是計算位置t從0到T的所有的詞蒲拉,所以最終的目標函數應該是:
其中,
但是上面是乘積,不打好求士聪,一般我們取個負對數辱姨,轉化成最小化某個和函數,然后再取個平均戚嗅,就方便求解了,所以我們轉化成如下的Cost function:
注意,上面的函數中懦胞,都要求
總之躏尉,一句話總結一下求詞向量的基本思路:
找一個巨大的文本形成語料庫蚯根,選擇一個窗口大小,遍歷每一個詞胀糜,依次把每個詞輸入進神經網絡颅拦,詞向量作為網絡的參數,網絡輸出其他詞的概率教藻。求得所有的詞的對應窗口詞的條件概率的乘積距帅,不斷地調整詞向量參數,使得這個概率的乘積最大化括堤,從而得到最終的詞向量碌秸。
此時,腦海里突然蹦出一句話:“夠了吧悄窃!”
所以本文就這么戛然而止了讥电。
下一篇文章,會詳細講解有關詞向量的一些很重要的細節(jié)轧抗,和一些訓練的高級方法恩敌。
后記:
其實雖然本文不長,但是來來回回修改了N次横媚,醞釀了好久才寫成纠炮。而且,實際上相關的內容我在暑假的時候分唾,就已經學習過了抗碰,最近才下筆,主要是我在思考“為什么這個詞向量要這么設計绽乔,為什么模型要這樣設計弧蝇,為什么目標函數是這個”。因為折砸,cs224n課程上面的說法看疗,一直不能說服我,雖然他們講課的時候給人一種“這就是自然而然的啊”的感覺睦授。而之前吳恩達在深度學習課程中講的word2vector的方式跟cs224n又很不一樣两芳,這讓我就更矛盾了。所以去枷,我花了大量時間怖辆,去協(xié)調二者的方法是复,總結成本文的思路,這才“自我說服”了竖螃。
伏筆:
這里想提前埋下一個伏筆淑廊,也是我想寫下有關詞向量系列文章的主要原因之一:
w2v的一個最基本用途就是尋找similar words(相似詞),但是w2v的一個最明顯的局限就是特咆,這個相似季惩,是“分布相似”,而不是語義相似腻格。雖然画拾,語義相似的詞,通常分布也是相似的菜职,但是分布相似的詞青抛,語義可能很不相似!
這個問題到底怎么解釋些楣?為什么訓練出來的詞向量就是反映的分布相似度脂凶?是什么原因導致的?這些問題愁茁,我們后面再詳細探討蚕钦!
推薦閱讀:
?歡迎來微信公眾號SimpleAI閱讀本文:**
?想學深度學習?這些筆記你一定喜歡:
一只蚊子告訴你鹅很,什么是正則化(Regularization)
一文上手TensorFlow嘶居,并搭建神經網絡實現(xiàn)手寫數字識別
?想了解更多Python有趣的知識?看看這些:
Python的矩陣傳播機制&矩陣運算——消滅for循環(huán)促煮!
全套筆記請至公眾號菜單邮屁,戳【原創(chuàng)筆記】