word2vec學習總結

1.簡介

word2vec是Google於2013年推出的開源的獲取詞向量word2vec的工具包。它包括了一組用於word embedding的模型,這些模型一般都是用淺層(兩層)神經網絡訓練詞向量。git

Word2vec的模型以大規模語料庫做爲輸入,經過神經網絡訓練到一個向量空間(一般爲幾百維)。詞典中的每一個詞都對應了向量空間中的一個獨一的向量,並且語料庫中擁有共同上下文的詞映射到向量空間中的距離會更近,而且其他弦類似度較高。github

在學習word2vec的過程當中深受[4],[6]兩篇文章啓發,其中的背景信息也借鑑了這些文章。而且學習序列生成模型中也從復旦邱錫鵬老師的《神經網絡與深度學習》一書[8]中受益不淺。算法

2.從統計語言模型開始

在機器學習中,統計語言模型(Statistic Language Model)做爲天然語言處理的主要方法,也是很重要的一環。網絡

在認知心理學中,有一個經典的實驗,當一我的看到下面兩個句子機器學習

麪包上塗黃油
麪包上塗襪子函數

後一個句子在人腦的語義整合時須要更多處理時間,更不符合天然語言規則。從統計的角度來看,這些語言規則能夠看做時一種機率分佈,而對於以上的兩個句子,明顯後面的句子發生的機率更小。
一個長度爲\(T\)的文本序列看做一個隨機事件\(X_{(1:T)} = ⟨X_1, · · · ,X_T ⟩\),其中每一個位置上的變量\(X_t\) 的樣本空間爲一個給定的詞表(vocabulary)\(V\),整個序列\(x_{1:T}\) 的樣本空間爲\(|V|^T\)
即,給定一個序列樣本給定一個序列樣本\(x_{1:T} = x_1, x_2, · · · , x_T\) ,其機率能夠看出是\(T\)個詞的聯合機率。工具

\[ P(X_{1:T} = x_{1_T}) = P(X_1 = x_1, X_2 = x_2, ... , X_T = x_T) = p(x_{1:T}). \]性能

2.1序列機率模型

序列數據有兩個特色:(1)樣本是變長的;(2)樣本空間爲很是大。對於一個長度爲\(T\) 的序列,其樣本空間爲\(|V|^T\) 。所以,咱們很難用已知的機率模型來直接建模整個序列的機率。學習

根據機率的乘法公式,序列\(x_{1:T}\) 的機率能夠寫爲

\[ p(x_{1:T}) = p(x_1)p(x_2|x_1)p(x_3|x_2) \cdots p(x_T|x_{1:(T-1)}) \\ = \prod^T_{t=1} p(x_t|x_{1:(t-1)}) \]

其中\(x_t ∈ V, t ∈ {1, · · · , T}\)爲詞表\(V\) 中的一個詞,\(p(x_1|x_0) = p(x_1)\)

所以,序列數據的機率密度估計問題能夠轉換爲單變量的條件機率估計問題,即給定\(x_{1:(t−1)}\)\(x_t\) 的條件機率\(p(x_t|x_{1:(t−1)})\)

給定\(N\) 個序列數據\(\{x^{(n)}_{1:T_n}\}^N _{n=1}\),序列機率模型須要學習一個模型\(p_θ( {\mathbf x}|x_{1:(t−1)})\)來最大化整個數據集的對數似然函數。

\[ {\mathop {max}_{\theta}} \sum^N_{n=1}log\ p_\theta(x^{(n)}_{1:T_n}) = {\mathop {max}_{\theta}}\sum^N_{n=1}\sum^T_{t=1}log\ p (x_t^{(n)}|x1^{(n)}_{1:(t-1)}). \]

2.2 N元統計模型

因爲數據稀疏問題,當\(t\)比較大時,依然很難估計條件機率\(p(x_t|x_{1:(t−1)})\)。一個簡化的方法是\(N\)元模型(N-Gram Model),假設每一個詞\(x_t\) 只依賴於其前面的
\(n − 1\) 個詞(\(n\)階馬爾可夫性質),即

\[ p(x_t|x_{1:(t-1)}) = p(x_t|x_{(t-n+1):(t-1)}). \]

\(n = 1\)時,稱爲一元(unigram)模型;當\(n = 2\)時,稱爲二元(bigram)模型,以此類推。

