CS224n筆記 詞向量
如何表示一個詞語的意思
先來看看如何定義“意思”的意思,英文中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)=…” role=”presentation”>p(context|wt)=…p(context|wt)=…損失函式定義如下:
J=1−p(w−t|wt)” role=”presentation”>J=1−p(w−t|wt)J=1−p(w−t|wt)這裡的w−t” role=”presentation”>w−tw−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預測
注意這裡雖然有四條線,但模型中只有一個條件分佈(因為這只是個詞袋模型而已,與位置無關)。學習就是要最大化這些概率。
word2vec細節
目標函式定義為所有位置的預測結果的乘積:
要最大化目標函式。對其取個負對數,得到損失函式——對數似然的相反數:
目標函式細節
這些術語都是一樣的:Loss function = cost function = objective function,不用擔心用錯了。對於softmax來講,常用的損失函式為交叉熵。
Word2Vec細節
預測到的某個上下文條件概率p(wt+j|wt)” role=”presentation”>p(wt+j|wt)p(wt+j|wt)可由softmax得到:
o是輸出的上下文詞語中的確切某一個,c是中間的詞語。u是對應的上下文詞向量,v是詞向量。
點積
複習一下課程開頭所說的baby math:
公式這種畫風這種配色真的有點幼兒園的感覺。
點積也有點像衡量兩個向量相似度的方法,兩個向量越相似,其點積越大。
Softmax function:從實數空間到概率分佈的標準對映方法
指數函式可以把實數對映成正數,然後歸一化得到概率。
softmax之所叫softmax,是因為指數函式會導致較大的數變得更大,小數變得微不足道;這種選擇作用類似於max函式。
Skipgram
別看這張圖有點亂,但其實條理很清晰,基本一圖流地說明了問題。從左到右是one-hot向量,乘以center word的W於是找到詞向量,乘以另一個context word的矩陣W’得到對每個詞語的“相似度”,對相似度取softmax得到概率,與答案對比計算損失。真清晰。
官方筆記裡有非手寫版,一樣的意思:
這兩個矩陣都含有V個詞向量,也就是說同一個詞有兩個詞向量,哪個作為最終的、提供給其他應用使用的embeddings呢?有兩種策略,要麼加起來,要麼拼接起來。在CS224n的程式設計練習中,採取的是拼接起來的策略:
- # concatenate the input and output word vectors
- wordVectors = np.concatenate(
- (wordVectors[:nWords,:], wordVectors[nWords:,:]),
- axis=0)
- # wordVectors = wordVectors[:nWords,:] + wordVectors[nWords:,:]
他們管W中的向量叫input vector,W’中的向量叫output vector。
訓練模型:計算引數向量的梯度
把所有引數寫進向量θ” role=”presentation”>θθ,對d維的詞向量和大小V的詞表來講,有:
由於上述兩個矩陣的原因,所以θ” role=”presentation”>θθ。
模型的學習當然是梯度法了,Manning還耐心地推導了十幾分鍾:
損失/目標函式
梯度有了,引數減去梯度就能朝著最小值走了。
梯度下降、SGD
只有一句比較新鮮,神經網路喜歡嘈雜的演算法,這可能是SGD成功的另一原因。