DL4NLP——詞表示模型(二)基於神經網絡的模型:NPLM;word2vec(CBOW/Skip-gram)

      本文簡述瞭如下內容:html

      神經機率語言模型NPLM,訓練語言模型並同時獲得詞表示git

      word2vec:CBOW / Skip-gram,直接以獲得詞表示爲目標的模型github

          (一)原始CBOW(Continuous Bag-of-Words)模型算法

          (二)原始Skip-gram模型網絡

          (三)word analogyapp

神經機率語言模型NPLM機器學習

      上篇文簡單整理了一下不一樣視角下的詞表示模型。近年來,word embedding能夠說已經成爲了各類神經網絡方法(CNN、RNN乃至各類網絡結構,深層也好不深也罷)處理NLP任務的標配。word embedding(詞嵌入;詞向量)是指基於神經網絡來獲得詞向量的模型(如CBOW、Skip-gram等,幾乎無一例外都是淺層的)所train出來的詞的向量表示,這種向量表示被稱爲是分佈式表示distributed representation,大概就是說單獨看其中一維的話沒什麼含義,可是組合到一塊兒的vector就表達了這個詞的語義信息(粒度上看的話,不止詞,字、句子乃至篇章均可以有分佈式表示;並且,例如網絡節點、知識圖譜中的三元組等均可以有本身的embedding,各類「xx2vec」層出不窮)。這種基於神經網絡的模型又被稱做是基於預測(predict)的模型,超參數每每要多於基於計數(count)的模型,所以靈活性要強一些,超參數起到的做用可能並不遜於模型自己。儘管有一批paper去證實了這類神經網絡獲得詞表示模型的本質其實就是矩陣分解,但這並不妨礙它們的普遍應用。分佈式

      下面就簡要介紹利用神經網絡來獲得詞表示的很是早期的工做——神經機率語言模型(NPLM, Neural Probabilistic Language Model),經過訓練語言模型,同時獲得詞表示。函數

      語言模型是指一個詞串 $\{w_t\}_{t=1}^T=w_1^T=w_1,w_2,...,w_T$ 是天然語言的機率 $P(w_1^T)$ 。 詞$w_t$的下標 $t$ 表示其是詞串中的第 $t$ 個詞。根據乘法公式,有工具

$$P(w_1,w_2,...,w_T)=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)...P(w_T|w_1,w_2,...,w_{T-1})$$

      所以要想計算出這個機率,那就要計算出 $P(w_t|w_1,w_2,...,w_{t-1}),t\in \{1,2,...,T\}$ 。傳統方式是利用頻數估計:

$$P(w_t|w_1,w_2,...,w_{t-1})=\frac{\text{count}(w_1,w_2,...,w_{t-1},w_t)}{\text{count}(w_1,w_2,...,w_{t-1})}$$

      count()是指詞串在語料中出現的次數。暫且拋開數據稀疏(若是分子爲零那麼機率爲零,這個零合理嗎?若是分母爲零,又怎麼辦?)不談,若是詞串的長度很長的話,這個計算會很是費時。n-gram模型是一種近似策略,做了一個 $n-1$ 階馬爾可夫假設:認爲目標詞 $w_t$ 的條件機率只與其以前的 $n-1$ 個詞有關:

$$\begin{aligned}P(w_t|w_1,w_2,...,w_{t-1})&\approx P(w_t|w_{t-(n-1)},w_{t-(n-2)},...,w_{t-1})\\&=\frac{\text{count}(w_{t-(n-1)},w_{t-(n-2)},...,w_{t-1},w_t)}{\text{count}(w_{t-(n-1)},w_{t-(n-2)},...,w_{t-1})}\end{aligned}$$

      神經機率語言模型NPLM延續了n-gram的假設:認爲目標詞 $w_t$ 的條件機率與其以前的 $n-1$ 個詞有關。但其在計算 $P(w_t|w_1,w_2,...,w_{t-1})$ 時,則使用的是機器學習的套路,而不使用上面count()的方式。那麼它是如何在訓練語言模型的同時又獲得了詞表示的呢?

