主要內(nèi)容
上一節(jié)討論了自然語言處理,討論了深度學習,非常宏觀,也非常有趣。這一節(jié)和下一節(jié)的探討則會直接跳到最基礎的內(nèi)容:詞向量。同時,也會涉及到一些基本的數(shù)學推導。
如何表示一個詞語的意思?計算機如何處理詞語的意思離散化表示的問題從符號化表示到分布式表示基于相似度的分布式表示通過向量定義詞語的含義word2vec神經(jīng)網(wǎng)絡詞嵌入的基本思路word2vec主要思路Skip-gram預測word2vec細節(jié)一張圖濃縮Skipgram訓練模型:計算向量梯度梯度推導梯度下降隨機梯度下降法關于公式排版Md2All 簡介
如何表示一個詞語的意思?
什么是“意思”?這是個簡單的問題,想要解釋清楚卻并不容易。怎么辦,向詞典求助。韋氏詞典說,“意思”是詞語、短語所表達的思想;人們使用詞語、符號所要表達的思想;作品、藝術所要表達的思想。這基本上與語言學家的思路是一致的。
在語言學家眼中,詞語是一種語言符號。任何語言符號是由“能指”和“所指”構成的,“能指”指語言的聲音形象,“所指”指語言所反映的事物的概念。比如英語的“tree”這個單詞,它的發(fā)音就是它的“能指”,而“樹”的概念就是“所指”。
中文中“意思”的意思更加有意思:
他說:“她這個人真有意思(funny)?!彼f:“他這個人怪有意思的(funny)?!庇谑侨藗円詾樗麄冇辛艘馑迹╳ish),并讓他向她意思意思(express)。他火了:“我根本沒有那個意思(thought)!”她也生氣了:“你們這么說是什么意思(intention)?”事后有人說:“真有意思(funny)?!币灿腥苏f:“真沒意思(nonsense)”。(原文見《生活報》1994.11.13.第六版)[吳尉天,1999] ——《統(tǒng)計自然語言處理》
然而這些高大上的東西對于計算機實際處理詞語的意思幾乎沒有任何幫助。
計算機如何處理詞語的意思
過去幾十年里主要使用的是分類詞典。比如使用WordNet詞庫可以查詢上義詞和同義詞。
panda 的上義詞
fromnltk.corpusimportwordnetaswnpanda=wn.synset('panda.n.01')hyper=lambdas:s.hypernyms()list(panda.closure(hyper))[Synset('procyonid.n.01'),Synset('carnivore.n.01'),Synset('placental.n.01'),Synset('mammal.n.01'),Synset('vertebrate.n.01'),Synset('chordate.n.01'),Synset('animal.n.01'),Synset('organism.n.01'),Synset('living_thing.n.01'),Synset('whole.n.02'),Synset('object.n.01'),Synset('physical_entity.n.01'),Synset('entity.n.01')]
good 的同義詞
S:(adj)full,goodS:(adj)estimable,good,honorable,respectableS:(adj)beneficial,goodS:(adj)good,just,uprightS:(adj)adept,expert,good,practiced,proficient,skillfulS:(adj)dear,good,nearS:(adj)good,right,ripe…S:(adv)well,goodS:(adv)thoroughly,soundly,goodS:(n)good,goodnessS:(n)commodity,tradegood,good
離散化表示的問題
有很大的參考價值,但無法體現(xiàn)細微差異,比如adept, expert, good, practiced, proficient, skillful雖然意思相近,但有很多細微差異
缺少新詞,無法與時俱進
比較主觀
需要手工創(chuàng)建和改編,甚至需要專家參與
難以精確計算詞與詞之間的相似度
無論是基于規(guī)則的語言處理,還是基于統(tǒng)計的語言處理,大都把詞語當作單個符號進行處理。這種離散化、分類式的表示都普遍存在上述問題。
把這樣的單個詞語直接轉(zhuǎn)換成向量后,就會出現(xiàn)一個1和大量的0:
這就是所謂的one-hot 向量,也是一種localist的表示方式(只顧自己,不顧他人)這種編碼方式會導致向量維度隨著詞表的增加而增加。2萬 (speech) – 5萬 (PTB) – 50萬 (big vocab) – 1300萬 (Google 1T),最后,這些詞向量會變得非常非常長,使得計算機難以處理。
從符號化表示到分布式表示
符號化表示體現(xiàn)不出詞語之間的內(nèi)在聯(lián)系,無法表示意思的相似度。任何兩個獨熱向量都是正交的,無法通過任何運算得到相似度。
因此需要找到一種可以直接把相似度編碼進向量的方法,也就是說可以直接從向量中讀出詞語之間的內(nèi)在聯(lián)系。
基于相似度的分布式表示
語言學家J. R. Firth提出,通過一個詞語的上下文可以得到它的意思。“You shall know a word by the company it keeps.”一個詞的意思是通過它的上下文表示的。
這個思想非常簡單,卻非常強大,是現(xiàn)代自然語言處理最成功的思想之一。
例如,如何知道banking的意思呢?方法就是找到成千上萬含有banking的例句,看它周圍都出現(xiàn)了哪些詞語,然后通過處理這些詞語來獲得banking的含義:
government debt problems turning into ?banking? crises as has happenedsaying that Europe needs unified ?banking? regulation to replace the hodgepodge
banking的含義是由周圍的這些詞表示的。
通過向量定義詞語的含義
我們先把一個詞語定義成一個稠密向量,通過調(diào)整一個單詞及其上下文單詞的向量,使得根據(jù)兩個向量可以推測兩個詞語的相似度;或通過一個詞可以預測詞語的上下文;或根據(jù)上下文可以預測這個詞。這種手法也是遞歸的。
這個稠密的向量,就是詞義的分布式表示。
word2vec
神經(jīng)網(wǎng)絡詞嵌入的基本思路
借助詞向量來定義一個預測中心詞和語境詞的概率模型(給定中心詞,預測語境詞的概率):
然后再定義損失函數(shù):
這里的表示的語境詞(負號表示除了某某之外)。損失函數(shù)的目的是判斷預測的準確與否。如果根據(jù)中心詞可以完美預測語境詞,則損失函數(shù)為零。而一般情況下是做不到的這一點的。
有了損失函數(shù)后,接下來就會在一個大型語料庫的不同位置得到訓練實例,調(diào)整詞向量,最小化損失函數(shù)。
最后,令人驚嘆的奇跡就會發(fā)生!產(chǎn)生的詞向量非常強大,能充分地表示詞語的含義。(后面會提到)
word2vec主要思路
在中心詞和語境詞之間相互預測!
兩種算法:
Skip-grams(SG)給定目標詞,預測語境詞
連續(xù)詞袋(CBOW)給定語境詞袋,預測目標詞
兩個相對高效的訓練方法:
層級 Softmax
負采樣
Skip-gram預測
Skip-gram預測
Skip-gram的核心思想是定義一個給定中心詞、預測語境詞的概率分布模型。然后通過調(diào)整向量,使概率分布最大化。
注意:這里雖然有四條線,但模型中只有一個條件分布。學習就是要最大化這些概率。
word2vec細節(jié)
對于每一個中心詞,計算半徑為的窗口中的所有外圍詞的預測概率。。然后通過調(diào)整向量,使得預測概率最大。
所以目標函數(shù)就是下面這個樣子,我們要通過調(diào)整參數(shù),使其最大化:
對其取負對數(shù),得到負對數(shù)似然函數(shù),這樣就把連我乘轉(zhuǎn)換為求和。我們要對其最小化。
其中 表示所有需要優(yōu)化的變量。
loss function = cost function = objective function 損失函數(shù)、代價函數(shù)、目標函數(shù)都是一樣的。對于概率分布,一般使用交叉熵來計算損失。
那么概率是如何計算的?
對兩個詞向量 做點乘:
兩個向量越相似,其點積越大!
重復以上,,算出所有詞與的點積,然后通過softmax獲得的概率分布。softmax是一種將實數(shù)值轉(zhuǎn)換成概率(0-1)的標準方法。
其中:是外部詞(輸出詞、語境詞)索引,是中心詞索引,是索引為的中心詞向量是索引為的外部詞向量
一張圖濃縮Skipgram
Skipgram濃縮圖
從左到右是中心詞獨熱向量,乘以中心詞向量矩陣W,獲得中心詞語義向量,乘以另一個語境詞矩陣W'得到每個詞語的“相似度”,對相似度取softmax得到概率,與答案對比計算損失。
這兩個矩陣都含有V個詞向量,也就是說同一個詞有兩個詞向量,哪個作為最終的、提供給其他應用使用的embeddings呢?有兩種策略,要么加起來,要么拼接起來。
訓練模型:計算向量梯度
通常把模型參數(shù)集定義為向量 ,訓練的過程就是優(yōu)化這些參數(shù),方法是梯度下降法。以之前的模型為例,有V個詞,每個詞有兩個向量,每個向量為d維,共有2dV個參數(shù)。
梯度推導
重要組件:
矩陣偏微分
鏈式法則若y=f(u),u=g(x),即y=f(g(x)),則:
目標函數(shù):
最大化它等同于最小化
其中T是文本長度,m是窗口大小。
目標函數(shù)中的概率通過softmax計算:
注意:每個詞語分別有中心詞和語境詞兩個向量表示。
我們先從一個中心詞及其語境詞開始。
對中心詞求梯度:
因此,
以上只是中心詞向量參數(shù)梯度的推導,外部詞向量參數(shù)梯度的推導過程類似。
梯度下降
有了梯度,參數(shù)減去梯度就能朝著最小值走了。這就是梯度下降法。
要在整個數(shù)據(jù)集上優(yōu)化目標函數(shù),需要計算所有窗口的梯度。用矩陣的語言表述:
樸素梯度下降代碼:
whileTrue:theta_grad=evaluate_gradient(J,corpus,theta)theta=theta-alpha*theta_grad
梯度下降示意圖
等高線表示目標函數(shù)的數(shù)值。梯度與等高線垂直,指明了前進的方向。 是每次前進的步長。
梯度下降法是求函數(shù)最小值的最基本的方法。
隨機梯度下降法
面對海量語料庫和窗口數(shù),計算所有參數(shù)的梯度,會讓每次參數(shù)更新變得異常緩慢!這對所有神經(jīng)網(wǎng)絡來說,都不是個好主意。
相反,我們使用隨機梯度下降法(SGD)。每次只對某個窗口更新參數(shù)。
隨機梯度下降代碼:
whileTrue:theta_grad=evaluate_gradient(J,window,theta)theta=theta-alpha*theta_grad
雖然隨機梯度下降充滿噪音,但效果奇好,而且速度要快幾個數(shù)量級。神經(jīng)網(wǎng)絡喜歡嘈雜的算法!
-
神經(jīng)網(wǎng)絡
+關注
關注
42文章
4771瀏覽量
100714 -
深度學習
+關注
關注
73文章
5500瀏覽量
121111 -
自然語言處理
+關注
關注
1文章
618瀏覽量
13552
原文標題:詞語的向量化表示(CS224N-2)
文章出處:【微信號:gh_b11486d178ef,微信公眾號:語言和智能】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論