1. 程式人生 > >詞向量—Word2Vec入門及Gensim實踐

詞向量—Word2Vec入門及Gensim實踐

在機器學習領域,語音識別和影象識別都比較容易做到。語音識別的輸入資料可以是音訊頻譜序列向量所構成的matrix,影象識別的輸入資料是畫素點向量構成的矩陣。但是文字是一種抽象的非結構化的資料,顯然不能直接把文字資料餵給機器當做輸入,因此這裡就需要對文字資料進行處理。

Word2vec是google在2013年推出的一個詞向量實現工具(注意,不是詞向量模型),它的特點是將所有的詞向量化,這樣詞與詞之間就可以定量的去度量他們之間的關係.  本文將從統計語言模型開始,儘可能詳細地介紹word2vec工具背後的演算法模型。

詞向量的表現形式主要分為兩種,一種是one-hot(one-hot representation)

表示方式,將詞表示成一個很長的向量,向量的長度就是詞典的長度;另一種表示方法是分散式表示(distributed representation)。同時,分散式表示方法又可以分為基於矩陣的表示方法、基於聚類的表示方法和基於神經網路的表示方法。

one-hot表示

one-hot表示方法,將詞表示成一個很長的向量,向量的分量只有一個1,其他全為0,1。詞典索引的下標對應的方向上是1,其餘方向上都是0。例如,對於一個大小為5的詞典:{"I", "love", "nature", "luaguage", "processing"},“nature”對應的one-hot向量為:[0,0,1,0,0]。顯然,one-hot向量的維度等於詞典的大小

。這在動輒上萬甚至百萬詞典的實際應用中,面臨著巨大的維度災難問題(the curse of dimensionality)

這樣表示有兩個缺點:

  1. 容易受維度災難(the curse of dimentionality)的困擾;

  2. 沒有考慮到詞之間的關係(similarity)。

分散式表示

       統計語言模型

自然語言處理中的一個基本問題:如何計算一段文字序列在某種語言下出現的概率?之所為稱其為一個基本問題,是因為它在很多NLP任務中都扮演著重要的角色。例如,在機器翻譯的問題中,如果我們知道了目標語言中每句話的概率,就可以從候選集合中挑選出最合理的句子做為翻譯結果返回。

統計語言模型給出了這一類問題的一個基本解決框架。對於一段文字序列S=w1,w2,...,wT,它的概率可以表示為:

即將序列的聯合概率轉化為一系列條件概率的乘積。問題變成了如何去預測這些給定previous words下的條件概率p(wt|w1,w2,...,wt−1)。

        N-gram模型

由於其巨大的引數空間,這樣一個原始的模型在實際中並沒有多的作用。我們更多的是採用其簡化版本——N-gram模型:

常見的如bigram模型(N=2)和trigram模型(N=3)。事實上,由於模型複雜度預測精度的限制,我們很少會考慮N>3的模型。

這種方法下,就可以用最大似然法去求解Ngram模型的引數,等價於去統計每個Ngram的條件詞頻。

為了避免統計中出現的零概率問題(一段從未在訓練集中出現過的Ngram片段會使得整個序列的概率為0),人們基於原始的Ngram模型進一步發展出了back-off trigram模型(用低階的bigram和unigram代替零概率的trigram)和interpolated trigram模型(將條件概率表示為unigram、bigram、trigram三者的線性函式)[3]

N-gram模型不足:

  1.  引數空間的爆炸式增長,它無法處理更長程的context(N>3)。
  2. 它沒有考慮詞與詞之間內在的聯絡性。例如,考慮"the cat is walking in the bedroom"這句話。如果我們在訓練語料中看到了很多類似“the dog is walking in the bedroom”或是“the cat is running in the bedroom”這樣的句子,那麼,即使我們沒有見過這句話,也可以從“cat”和“dog”(“walking”和“running”)之間的相似性,推測出這句話的概率[3]。然而, Ngram模型做不到。
  3. N-gram本質上是將詞當做一個個孤立的原子單元(atomic unit)去處理的。這種處理方式對應到數學上的形式是一個個離散的one-hot向量。

       神經網路語言模型

