1. 程式人生 > >[Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec詞向量模型

[Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec詞向量模型

www. 頻率 cbo homepage 算法 文章 有一個 tro 概率

閱讀目錄

  • 1. 詞向量
  • 2.Distributed representation詞向量表示
  • 3.詞向量模型
  • 4.word2vec算法思想
  • 5.doc2vec算法思想
  • 6.參考內容

  深度學習掀開了機器學習的新篇章,目前深度學習應用於圖像和語音已經產生了突破性的研究進展。深度學習一直被人們推崇為一種類似於人腦結構的人工智能算法,那為什麽深度學習在語義分析領域仍然沒有實質性的進展呢?

  引用三年前一位網友的話來講:

  “Steve Renals算了一下icassp錄取文章題目中包含deep learning的數量,發現有44篇,而naacl則有0篇。有一種說法是,語言(詞、句子、篇章等)屬於人類認知過程中產生的高層認知抽象實體,而語音和圖像屬於較為底層的原始輸入信號,所以後兩者更適合做deep learning來學習特征。

  實際上,就目前而言,Deep Learning 在 NLP 領域中的研究已經將高深莫測的人類語言撕開了一層神秘的面紗。其中最有趣也是最基本的,就是“詞向量”了。

回到頂部

1. 詞向量

  自然語言理解的問題要轉化為機器學習的問題,第一步肯定是要找一種方法把這些符號數學化。
  NLP 中最直觀,也是到目前為止最常用的詞表示方法是 One-hot Representation,這種方法把每個詞表示為一個很長的向量。這個向量的維度是詞表大小,其中絕大多數元素為 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 …]
  每個詞都是茫茫 0 海中的一個 1。
  這種 One-hot Representation 如果采用稀疏方式存儲,會是非常的簡潔:也就是給每個詞分配一個數字 ID。比如剛才的例子中,話筒記為 3,麥克記為 8(假設從 0 開始記)。如果要編程實現的話,用 Hash 表給每個詞分配一個編號就可以了。這麽簡潔的表示方法配合上最大熵、SVM、CRF 等等算法已經很好地完成了 NLP 領域的各種主流任務。
  當然這種表示方法也存在一個重要的問題就是“詞匯鴻溝”現象:任意兩個詞之間都是孤立的。光從這兩個向量中看不出兩個詞是否有關系,哪怕是話筒和麥克這樣的同義詞也不能幸免於難。此外,這種表示方法還容易發生維數災難,尤其是在Deep Learning相關的一些應用中。

回到頂部

2.Distributed representation詞向量表示

  既然上述這種易於理解的One-hot Representation詞向量表示方式具有這樣的重要缺陷,那麽就需要一種既能表示詞本身又可以考慮語義距離的詞向量表示方法,這就是我們接下來要介紹的Distributed representation詞向量表示方法。

  Distributed representation 最早由 Hinton在 1986 年提出。它是一種低維實數向量,這種向量一般長成這個樣子:

[0.792, −0.177, −0.107, 0.109, −0.542, …]

  維度以 50 維和 100 維比較常見,當然了,這種向量的表示不是唯一的。
  Distributed representation 最大的貢獻就是讓相關或者相似的詞,在距離上更接近了(看到這裏大家有沒有想到普通hash以及simhash的區別呢?有興趣的同學請見博客《[Algorithm] 使用SimHash進行海量文本去重》)。向量的距離可以用最傳統的歐氏距離來衡量,也可以用 cos 夾角來衡量。用這種方式表示的向量,“麥克”和“話筒”的距離會遠遠小於“麥克”和“天氣”。可能理想情況下“麥克”和“話筒”的表示應該是完全一樣的,但是由於有些人會把英文名“邁克”也寫成“麥克”,導致“麥克”一詞帶上了一些人名的語義,因此不會和“話筒”完全一致。

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

回到頂部

3.詞向量模型

  a) LSA矩陣分解模型

  采用線性代數中的奇異值分解方法,選取前幾個比較大的奇異值所對應的特征向量將原矩陣映射到低維空間中,從而達到詞矢量的目的。

  b) PLSA 潛在語義分析概率模型

  從概率學的角度重新審視了矩陣分解模型,並得到一個從統計,概率角度上推導出來的和LSA相當的詞矢量模型。

  c) LDA 文檔生成模型

  按照文檔生成的過程,使用貝葉斯估計統計學方法,將文檔用多個主題來表示。LDA不只解決了同義詞的問題,還解決了一次多義的問題。目前訓練LDA模型的方法有原始論文中的基於EM和 差分貝葉斯方法以及後來出現的Gibbs Samplings 采樣算法。

  d) Word2Vector 模型

  最近幾年剛剛火起來的算法,通過神經網絡機器學習算法來訓練N-gram 語言模型,並在訓練過程中求出word所對應的vector的方法。本文將詳細闡述此方法的原理。

