1. 程式人生 > >語言模型1-word2vec為什麼能訓練出相似向量

語言模型1-word2vec為什麼能訓練出相似向量

導語

由於接到一點語言模型的任務,自然也就看到了word2vec這個比較火的課題。網上的課程和材料相對都比較多,一般一開始都會說word2vec的優點能描述出單詞的相似關係,然後就是理論或者程式碼。但是都沒有解釋或者沒有清楚地解釋為什麼word2vec能為功能性差不多的單詞訓練出相似向量(當然也有可能自己看的材料不多)。不管怎麼樣,本文嘗試去解釋這個問題,由於本人才疏學淺,錯誤敬請指正。

Word2vec網上已經有了很多材料,這篇文章的重點不在此,但是為了完備和引入的方便,會簡要介紹,讀者可以先參考其他的材料。

詞向量/詞嵌入 word2Vec(word embedding)

由於計算機處理的需要,我們在處理自然語言處理的時候需要將一個單詞數字化。數字化有很多方法,比如one-hot表示

1 one-hot表示

舉個簡單例子,我們現在有兩句話,構成我們的語料庫,

1 牛在吃草。

2馬在吃草。

為了解釋方便,忽略標點符號(一般地,標點符號應該也要考慮)。那麼這裡5個字,構成我們所說的字典,這樣我們就可以為這五個字分別編碼成

牛 -> [1,0,0,0,0]

在->[0,1,0,0,0]

吃->[0,0,1,0,0]

草->[0,0,0,1,0]

馬->[0,0,0,0,1]

這樣表示的好處是簡單,好理解,缺點是:

1維度太大,一般文字需要考慮上下文資訊,用這些特徵去訓練權重的維度很大

2太稀疏,訓練難,因為某一次迭代中連線0的那部分權重無法獲得更新,訓練效果差,時間長

因為,比如y = Wx,根據梯度下降法,權重的更新大致如下面的公式,如果x等於0,那麼w無法得到更新

3牛和馬這對相近的字之間沒有什麼聯絡(從特徵的角度來說應該就是特徵不太好,影響後面的訓練。個人理解,兼聽則明)

2 直接學習(Learn low dimensionalvectors directly)

從機器學習的角度來說,一個好的詞轉向量演算法就是要找一個較低維的向量來表示一個詞。這個詞向量最好能使相似的兩個詞之前的向量也比較接近,當然,速度也是一個非常重要的因素。

一提到降維,首先就會想到PCA啊,SVD。其實之前確實有人用過SVD這類方法來做過,但是可能對於大詞庫的資料來說,維度還是很大,具體參考NLP相關的課程或者[1],本人沒有仔細研究。

另外一個分支就是這裡要說的利用機器學習,直接學習法,它的發展歷程如下

Learning representations by back-propagatingerrors.(Rumelhnrt,Hinton,Williams 1986)

A neural Probabilistic Language Model(Bengio et al.2003)

Natural Language Processing(Almost) fromScratch(Collobert et al.,2011)

Efficient Estimation of Word Representations inVector Space(Mikolov et al.2013)

GloVe: Global Vectors for WordRepresentation(Pennington et al. 2014)

這裡我們主要分析的是影響深遠的Mikolov的這篇[3],另外本篇博文受文獻[2]的啟發比較大。

2.1 定義

什麼詞算相似,一般可以認為,如果兩個詞的上下文越相似,這兩個詞也就越相似。比如牛在吃草,馬在吃草,牛和馬後面的詞都一樣。又或者是我家在北京,我家在上海,北京和上海的功能差不多,這兩個詞也就越相似,個人認為這也就是word2vec的出發點。

向量相似性,一般地,我們以向量的夾角來評價兩個向量的相似性

這樣我們就可以發現,如果有兩向量u,v

u加上s*v時(s是正標量),uv的夾角變小,因此更相似,

u減去s*v時(s是正標量),uv的夾角變大,因此相似性減弱

2.2 網路架構