圖片來源:[1],加了幾個符號

      設訓練語料爲 $\mathbb D$ ,提取出的詞表爲 $\mathbb V=\{w_{\underline 1},w_{\underline 2},...,w_{\underline{|\mathbb V|}}\}$ 。詞 $w_{\underline i}$ 的下標 $\underline i$ 表示其是詞表中的第 $i$ 個詞,區別於不帶下劃線的下標。大體說來,NPLM將語料中的一個詞串 $w_{t-(n-1)}^t$ 的目標詞 $w_t$ 以前的 $n-1$ 個詞的詞向量(即word embedding,設維度爲 $m$ )按順序首尾拼接獲得一個「長」的列向量 $\boldsymbol x$ ,做爲輸入層(也就是說共 $(n-1)m$ 個神經元)。而後通過權重矩陣 $H_{h\times (n-1)m}$ 來到隱層(神經元數爲 $h$ ),並用tanh函數激活。以後再通過權重矩陣 $U_{|\mathbb V|\times h}$ 來到輸出層(神經元數固然爲 $|\mathbb V|$ ),並使用softmax()將其歸一化爲機率。另外存在一個從輸入層直連輸出層的權重矩陣 $W_{|\mathbb V|\times (n-1)m}$ 。因此網絡的輸出以下(隱層和輸出層加了偏置):

$$\boldsymbol z=U\tanh (H\boldsymbol x+\boldsymbol d)+\boldsymbol b+W\boldsymbol x$$

$$\hat y_{\underline i}=P(w_{\underline i}|w_{t-(n-1)},w_{t-(n-2)},...,w_{t-1})=\text{softmax}(z_{\underline i})=\frac{\exp z_{\underline i}}{\sum\limits_{k=1}^{|\mathbb V|}\exp z_{\underline k}},\quad w_{\underline i}\in \mathbb V$$

       $\hat y_{\underline i}$ 表示目標詞是詞表中第 $i$ 個詞 $w_{\underline i}$ 的機率。

       $\exp z_{\underline i}$ 表示前 $n-1$ 個詞對詞表中第 $i$ 個詞 $w_{\underline i}$ 的能量彙集。

      詞表中的每一個詞的詞向量都存在一個矩陣 $C$ 中,look-up操做就是從矩陣中取出須要的詞向量。由此能夠看出,NPLM模型和傳統神經網絡的區別在於,傳統神經網絡須要學習的參數是權重和偏置;而NPLM模型除了須要學習權重和偏置外,還須要對輸入(也就是詞向量)進行學習。

      那麼,模型的參數就有:$C,U,H,W,\boldsymbol b,\boldsymbol d$ 。

      使用交叉熵損失函數,模型對目標詞 $w_t$ 的損失爲

$$\mathcal L =-\log \hat y_t=-\log P(w_t|w_{t-(n-1)},w_{t-(n-2)},...,w_{t-1})=-\log \text{softmax}(z_t) $$

      那麼模型的經驗風險爲(省略了常係數)

$$ \begin{aligned} \mathcal L&=-\sum_{w_{t-(n-1)}^t\in \mathbb D}\log \hat y_t\\&=-\sum_{w_{t-(n-1)}^t\in \mathbb D}\log P(w_t|w_{t-(n-1)},w_{t-(n-2)},...,w_{t-1})\\&=-\sum_{w_{t-(n-1)}^t\in \mathbb D}\log \text{softmax}(z_t)  \end{aligned} $$

      因此接下來就可使用梯度降低等方法來迭代求取參數了。這樣便同時訓練了語言模型和詞向量。