鑑於Ngram等模型的不足,2003年,Bengio等人發表了一篇開創性的文章:《A neural probabilistic language model 》。在這篇文章裡,他們總結出了一套用神經網路建立統計語言模型的框架(Neural Network Language Model,NNLM),並首次提出了word embedding的概念,從而奠定了包括word2vec在內後續研究word representation learning的基礎。

NNLM模型的基本思想如下:

  • 假定詞表中的每一個word都對應著一個連續的特徵向量;
  • 假定一個連續平滑的概率模型,輸入一段詞向量的序列,可以輸出這段序列的聯合概率
  • 同時學習詞向量的權重和概率模型裡的引數。(詞向量也是要學習的引數)

Bengio等人《A neural probabilistic language model》論文中採用了一個簡單的前向反饋神經網路 f(wt−n+1,...,wt) 來擬合一個詞序列的條件概率p(wt|w1,w2,...,wt−1)。整個模型的網路結構見下圖:

模型的整個網路結構我們可以得到:

  1. 首先是一個線性的embedding層。它將輸入的 N−1個one-hot詞向量,通過一個共享的D×V的矩陣C,對映為N−1個分散式的詞向量(distributed vector)。其中,V是詞典的大小,D是embedding向量的維度(一個先驗引數)。C矩陣裡儲存了要學習的word vector。
  2. 其次是一個簡單的前向反饋神經網路g。它由一個tanh隱層和一個softmax輸出層組成。通過將embedding層輸出的N−1個詞向量對映為一個長度為V的概率分佈向量,從而對詞典中的word在輸入context下的條件概率做出預估:

通過最小化一個cross-entropy的正則化損失函式來調整模型的引數θ:

其中,模型的引數θ包括了embedding層矩陣C的元素和前向反饋神經網路模型g裡的權重。這是一個巨大的引數空間。不過,在用SGD學習更新模型的引數時,並不是所有的引數都需要調整(例如,未在輸入的context中出現的詞對應的詞向量)。計算的瓶頸主要是在softmax層的歸一化函式上(需要對詞典中所有的word計算一遍條件概率)

NNLM 相比較 N-gram優點:

  • 通過引入連續的詞向量和平滑的概率模型,我們就可以在一個連續空間裡對序列概率進行建模,從而根本上緩解資料稀疏性維度災難的問題。
  • 另一方面,以條件概率p(wt|context)為學習目標去更新詞向量的權重,具有更強的導向性,同時也與VSM裡的Distributional Hypothesis不謀而合。

CBoW & Skip-gram 模型

NNLM 模型不足

  • 同N-gram模型一樣,NNLM模型只能處理定長的序列。03年,Bengio等人在其論文《A neural probabilistic language model》將模型能夠一次處理的序列長度N提高到了55,雖然相比bigram和trigram已經是很大的提升,但依然缺少靈活性。因此,2010年,Mikolov等人《Recurrent neural network based language model》中提出了一種RNNLM模型,用遞迴神經網路RNN代替原始模型裡的前向反饋神經網路,並將embedding層與RNN裡的隱藏層合併,從而解決了變長序列的問題。
  • NNLM 模型訓練太慢。softmax層在歸一化時需要對詞典中所有的word計算一遍條件概率即便是在百萬量級的資料集上,即便是藉助了幾十個CPU進行訓練,NNLM也需要耗時數週才能給出一個稍微靠譜的結果。顯然,對於現在動輒上千萬甚至上億的真實語料庫,訓練一個NNLM模型幾乎是一個impossible mission。

面對NNLM的不足,Mikolov 繼續對此進行了。他注意到,原始的NNLM模型的訓練其實可以拆分成兩個步驟:

  1. 用一個簡單模型訓練出連續的詞向量
  2. 基於詞向量的表達,訓練一個連續的N-gram神經網路模型

如果我們只是想得到word的連續特徵向量,是不是可以對第二步裡的神經網路模型進行簡化呢?

Mikolov是這麼想的,也是這麼做的。他在2013年一口氣推出了兩篇paper,並開源了一款計算詞向量的工具。至此,word2vec橫空出世。