文獻[3]用的是神經網路來學習詞向量,為了理解方便,我們用最簡單的架構和最原始的任務為例。現在我們的任務是根據上一個單詞來預測當前的單詞,比如上面的例子中我們有的兩句話("牛","在","吃","草")和("馬","在","吃","草"),輸入"牛"我們需要預測"在",輸入"在"需要預測“吃”。

整個架構由三部分組成,輸入層,隱藏層和輸出層。輸入層是上一個單詞(上下文)的onehot表示,維度是V(字典中所有單詞的個數),然後經過一個線性的對映W(沒有非線性的啟用函式)也就是word embeding轉換到隱藏層(詞向量)。詞向量再經過一個全連線層和一個softmax輸出的是每一個單詞的概率。

比如上面的例子中,V就是5,"牛"和"在",“馬"和"在",“在”和“吃”(2個),“吃”和"草"(2個)都構成一個訓練樣本。如果再具體些,如果假設隱藏層的維度為2,那麼整個系統架構圖就變成了下圖,W是個5*2的矩陣,U是個2*5的矩陣。另外圖中假設輸入的是單詞“牛”。

2.3  W的意義

從上面的架構中,我們可以得到

由於x採用了one hot表示,因此從上圖中可以看出,

W的第一行就是當前""word vector,

同理W的第二行就是"在"的word vector,以此類推

2.4 分析

接下來就到了我們這篇文章的核心部分,就是探討為什麼這樣的訓練方式能為功能相近的單詞訓練出相似的特徵。

這裡我們需要剖析BP的過程。我們先考慮第一個輸入樣本,也就是“牛”和“在”(當前輸入是”牛“,目標是”在“),這個時候H(h0,h1)和W的第一行都表示牛的詞向量W牛。

然後經過全連線U的前饋和softmax歸一啟用,我們可以計算五個單詞的概率(P0,p1,p2,p3,p4),當然這個概率跟我們想要的概率(0,1,0,0,0)會有差距,因此呢我們需要BP.現在假設我們已經求得了輸出誤差反饋到了sigmoid函式f輸入的誤差(這個部分對現在的分析沒有很大影響),得到e牛,e在,…,e馬。

e牛 = f'0 * (p0 - 0);//正數

e在 = f'1 * (p1 - 1);//負數

e吃 = f'2 * (p2 - 0);//正數

e草 = f'3 * (p3 - 0);//正數

e馬= f'4 * (p4 - 0);//正數

然後我們首先來看下圖這兩個權重的調整,也就是U的第一列(其實分析BP基本不需要去列很多公式,只需要記住雖然前饋是非線性的,但是反饋是線性的,資料流從哪裡流出去,反饋誤差就從哪裡流回來),我們用uij表示u的第i行第j列元素。併為了表示方便,在這個例子中我們用U牛來表示U的第一列,U在表示U的第二列,以此類推

因為我們要預測的是"在",所以根據普通的梯度下降法,得到

u00 -= alpha * e牛 * h0

u10 -= alpha * e牛 * h1

其中apha是學習率

用向量來表示就是

U牛-= alpha * e牛* H

由於e牛是正數,根據之前2.1節相似性的分析,所以這個迭代的結果就是使得U牛遠離H,又由於當前的H就是"牛”的當前詞向量W牛,也就是說U牛與W牛越來越不相似

同理可以得到U的第三列,第四列,第五列都是同樣的情況

但是唯一不同的是U的第二列,也是是U在,由於e在是正的,所以U在會跟W牛相似

所以這次的結果就是

U牛遠離 W牛

U在 拉近  W牛

U吃 遠離 W牛

U草 遠離 W牛

U馬 遠離 W牛

然後我們先不按照一般的BP去分析H和W的迭代,我們繼續分析(“馬”,“在”)這個訓練樣本對U的影響,根據上面的分析我們會得到

U牛遠離 W馬

U在 拉近  W馬

U吃 遠離 W馬

U草 遠離 W馬

U馬 遠離 W馬

繼續分析(“在”,“吃”)這個樣本

U牛遠離 W在

U在 遠離  W在

U吃 拉近 W在