一元模型:在一元模型中,\(n=1\),即序列\(x_{1:T}\)每個詞與其餘詞獨立,即與它的上下文無關。即每一個詞都是從多項機率分佈中得到的,其對數似然函數爲:

\[ log\prod^{N'}_{n=1}p(x_{1:T_n}^{(n)};\theta) = log \prod^{|V|}_{k=1}\theta^{m_k}_k \\ = \sum ^{|V|}_{k=1}m_k\ log\theta_k \]

其中,經過必定的公式證實,能夠得出最大似然估計等價於頻率估計。

N元模型:與一元模型同理,當前詞只依賴於前\(n-1\)個詞,知足\(n\)階馬爾可夫性質。經過最大似然函數可得:

\[ p(x_t|x_{(t-n+1):(t-1)}) = \frac {m(x_{(t-n+1):t})} {m(x_{(t-n+1):t-1})} \]
其中\({m(x_{(t-n+1):t})}\)\(x_{(t-n+1):t}\)在數據集上出現的次數。

平滑技術

考慮到如下兩個問題

  1. 若一個詞\(w\)在當前語料庫(訓練集)中出現的次數爲\(0\),是否能夠認爲當前詞在語言序列中出現的機率爲\(0\)
  2. 若一個詞\(w1\)與另外一個詞\(w2\)在語料庫中出現的次數相同,是否能夠人爲該兩個詞在必定序列中出現的機率即\(p(w_k|w_1^{k-1})\)等於1?

固然以上兩個問題顯然是不能的,哪怕當前的訓練集多大,都沒法避免的出現某些詞有着以上的兩種問題,所以,平滑化技術就是用於處理以上兩個問題。

3.深度序列模型

深度序列模型是指利用神經網絡模型來估計\(p_\theta(x_t|x_{1:(t-1)})\)

3.1神經機率模型

神經機率模型是由Bengio等人在文《A neural probabilistic language model. Journal of Machine Learning Research》(2003)中提出。該模型使用了一個重要的工具——詞向量。
神經語言機率模型通常能夠分紅三個部分:嵌入層、特徵層、輸出層。

3.1.1嵌入層

\(h_t = x_{1:(t−1)}\) 表示輸入的歷史信息,通常爲符號序列。因爲神經網絡模型通常要求輸入形式爲實數向量,所以爲了可以使得神經網絡模型能處理符號數據,須要將這些符號轉換爲向量形式。一種簡單的轉換方法是經過一個嵌入表(Embedding Lookup Table)來將每一個符號直接映射成向量表示。嵌入表也稱爲嵌入矩陣或查詢表。

3.1.2特徵層

特徵層用於從輸入向量序列\(e_1, · · · , e_{t−1}\) 中提取特徵,輸出爲一個能夠表示歷史信息的向量\(h_t\)。簡單而言是經過訓練數據選取詞向量輸入到神經網絡中進行計算。

特徵層能夠經過不一樣類型的神經網絡來實現,好比前饋神經網絡和循環神經網絡。常見的網絡類型有如下三種:

  1. 簡單平均。
  2. 前饋神經網絡。
  3. 循環神經網絡。

3.1.3輸出層

輸出層爲通常使用softmax 分類器,接受歷史信息的向量表示\(h_t ∈ R^{d2}\),輸出爲詞表中每一個詞的後驗機率,輸出大小爲\(|V|\)。簡而言之就是一般神經網絡中的softmax,最後輸出機率分佈,而後能夠進行loss的計算。

3.2 one-hot向量表示法

在谷歌提出word2vec模型以前,在語言神經網絡模型中一般使用的是one-hot向量,即對於一個長度爲10000的單詞語料庫,使用one-hot向量表示的話,單個單詞能夠表示爲10000*1的向量,若當前詞處於語料庫的第4096個位置,則當前單詞的one-hot向量是在第4096位置爲1,其他位置爲0的10000*1的向量。

這種詞向量表示方法的優勢是簡便,便於直接使用,由於文字沒法之間在數學計算中使用,所以經過一種向量表示法,能夠將其放入語言計算模型中使用。
但缺點很明顯,這種詞向量僅僅只能表示當前詞在語料庫中的位置,僅能表示其身份信息,而沒法表示兩個向量之間的關聯信息。

所以須要用到一種可以表示兩個詞之間相關信息的向量表示法。

3.3 word2vec

word2vec又可稱爲word embedding,即詞嵌入,由於不管是word2vec仍是one-hot,這兩種詞的表示方法都是在神經機率模型中的嵌入層使用,做爲神經網絡模型可以處理的符號數據使用。

word2vec的表示形式與one-hot不一樣,每個詞在word2vec中一樣是一個向量,但該向量的長度不固定,即非語料庫的長度,該長度m可有算法的使用者而定,而向量的每一個維度也並不是直接使用0或1這種簡單的方式表示,通常是任意的實數。由此表示形式,能夠得出,這種詞的表示方法既能夠表示當前詞的身份信息(即區別於其餘詞),又能夠計算當前詞與其餘詞之間的語義上的關係。

咱們能夠思考一下這種詞之間的語義關聯性。首先,對於每個詞而言,因其是多維向量,所以能夠映射到高維空間中。其次,在映射到高維空間後,能夠聯繫向量之間的關係,經過計算兩個向量之間的餘弦值而得出兩個向量之間的關聯程度。更甚之,能夠經過詞向量之間的加減,計算出其餘詞。

對於如何獲取詞向量而言,對於神經機率模型中,詞向量(word embedding)即爲神經網絡中的參數,因其做爲嵌入層的參數,輸入形式爲實數向量。所以獲取word embedding,便是神經網絡中的參數的學習。

這種訓練經過給定一個訓練序列數據集,而神經網絡模型的訓練目標則是爲找到一組參數\(\theta\),使得對數似然函數最大。其中\(\theta\)表示網絡中的全部參數,包括嵌入矩陣M以及神經網絡的權重和偏置。
而該嵌入矩陣即爲詞向量的矩陣,其大小爲\(M\times N\)\(N\)爲語料庫詞的數量,M爲給定的詞向量的長度。

3.3.1 word2vec訓練的神經網絡模型

在google於2013年所提出的兩篇文章[2]與[3]中,使用了兩種重要的模型——CBOW模型與Skip-Gram模型。

跳字模型(Skip-gram)

由論文中所給出的圖,能夠形象地得知對於skip-gram模型而言,是由當前的詞生成周圍的詞的一種神經機率模型,在這些模型討論中,通常將詞分爲兩種(最後訓練出來的詞向量也分爲這兩種),一種是做爲中心詞,另外一種則是做爲背景詞。
這種假設方式在skip-gram模型中能夠很明確的看出,由中心詞(圖中爲\(w(t)\))通過神經機率模型生成周圍的詞\((w(t-2), w(t-1), w(t+1), w(t+2))\),在這之中,生成周圍的詞有先後各兩個,相應的,把這個生成背景詞範圍的大小叫作背景詞窗口,圖中的背景詞窗口爲2。

在以上模型中,咱們不妨將中心詞的詞向量設爲\(v_c\),而背景詞可認爲是\(u_o\)。在skip-gram模型中,輸入層獲取到當前做爲中心詞的向量,並在預測層與模型參數(實爲背景詞的詞向量)作乘積計算,最後在輸出層作一個softmax的運算輸出生成背景詞的一個機率分佈。

設中心詞\(w_c\)在詞典中索引爲\(c\),背景詞\(w_o\)在詞典中索引爲\(o\),給定中心詞生成背景詞的條件機率能夠經過對向量內積作softmax運算而獲得:

\[ P(w_o \mid w_c) = \frac{\text{exp}(\boldsymbol{u}_o^\top \boldsymbol{v}_c)}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}. \]

其中詞典索引集\(\mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\}\)。假設給定一個長度爲\(T\)的文本序列,設時間步\(t\)的詞爲\(w^{(t)}\)。假設給定中心詞的狀況下背景詞的生成相互獨立,當背景窗口大小爲\(m\)時,跳字模型的似然函數即給定任一中心詞生成全部背景詞的機率

