1. 程式人生 > >CS224n筆記 詞向量

CS224n筆記 詞向量

如何表示一個詞語的意思

先來看看如何定義“意思”的意思,英文中meaning代表人或文字想要表達的idea。這是個遞迴的定義,估計查詢idea詞典會用meaning去解釋它。2017-06-07_15-24-56.png

中文中“意思”的意思更加有意思:

他說:“她這個人真有意思(funny)。”她說:“他這個人怪有意思的(funny)。”於是人們以為他們有了意思(wish),並讓他向她意思意思(express)。他火了:“我根本沒有那個意思(thought)!”她也生氣了:“你們這麼說是什麼意思(intention)?”事後有人說:“真有意思(funny)。”也有人說:“真沒意思(nonsense)”。(原文見《生活報》1994.11.13.第六版)[吳尉天,1999]

——《統計自然語言處理》

語言學中“meaning”近似於“指代、所指、符號”。

計算機如何處理詞語的意思

過去幾個世紀裡一直用的是分類詞典。計算語言學中常見的方式是WordNet那樣的詞庫。比如NLTK中可以通過WordNet查詢熊貓的hypernyms (is-a,上位詞),得到“食肉動物”“動物”之類的上位詞。也可以查詢“good”的同義詞——“just品格好”“ripe熟了”。

discrete representation的問題

  • 這種discrete representation雖然是種語言學資源,但丟失了韻味。比如這些同義詞的意思實際上還是有微妙的差別:adept, expert, good, practiced, proficient, skillful

  • 缺少新詞

  • 主觀化

  • 需要耗費大量人力去整理

  • 無法計算準確的詞語相似度

無論是規則學派,還是統計學派,絕大多數NLP學家都將詞語作為最小單位。事實上,詞語只是詞表長度的one-hot向量,這是一種localist representation(大概是借用localist“區域性”的意項)。

在不同的語料中,詞表大小不同。Google的1TB語料詞彙量是1300萬,這個向量的確太長了。

從symbolic representations到distributed representations

詞語在符號表示上體現不出意義的相似性,比如Dell notebook battery size和Dell laptop battery capacity。而one-hot向量是正交的,無法通過任何運算得到相似度。

hankcs.com 2017-06-07 上午10.58.24.png

需要找到一種用向量直接編碼含義的方法。

Distributional similarity based representations

語言學家J. R. Firth提出,通過一個單詞的上下文可以得到它的意思。J. R. Firth甚至建議,如果你能把單詞放到正確的上下文中去,才說明你掌握了它的意義。

這是現代統計自然語言處理最成功的思想之一:

hankcs.com 2017-06-07 上午11.04.07.png

通過向量定義詞語的含義

通過調整一個單詞及其上下文單詞的向量,使得根據兩個向量可以推測兩個詞語的相似度;或根據向量可以預測詞語的上下文。這種手法也是遞迴的,根據向量來調整向量,與詞典中意項的定義相似。

另外,distributed representations與symbolic representations(localist representation、one-hot representation)相對;discrete representation則與後者及denotation的意思相似。切不可搞混distributed和discrete這兩個單詞。

學習神經網路word embeddings的基本思路

定義一個以預測某個單詞的上下文的模型:

p(context|wt)=…” role=”presentation”>p(context|wt)=p(context|wt)=…

損失函式定義如下:

J=1−p(w−t|wt)” role=”presentation”>J=1p(wt|wt)J=1−p(w−t|wt)

這裡的w−t” role=”presentation”>wtw−t的上下文(負號通常表示除了某某之外),如果完美預測,損失函式為零。

然後在一個大型語料庫中的不同位置得到訓練例項,調整詞向量,最小化損失函式。

直接學習低維詞向量

這其實並不是多麼新潮的主意,很早就有一些研究了:

• Learning representations by back-propagating errors (Rumelhart et al., 1986)

A neural probabilistic language model (Bengio et al., 2003)

• NLP (almost) from Scratch (Collobert & Weston, 2008)

• A recent, even simpler and faster model: word2vec (Mikolov et al. 2013) 