首先,對原始的NNLM模型做如下改造:

  1. 移除前向反饋神經網路中非線性的hidden layer,直接將embedding layer與輸出層的softmax layer連線
  2. 忽略上下文環境的序列資訊:輸入的所有詞向量均彙總到同一個embedding layer;
  3. 將future words納入上下文環境

得到的模型稱之為CBOW模型(Continuous Bag-of-Words Model)。

從直觀上理解,Skip-Gram是給定input word來預測上下文或者說在其附近的詞神經網路將會計算出我們從詞彙表中選出的每個“候選”鄰居詞的概率。實際上在演算法裡有一個"window size"引數,用來控制視窗大小,如果選擇引數的值為6,則會預測該詞前後各6個詞的概率。而CBOW是給定上下文,來預測input word。

skip-gram模型是十分簡單的。我們將會訓練一個只有一個隱藏層的簡單的神經網路來完成我們的任務,但是當神經網路訓練完成以後,我們實際上並不使用這個網路做什麼,而是獲得隱藏層的權重矩陣,這個矩陣實際上就是我們需要得到的詞向量(word vectors)。

將Skip-gram模型的前向計算過程的數學形式:

其中,Vi是embedding層矩陣裡的向量,也被稱為wi的input vector。Uj是softmax層矩陣裡的向量,稱為wj的output vector。

        然而,直接對詞典裡的V個詞計算 相似度 歸一化,顯然是一件極其耗時的 impossible mission。 我們的詞彙表一般在百萬級別以上,這意味著我們DNN的輸出層需要進行softmax計算各個詞的輸出概率的的計算量非常大(詞彙表中的詞都需計算一遍),有沒有簡化一點點的方法呢?為此,Mikolov引入了兩種優化演算法:層次Softmax(Hierarchical Softmax)和負取樣(Negative Sampling)。

層次Softmax

層次Softmax是一個很巧妙的模型,最早由Bengio在05年引入到語言模型中。它通過構造一顆二叉樹,將目標概率的計算複雜度從最初的V降低到了log⁡V的量級層次,它的基本思想是將複雜的歸一化概率分解為一系列條件概率乘積的形式:

其中,每一層條件概率對應一個二分類問題,可以通過一個簡單的邏輯迴歸函式去擬合。這樣,我們將對 V個詞的概率歸一化問題,轉化成了對 logV 個詞的概率擬合問題。

我們可以通過構造一顆分類二叉樹來直觀地理解這個過程。首先,我們將原始字典D劃分為兩個子集D1、D2,並假設在給定context下,target word屬於子集D1的概率p(wt∈D1|context)服從logistical function的形式

其中,UDroot和Vwt都是模型的引數

接下來,對子集D1和D2進一步劃分。重複這一過程,直到集合裡只剩下一個word。這樣就將原始大小為V的字典D轉換成了一顆深度為log⁡V的二叉樹。樹中的葉子節點與原始字典裡的word依次對應;非葉節點則對應著某一類word的集合。顯然,從根節點出發到任意一個葉子節點都只有一條唯一路徑,這條路徑也編碼了這個葉子節點所屬的類別。

同時,從根節點出發到葉子節點也是一個隨機遊走的過程。因此,我們可以基於這顆二叉樹對葉子節點出現的似然概率進行計算。例如,對於訓練樣本里的一個target word (wt),假設其對應的二叉樹編碼為{1,0,1,...,1},則我們構造的似然函式為:

乘積中的每一項都是一個邏輯迴歸的函式。通過最大化這個似然函式來求解二叉樹上的引數——非葉節點上的向量,用來計算遊走到某一個子節點的概率。

因此,構造一顆最優的二叉樹就顯得十分重要。在實際的應用中,最先優化使用的資料結構是用 霍夫曼樹 來代替隱藏層和輸出層的神經元,霍夫曼樹的內部節點則起到隱藏層神經元的作用; 葉子節點起到輸出層神經元的作用,葉子節點的個數即為詞彙表的大小 。