\[ \prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(w^{(t+j)} \mid w^{(t)}) \]

訓練跳字模型

在上文中已經提到整個跳字模型從輸入層到輸出層的一個計算,那麼對於這個神經網絡,使用反向傳播即可以對整個模型與詞向量作一個訓練。而在3.1.3小節及以後的討論中提到,訓練中是經過最大化似然函數來學習模型參數,即最大似然估計。由上文的推導即分析,能夠得出loss爲:

\[ - \sum_{t=1}^{T} \sum_{-m \leq j \leq m,\ j \neq 0} \text{log}\, P(w^{(t+j)} \mid w^{(t)}).\]

若是使用隨機梯度降低,那麼在每一次迭代裏咱們隨機採樣一個較短的子序列來計算有關該子序列的損失,而後計算梯度來更新模型參數。梯度計算的關鍵是條件機率的對數有關中心詞向量和背景詞向量的梯度。根據定義,首先看到

\[\log P(w_o \mid w_c) = \boldsymbol{u}_o^\top \boldsymbol{v}_c - \log\left(\sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)\right)\]

經過微分,咱們能夠獲得上式中\(\boldsymbol{v}_c\)的梯度

\[ \begin{aligned} \frac{\partial \text{log}\, P(w_o \mid w_c)}{\partial \boldsymbol{v}_c} &= \boldsymbol{u}_o - \frac{\sum_{j \in \mathcal{V}} \exp(\boldsymbol{u}_j^\top \boldsymbol{v}_c)\boldsymbol{u}_j}{\sum_{i \in \mathcal{V}} \exp(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}\\ &= \boldsymbol{u}_o - \sum_{j \in \mathcal{V}} \left(\frac{\text{exp}(\boldsymbol{u}_j^\top \boldsymbol{v}_c)}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}\right) \boldsymbol{u}_j\\ &= \boldsymbol{u}_o - \sum_{j \in \mathcal{V}} P(w_j \mid w_c) \boldsymbol{u}_j. \end{aligned} \]