只不過以前一直沒有引起重視,直到Bengio展示了它的用處之大。後來研究才開始火熱起來,並逐漸出現了更快更工業化的模型。

word2vec的主要思路

通過單詞和上下文彼此預測,老生常談了。

兩個演算法:

  • Skip-grams (SG):預測上下文

  • Continuous Bag of Words (CBOW):預測目標單詞

兩種稍微高效一些的訓練方法:

  • Hierarchical softmax

  • Negative sampling

Skip-gram預測

hankcs.com 2017-06-07 下午2.47.31.png

注意這裡雖然有四條線,但模型中只有一個條件分佈(因為這只是個詞袋模型而已,與位置無關)。學習就是要最大化這些概率。

word2vec細節

目標函式定義為所有位置的預測結果的乘積:

hankcs.com 2017-06-07 下午2.55.51.png

要最大化目標函式。對其取個負對數,得到損失函式——對數似然的相反數:

hankcs.com 2017-06-07 下午2.57.28.png

目標函式細節

這些術語都是一樣的:Loss function = cost function = objective function,不用擔心用錯了。對於softmax來講,常用的損失函式為交叉熵。

Word2Vec細節

預測到的某個上下文條件概率p(wt+j|wt)” role=”presentation”>p(wt+j|wt)p(wt+j|wt)可由softmax得到:

hankcs.com 2017-06-07 下午3.07.22.png

o是輸出的上下文詞語中的確切某一個,c是中間的詞語。u是對應的上下文詞向量,v是詞向量。

點積

複習一下課程開頭所說的baby math:

hankcs.com 2017-06-07 下午3.09.43.png

公式這種畫風這種配色真的有點幼兒園的感覺。

點積也有點像衡量兩個向量相似度的方法,兩個向量越相似,其點積越大。

Softmax function:從實數空間到概率分佈的標準對映方法

hankcs.com 2017-06-07 下午3.13.57.png

指數函式可以把實數對映成正數,然後歸一化得到概率。

softmax之所叫softmax,是因為指數函式會導致較大的數變得更大,小數變得微不足道;這種選擇作用類似於max函式。

Skipgram

2017-06-07_15-24-56.png

別看這張圖有點亂,但其實條理很清晰,基本一圖流地說明了問題。從左到右是one-hot向量,乘以center word的W於是找到詞向量,乘以另一個context word的矩陣W’得到對每個詞語的“相似度”,對相似度取softmax得到概率,與答案對比計算損失。真清晰。

官方筆記裡有非手寫版,一樣的意思:

Skip-Gram.png

這兩個矩陣都含有V個詞向量,也就是說同一個詞有兩個詞向量,哪個作為最終的、提供給其他應用使用的embeddings呢?有兩種策略,要麼加起來,要麼拼接起來。在CS224n的程式設計練習中,採取的是拼接起來的策略:

  1. # concatenate the input and output word vectors
  2. wordVectors = np.concatenate(
  3. (wordVectors[:nWords,:], wordVectors[nWords:,:]),
  4.     axis=0)
  5. # wordVectors = wordVectors[:nWords,:] + wordVectors[nWords:,:]

他們管W中的向量叫input vector,W’中的向量叫output vector。

訓練模型:計算引數向量的梯度

把所有引數寫進向量θ” role=”presentation”>θθ,對d維的詞向量和大小V的詞表來講,有:

2017-06-07_15-34-33.png

由於上述兩個矩陣的原因,所以θ” role=”presentation”>θθ

模型的學習當然是梯度法了,Manning還耐心地推導了十幾分鍾:

hankcs.com 2017-06-07 下午5.18.54.png

hankcs.com 2017-06-07 下午5.19.15.png

hankcs.com 2017-06-07 下午5.20.24.png

hankcs.com 2017-06-07 下午5.20.42.png

損失/目標函式

梯度有了,引數減去梯度就能朝著最小值走了。

hankcs.com 2017-06-07 下午8.34.41.png

梯度下降、SGD

hankcs.com 2017-06-07 下午8.42.22.png

hankcs.com 2017-06-07 下午8.40.33.png

只有一句比較新鮮,神經網路喜歡嘈雜的演算法,這可能是SGD成功的另一原因。