U草 遠離 W在

U馬 遠離 W在

分析到這,應該就有點眉目了,原來U儲存的是對應“在”的上下文的資訊,會偏向其上下文出現的詞向量,而與不是上下文的詞向量相差比較大,這是我們得到的非常重要的觀察。

當然我們的最終目的是要分析詞向量W,因此我們按照BP的過程繼續分析H

如果對BP非常瞭解,下面結果一目瞭然,H的更新公式為

H -= alpha * U牛 * e牛 +

       alpha * U在 * e在  +

       alpha * U吃 * e吃  +

       alpha * U草 * e草  +

       alpha * U馬 * e馬  

比如我們在訓練樣本("牛","在")的時候,H就是當前的W牛,也就是

W牛 -= alpha * U牛 * e牛 +//負數

          alpha * U在 * e在  +//正數

          alpha * U吃 * e吃 +//負數

         alpha * U草 * e草 +//負數

         alpha * U馬 * e馬//負數

由於只有e在是負數,W牛會拉近U在,而U在裡面會包含“在”的上下文資訊,會偏向W牛和W馬,而其他的四個會偏向他們對應的上下文單詞,所以結果就是W牛會偏向W牛和W馬,同理在訓練("馬","在")的時候W馬也會偏向W牛和W馬,最後經過多次訓練,達到一個平衡,W牛和W馬會比較相似

參考文獻

[1]http://www.mamicode.com/info-detail-859790.html

[2]Rong X. word2vec parameter learning explained[J].arXiv preprint arXiv:1411.2738, 2014.

[3]

Mikolov T, Chen K, Corrado G, et al. Efficientestimation of word representations in vector space[J]. arXiv preprintarXiv:1301.3781, 2013.

相關推薦

語言模型1-word2vec為什麼訓練相似向量

導語 由於接到一點語言模型的任務,自然也就看到了word2vec這個比較火的課題。網上的課程和材料相對都比較多,一般一開始都會說word2vec的優點能描述出單詞的相似關係,然後就是理論或者程式碼。但是都沒有解釋或者沒有清楚地解釋為什麼word2vec能為功能性差不多的單詞

深度學習語言模型(3)-word2vec負取樣(Negative Sampling) 模型(keras版本)

目錄: 深度學習語言模型(1)-word2vec的發展歷程 深度學習語言模型(2)-詞向量,神經概率網路模型(keras版本) 深度學習語言模型(3)-word2vec負取樣(Negative Sampling) 模型(keras版本) 程式碼參考了:https://spaces.a

在Keras模型中使用預訓練的詞向量