它的計算須要詞典中全部詞以\(w_c\)爲中心詞的條件機率。有關其餘詞向量的梯度同理可得。

訓練結束後,對於詞典中的任一索引爲\(i\)的詞,咱們均獲得該詞做爲中心詞和背景詞的兩組詞向量\(\boldsymbol{v}_i\)\(\boldsymbol{u}_i\)。在天然語言處理應用中,通常使用跳字模型的中心詞向量做爲詞的表徵向量。

以上這一段公式的推導是取自《dive into deeplearning》一書[7]中,其中更爲詳細的推導能夠見[4],這篇文章中有着對整個word2vec模型與公式上更爲詳細與嚴謹的推導過程。

連續詞袋模型(CBOW)

CBOW模型(Continuous Bag-of-Words Model)與skip-gram模型相反,CBOW模型是由周圍的詞(即背景詞)生成中心詞的一種神經機率模型,這裏咱們將背景詞記爲\(v_o\),生成的中心詞記爲\(u_c\)。因爲是多個背景詞生成中心詞,所以在輸入層中,對背景詞的詞向量選取並進行求和取平均數,而後與跳字模型相同,經過與中心詞的向量作乘積運算(即在隱藏層和輸出層之間作矩陣運算),以及在輸出層上的softmax歸一化運算。

設中心詞\(w_c\)在詞典中索引爲\(c\),背景詞\(w_{o_1}, \ldots, w_{o_{2m}}\)在詞典中索引爲\(o_1, \ldots, o_{2m}\),那麼給定背景詞生成中心詞的條件機率

\[P(w_c \mid w_{o_1}, \ldots, w_{o_{2m}}) = \frac{\text{exp}\left(\frac{1}{2m}\boldsymbol{u}_c^\top (\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o_{2m}}) \right)}{ \sum_{i \in \mathcal{V}} \text{exp}\left(\frac{1}{2m}\boldsymbol{u}_i^\top (\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o_{2m}}) \right)}.\]
爲了讓符號更加簡單,咱們記\(\mathcal{W}_o= \{w_{o_1}, \ldots, w_{o_{2m}}\}\),且\(\bar{\boldsymbol{v}}_o = \left(\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o_{2m}} \right)/(2m)\),那麼上式能夠簡寫成

\[P(w_c \mid \mathcal{W}_o) = \frac{\exp\left(\boldsymbol{u}_c^\top \bar{\boldsymbol{v}}_o\right)}{\sum_{i \in \mathcal{V}} \exp\left(\boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o\right)}.\]

給定一個長度爲\(T\)的文本序列,設時間步\(t\)的詞爲\(w^{(t)}\),背景窗口大小爲\(m\)。連續詞袋模型的似然函數是由背景詞生成任一中心詞的機率

\[ \prod_{t=1}^{T} P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}).\]

訓練連續詞袋模型

一樣對於CBOW模型的訓練與skip-gram模型相似,經過最大似然估計等價於最小化損失函數,能夠獲得\(loss\)

\[ -\sum_{t=1}^T \text{log}\, P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}).\]
注意到

