在上一篇學習筆記《
word2vec學習筆記之文本向量化概述》中介紹了word2vec提出的一些背景(當然,除了該篇文章中所說的一些向量化方法之外,在word2vec之後,還有fasttext,glove等其他方法,但在
word2vec學習筆記
系列中不對這些新的方法進行介紹)。本文將詳細針對word2vec中的CBOW和skip-gram這兩種形式進行詳細介紹。本文主要是學習《word2vec Parameter Learning Explained》進行筆記。
word2vec的兩個模型與
上一篇筆記中提到的NNLM相似,均是在訓練語言模型的過程中,使用語言模型的中間產物來得到詞表的詞向量。
1. Continuous Bag-of-Word Model(CBOW)
上圖是連續詞袋模型CBOW的結構圖。該模型中,是使用上下文詞彙來預測中間詞。下面將與《word2vec Parameter Learning Explained》相同,分別從一個詞的上下文和多個詞的上下文來進行介紹。
1.1 One-word context(一個詞的上下文)
這裏是先簡單的從一個詞的輸入上下文開始介紹,即假設輸入側只有一個詞。此時CBOW模型的結構如下
上圖中,輸入層是一個詞的one-hot形式,假設詞表大小爲V,那麼輸入是一個大小爲V維的one-hot向量,該one-hot向量中,僅有所對應的詞的下標處爲1,其他位置均爲0,我們可以將輸入向量記爲x。
輸入層經過與一個V∗N大小的矩陣WV∗N相乘後,得到N維大小的隱藏層的向量h,從輸入層到隱藏層可以理解爲是一個全連接過程,但是跟平時的全連接不同的是,這裏沒有進行非線性函數的處理。並且,由於輸入是一個one-hot向量,因此相乘後的結果實際上是從矩陣WV∗N中取出第k行的向量(one-hot向量中1的下標爲k),也就是詞wI所對應的詞向量。即h=WTx=Wk,⋅T:=vwIT
隱藏層再經過與一個N∗V大小的矩陣W′相乘後,得到V維大小的輸出層的向量u。其中輸出層向量中的第j個元素uj就是矩陣W′中的第j列向量vwj′與隱藏層向量h的乘積u=hW′uj=vwj′Th然後將輸出的向量u進行softmax處理,得到此表中每一個詞的預測概率,而輸出概率最大的詞即爲本次預測的結果。即,輸入wI輸出wj的概率爲p(wj∣wI)=yj=∑j′=1Vexp(uj′)exp(uj)
隱藏層到輸出層之間的權重更新
在模型訓練過程中,假設當輸入的詞是wI時,期望輸出的詞是wO,那麼我們希望p(wO∣wI)能夠最大,即我們訓練的目標是使得下面的式子最大化maxp(wO∣wI)=maxyj∗=maxlogyj∗=uj∗−logj′=1∑Vexp(uj′):=−E其中,E=−logp(wO∣wI)就是我們所期望能夠達到最小的損失函數,j∗就是實際輸出詞或者說是我們期望輸出詞在此表中的下標。
接下來,我們使用反向傳播來進行權重的更新。首先是求損失函數E對於uj和wij′的求導(uj是輸出層輸出向量的第j個值,wij′是矩陣W′的第i行第j列的元素)∂uj∂E=yj−tj:=ej∂wij′∂E=∂uj∂E⋅∂wij′∂uj=ej⋅hi其中,當j=j∗的時候tj爲1,否則爲0。於是,矩陣W′的更新公式如下wij′(new)=wij′(old)−η⋅ej⋅hi或者vwj′(new)=vwj′(old)−η⋅ej⋅h其中η是learning rate。
輸入層到隱藏層之間的權重更新
與上述”隱藏層到輸出層之間的權重更新“過程類似,可以使用以下幾個式子求得損失函數E對hi和wki的求導∂hj∂E=j=1∑V∂uj∂E⋅∂hi∂uj=j=1∑Vej⋅wij′:=EHi∂wki∂E=∂hi∂E⋅∂wki∂hi=EHi⋅xk其中hi=k=1∑Vxk⋅wki而由於輸入向量x中僅有一個元素非零,因此vwI(new)=vwI(old)−ηEHT
1.2 Multi-word context(多個詞的上下文)
多個詞上下問的CBOW的結構圖如下
多個詞的上下文與單個詞的上下文的主要區別在於,每次訓練的時候,輸入層中的輸入詞不是一個而是多個。於是,從輸入層到中間層的映射變爲,將每一個單獨的輸入詞所對應的向量做均值h=C1WT(x1+x2+...+xC)=C1(vw1+vw1+...+vwC)T其中,C是輸入層輸入詞的個數。於是損失函數也就變爲E=−logp(wO∣wI,1,⋅⋅⋅,wI,C)=−uj∗+logj′=1∑Vexp(uj′)=−vwO′T⋅h+logj′=1∑Vexp(vwj′T⋅h)於是,更新W′和W中的值的公式爲vwj′(new)=vwj′(old)−η⋅ej⋅hvwI,c′(new)=vwI,c′(old)−C1⋅η⋅EHT
2. Skip-gram model
上圖是跳字模型skip-gram的結構圖。該模型中,是使用中間詞來預測上下文詞彙。
下圖中每一個節點均是表示一個向量,將上圖中的每一個節點展開爲向量,就與下面的圖相同
在skip-gram中的輸入層到中間層的過程,就與1.1節中介紹的相似,於是也就有了h=W(k,⋅)T:=vwIT在隱藏層到輸出層中,是有多個詞輸出,而每一個詞的輸出概率同樣是p(wc,j=wO,c∣wI)=yc,j=∑j′=1Vexp(uj′)exp(uc,j)於是skip-gram的損失函數就是E=−logp(wO,1,wO,2,...,wO,c∣wI)=−logc=1∏C∑j′=1Vexp(uj′)exp(uc,jc∗)=−c=1∑Cujc∗+Clogj′=1∑Vexp(uj′)其中wI是輸入的詞,w_{O,c}表示輸入的C個詞中的第c個。於是,損失函數對輸出的第c個輸出詞向量的第j個元素的求導爲∂uc,j∂E=yc,j−tc,j:=ec,j損失函數E對矩陣W′中的第i行第j列元素的求導爲∂wij′∂E=c=1∑C∂uc,j∂E⋅∂wij′∂uc,j=EIj⋅hi於是,可更新權重wij′(new)=wij′(old)−η⋅EIj⋅hi或者vwj′(new)=vwj′(old)−η⋅EIj⋅h
而在skip-gram的輸入層到隱藏層的過程與一個詞上下文的CBOW相似,矩陣W的更新公式爲vwI(new)=vwI(old)−η⋅EHT