具體如何用 霍夫曼樹 來進行CBOW和Skip-Gram的訓練,我們先複習下霍夫曼樹。

Word2vec—霍夫曼樹

1. 霍夫曼樹的建立

    霍夫曼樹的建立其實並不難,過程如下:

    輸入:權值為(w1,w2,...wn)的n個節點

    輸出:對應的霍夫曼樹

    1)將(w1,w2,...wn)看做是有n棵樹的森林,每個樹僅有一個節點。

    2)在森林中選擇根節點權值最小的兩棵樹進行合併,得到一個新的樹,這兩顆樹分佈作為新樹的左右子樹。新樹的根節點權重為左右子樹的根節點權重之和。

    3) 將之前的根節點權值最小的兩棵樹從森林刪除,並把新樹加入森林。

    4)重複步驟2)和3)直到森林裡只有一棵樹為止。

    下面我們用一個具體的例子來說明霍夫曼樹建立的過程,我們有(a,b,c,d,e,f)共6個節點,節點的權值分佈是(16,4,8,6,20,3)。

    首先是最小的b和f合併,得到的新樹根節點權重是7。此時森林裡5棵樹,根節點權重分別是16,8,6,20,7。此時根節點權重最小的6,7合併,得到新子樹,依次類推,最終得到下面的霍夫曼樹。

 2. 霍夫曼樹有什麼好處

       那麼霍夫曼樹有什麼好處呢?一般得到霍夫曼樹後我們會對葉子節點進行霍夫曼編碼,由於權重高的葉子節點越靠近根節點,而權重低的葉子節點會遠離根節點,這樣會使得 高權重節點的編碼值較短,而低權重值編的碼值較長,這會保證的樹的帶權路徑最短,得到最優的二叉樹(哈夫曼樹是一種最優二叉樹)。符合資訊理論要求,即我們希望越常用的詞擁有更短的編碼。如何編碼呢?一般對於一個霍夫曼樹的節點(根節點除外),可以約定左子樹編碼為0,右子樹編碼為1。如上圖,則可以得到 e 的編碼是 10。

  在word2vec中,約定編碼方式和上面的例子相反,即約定左子樹編碼為1,右子樹編碼為0,同時約定左子樹的權重不小於右子樹的權重。

負取樣

負取樣的思想最初來源於一種叫做Noise-Contrastive Estimation的演算法,原本是為了解決那些無法歸一化的概率模型的引數預估問題。與改造模型輸出概率的 Hierarchical Softmax 演算法不同,NCE演算法改造的是模型的似然函式

以Skip-gram模型為例,其原始的似然函式對應著一個Multinomial的分佈。在用最大似然法求解這個似然函式時,我們得到一個cross-entropy的損失函式:

式中的p(wt+j|wt)是一個在整個字典上歸一化了的概率。

而在NCE演算法中,構造了這樣一個問題:對於一組訓練樣本<context, word>,我們想知道target word的出現,是來自於context 的驅動,還是一個事先假定的背景噪聲的驅動?顯然,我們可以用一個邏輯迴歸的函式來回答這個問題:

這個式子給出了一個target word (w)來自於context驅動的概率。其中,k是一個先驗引數,表示噪聲的取樣頻率。p(w|context)是一個非歸一化的概率分佈,這裡採用softmax歸一化函式中的分子部分,pn(w)則是背景噪聲的詞分佈。通常採用word的unigram分佈。

通過對噪聲分佈的k取樣,我們得到一個新的資料集:<context, word, label>。其中,label標記了資料的來源(真實資料分佈還是背景噪聲分佈)。在這個新的資料集上,我們就可以用最大化上式中邏輯迴歸的似然函式來求解模型的引數。

Mikolov在2013年的論文《Linguistic Regularities in Continuous Space Word Representations》裡提出的負取樣演算法[8], 是NCE的一個簡化版本。在這個演算法裡,Mikolov拋棄了NCE似然函式中對噪聲分佈的依賴,直接用原始softmax函式裡的分子 定義了邏輯迴歸的函式,進一步簡化了計算:

此時,模型相應的目標函式變為:

除了這裡介紹的 層次Softma x和 負取樣 的優化演算法,Mikolov在13年的論文裡還介紹了另一個trick:下采樣(subsampling)。其基本思想是在訓練時依概率隨機丟棄掉那些高頻詞

其中,t是一個先驗引數,一般取為10^−5。f(w)表示 w在語料中出現的頻率。

實驗證明,這種下采樣技術可以顯著提高低頻詞的詞向量的準確度

實踐

可參考我之前利用Gensim來處理的搜狗實驗室釋出的語料

GitHub:https://github.com/YangCharles

參考:

Bengio, Y., Ducharme, R., Vincent, P., & Janvin, C. (2003). A neural probabilistic language model. The Journal of Machine Learning Research, 3, 1137–1155.

Mnih, A., & Kavukcuoglu, K. (2013). Learning word embeddings efficiently with noise-contrastive estimation, 2265–2273.

Mikolov, T., Yih, W., & Zweig, G. (2013). Linguistic Regularities in Continuous Space Word Representations. Hlt-Naacl.

Mikolov, T., Le, Q. V., & Sutskever, I. (2013, September 17). Exploiting Similarities among Languages for Machine Translation. arXiv.org.

相關推薦

向量Word2Vec入門Gensim實踐

在機器學習領域,語音識別和影象識別都比較容易做到。語音識別的輸入資料可以是音訊頻譜序列向量所構成的matrix,影象識別的輸入資料是畫素點向量構成的矩陣。但是文字是一種抽象的非結構化的資料,顯然不能直接把文字資料餵給機器當做輸入,因此這裡就需要對文字資料進行處理。 Word

[NLP] 秒懂向量Word2vec的本質 穆文

大家好 我叫資料探勘機 皇家布魯斯特大學肄業 我喝最烈的果粒橙,鑽最深的牛角尖 ——執著如我 今天我要揭開Word2vec的神祕面紗 直窺其本質 相信我,這絕對是你看到的 最淺白易懂的 Word2vec 中文總結 (蛤?你問我為啥有這個底氣? 且看下面,我的踩坑血淚史。。。) 2. Word2vec參考

秒懂向量Word2vec的本質

