word2vec (一) 簡介與訓練過程概要

因爲在組裏分享會要講word2vec,重新整理了之前凌亂的筆記,結果發現有不少新的收穫,真是所謂的溫故而知新!

詞的向量化與word2vec簡介

word2vec最初是Tomas Mikolov發表的一篇文章[1],同時開源了相應的代碼,作用是將所有詞語投影到K 維的向量空間,每個詞語都可以用一個K 維向量表示。

爲什麼要將詞用向量來表示呢?這樣可以給詞語一個數學上的表示,使之可以適用於某些算法或數學模型。通常將詞語表示成向量有如下兩種方法。

一、one-hot 表示法

假如語料庫裏一共有N 個詞,one-hot表示即是爲每個詞分配一個唯一的索引,並且將每個詞表示爲N 維的向量,在該詞索引對應的維度值爲1,其餘維度均爲0。如一共有三個詞:今天、天氣、真好,那麼三個詞的詞向量分別可以是[1,0,0],[0,1,0],[0,0,1] 。這種簡單的表示方法已經可以解決相當一部分NLP的問題,不過仍然存在不足,即詞向量與詞向量之間都是相互獨立的,我們無法通過這種詞向量得知兩個詞在語義上是否相似,並且如果N 非常大,這種高維稀疏的表示也有可能引發維度災難。爲了解決上述問題,就有了詞向量的第二種表示方法。

二、Distributed 表示法

word2vec就是通過這種方法將詞表示爲向量,即通過訓練將詞表示爲限定維度K 的實數向量,這種非稀疏表示的向量很容易求它們之間的距離(歐式、餘弦等),從而判斷詞與詞語義上的相似性。如K=3 時,我們得到的實數向量可以是[0.5,0.22,0.7] 這樣。

不過Distributed表示法並不是word2vec誕生纔有的,這種方法早在1986年Hinton就提出了[2]。word2vec之所以會產生這麼大的影響,是因爲它採用了簡化的模型,使得訓練速度大爲提升,讓word embedding這項技術(也就是詞的distributed表示)變得較爲實用。

概率語言模型

在詳細介紹word2vec的原理之前還需要簡單的提一下概率語言模型。概率語言模型就是表示語言的基本單位(通常爲句子)的概率分佈函數。有了語言模型我們可以判斷一句話是自然語言的概率,或者讓機器開口說話(根據語言模型生成一句話)。概率語言模型的數學表示如下

p(s)=p(w1,w2,...,wT)=t=1Tp(wt|context)

其中s 代表當前的sentence,w1wT 爲組成該句子的詞。context爲上下文,因此p(wt|context) 也就是在給定上下文時出現詞wt 的概率。

根據context的不同劃分方法,有可以分爲好幾種模型。如context=NULL就是上下文無關模型,也就是說我們假設每一個詞出現的概率與它的上下文均無關,這顯然是不合理的假設。常用的是n-gram語言模型,也就是假設一個詞的出現與它前面的n-1個詞有關,比如n=2的時候,context=wt1 。這裏的n不能太大,n太大要掃描語料庫統計條件概率就很困難了,通常最多爲3。其餘的模型還有n-pos模型,最大熵模型等等。

上述都是基於統計的方法,還有一些方法可以直接擬合出概率分佈函數,比如NNLM(Neural Network Language Model),log-linear等。

回到word2vec,word2vec本質上也就是可以擬合出語言模型概率分佈的一種方法。這種方法基於神經網絡,輸入爲distributed表示的詞向量,輸出爲語言模型的概率分佈。只不過我們並不關心得到的語言模型,而是保留每個詞的詞向量。

word2vec訓練過程

先介紹一下word2vec的訓練過程,目的是想說明這個算法拆解開步驟並不多,初學的時候聽說這是deep learning的應用,就感覺高深莫測,其實並不會。

STEP 1:爲了訓練出詞向量,肯定要先準備好語料,巧婦難爲無米之炊嘛。我們先將中文語料分好詞,分詞的方法有很多,這裏就不細說了。再去除一些無意義的詞,比如純數字1523523523,亂碼fasdfkalsjfwek等等,這樣得到的結果看起來會更乾淨。如果是用google開源的word2vec實現,那就將所有語料保存在一個文本里,可以所有詞用一行表示,也可以有換行符\n,google的代碼裏自動將換行符替換爲<\s>了,所以在結果詞向量裏會看到這麼一個詞,不要覺得奇怪。

STEP 2:掃描語料庫,統計每個詞出現的次數,保存在一個hash表裏。

STEP 3: 根據各詞的詞頻建立哈夫曼樹。哈夫曼樹是一棵最優二叉樹,哈夫曼樹中的每個葉子節點都有一個權值,並且所有葉子節點的權值乘上其到根節點路徑的長度的累加和最小。因此權值較大的葉子節點往往比較靠近根節點。每個詞彙最終都是哈夫曼樹的葉子節點,詞頻就是相應的權值,所有的非葉子節點代表了某一類的詞,如下圖中的Wsyn1 ,每一個Wsyn1 也是與葉子節點的詞一樣,爲K 維的向量。哈夫曼樹建立好以後,每個詞都會有一個二進制的哈夫曼編碼,用於表示從根節點到該詞彙的路徑。比如我們假設往左子節點走編碼爲0,往右爲1,下圖中紅框內的詞的哈夫曼編碼就是101

這裏寫圖片描述

STEP 4: 初始化詞向量與哈夫曼樹非葉子節點的向量。向量的維度是我們給定的參數K ,google的代碼裏將詞向量的每個維度都隨機初始化爲±0.00X ,將非葉子節點每個維度初始化爲0。word2vec最終得到的是詞向量,但並不是執行一系列複雜的運算,在最終算出一堆的詞向量,詞向量在一開始就已經存在了,整個運算過程只是不斷的迭代優化,讓被隨機初始化的詞向量在詞向量空間裏逐漸挪到屬於它自己的位置。

STEP 5:訓練,也就是迭代最優化。再回到語料庫,逐句的讀取一系列的詞,然後用梯度下降算出梯度,再更新詞向量的值、非葉子節點處向量的詞。通常神經網絡訓練過程,會指定max epoch,與early stop的patience,並且獨立保存一個驗證集,用於每一個epoch後用驗證集算一下error,然後用early stop策略來控制是否停止訓練。但是word2vec的實現更簡單粗暴,如果語料文檔讀完了,就終止,或者是每個線程遍歷過的詞數超過了一個值。
這裏寫圖片描述

word2vec用的是神經網絡模型,分爲兩種,cbow與skip-gram,每個模型的訓練方法又分別有兩種,hierarchical sofmax與negative sampling。

Reference

[1] Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient Estimation of Word Representations in Vector Space. In Proceedings of Workshop at ICLR, 2013.

[2] A. Mnih and G. Hinton. Three new graphical models for statistical language modelling. Proceedings of the 24th international conference on Machine learning,pages 641–648, 2007

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章