word2vec:CBOW / Skip-gram

      上面介紹的NPLM以訓練語言模型爲目標,同時獲得了詞表示。2013年的開源工具包word2vec則包含了CBOW和Skip-gram這兩個直接以獲得詞向量爲目標的模型

      像SGNS這些新興的得到embedding的模型其實不屬於字面含義上的「深度」學習,由於這些模型自己都是很淺層的神經網絡。但獲得它們後,一般會做爲輸入各類神經網絡結構的初始值(也就是預訓練,而不採用隨機初始化),並隨網絡參數一塊兒迭代更新進行fine-tuning。就我作過的實驗來講,預訓練作初始值時一般能夠提高任務上的效果,並且fine-tuning也是必要的,不要直接用初始值而不更新了。

      首先它獲取word embedding(Distributed representation)的方式是無監督的,只須要語料自己,而不須要任何標註信息,訓練時所使用的監督信息並不來自外部標註;但以前的pLSA什麼的也是無監督的啊,也是稠密向量表示啊。因此我以爲word2vec之因此引爆了DL在NLP中的應用更多是由於它在語義方面的一些優良性質,好比類似度方面和詞類比(word analogy)現象,便於神經網絡從它開始繼續去提取一些high level的東西,進而去完成複雜的任務。

      這裏先介紹兩種模型的沒有加速策略的原始形式(也就是輸出層是softmax的那種。對於Skip-gram模型,做者在paper中稱之爲「impractical」),兩種加速策略將在下篇文中介紹。

      與NPLM不一樣,在CBOW / Skip-gram模型中,目標詞 $w_t$ 是一個詞串中間的詞而不是最後一個詞,其擁有的上下文(context)爲先後各 $m$ 個詞:$w_{t-m},...,w_{t-1},w_{t+1},...,w_{t+m}$ 。NPLM基於n-gram,至關於目標詞只有上文。後文中,「目標詞」和「中心詞」是同一律念,「周圍詞」和「上下文」是同一律念。

      在原始的CBOW / Skip-gram模型中,任一個詞 $w_{\underline i}$ 將獲得兩個word embedding(設維度爲 $n$ ):做爲中心詞時的詞向量,也稱爲輸出詞向量 $\boldsymbol v_{\underline i}\in \mathbb R^{n\times 1}$ ;以及做爲周圍詞時的詞向量,也稱爲輸入詞向量 $\boldsymbol u_{\underline i}\in \mathbb R^{n\times 1}$ 。詞向量的下標和詞的下標相對應,好比說目標詞 $w_t$ 的詞向量就對應爲 $\boldsymbol v_t$ 和 $\boldsymbol u_t$ 。

      與NPLM相似,詞表中每一個詞的詞向量都存在一個矩陣中。因爲存在兩套詞向量,所以就有兩個矩陣:輸入詞矩陣 $V_{n\times |\mathbb V|}=[\boldsymbol v_{\underline 1},...,\boldsymbol v_{\underline {|\mathbb V|}}]$ ,其每一列都是一個詞做爲周圍詞時的詞向量;輸出詞矩陣 $U_{|\mathbb V|\times n}=[\boldsymbol u_{\underline 1}^\top ;...;\boldsymbol u_{\underline {|\mathbb V|}}^\top]$ ,其每一行都是一個詞做爲中心詞時的詞向量。好比說若想取出詞做爲周圍詞時的詞向量,只要知道詞在詞表中的編號便可,取出的操做至關於用輸入詞矩陣乘以詞的one-hot representation。