轉自我的公眾號: 『資料探勘機養成記』 1. 引子 大家好 我叫資料探勘機 皇家布魯斯特大學肄業 我喝最烈的果粒橙,鑽最深的牛角尖 ——執著如我 今天我要揭開Word2vec的神祕面紗 直窺其本質 相信我,這絕對是你看到的 最淺白易懂的 Word2vec 中文總結 (蛤?你問我為啥有這個底氣? 且看下面

機器學習(四):通俗理解支援向量機SVM程式碼實踐

[上一篇文章](https://mp.weixin.qq.com/s/cEbGM0_Lrt8elfubxSF9jg)我們介紹了使用邏輯迴歸來處理分類問題,本文我們講一個更強大的分類模型。本文依舊側重程式碼實踐,你會發現我們解決問題的手段越來越豐富,問題處理起來越來越簡單。 支援向量機(Support V

word2vec向量訓練gensim的使用

一、什麼是詞向量 詞向量最初是用one-hot represention表徵的,也就是向量中每一個元素都關聯著詞庫中的一個單詞,指定詞的向量表示為:其在向量中對應的元素設定為1,其他的元素設定為0。採

機器學習之路: python 實踐 word2vec 向量技術

fetch 分離 ext .com work bsp re.sub 最終 mat git: https://github.com/linyi0604/MachineLearning 詞向量技術 Word2Vec 每個連續詞匯片段都會對後面有一定制約 稱為上下

【python gensim使用】word2vec向量處理中文語料

word2vec介紹 word2vec官網:https://code.google.com/p/word2vec/ word2vec是google的一個開源工具,能夠根據輸入的詞的集合計算出詞與詞之間的距離。 它將term轉換成向量形式,可以把對文字內容的處理簡化為向量空間中的向量運算,計算出向

NLP課程:向量Word2Vec理論基礎相關程式碼

以下是我的學習筆記,以及總結,如有錯誤之處請不吝賜教。 詞向量: NLP的發展主要有兩個方向: 傳統方向:基於規則 現代方向:基於統計機器學習:如HMM(隱馬爾可夫)、CRF(條件隨機場)、SVM、LDA(主題模型)、CNN.. 詞向量需要保證空間中分佈的相似性:

基於python的gensim word2vec訓練向量

準備工作 當我們下載了anaconda後,可以在命令視窗通過命令 conda install gensim 安裝gensim gensim介紹 gensim是一款強大的自然語言處理工具,裡面包括N多常見模型,我們體驗一下: interfa

word2vec向量訓練中文文字相似度計算

本文是講述如何使用word2vec的基礎教程,文章比較基礎,希望對你有所幫助!官網C語言下載地址:http://word2vec.googlecode.com/svn/trunk/官網Python下載地址:http://radimrehurek.com/gensim/mod

gensim匯入word2vec向量bin檔案,出現字元編碼

首先丟擲我遇到的問題。 我訓練了一個詞向量檔案,得到了一個二進位制檔案,model.bin,然後準備呼叫gensim來測試bin檔案裡面的詞向量效果怎麼樣,於是就匯入這個模型。 import gensim # 匯入模型 model = gensim.models.Key

windows環境下使用wiki中文百科gensim工具庫訓練向量

       以前做影象演算法,面對的都是一幅影象、m*n個畫素點,對於詞向量完全沒有概念,在接觸自然語言處理一些演算法後,才知道這個概念,想必做自然語言處理的同學都訓練過詞向量。訓練詞向量的相關文章

gensimword2vec如何得出向量(python)

首先需要具備gensim包,然後需要一個語料庫用來訓練,這裡用到的是skip-gram或CBOW方法,具體細節可以去查查相關資料,這兩種方法大致上就是把意思相近的詞對映到詞空間中相近的位置。語料庫test8下載地址: 這個語料庫是從http://blog.csdn.net/m

Laravel入門實踐,快速上手社交系統ThinkSNS+二次開發

title 瀏覽器 extend 成了 migration 如果 編寫 三種 views 【摘要】自從社交系統ThinkSNS+不使用ThinkPHP框架而使用Laravel框架之後,很多人都說技術門檻擡高了,其實你與TS+的距離僅僅只是學習一個新框架而已,所以,我們今天來

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

www. 頻率 cbo homepage 算法 文章 有一個 tro 概率 閱讀目錄 1. 詞向量 2.Distributed representation詞向量表示 3.詞向量模型 4.word2vec算法思想 5.doc2vec算法思

機器不學習:word2vec是如何得到向量的?

梯度 true day loss class win dex 得到 word2vec 機器不學習 jqbxx.com -機器學習、深度學習好網站 word2vec是如何得到詞向量的?這個問題比較大。從頭開始講的話,首先有了文本語料庫,你需要對語料庫進行預處理,這個處理流

CountVectorizer,Tf-idfVectorizer和word2vec構建向量的區別

tor 兩種方法 閾值 出現 使用 方法 詞典 idfv 情感 CountVectorizer和Tf-idfVectorizer構建詞向量都是通過構建字典的方式,比如在情感分析問題中,我需要把每一個句子(評論)轉化為詞向量,這兩種方法是如何構建的呢?拿CountVector

Python Word2Vec使用訓練好的模型生成向量

https 一起 失效 com mode 密碼 pytho ID list # 文本文件必須是utf-8無bom格式 from gensim.models.deprecated.word2vec import Word2Vec model = Word2Vec.lo

自然語言處理向量模型-word2vec

技術分享 alt 自然語言 inf bsp word 學習 向量 9.png 自然語言處理與深度學習: 語言模型: N-gram模型: 自然語言處理詞向量模型-word2vec

word2vec 和 doc2vec 向量表示

ron 中心 con 線性 如果 存在 但是 標簽 word Word2Vec 詞向量的稠密表達形式(無標簽語料庫訓練) Word2vec中要到兩個重要的模型,CBOW連續詞袋模型和Skip-gram模型。兩個模型都包含三層:輸入層,投影層,輸出層。 1.Skip-Gr