1. 程式人生 > >word2vec 原理

word2vec 原理

轉自:http://www.cnblogs.com/iloveai/p/word2vec.html



SVD分解:低維詞向量的間接學習

既然基於co-occurrence矩陣得到的離散詞向量存在著高維和稀疏性的問題,一個自然而然的解決思路是對原始詞向量進行降維,從而得到一個稠密的連續詞向量。

第一個出場的對原始矩陣進行降維的方法是奇異值分解(SVD)。SVD的基本思想是,通過將原co-occurrence矩陣XX分解為一個正交矩陣UU,一個對角矩陣SS,和另一個正交矩陣VV乘積的形式,並提取UUkk個主成分(按S裡對角元的大小排序)構造低維詞向量。(關於SVD更多的介紹可以參考這篇部落格:機器學習中的數學(5)-強大的矩陣奇異值分解(SVD)及其應用

除此之外,在對原始矩陣XX的處理上,還有很多簡單但很好用的Hacks。比如對原始矩陣中高頻詞的降頻處理;帶權重的統計視窗(距離越近的詞對詞義的貢獻越大);用Pearson相關性係數替代簡單的詞頻統計等。包括我們後面要學習到的word2vec模型,也屬於這一類Hacks。

即便是簡單的對co-occurrence矩陣進行SVD分解得到的稠密詞向量,也具有很多優美的性質。語義相近的詞(比如"wrist"和"ankle")可以通過用詞向量內積定義的相似度聚類到一起;同一動詞的不同時態也往往出現在向量空間的同一片區域。詞向量甚至可以一定程度上反應word之間的線性聯絡。

然而,高昂的計算複雜度(O(mn

2))是SVD演算法的效能瓶頸。這對於現在動輒上百萬甚至上億資料量的語料庫而言,是一筆巨大的計算開銷。更不用說每一個新詞的加入都需要在一個新的矩陣上重新執行一遍SVD分解。此外,後面我們會看到,SVD演算法和其他Deep Learning模型本質上是屬於兩類不同的學習演算法。

儘管SVD分解存在著這樣或那樣的問題,但是其將word表示為一個稠密的低維連續向量的思想,成為了包括Deep NLP在內的眾多NLP模型的基礎。

From now on, every word will be a dense vector.


對機器學習有一定基礎的同學會發現,這裡的條件概率其實是一個Softmax分類函式,而目標函式對應著這個分類函式的交叉熵。

優化這個目標函式的演算法是SGD——隨機梯度下降法。為此,我們要求解這個目標函式的一階導數。

首先,我們引入兩個重要的求導法則:



word2vec前世今生

2013年,Google開源了一款用於詞向量計算的工具——word2vec,引起了工業界和學術界的關注。首先,word2vec可以在百萬數量級的詞典和上億的資料集上進行高效地訓練;其次,該工具得到的訓練結果——詞向量(word embedding),可以很好地度量詞與詞之間的相似性。隨著深度學習(Deep Learning)在自然語言處理中應用的普及,很多人誤以為word2vec是一種深度學習演算法。其實word2vec演算法的背後是一個淺層神經網路。另外需要強調的一點是,word2vec是一個計算word vector的開源工具。當我們在說word2vec演算法或模型的時候,其實指的是其背後用於計算word vector的CBoW模型和Skip-gram模型。很多人以為word2vec指的是一個演算法或模型,這也是一種謬誤。接下來,本文將從統計語言模型出發,儘可能詳細地介紹word2vec工具背後的演算法模型的來龍去脈。


Distributed Representation

不過,Ngram模型仍有其侷限性。首先,由於引數空間的爆炸式增長,它無法處理更長程的context(N>3)。其次,它沒有考慮詞與詞之間內在的聯絡性。例如,考慮"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模型做不到。

這是因為,Ngram本質上是將詞當做一個個孤立的原子單元(atomic unit)去處理的。這種處理方式對應到數學上的形式是一個個離散的one-hot向量(除了一個詞典索引的下標對應的方向上是11,其餘方向上都是0)。例如,對於一個大小為55的詞典:{"I", "love", "nature", "luaguage", "processing"},“nature”對應的one-hot向量為:[0,0,1,0,0]。顯然,one-hot向量的維度等於詞典的大小。這在動輒上萬甚至百萬詞典的實際應用中,面臨著巨大的維度災難問題(the curse of dimensionality)

於是,人們就自然而然地想到,能否用一個連續的稠密向量去刻畫一個word的特徵呢?這樣,我們不僅可以直接刻畫詞與詞之間的相似度,還可以建立一個從向量到概率的平滑函式模型,使得相似的詞向量可以對映到相近的概率空間上。這個稠密連續向量也被稱為word的distributed representation[3]。

事實上,這個概念在資訊檢索(Information Retrieval)領域早就已經被廣泛地使用了。只不過,在IR領域裡,這個概念被稱為向量空間模型(Vector Space Model,以下簡稱VSM)。

VSM是基於一種Statistical Semantics Hypothesis[4]:語言的統計特徵隱藏著語義的資訊(Statistical pattern of human word usage can be used to figure out what people mean)。例如,兩篇具有相似詞分佈的文件可以被認為是有著相近的主題。這個Hypothesis有很多衍生版本。其中,比較廣為人知的兩個版本是Bag of Words Hypothesis和Distributional Hypothesis。前者是說,一篇文件的詞頻(而不是詞序)代表了文件的主題;後者是說,上下文環境相似的兩個詞有著相近的語義。後面我們會看到,word2vec演算法也是基於Distributional的假設。

那麼,VSM是如何將稀疏離散的one-hot詞向量對映為稠密連續的distributional representation的呢?

簡單來說,基於Bag of Words Hypothesis,我們可以構造一個term-document矩陣A矩陣的行Ai,:對應著詞典裡的一個word;矩陣的列A:,j對應著訓練語料裡的一篇文件;矩陣裡的元素Aij代表著word wi在文件Dj中出現的次數(或頻率)。那麼,我們就可以提取行向量做為word的語義向量(不過,在實際應用中,我們更多的是用列向量做為文件的主題向量)。

類似地,我們可以基於Distributional Hypothesis構造一個word-context的矩陣。此時,矩陣的列變成了context裡的word,矩陣的元素也變成了一個context窗口裡word的共現次數。

注意,這兩類矩陣的行向量所計算的相似度有著細微的差異:term-document矩陣會給經常出現在同一篇document裡的兩個word賦予更高的相似度;而word-context矩陣會給那些有著相同context的兩個word賦予更高的相似度。後者相對於前者是一種更高階的相似度,因此在傳統的資訊檢索領域中得到了更加廣泛的應用。

不過,這種co-occurrence矩陣仍然存在著資料稀疏性和維度災難的問題。為此,人們提出了一系列對矩陣進行降維的方法(如LSI/LSA等)。這些方法大都是基於SVD的思想,將原始的稀疏矩陣分解為兩個低秩矩陣乘積的形式。

關於VSM更多的介紹,可以進一步閱讀文末的參考文獻[4]。

Neural Network Language Model

接下來,讓我們回到對統計語言模型的討論。鑑於Ngram等模型的不足,2003年,Bengio等人發表了一篇開創性的文章:A neural probabilistic language model[3]。在這篇文章裡,他們總結出了一套用神經網路建立統計語言模型的框架(Neural Network Language Model,以下簡稱NNLM),並首次提出了word embedding的概念(雖然沒有叫這個名字),從而奠定了包括word2vec在內後續研究word representation learning的基礎。

NNLM模型的基本思想可以概括如下:

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

值得注意的一點是,這裡的詞向量也是要學習的引數。

在03年的論文裡,Bengio等人採用了一個簡單的前向反饋神經網路f(wtn+1,...,wt)來擬合一個詞序列的條件概率p(wt|w1,w2,...,wt1)。整個模型的網路結構見下圖:

the neural network language model

我們可以將整個模型拆分成兩部分加以理解:

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

    相關推薦

    word2vec原理(三) 基於Negative Sampling的模型

    轉自http://www.cnblogs.com/pinard/p/7249903.html   在上一篇中我們講到了基於Hierarchical Softmax的word2vec模型,本文我們我們再來看看另一種求解word2vec模型的方法:Negative Sampling。

    word2vec原理(二) 基於Hierarchical Softmax的模型

    轉自http://www.cnblogs.com/pinard/p/7243513.html  在word2vec原理(一) CBOW與Skip-Gram模型基礎中,我們講到了使用神經網路的方法來得到詞向量語言模型的原理和一些問題,現在我們開始關注word2vec的語言模型如何改進傳統的神經網路

    (六) word2vec原理

    Word2Vec 的有兩種訓練模型:CBOW (Continuous Bag-of-Words Model) 和 Skip-gram (Continuous Skip-gram Model)。 1、步驟(以CBOW為例) (1)處理語料庫:把語料庫劃分成一連串的單詞,把這些一連串

    word2vec原理(一) CBOW與Skip-Gram模型基礎

    word2vec是google在2013年推出的一個NLP工具,它的特點是將所有的詞向量化,這樣詞與詞之間就可以定量的去度量他們之間的關係,挖掘詞之間的聯絡。雖然原始碼是開源的,但是谷歌的程式碼庫國內無法訪問,因此本文的講解word2vec原理以Github上的wor

    Word2vec原理與應用

    用一個普通的向量表示一個詞,將所有這些向量放在一起形成一個詞向量空間,而每一向量則為該空間中的一個點,在這個空間上的詞向量之間的距離度量也可以表示對應的兩個詞之間的“距離”。所謂兩個詞之間的“距離”,就是這兩個詞之間的語法,語義之間的相似性。 只介紹基於Hie

    Word2Vec原理詳解

    寫在前面 為了更方便讀者學習,筆者下載了word2vec原始碼共享在雲盤(google官網有時會訪問不了),地址。 還有關於word2vec實戰的 地址 下面是轉載內容: word2vec 是 Google 於 2013 年開源推出的一個用於獲取 wo

    Word2vec 原理公式推到和程式碼實現

    本文摘錄整編了一些理論介紹,推導了word2vec中的數學原理;並考察了一些常見的word2vec實現,評測其準確率等效能,最後分析了word2vec原版C程式碼;針對沒有好用的Java實現的現狀,移植了原版C程式到Java。時間和水平有限,本文沒有就其發展歷史展開多談,只

    Word2vec 原理解析

    Word2vec 背景知識Word2vec 的兩種模型 cbow 和 skip-gram 兩種學習框架 Hierarchical Softmax 和 Negative Samping 的原理分析Word2vec 的拓展與應用一場場看太麻煩?訂閱GitChat體驗卡,暢享300

    自然語言處理之word2vec原理詞向量生成

    前言 word2vec是如何得到詞向量的?這個問題比較大。從頭開始講的話,首先有了文字語料庫,你需要對語料庫進行預處理,這個處理流程與你的語料庫種類以及個人目的有關,比如,如果是英文語料庫你可能需要大小寫轉換檢查拼寫錯誤等操作,如果是中文日語語料庫你需

    word2vec 原理

    轉自:http://www.cnblogs.com/iloveai/p/word2vec.htmlSVD分解:低維詞向量的間接學習既然基於co-occurrence矩陣得到的離散詞向量存在著高維和稀疏性的問題,一個自然而然的解決思路是對原始詞向量進行降維,從而得到一個稠密的連

    Word2Vec原理推導

    本文摘錄整編了一些理論介紹,推導了word2vec中的數學原理;並考察了一些常見的word2vec實現,評測其準確率等效能,最後分析了word2vec原版C程式碼;針對沒有好用的Java實現的現狀,移植了原版C程式到Java。時間和水平有限,本文沒有就其發展歷史展開多談,

    Word2Vec原理分析

    目錄 六、總結 CBOW: glove 一、Doc2vec 可以直接將Sentence/Document中所有詞的向量取均值作為Sentence/Document的向量表示,但是這樣會忽略了單詞之間的排列順序對

    [NLP]word2vec原理

    Hierarchical SoftmaxCbow:    原理:用中心詞作為預測的值(輸出),輸出可看做一個點,和其他點(詞語)做區分,共同構成了一個霍夫曼樹,要求Xw經過層次softmax函式,達到輸出預測值概率最大。    用周圍的詞做輸入,通過查表的形式,將原輸入的on

    Word2Vec原理及代碼

    path 神經元 容易 num pyplot -h 改變 exist 除了 一、分布式詞表示(Distributed Represantation)   Word2Vec 是 Google 於 2013 年開源推出的一個用於獲取 word vector 的工具包,具

    word2vec 中的數學原理二 預備知識 霍夫曼樹

    append 哈夫曼編碼 har html ant 世界 word2vec tree plus 主要參考: word2vec 中的數學原理詳解 自己動手寫 word2vec 編碼的話,根是不記錄在編碼中的 這一篇主要講的就是

    word2vec 中的數學原理三 背景知識 語言模型

    tps 詳解 art 技術 nbsp log 分享圖片 word2vec 自己 主要參考: word2vec 中的數學原理詳解 自己動手寫 word2vec word2vec 中的數學原理三 背景知識 語言模型

    文字轉詞向量原理Word2Vec

    文字轉詞向量原理Word2Vec Word2Vec 的訓練模型,是具有一個隱含層的神經元網路 它的輸入是詞彙表向量,當看到一個訓練樣本時,對於樣本中的每一個詞,就把相應的在詞彙表中出現的位置的值置為1,否則置為0。它的輸出也是詞彙表向量,對於訓練樣本的標籤中的每一個詞,就把相應的在詞彙表

    word2vec中關於霍夫曼樹的應用原理

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    (一)理解word2vec原理

    為什麼想起來學習word2vec呢?其實之前自己根本沒有接觸過NLP的知識和任務,只是最近嘗試使用了embedding的方法去處理類別特徵和用embedding去做推薦,發現有不錯的效果。同時,自己也感觸到了所掌握知識的匱乏,因此,決定好好學習一下word2vec。 最近幾天自己研讀了網

    word2vec 中的數學原理詳解

       word2vec 是 Google 於 2013 年開源推出的一個用於獲取 word vector 的工具包,它簡單、高效,因此引起了很多人的關注。由於 word2vec 的作者 Tomas Mikolov 在兩篇相關的論文 [3,4] 中並沒有談及太多演算法細節,因而