word2vec學習筆記之CBOW和skip-gram


在上一篇學習筆記《word2vec學習筆記之文本向量化概述》中介紹了word2vec提出的一些背景(當然,除了該篇文章中所說的一些向量化方法之外,在word2vec之後,還有fasttext,glove等其他方法,但在word2vec學習筆記系列中不對這些新的方法進行介紹)。本文將詳細針對word2vec中的CBOW和skip-gram這兩種形式進行詳細介紹。本文主要是學習《word2vec Parameter Learning Explained》進行筆記。
word2vec的兩個模型與上一篇筆記中提到的NNLM相似,均是在訓練語言模型的過程中,使用語言模型的中間產物來得到詞表的詞向量。

1. Continuous Bag-of-Word Model(CBOW)

CBOW
上圖是連續詞袋模型CBOW的結構圖。該模型中,是使用上下文詞彙來預測中間詞。下面將與《word2vec Parameter Learning Explained》相同,分別從一個詞的上下文和多個詞的上下文來進行介紹。

1.1 One-word context(一個詞的上下文)

這裏是先簡單的從一個詞的輸入上下文開始介紹,即假設輸入側只有一個詞。此時CBOW模型的結構如下
CBOW one word in context
上圖中,輸入層是一個詞的one-hot形式,假設詞表大小爲V,那麼輸入是一個大小爲V維的one-hot向量,該one-hot向量中,僅有所對應的詞的下標處爲1,其他位置均爲0,我們可以將輸入向量記爲xx
輸入層經過與一個VNV*N大小的矩陣WVNW_{V*N}相乘後,得到N維大小的隱藏層的向量hh,從輸入層到隱藏層可以理解爲是一個全連接過程,但是跟平時的全連接不同的是,這裏沒有進行非線性函數的處理。並且,由於輸入是一個one-hot向量,因此相乘後的結果實際上是從矩陣WVNW_{V*N}中取出第kk行的向量(one-hot向量中1的下標爲k),也就是詞wIw_I所對應的詞向量。即h=WTx=Wk,T:=vwITh=W^Tx=W^T_{k,·}:=v^T_{w_I}
隱藏層再經過與一個NVN*V大小的矩陣WW'相乘後,得到V維大小的輸出層的向量uu。其中輸出層向量中的第jj個元素uju_{j}就是矩陣WW'中的第jj列向量vwjv'_{ w_j}與隱藏層向量hh的乘積u=hWu=hW'uj=vwjThu_{j}={v'_{w_j}}^{T}h然後將輸出的向量uu進行softmax處理,得到此表中每一個詞的預測概率,而輸出概率最大的詞即爲本次預測的結果。即,輸入wIw_I輸出wjw_{j}的概率爲p(wjwI)=yj=exp(uj)j=1Vexp(uj)p(w_j|w_I)=y_j=\frac{exp(u_j)}{\sum^V_{j'=1}exp(u_{j'})}
隱藏層到輸出層之間的權重更新
在模型訓練過程中,假設當輸入的詞是wIw_I時,期望輸出的詞是wOw_O,那麼我們希望p(wOwI)p(w_O|w_I)能夠最大,即我們訓練的目標是使得下面的式子最大化maxp(wOwI)=maxyj=maxlogyj=ujlogj=1Vexp(uj):=E\max p(w_O|w_I)=\max y_{j*}=\max \log y_{j*}=u_{j*}-\log \sum^V_{j'=1}exp(u_{j'}):=-E其中,E=logp(wOwI)E=-\log p(w_O|w_I)就是我們所期望能夠達到最小的損失函數,jj*就是實際輸出詞或者說是我們期望輸出詞在此表中的下標。
接下來,我們使用反向傳播來進行權重的更新。首先是求損失函數EE對於ujwiju_j和w'_{ij}的求導(uju_j是輸出層輸出向量的第jj個值,wijw'_{ij}是矩陣WW'的第ii行第jj列的元素)Euj=yjtj:=ej\frac{\partial E}{\partial u_{j}}=y_j-t_j:=e_jEwij=Eujujwij=ejhi\frac{\partial{E}}{\partial w'_{ij}}=\frac{\partial E}{\partial u_{j}}·\frac{\partial u_{j}}{\partial w'_{ij}}=e_j·h_i其中,當j=jj=j^*的時候tjt_j爲1,否則爲0。於是,矩陣WW'的更新公式如下wij(new)=wij(old)ηejhi{w'_{ij}}^{(new)}={w'_{ij}}^{(old)}-\eta·e_j·h_i或者vwj(new)=vwj(old)ηejh{v'_{w_j}}^{(new)}={v'_{w_j}}^{(old)}-\eta·e_j·h其中η\eta是learning rate。

輸入層到隱藏層之間的權重更新
與上述”隱藏層到輸出層之間的權重更新“過程類似,可以使用以下幾個式子求得損失函數EEhiwkih_i和w_{ki}的求導Ehj=j=1VEujujhi=j=1Vejwij:=EHi\frac{\partial E}{\partial h_j}=\sum^V_{j=1}\frac{\partial E}{\partial u_j}·\frac{\partial u_j}{\partial h_i}=\sum^V_{j=1}e_j·w'_{ij}:=EH_iEwki=Ehihiwki=EHixk\frac{\partial E}{\partial w_{ki}}=\frac{\partial E}{\partial h_i}·\frac{\partial h_i}{\partial w_{ki}}=EH_i·x_k其中hi=k=1Vxkwkih_i=\sum^V_{k=1}x_k·w_{ki}而由於輸入向量xx中僅有一個元素非零,因此vwI(new)=vwI(old)ηEHT{v_{w_I}}^{(new)}={v_{w_I}}^{(old)}-\eta EH^T

1.2 Multi-word context(多個詞的上下文)

多個詞上下問的CBOW的結構圖如下
CBOW Multi-word context
多個詞的上下文與單個詞的上下文的主要區別在於,每次訓練的時候,輸入層中的輸入詞不是一個而是多個。於是,從輸入層到中間層的映射變爲,將每一個單獨的輸入詞所對應的向量做均值h=1CWT(x1+x2+...+xC)=1C(vw1+vw1+...+vwC)Th=\frac{1}{C}W^T(x_1+x_2+...+x_C)=\frac{1}{C}(v_{w_1}+v_{w_1}+...+v_{w_C})^T其中,C是輸入層輸入詞的個數。於是損失函數也就變爲E=logp(wOwI,1,wI,C)E=-\log p(w_O|w_{I,1},···,w_{I,C})=uj+logj=1Vexp(uj)=-u_{j^*}+\log \sum^{V}_{j'=1}exp(u_{j'})=vwOTh+logj=1Vexp(vwjTh)=-{v'_{w_O}}^{T}·h+\log \sum^{V}_{j'=1}exp({v'_{w_j}}^T·h)於是,更新WWW'和W中的值的公式爲vwj(new)=vwj(old)ηejh{v'_{w_j}}^{(new)}={v'_{w_j}}^{(old)}-\eta·e_j·hvwI,c(new)=vwI,c(old)1CηEHT{v'_{w_{I,c}}}^{(new)}={v'_{w_{I,c}}}^{(old)}-\frac{1}{C}·\eta·EH^{T}

2. Skip-gram model

skip-gram
上圖是跳字模型skip-gram的結構圖。該模型中,是使用中間詞來預測上下文詞彙。
下圖中每一個節點均是表示一個向量,將上圖中的每一個節點展開爲向量,就與下面的圖相同
skip-gram
在skip-gram中的輸入層到中間層的過程,就與1.1節中介紹的相似,於是也就有了h=W(k,)T:=vwITh=W^T_{(k,·)}:=v^T_{w_I}在隱藏層到輸出層中,是有多個詞輸出,而每一個詞的輸出概率同樣是p(wc,j=wO,cwI)=yc,j=exp(uc,j)j=1Vexp(uj)p(w_{c,j}=w_{O,c}|w_I)=y_{c,j}=\frac{exp(u_{c,j})}{\sum^{V}_{j'=1}exp(u_{j'})}於是skip-gram的損失函數就是E=logp(wO,1,wO,2,...,wO,cwI)E=-\log p(w_{O,1},w_{O,2},...,w_{O,c}|w_I)=logc=1Cexp(uc,jc)j=1Vexp(uj)=-\log \prod^C_{c=1}\frac{exp(u_{c,j^*_c})}{\sum^V_{j'=1}exp(u_{j'})}=c=1Cujc+Clogj=1Vexp(uj)=-\sum^C_{c=1}u_{j^*_c}+C\log \sum^V_{j'=1}exp(u_{j'})其中wIw_I是輸入的詞,w_{O,c}表示輸入的C個詞中的第c個。於是,損失函數對輸出的第c個輸出詞向量的第j個元素的求導爲Euc,j=yc,jtc,j:=ec,j\frac{\partial E}{\partial u_{c,j}}=y_{c,j}-t_{c,j}:=e_{c,j}損失函數E對矩陣WW'中的第i行第j列元素的求導爲Ewij=c=1CEuc,juc,jwij=EIjhi\frac{\partial E}{\partial w'_{ij}}=\sum^{C}_{c=1}\frac{\partial E}{\partial u_{c,j}}·\frac{\partial u_{c,j}}{\partial w'_{ij}}=EI_j·h_i於是,可更新權重wij(new)=wij(old)ηEIjhi{w'_{ij}}^{(new)}={w'_{ij}}^{(old)}-\eta·EI_j·h_i或者vwj(new)=vwj(old)ηEIjh{v'_{w_j}}^{(new)}={v'_{w_j}}^{(old)}-\eta·EI_j·h
而在skip-gram的輸入層到隱藏層的過程與一個詞上下文的CBOW相似,矩陣WW的更新公式爲vwI(new)=vwI(old)ηEHT{v^{(new)}_{w_I}}={v^{(old)}_{w_I}}-\eta·EH^T

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