(一)CBOW(Continuous Bag-of-Words)

      不帶加速的CBOW模型是一個兩層結構,相比於NPLM來講CBOW模型沒有隱層,經過上下文來預測中心詞,而且拋棄了詞序信息——

            輸入層:$n$ 個節點,上下文共 $2m$ 個詞的詞向量的平均值;

            輸入層到輸出層的鏈接邊:輸出詞矩陣 $U_{|\mathbb V|\times n}$ ;

            輸出層:$|\mathbb V|$ 個節點。第 $i$ 個節點表明中心詞是詞 $w_{\underline i}$ 的機率。

      若是要視做三層結構的話,能夠認爲——

            輸入層:$2m\times |\mathbb V|$個節點,上下文共 $2m$ 個詞的one-hot representation

            輸入層到投影層到鏈接邊:輸入詞矩陣 $V_{n\times |\mathbb V|}$ ;

            投影層::$n$ 個節點,上下文共 $2m$ 個詞的詞向量的平均值;

            投影層到輸出層的鏈接邊:輸出詞矩陣 $U_{|\mathbb V|\times n}$ ;

            輸出層:$|\mathbb V|$ 個節點。第 $i$ 個節點表明中心詞是詞 $w_{\underline i}$ 的機率。

      這樣表述相對清楚,將one-hot到word embedding那一步描述了出來。這裏的投影層並無作任何的非線性激活操做,直接就是Softmax層。換句話說,若是隻看投影層到輸出層的話,其實就是個Softmax迴歸模型,但標記信息是詞串中心詞,而不是外部標註。

圖片來源:[5],把記號都改爲和本文一致

      首先,將中心詞 $w_t$ 的上下文 $c_t$ :$w_{t-m},...,w_{t-1},w_{t+1},...,w_{t+m}$ 由one-hot representation( $\boldsymbol x_{t+j}$ )轉爲輸入詞向量( $\boldsymbol v_{t+j}$ ):

$$\boldsymbol v_{t+j}=V\boldsymbol x_{t+j},\quad j\in \{-m,...,m\}\setminus \{0\}$$

      進而將上下文的輸入詞向量 $\boldsymbol v_{t-m},...,\boldsymbol v_{t-1},\boldsymbol v_{t+1},...,\boldsymbol v_{t+m}$ 求平均值,做爲模型輸入:

$$\hat{\boldsymbol v}_t=\frac{1}{2m}\sum_j\boldsymbol v_{t+j},\quad j\in \{-m,...,m\}\setminus \{0\}$$

      這一步叫投影(projection)。能夠看出,CBOW像詞袋模型(BoW)同樣拋棄了詞序信息,而後窗口在語料上滑動,就成了連續詞袋= =。丟掉詞序看起來不太好,不過開個玩笑的話:「研表究明,漢字的序順並不定一能影閱響讀,事證明明瞭當你看這完句話以後才發字現都亂是的」。

      與NPLM不一樣,CBOW模型沒有隱藏層,投影以後就用softmax()輸出目標詞是某個詞的機率,進而減小了計算時間:

$$\boldsymbol z=U\hat{\boldsymbol v}_t$$

$$\hat y_{\underline i}=P(w_{\underline i}|w_{t-m},...,w_{t-1},w_{t+1},...,w_{t+m})=\text{softmax}(z_{\underline i})=\text{softmax}(\boldsymbol u_{\underline i}^\top \hat{\boldsymbol v}_t),\quad w_{\underline i}\in \mathbb V $$

      那麼模型的參數就是兩個詞向量矩陣:$U,V$ 。

      對於中心詞 $w_t$ ,模型對它的損失爲

$$\begin{aligned}\mathcal L&=-\log \hat y_t\\&=-\log P(w_t|w_{t-m},...,w_{t-1},w_{t+1},...,w_{t+m})\\&=-\log \text{softmax}(z_t)\\&=-\log \frac{\exp (\boldsymbol u_t^\top \hat{\boldsymbol v}_t)}{\sum_{k=1}^{|\mathbb V|}\exp (\boldsymbol u_{\underline k}^\top \hat{\boldsymbol v}_t)}\\&=-\boldsymbol u_t^\top \hat{\boldsymbol v}_t+\log \sum_{k=1}^{|\mathbb V|}\exp (\boldsymbol u_{\underline k}^\top \hat{\boldsymbol v}_t)\\&=-z_t+\log \sum_{k=1}^{|\mathbb V|}\exp z_{\underline k} \end{aligned}$$

      因此模型的經驗風險爲