轉自:wuwt.me/2017/08/21/pre-trained-embedding-keras/ “詞向量”(詞嵌入)是將一類詞的語義對映到向量空間中的自然語言處理技術。即將一個詞用特定的向量來表示,向量之間的距離(例如,任意兩個向量之間的L2正規化距離或更常用的餘

【Language model】使用RNN LSTM訓練語言模型45°角仰望星空的文章

開篇 這篇文章主要是實戰內容,不涉及一些原理介紹,原理介紹為大家提供一些比較好的連結:   1. Understanding LSTM Networks : RNN與LSTM最為著名的文章,貼圖和內容都恰到好處,為研究人員提供很好的參考價值。 中文漢化版:(譯

深度學習課程之文字預處理、詞袋模型word2vec語言模型1.9)

詞向量和語言模型 深度學習其實最成功的應用是在影象上,有了 CNN 可以很好地提取影象上的特徵,這些特徵經過幾層的神經網路結構可以很好地組合成比較抽象的特徵。 NLP 常見任務 自動摘要:媒體需要的頭條通過 NLP 自動提取 機器翻譯 主題識別 文字分類

Word2Vec-語言模型的前世今生

ace 分析 相關性 語音 集中 媒體 任務 統計語言模型 pascal 引言 在機器學習領域,語言識別和圖像識別都比較容易做到。語音識別的輸入數據可以是音頻頻譜序列向量所構成的matrix,圖像識別的輸入數據是像素點向量構成的矩陣。但是文本是一種抽象的東西,顯然不能直接

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

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

Oracle12c(12.1)中性優化&功能增強之通過參數THREADED_EXECTION使用多線程模型

lgwr rod dbrm nbsp leg 功能 altered denied partition 1. 後臺 UNIX/Linux系統上,oracle用多進程模型。例如:linux上一個常規安裝的數據庫會有如下進程列: $ ps -ef | grep [o

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

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

自然語言處理中的語言模型訓練方法

16px 預測 網絡語言 緩解 lang 大數 一中 標準 小數 自然語言處理中的語言模型預訓練方法 最近,在自然語言處理(NLP)領域中,使用語言模型預訓練方法在多項NLP任務上都獲得了不錯的提升,廣泛受到了各界的關註。就此,我將最近看的一些相關論文進行總結,選取了幾

語音識別系統語言模型訓練和聲學模型的改進

10個 ext 個數 靜音 介紹 準備 上下 詞匯表 數據 一、訓練語言模型 詞與詞之間存在著合乎句法與否的約束,語言模型就是用來表示這些約束的,它可以提供字與字之間的上下文信息和語義信息。N-gram模型,即對訓練音頻文件所對應的文本文件進行統計,提取不同字

為什麼使用神經網路訓練得到的語言模型不需要做資料平滑

我們都知道,在自然語言處理的語言模型裡面,最核心的就是計算得到一個句子的概率,為了得到這個概率,我們需要計算得到一系列的條件概率。這些條件概率就是整個語言模型的引數。 為了得到條件概率,我們可以有兩種不同的方法。 第一種就是使用統計概率方法,通過統計的方法得到不同的詞對的條件概率。這種方

文字分類——怎麼評價訓練的分類模型

模型的評價就是對模型的準確性和覆蓋性的評價。 1. 當然最保險的方法是抽取大量預測例項,進行人工校對。原因是第1實際應用中沒有太多的標註測試集可用。第2當預測的例項類別分佈不均衡時,很可能導

Bert-一種基於深度雙向Transform的語言模型訓練策略

今天的部落格主要參考了論文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》。這篇paper是Google公司下幾個研究員發表的,而且在NLP領域引起了很大的轟動(在多個NLP任

gluon訓練模型轉成mx.mode.Module可用的symbol

6. 儲存成Symbol格式的網路和引數(重點) 要注意儲存網路引數的時候,需要net.collect_params().save()這樣儲存,而不是net.save_params()儲存最新版的mxnet已經有可以匯出到symbol格式下的介面了。需要mxnet版本在20171015以上下面示例

NLP中語言模型訓練方法

最近,在自然語言處理(NLP)領域中,使用語言模型預訓練方法在多項NLP任務上都獲得了不錯的提升,廣泛受到了各界的關注。就此,我將最近看的一些相關論文進行總結,選取了幾個代表性模型(包括ELMo [1],OpenAI GPT [2]和BERT [3])和大家一起學習分享。

語言模型訓練工具SRILM

                     SRILM是著名的約翰霍普金斯夏季研討會(Johns Hopkins Summer Workshop)的產物,誕生於1995年,由SRI實驗室的Andreas Stolcke負責開發維護。  關於SRILM的安裝,我已經在前面關於moses平臺搭建的文章(參見:《Mo

【c語言】(迴圈)找1到10000的完全數

題目: 找出1到10000中的完全數 完全數:完全數的所有因數之和等於其本身(1不是完全數) --------如:(6 = 1 + 2 + 3) 思路分析: 找出一個數的全部因數 判斷因數之和是否等於本身 程式碼實現: #include<stdio

C語言1——100內不被3整除的數輸出

#include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or

C語言作業1-順序選擇結構設計-3三個數比較最大值

C語言作業1-順序選擇結構設計-3三個數比較出最大值 問題描述: 輸入並執行下面程式: 三個整數a,b,c,由鍵盤輸入這三個數,求三個數中最大的值。 程式碼實現: #include<stdio.h> #include<stdlib.h> int mai