\[\log\,P(w_c \mid \mathcal{W}_o) = \boldsymbol{u}_c^\top \bar{\boldsymbol{v}}_o - \log\,\left(\sum_{i \in \mathcal{V}} \exp\left(\boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o\right)\right).\]

經過微分,咱們能夠計算出上式中條件機率的對數有關任一背景詞向量\(\boldsymbol{v}_{o_i}\)\(i = 1, \ldots, 2m\))的梯度

\[\frac{\partial \log\, P(w_c \mid \mathcal{W}_o)}{\partial \boldsymbol{v}_{o_i}} = \frac{1}{2m} \left(\boldsymbol{u}_c - \sum_{j \in \mathcal{V}} \frac{\exp(\boldsymbol{u}_j^\top \bar{\boldsymbol{v}}_o)\boldsymbol{u}_j}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o)} \right) = \frac{1}{2m}\left(\boldsymbol{u}_c - \sum_{j \in \mathcal{V}} P(w_j \mid \mathcal{W}_o) \boldsymbol{u}_j \right).\]

有關其餘詞向量的梯度同理可得。同跳字模型不同的一點在於,咱們通常使用連續詞袋模型的背景詞向量做爲詞的表徵向量。

這一部分的梯度推導也取自於《dive into deeplearning》一書[7]中。

3.3.2近似計算

在3.3.1節中,能夠由兩種模型的條件機率看出,對於一個詞的條件機率而言,背景窗口雖然可以限制背景詞的數量,可是這個背景詞須要從整個語料庫中選擇,即對於跳字模型中的條件機率而言:

\[ P(w_o \mid w_c) = \frac{\text{exp}(\boldsymbol{u}_o^\top \boldsymbol{v}_c)}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}. \]
其中的分母的\(u_i\)須要從訓練集的語料庫中選擇,所以使得最終的softmax的計算量很是的巨大,所以提出了兩種近似計算,分別是Hierarchical softmax(層序softmax)與Negative Sampling(負採樣)。我對這兩種方法深受[4]這篇文章的理解,所以接用其中的表示方法。

層序softmax

在通常書籍與論文的舉例中,經過使用平衡樹來解釋,但在實際實現的代碼中則是經過Huffman樹去實現這個方法。

文章[4]中引入相關的表示記號以下:

  1. \(p^w\):從根節點出發到達w對應葉子節點的路徑。
  2. \(l^w\):路徑\(p^w\)中包含節點的個數。
  3. \(p^w_1, p^w_2, \cdots, p^w_{l^w}\):路徑\(p^w\)中的\(l^w\)個結點,其中\(p^w_1\)表示根結點,\(p^w_{l^w}\)表示詞w對應的結點。
  4. \(d^w_1, d^w_2, \cdots, d^w_{l^w} \in \{0, 1\}\):詞w的Huffman編碼,它由\(l^w - 1\)位編碼構成,\(d^w_j\)表示路徑\(p^w\)中第j個結點對應的編碼(根節點不對應編碼)。
  5. \(\theta^w_1, \theta^w_2, \cdots, \theta^w_{l^w-1} \in \mathbb{R}^m\):路徑\(p^w\)中非葉子結點對應的向量,\(\theta^w_j\)表示路徑\(p^w\)中第j個非葉子結點對應的向量。

由這些標記符號咱們能夠結合如下的二叉樹圖對總體參數的分佈記每一個詞的條件機率作一個深刻的理解。

其中,正如文章[4]中所提到的那樣,爲什麼還要爲Huffman樹中的每一個非葉子結點也定義一個同長的向量呢?文章[4]中解釋道:「它們只是算法中的輔助向量」。具體的詳細推導可見文章[4],這裏給出必定簡要的理解與解釋。

首先是爲何Huffman樹可以大量的減小計算量。咱們能夠經過二叉樹形象的來看。

再上圖的二叉樹中,咱們能夠看到,語料庫大小爲\(|V|\)的狀況下,每一個詞向量做爲二叉樹的根節點的每一個向量數據,其中由輔助參數\(\theta^w_{l^w-1}\)非葉子結點上的向量數據。那麼在二叉樹中如何定義條件機率函數\(P(w_c \mid Context(w))\)(其中使用CBOW模型的條件機率)?更具體的說,就是如何使用平衡二叉樹中的結點向量去定義這個條件機率函數。以圖中紅色的路徑爲例,中間一共經歷了3次分支,每一次分支均可以視爲二分類。
從二分類的角度來看,對於每個非葉子結點,須要考慮爲左右孩子制定一個分類類別,咱們假設左爲正,而右爲負,根據邏輯迴歸,易知:

