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

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

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

  「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 年提出。它是一種低維實數向量,這種向量通常長成這個樣子:post

[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原理介紹

相關文章
相關標籤/搜索