$$ \begin{aligned} \mathcal L&=-\sum_{w_{t-m}^{t+m}\in \mathbb D}\log \hat{y_t}\\&=-\sum_{w_{t-m}^{t+m}\in \mathbb D}\log P(w_t|w_{t-m},...,w_{t-1},w_{t+1},...,w_{t+m})\\&=-\sum_{w_{t-m}^{t+m}\in \mathbb D}\log \text{softmax}(z_t) \end{aligned} $$

      作文本的各位同好應該都知道fastText,它相比於CBOW有兩個比較重要的區別:首先,fastText是一個端到端的分類器,用所有窗口詞取平均去預測文檔的標籤,而不是預測窗口中心詞;另一個,是它引入了局部詞序,也就是 n-gram 特徵,因此train出來的詞向量和word2vec有一些不同的特色。由於Hierarchical Softmax還有其餘的trick,它的速度快到難以置信,並且精度並不低,沒用過fastText的各位能夠跑下實驗感覺一下。附上一個帶中文註釋的源碼解析:fastText 源碼分析

 

      下面開始是很是無聊的求導練習。。。

      若是用SGD來更新參數的話,只需求出模型對一個樣本的損失的梯度。也就是說上式的求和號能夠沒有,直接對 $\mathcal L$ 求梯度,來更新參數。

      I. 首先是對輸出詞矩陣 $U^\top =[\boldsymbol u_{\underline 1},...,\boldsymbol u_{\underline {|\mathbb V|}}]$ :

      這部分和Softmax迴歸模型的梯度推導過程是同樣同樣的。有不少種方法,下面介紹最循序漸進的方法。

      由於 $z_{\underline i}=\boldsymbol u_{\underline i}^\top \hat{\boldsymbol v}_t$ ,因此 $\dfrac{\partial \mathcal L}{\partial \boldsymbol u_{\underline i}}=\dfrac{\partial z_{\underline i}}{\partial \boldsymbol u_{\underline i}}\dfrac{\partial \mathcal L}{\partial z_{\underline i}}=\hat{\boldsymbol v}_t\dfrac{\partial \mathcal L}{\partial z_{\underline i}}$ (這裏的 $\dfrac{\partial \mathcal L}{\partial z_{\underline i}}$ 其實就是BP算法中的 $\delta$ ),那麼先求 $\dfrac{\partial \mathcal L}{\partial z_{\underline i}}$ :

      (1) 對 $\forall w_{\underline i}\in \mathbb V\setminus \{w_t\}$ ,有 $y_{\underline i}=0$,那麼

$$\begin{aligned}\frac{\partial \mathcal L}{\partial z_{\underline i}}&=\frac{\partial (-z_t+\log \sum\limits_{k=1}^{|\mathbb V|}\exp z_{\underline k})}{\partial z_i}\\&=0+\frac{\dfrac{\partial \sum_{k=1}^{|\mathbb V|}\exp z_{\underline k}}{\partial z_{\underline i}}}{\sum\limits_{k=1}^{|\mathbb V|}\exp z_{\underline k}}=\frac{\exp z_{\underline i}}{\sum\limits_{k=1}^{|\mathbb V|}\exp z_{\underline k}}=\hat y_{\underline i}=\hat y_{\underline i}-y_{\underline i}\end{aligned}$$

      (2) 對 $w_{\underline i}=w_t$ ,有 $y_{\underline i}=1$,那麼

$$\frac{\partial \mathcal L}{\partial z_{\underline i}}=\frac{\partial \mathcal L}{\partial z_t}=-1+\hat y_t=\hat y_{\underline i}-y_{\underline i}$$

      可見兩種情形的結果是統一的,就是偏差項。

      所以有