\[\sigma(x^T_w \theta) = \frac{1}{1+\exp(-x^T_w \theta)}.\]
那麼分類爲負的機率則爲:

\[ 1 - \sigma(x^T_w \theta) \]
其中\(\theta\)則是做爲非葉子結點的輔助參數向量。

那麼,咱們能夠看到該路徑的條件機率則爲(如下忽略參數):

\[P(w_3 \mid Context(w)) = \sigma(\boldsymbol{x}_w^\top \boldsymbol{\theta}_{n(w_3,1)}) \cdot (1- \sigma(\boldsymbol{x}_w^\top \boldsymbol{\theta}_{n(w_3,2)})) \cdot \sigma(\boldsymbol{x}_w^\top \boldsymbol{\theta}_{n(w_3,3)}).\]

\[P(w_c \mid Context(w)) = \prod^{l^w}_{j=2}p(d^w_j \mid x_w, \theta^w_{j-1}),\]
其中

\[ p(d^w_j \mid x_w, \theta^w_{j-1}) = \begin{cases} \sigma(x^T_w \theta^w_{j-1}), & d^w_j = 1 \\ 1 - \sigma(x^T_w \theta^w_{j-1}), & d^w_j = 0 \end{cases} \]

或寫成總體表達式:

\[ p(d^w_j \mid x_w, \theta^w_{j-1}) = [\sigma(x^T_w \theta^w_{j-1})]^{d^w_j} \cdot [1 - \sigma(x^T_w \theta^w_{j-1})]^{1-d^w_j} \]

其中\(d^w_j=1\)表示爲正類,\(d^w_j=0\)表示爲負類。

也就是說,經過將語料庫中的每個詞表示爲二叉樹上的葉子結點,能夠將原來的條件機率變爲簡單的路徑上的二分類的相乘,由此大大的縮短了整個計算量。
那麼又爲什麼使用Huffman樹呢?學過二叉樹與Huffman樹的同窗到如今應該可以想到,對於整個語料庫中,每個詞的復現的頻率是不一樣的,所以在計算過程當中,有一些高頻率的的詞用到的次數就較多,而Huffman樹則能夠經過對高頻詞進行較短的編碼,對低頻詞進行較長的編碼來進一步縮短計算量。

負採樣

相比於層序softmax,負採樣顯得更爲簡單。
負採樣一樣使用了正負樣本的概念,再也不使用Huffman樹,而是利用隨機負採樣,如此可以大幅提升性能。
一樣是在CBOW模型中,詞w的上下文爲Context(w)須要預測w,那麼給定的Context(w)就是正樣本,而負樣本則是不出如今這個上下文窗口中的詞。

那麼,負樣本是如何選取的呢?在上一小節也提到,對於語料庫中的不一樣詞而言,不一樣的詞的復現頻率是不一樣的,所以在語料庫上的負樣本的選取就變成了一個帶權採樣問題。
而對於樣本的權值設置則是經過以下公式:

\[ p(w)=\frac{[count(w)]^{\frac{3}{4}}}{\sum_{u \in D}[count(u)]^{\frac{3}{4}}} \]