回到頂部

4.word2vec算法思想

  什麽是word2vec?你可以理解為word2vec就是將詞表征為實數值向量的一種高效的算法模型,其利用深度學習的思想,可以通過訓練,把對文本內容的處理簡化為 K 維向量空間中的向量運算,而向量空間上的相似度可以用來表示文本語義上的相似

  Word2vec輸出的詞向量可以被用來做很多 NLP 相關的工作,比如聚類、找同義詞、詞性分析等等。如果換個思路, 把詞當做特征,那麽Word2vec就可以把特征映射到 K 維向量空間,可以為文本數據尋求更加深層次的特征表示

  Word2vec 使用的詞向量不是我們上述提到的One-hot Representation那種詞向量,而是 Distributed representation 的詞向量表示方式。其基本思想是 通過訓練將每個詞映射成 K 維實數向量(K 一般為模型中的超參數),通過詞之間的距離(比如 cosine 相似度、歐氏距離等)來判斷它們之間的語義相似度.其采用一個 三層的神經網絡 ,輸入層-隱層-輸出層。有個核心的技術是 根據詞頻用Huffman編碼 ,使得所有詞頻相似的詞隱藏層激活的內容基本一致,出現頻率越高的詞語,他們激活的隱藏層數目越少,這樣有效的降低了計算的復雜度。而Word2vec大受歡迎的一個原因正是其高效性,Mikolov 在論文中指出,一個優化的單機版本一天可訓練上千億詞。

  這個三層神經網絡本身是 對語言模型進行建模 ,但也同時 獲得一種單詞在向量空間上的表示 ,而這個副作用才是Word2vec的真正目標。

  與潛在語義分析(Latent Semantic Index, LSI)、潛在狄立克雷分配(Latent Dirichlet Allocation,LDA)的經典過程相比,Word2vec利用了詞的上下文,語義信息更加地豐富。

  Word2Vec實際上是兩種不同的方法:Continuous Bag of Words (CBOW) 和 Skip-gram。CBOW的目標是根據上下文來預測當前詞語的概率。Skip-gram剛好相反:根據當前詞語來預測上下文的概率(如下圖所示)。這兩種方法都利用人工神經網絡作為它們的分類算法。起初,每個單詞都是一個隨機 N 維向量。經過訓練之後,該算法利用 CBOW 或者 Skip-gram 的方法獲得了每個單詞的最優向量。

技術分享圖片

  取一個適當大小的窗口當做語境,輸入層讀入窗口內的詞,將它們的向量(K維,初始隨機)加和在一起,形成隱藏層K個節點。輸出層是一個巨大的二叉 樹,葉節點代表語料裏所有的詞(語料含有V個獨立的詞,則二叉樹有|V|個葉節點)。而這整顆二叉樹構建的算法就是Huffman樹。這樣,對於葉節點的 每一個詞,就會有一個全局唯一的編碼,形如"010011",不妨記左子樹為1,右子樹為0。接下來,隱層的每一個節點都會跟二叉樹的內節點有連邊,於是 對於二叉樹的每一個內節點都會有K條連邊,每條邊上也會有權值。