$$\frac{\partial \mathcal L}{\partial \boldsymbol u_{\underline i}}=(\hat y_{\underline i}-y_{\underline i})\hat{\boldsymbol v}_t,\quad w_{\underline i}\in \mathbb V$$

      那麼對於詞表中的任一個詞 $w_{\underline i}$ ,其輸出詞向量的更新迭代式爲:

$$\boldsymbol u_{\underline i}=\boldsymbol u_{\underline i}-\alpha(\hat y_{\underline i}-y_{\underline i})\hat{\boldsymbol v}_t,\quad w_{\underline i}\in \mathbb V$$

      不妨把它們拼接成對矩陣的梯度:

$$ \begin{aligned}\frac{\partial \mathcal L}{\partial U^\top}&=[\frac{\partial \mathcal L}{\partial \boldsymbol u_{\underline 1}},...,\frac{\partial \mathcal L}{\partial \boldsymbol u_{\underline {|\mathbb V|}}}]\\&=\hat{\boldsymbol v}_t(\hat{\boldsymbol y}-\boldsymbol y)^\top \end{aligned} $$

$$U^\top= U^\top-\alpha\hat{\boldsymbol v}_t(\hat{\boldsymbol y}-\boldsymbol y)^\top$$

      II. 接下來是對輸入詞矩陣 $V=[\boldsymbol v_{\underline 1},...,\boldsymbol v_{\underline {|\mathbb V|}}]$ :

      由於 $\hat{\boldsymbol v}_t=\dfrac{1}{2m}\sum_j\boldsymbol v_{t+j}$ ,因此 $\dfrac{\partial\mathcal L}{\partial \boldsymbol v_{t+j}}=\dfrac{\partial \hat{\boldsymbol v}_t}{\partial \boldsymbol v_{t+j}}\dfrac{\partial \mathcal L}{\partial \hat{\boldsymbol v}_t}=\dfrac{1}{2m}I\dfrac{\partial \mathcal L}{\partial \hat{\boldsymbol v}_t}$,那麼求 $\dfrac{\partial \mathcal L}{\partial \hat{\boldsymbol v}_t}$ :

$$\begin{aligned} \frac{\partial \mathcal L}{\partial \hat{\boldsymbol v}_t}&=\sum_{k=1}^{|\mathbb V|}\frac{\partial \mathcal L}{\partial z_{\underline k}}\frac{\partial z_{\underline k}}{\partial \hat{\boldsymbol v}_t}\\&=\sum_{k=1}^{|\mathbb V|}(\hat y_{\underline k}-y_{\underline k})\boldsymbol u_{\underline k}\\&=[\boldsymbol u_{\underline 1},...,\boldsymbol u_{\underline {|\mathbb V|}}]   \begin{pmatrix} \hat y_{\underline 1}-y_{\underline 1}\\ \vdots \\ \hat y_{\underline{|\mathbb V|}}-y_{\underline{|\mathbb V|}} \end{pmatrix} \\&=U^\top(\hat{\boldsymbol y}-\boldsymbol y) \end{aligned}$$

      所以有

$$\frac{\partial \mathcal L}{\partial \boldsymbol v_{t+j}}=\frac{1}{2m}U^\top(\hat{\boldsymbol y}-\boldsymbol y),\quad j\in \{-m,...,m\}\setminus \{0\}$$

      那麼對於中心詞 $w_t$ 的上下文的任一個詞 $w_{t+j}$ ,其輸入詞向量的更新迭代式爲:

$$\boldsymbol v_{t+j}=\boldsymbol v_{t+j}-\frac{1}{2m}\alpha U^\top(\hat{\boldsymbol y}-\boldsymbol y),\quad j\in \{-m,...,m\}\setminus \{0\}$$

(二)Skip-gram

      不帶加速的Skip-gram模型其實和CBOW模型很類似,兩者都是用上下文來預測中心詞。兩者的區別在於,CBOW模型把上下文的 $2m$ 個詞向量求平均值「揉」成了一個向量 $\hat{\boldsymbol v}_t$ 而後做爲輸入,進而預測中心詞;而Skip-gram模型則是把上下文的 $2m$ 個詞向量 $\boldsymbol v_{t+j}$ 依次做爲輸入,而後預測中心詞。

      Skip-gram模型中,對於中心詞 $w_t$ ,模型對它的損失爲

