1. 程式人生 > >CS224n筆記2 詞的向量表示:word2vec

CS224n筆記2 詞的向量表示:word2vec

present 技術分享 思想 相對 自然語言 -h padding erro bat

如何表示一個詞語的意思

  先來看看如何定義“意思”的意思,英文中meaning代表人或文字想要表達的idea。這是個遞歸的定義,估計查詢idea詞典會用meaning去解釋它。技術分享

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

他說:“她這個人真有意思(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向量是正交的,無法通過任何運算得到相似度。

  

技術分享

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

Distributional similarity based representations

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

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

技術分享

  

通過向量定義詞語的含義

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

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

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

  定義一個以預測某個單詞的上下文的模型:p(context|wt)=

  損失函數定義如下:J=1?p(w?t|wt)

  這裏的w?tw?t表示wtwt的上下文(負號通常表示除了某某之外),如果完美預測,損失函數為零。

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

直接學習低維詞向量

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

    ? 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

  但在這門課裏,只會講Nai?ve softmax。好在我早就把兩種算法和兩種訓練方法的四種組合過了一遍:http://www.hankcs.com/nlp/word2vec.html

Skip-gram預測

技術分享

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

word2vec細節

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

技術分享

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

  目標函數和損失函數通常是相反的過程:

技術分享

目標函數細節

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

Word2Vec細節

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

技術分享

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

點積

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

技術分享

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

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

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

技術分享

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

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

Skipgram

技術分享

  別看這張圖有點亂,但其實條理很清晰,基本一圖流地說明了問題。從左到右的過程依次是one-hot向量乘以W於是找到詞向量,再乘以W的轉置得到對每個詞語的“相似度”,對相似度取softmax得到概率,與答案對比計算損失。真清晰。官方筆記裏有非手寫版,一樣的意思:

技術分享

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

  把所有參數寫進向量θθ,對d維的詞向量和大小V的詞表來講,有:

技術分享

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

技術分享

技術分享

技術分享

技術分享

  更清晰的公式參考:http://www.hankcs.com/nlp/word2vec.html#h3-5

損失/目標函數

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

技術分享

梯度下降、SGD

技術分享

技術分享

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

CS224n筆記2 詞的向量表示:word2vec