技術分享圖片

  對於語料庫中的某個詞w_t,對應著二叉樹的某個葉子節點,因此它必然有一個二進制編碼,如"010011"。在訓練階段,當給定上下文,要預測後 面的詞w_t的時候,我們就從二叉樹的根節點開始遍歷,這裏的目標就是預測這個詞的二進制編號的每一位。即對於給定的上下文,我們的目標是使得預測詞的二 進制編碼概率最大。形象地說,我們希望在根節點,詞向量和與根節點相連經過 logistic 計算得到 bit=1 的概率盡量接近 0,在第二層,希望其 bit=1 的概率盡量接近1,這麽一直下去,我們把一路上計算得到的概率相乘,即得到目標詞w_t在當前網絡下的概率P(w_t),那麽對於當前這個 sample的殘差就是1-P(w_t),於是就可以使用梯度下降法訓練這個網絡得到所有的參數值了。顯而易見,按照目標詞的二進制編碼計算到最後的概率 值就是歸一化的。

  Hierarchical Softmax用Huffman編碼構造二叉樹,其實借助了分類問題中,使用一連串二分類近似多分類的思想。例如我們是把所有的詞都作為輸出,那麽“桔 子”、“汽車”都是混在一起。給定w_t的上下文,先讓模型判斷w_t是不是名詞,再判斷是不是食物名,再判斷是不是水果,再判斷是不是“桔子”。

  但是在訓練過程中,模型會賦予這些抽象的中間結點一個合適的向量,這個向量代表了它對應的所有子結點。因為真正的單詞公用了這些抽象結點的向量,所 以Hierarchical Softmax方法和原始問題並不是等價的,但是這種近似並不會顯著帶來性能上的損失同時又使得模型的求解規模顯著上升。

  沒有使用這種二叉樹,而是直接從隱層直接計算每一個輸出的概率——即傳統的Softmax,就需要對|V|中的每一個詞都算一遍,這個過程時間復雜 度是O(|V|)的。而使用了二叉樹(如Word2vec中的Huffman樹),其時間復雜度就降到了O(log2(|V|)),速度大大地加快了。

  現在這些詞向量已經捕捉到上下文的信息。我們可以利用基本代數公式來發現單詞之間的關系(比如,“國王”-“男人”+“女人”=“王後”)。這些詞向量可 以代替詞袋用來預測未知數據的情感狀況。該模型的優點在於不僅考慮了語境信息還壓縮了數據規模(通常情況下,詞匯量規模大約在300個單詞左右而不是之前 模型的100000個單詞)。因為神經網絡可以替我們提取出這些特征的信息,所以我們僅需要做很少的手動工作。但是由於文本的長度各異,我們可能需要利用 所有詞向量的平均值作為分類算法的輸入值,從而對整個文本文檔進行分類處理。

回到頂部

5.doc2vec算法思想

  然而,即使上述模型對詞向量進行平均處理,我們仍然忽略了單詞之間的排列順序對情感分析的影響。即上述的word2vec只是基於詞的維度進行"語義分析"的,而並不具有上下文的"語義分析"能力。

  作為一個處理可變長度文本的總結性方法,Quoc Le 和 Tomas Mikolov 提出了 Doc2Vec方法。除了增加一個段落向量以外,這個方法幾乎等同於 Word2Vec。和 Word2Vec 一樣,該模型也存在兩種方法:Distributed Memory(DM) 和 Distributed Bag of Words(DBOW)。DM 試圖在給定上下文和段落向量的情況下預測單詞的概率。在一個句子或者文檔的訓練過程中,段落 ID 保持不變,共享著同一個段落向量。DBOW 則在僅給定段落向量的情況下預測段落中一組隨機單詞的概率。

  以下內容摘自語義分析的一些方法(中篇)

  先看c-bow方法,相比於word2vec的c-bow模型,區別點有:

  • 訓練過程中新增了paragraph id,即訓練語料中每個句子都有一個唯一的id。paragraph id和普通的word一樣,也是先映射成一個向量,即paragraph vector。paragraph vector與word vector的維數雖一樣,但是來自於兩個不同的向量空間。在之後的計算裏,paragraph vector和word vector累加或者連接起來,作為輸出層softmax的輸入。在一個句子或者文檔的訓練過程中,paragraph id保持不變,共享著同一個paragraph vector,相當於每次在預測單詞的概率時,都利用了整個句子的語義。
  • 在預測階段,給待預測的句子新分配一個paragraph id,詞向量和輸出層softmax的參數保持訓練階段得到的參數不變,重新利用梯度下降訓練待預測的句子。待收斂後,即得到待預測句子的paragraph vector。

技術分享圖片

  sentence2vec相比於word2vec的skip-gram模型,區別點為:在sentence2vec裏,輸入都是paragraph vector,輸出是該paragraph中隨機抽樣的詞。

技術分享圖片

  下面是sentence2vec的結果示例。先利用中文sentence語料訓練句向量,然後通過計算句向量之間的cosine值,得到最相似的句子。可以看到句向量在對句子的語義表征上還是相當驚嘆的。

技術分享圖片

回到頂部

6.參考內容

  1. word2vec官方地址:Word2Vec Homepage

  2. python版本word2vec實現:gensim word2vec

  3. python版本doc2vec實現:gensim doc2vec

  4. 情感分析的新方法——基於Word2Vec/Doc2Vec/Python

  5. 練數成金:語義分析的一些方法(中篇)

  6. 王琳 Word2vec原理介紹

[Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec詞向量模型