$$\begin{aligned}\mathcal L&=-\log P(w_t|w_{t-m},...,w_{t-1},w_{t+1},...,w_{t+m})\\&=-\log \prod_jP(w_t|w_{t+j})\\&=-\log \prod_j\hat y_t^{(j)}\\&=-\log \prod_j\text{softmax}(\hat z_t^{(j)})\\&=-\sum_j\log \frac{\exp (\boldsymbol u_t^\top \boldsymbol v_{t+j})}{\sum\limits_{k=1}^{|\mathbb V|}\exp (\boldsymbol u_{\underline k}^\top \boldsymbol v_{t+j})}\end{aligned}$$

      第二個等號是獨立性假設。後面的求梯度過程也是相似的。

      下篇博文將簡述兩種從計算上加速的策略。

      觀衆朋友們可能會問,實驗呢?我以爲word embedding的實驗仍是要結合具體任務,畢竟它一般是做爲初始值的。我作實驗時都是用gensim包來train詞向量,如今TF也有例子,我沒對比過。如今感覺就是:用pre-train的話比隨機初始化要好(固然也有文章說pre-train對效果沒什麼影響,例如2015 COCO Image Caption評測第一名的NIC模型。我我的感受的話,若是語料很是大,隨機初始化也是能夠的);fine-tuning作了比不作要好。基本上都屬於說了跟沒說同樣……可是實際上,仍是要看任務的,好比我見過一些paper裏面是不對預訓練值作update的。關於各個超參數的取值,首先我習慣用SGNS(Skip-gram搭配負採樣加速),而後諸如維數、窗口大小、最低詞頻、二次採樣的設置等等都要根據語料的實際狀況:維數的話,若是不是機器翻譯這種特別大的任務通常200之內就夠;窗口大小,若是是推特這樣的短文本那就不能取太大。調這些參數的trick在網上也有一些其它的博客在寫,這裏只是籠統的寫一點,更詳細的對比請看中科院在兩年前著名的大做 —— How to generate a good word embedding。另外,各個我以前的pre-train都用的是word2vec的,沒用過GloVe,若是語料足夠大就用語料訓練,若是語料不大就用中文維基百科。之後可能會嘗試對比一下GloVe作pre-train。

      另外我我的有個疑惑,關於word2vec的改進應該有很多paper,若是它們是有效的,爲何沒有被寫進gensim這樣的工具包呢?

(三)word analogy

        word analogy是一種有趣的現象,能夠做爲評估詞向量的質量的一項任務。

圖片來源:[6]

      word analogy是指訓練出的word embedding能夠經過加減法操做,來對應某種關係。好比說左圖中,有 $w(king)-w(queen)\approx w(man)-w(woman)$ 。那麼評測時,則是已知這個式子,給出king、queen和man三個詞,看與 $w(king)-w(queen)+w(woman)$ 最接近的是不是 $w(woman)$ 。右圖則表示,word analogy現象不僅存在於語義類似,也存在於語法類似。

      這個彷佛已經有理論證實了: 題目叫 Skip-Gram – Zipf + Uniform = Vector Additivity, 2017ACL

        

參考:

[1] A Neural Probabilistic Language Model, LMLR2003

[2] Efficient Estimation of Word Representations in Vector Space, 2013

[3] CS224d Lecture Notes1

[4] (PhD thesis)基於神經網絡的詞和文檔語義向量表示方法研究

[5] word2vec Parameter Learning Explained

[6] Linguistic Regularities in Continuous Space Word Representations, NAACL2013

[7] Comparison of FastText and Word2Vec

[8] fastText 源碼分析

相關文章
相關標籤/搜索