1. 程式人生 > >【深度學習】詞的向量化表示

【深度學習】詞的向量化表示

model ref res font 技術 訓練 lin 挖掘 body

如果要一句話概括詞向量的用處,就是提供了一種數學化的方法,把自然語言這種符號信息轉化為向量形式的數字信息。這樣就把自然語言理解的問題要轉化為機器學習的問題。

其中最常用的詞向量模型無非是 one-hot Representation模型和 distributed representation 模型。

One-hot Representation

One-hot Representation 就是用一個很長的向量來表示一個詞,向量長度為詞典的大小N,每個向量只有一個維度為1,其余維度全部為0,為1的位置表示該詞語在詞典的位置。

舉個常見例子:

“話筒”表示為 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …]

“麥克”表示為 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …]

這種 One-hot Representation 如果采用稀疏方式存儲,會是非常的簡潔,也就是給每個詞分配一個數字 ID。但這種表示方式有兩個缺點:
(1)容易受維數災難的困擾,每個詞語的維度就是語料庫字典的長度。
(2)詞語的編碼往往是隨機的,導致不能很好地刻畫詞與詞之間的相似性

Distributed representation

Distributed representation 最早由 Hinton在1986 年提出。其依賴思想是:詞語的語義是通過上下文信息來確定的,即相同語境出現的詞,其語義也相近。

Distributed Representation與one-hot representation對比

  1. 在形式上,one-hot representation 詞向量是一種稀疏詞向量,其長度就是字典長度,而Distributed Representation是一種固定長度的稠密詞向量。一般長這樣:[0.792, −0.177, −0.107, 0.109, −0.542, …]
  2. 在功能上,Distributed representation 最大的貢獻就是讓相關或者相似的詞,在距離上更接近了。

關於生成 Distributed representation 形式的詞向量,除了word2vec外,還有其他生成的方式。如:LSA矩陣分解模型、 PLSA 潛在語義分析概率模型、LDA 文檔生成模型。但本文只關註 word2vec 這種方式,其他不做介紹。

將word映射到一個新的空間中,並以多維的連續實數向量進行表示叫做“Word Represention” 或 “Word Embedding”。自從21世紀以來,人們逐漸從原始的詞向量稀疏表示法過渡到現在的低維空間中的密集表示。用稀疏表示法在解決實際問題時經常會遇到維數災難,並且語義信息無法表示,無法揭示word之間的潛在聯系。而采用低維空間表示法,不但解決了維數災難問題,並且挖掘了word之間的關聯屬性,從而提高了向量語義上的準確度。

神經網絡訓練詞向量

NNLM 是 Neural Network Language Model 的縮寫,即神經網絡語言模型。這方面最值得閱讀的文章:Bengio 的《A Neural Probabilistic Language Model》

這部分內容首先需理解下圖。Bengio用了一個三層的神經網絡來構建語言模型,同樣也是 n-gram 模型。本小節即主要是對於這個圖的理解:
技術分享圖片

以輸入一句英文為例:The cat is walking in the bedroom。如果我們需要這句話中所有上下文為數量為4的連續詞匯片段,那麽就有 The cat is walking、cat is walking in、is walking in the 以及 walking in the bedroom 這樣4個片段。從語言模型角度上來講,每個連續詞匯片段的最後一個單詞是什麽,都是受前面三個詞匯制約。因此,這就形成了一個根據前面三個單詞,預測最後一個單詞的監督學習系統。

如果用神經網絡框架來描述,上圖就代表一個監督模型的神經網絡,當上下文數量為n的時候,這裏的模型就是用前n-1個詞語,也就是w(t-1) … w(t-n+1),來預測第t個詞語w(t)。在神經網絡中,用於計算的都是這些詞的向量表示,如C(w(t-1)) 就是詞語 w(t-1) 的向量表示。

這裏C(w(t-1))其實就是詞向量,但不是最終的詞向量,最終結果還需要多輪叠代計算。其實這些詞向量就是神經網絡裏的參數,生成詞向量的過程就是一個參數更新的過程。

註意:對於初學者來說這裏有個坑,考慮一個問題:詞向量不是我們最終得到的嗎?那我們如何得到最初輸入的每個詞對應的詞向量C(w(t-1))、C(w(t-2))、、、C(w(t-n+1))?以下是我查閱資料後自己的理解:

在上圖中存在一個系數矩陣C(是一個N*M的矩陣),其中N是詞典的長度,M是詞向量的維度。最底層的輸入其實是詞語的one-hot形式,one-hot也可以看成 1*N的矩陣 ,與這個系數矩陣C(N*M, M是word2vec詞向量維數)相乘之後就可以得到1*M的向量,這個向量就是這個詞對應的詞向量了。

從本質上來看,詞語w轉化為詞向量C(w),就是根據詞 w 的one-hot 形式,通過矩陣相乘,從系數矩陣C中取出一行。

還需註意的是,這個系數矩陣C,就是神經網絡的參數,最初是隨機的,隨著訓練的進行不斷被更新。

Word2vec 訓練介紹

這部分還是一樣,盡量想避開那些底層原理、不想多扯。

Word2Vec 實際上是兩種不同思想實現的:CBOW(Continuous Bag of Words) 和 Skip-gram。

CBOW的目標是根據上下文來預測當前詞語的概率,且上下文所有的詞對當前詞出現概率的影響的權重是一樣的,因此叫continuous bag-of-words模型。如在袋子中取詞,取出數量足夠的詞就可以了,至於取出的先後順序是無關緊要的。

Skip-gram剛好相反:根據當前詞語來預測上下文的概率。

這兩種方法都利用人工神經網絡作為它們的分類算法。起初每個單詞都是一個隨機 N 維向量。經過訓練之後,該算法利用 CBOW 或者 Skip-gram 的方法獲得了每個單詞的最優向量。訓練過程如下圖所示:
技術分享圖片

對於CBOW 和 Skip-gram 的基本思想講到這裏就結束了。按照學習word2vec一般套路,接下來就是實現CBOW 和 Skip-gram 這兩種思想的方法了— Hierarchical Softmax 和 negative sampling。

【深度學習】詞的向量化表示