在選取好一個關於w的負樣本子集NEG(w),而且定義了詞典\(D\)中的任意詞\(w'\),都有:

\[ L^w(w')= \begin{cases} 1 & w'=w \\ 0 & w'\neq w \end{cases} \]

對於一個給定的正樣本\((Context(w),w)\),咱們但願最大化

\[ g(w)=\prod_{u\in \{w\}\bigcup NEG(w)} p(u|Context(w)) \]

其中,正負樣本的條件機率相似於層序softmax中的正負類的條件機率:

\[ p(u|Context(w))= \begin{cases} \sigma(X_w^T\theta^u) & L^w(u)=1 \\ 1-\sigma(X_w^T\theta^u) & L^w(u)=0 \end{cases} \\ = [\sigma(X_w^T\theta^u)]^{L^w(u)} \cdot [1-\sigma(X_w^T\theta^u)]^{1-L^w(u)} \]

負採樣直接經過負樣本(採樣不出如今背景窗口中的詞)與正樣本(出如今背景窗口中的詞)計算目標詞出現的條件機率,相比於層序softmax,不須要構建一個Huffman樹與使用樹中每個非葉子節點的參數向量,取而代之的是直接使用語料庫中的詞。

對於層序softmax與負採樣的梯度計算的詳細推導能夠在文章[4]中有詳細提到。

詞向量的選取

對於層序softmax與負採樣這兩種近似計算訓練出來的詞向量,每個詞其實有兩種形式的詞向量,一種是做爲中心詞的詞向量,一種是做爲背景詞的詞向量,通常狀況下直接選擇中心詞的詞向量做爲最終訓練獲得的詞向量使用。能夠從負採樣近似訓練中得出,做爲背景詞的詞向量可能會是不存在生成目標詞的背景窗口中,所以做爲背景詞的詞向量相比之下的置信度較低。

3.4word2vec的實際運用

詞向量的語言翻譯

在google的Tomas Mikolov團隊開發了一種詞典和術語表的自動生成技術,可以把一種語言轉變成另外一種語言,該技術利用數據挖掘來構建兩種語言的結構模型,而後加以對比,每種語言詞語之間的關鍵即「語言空間」,能夠被表徵成數學意義上的向量集合。在向量空間內,不一樣的語言享有許多共性,只有實現一個向量空間向另外一個向量空間的映射與轉換,語言翻譯便可實現。該技術效果很是不錯,對英語和西班牙語的翻譯準確率高達90%。
文[5]在介紹算法時舉了一個簡單的例子,能夠幫助咱們更好地理解詞向量的工做原理。

詞向量的近義詞與類比詞

詞向量的一個簡單應用就是求得當前次的近義詞與類比詞。

對於近義詞而言,直接在訓練好的詞向量中計算其餘詞與當前次的餘弦類似度,選取最高的幾個便可求出當前次的近義詞。

除了求近義詞之外,咱們還可使用預訓練詞向量求詞與詞之間的類比關係。例如,「man」(男人): 「woman」(女人):: 「son」(兒子) : 「daughter」(女兒)是一個類比例子:「man」之於「woman」至關於「son」之於「daughter」。求類比詞問題能夠定義爲:對於類比關係中的4個詞 \(a : b :: c : d\),給定前3個詞\(a\)\(b\)\(c\),求\(d\)。設詞\(w\)的詞向量爲\(\text{vec}(w)\)。求類比詞的思路是,搜索與\(\text{vec}(c)+\text{vec}(b)-\text{vec}(a)\)的結果向量最類似的詞向量。

又如「首都-國家」類比:「beijing」(北京)之於「china」(中國)至關於「tokyo」(東京)之於什麼?答案應該是「japan」(日本)。

經過詞向量之間的加減便可求得所對應詞的類比詞。

4.總結

本文中,簡要的對當前天然語言處理中所使用的詞向量作了一個簡要的介紹。在詞向量的訓練過程當中,每個詞向量(word vector)都被要求爲相鄰上下文中的word的出現做預測,因此儘管咱們是隨機初始化Word vectors,可是這些vectors最終仍然能經過上面的預測行爲捕獲到word之間的語義關係,從而訓練到較好的word vectors。而這些訓練好的詞向量在一些天然語言任務中使用的效果很是出色,好比詞向量就能夠應用到情感分類的問題中。

參考資料

[1] Yoshua Bengio, Réjean Ducharme, Pascal Vincent, Christian Jauvin. A Neural Probabilistic Language Model. Journal of machine learning(JMLR), 3:1137-1155, 2003
[2] Mikolov T, Chen K, Corrado G, et al. Efficient estimation of word representations in vector space[J]. arXiv preprint arXiv:1301.3781, 2013.
[3] Mikolov T, Sutskever I, Chen K, et al. Distributed representations of words and phrases and their compositionality[C]//Advances in neural information processing systems. 2013: 3111-3119.
[4] http://www.javashuo.com/article/p-pxbqyvyv-mg.html
[5] Tomas Mikolov, Quoc V. Le, llya Sutskever. Exploiting Similarities among Languages for Machine Translation. arXiv:1309.4168v1, 2013.
[6] https://www.zybuluo.com/Dounm/note/591752#5-%E5%9F%BA%E4%BA%8Enegative-sampling%E7%9A%84%E6%A8%A1%E5%9E%8B
[7] https://zh.d2l.ai/
[8] https://nndl.github.io/

相關文章
相關標籤/搜索