cs224n學習筆記L1:自然語言處理簡介
一、課堂計劃
完成word vectors和word2vec工具預覽(即作業一)
優化理論基礎
能否通過計數使計算更高效
glove模型計算詞向量的方案
驗證word vectors
word senses(詞感知?)
目的 :課堂結束後能夠讀懂詞嵌入的論文。
二、 詞向量計算方法
2.1 回顧word2vec計算
對一箇中心詞,與窗口內的context詞出現的概率:
P ( o ∣ c ) = e x p ( u o T v c ) ∑ w ∈ V e x p ( u w v c ) (2.1) P(o|c) = \frac{exp(u_o^T v_c)}{\sum_{w \in V}exp(u_wv_c)} \tag{2.1} P ( o ∣ c ) = ∑ w ∈ V e x p ( u w v c ) e x p ( u o T v c ) ( 2 . 1 )
通過極大似然方法最大化整個文本出現的概率:
L ( θ ) = ∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( w t + j ∣ w t , θ ) L(\theta) = \prod_{t=1}^T\prod_{-m \le j \le m, j\ne0}P(w_{t+j}|w_t,\theta) L ( θ ) = t = 1 ∏ T − m ≤ j ≤ m , j = 0 ∏ P ( w t + j ∣ w t , θ )
損失函數:
J ( θ ) = − 1 T l o g L ( θ ) = − 1 T ∑ t = 1 T ∑ − m ≤ j ≤ m , j ≠ 0 l o g P ( w t + j ∣ w t , θ ) (2.2) J(\theta)=-\frac1TlogL(\theta)=-\frac1T\sum_{t=1}^T\sum_{-m \le j \le m, j\ne0}logP(w_{t+j}|w_t,\theta) \tag{2.2} J ( θ ) = − T 1 l o g L ( θ ) = − T 1 t = 1 ∑ T − m ≤ j ≤ m , j = 0 ∑ l o g P ( w t + j ∣ w t , θ ) ( 2 . 2 )
2.2 word2vec中計算方法詳解
假設vocabulary包含m個詞,每個詞向量長度爲n, 對於每一個詞,作爲中心詞(center)和非中心詞(outside)時分別使用v和u兩個向量表示。在計算完成後將兩個向量平均作爲最終詞向量表示。
U m × n ( o u t s i d e ) = [ u 1 u 2 ⋮ u m ] U_{m \times n}(outside) = \left[ \begin{matrix}
u_1 \\
u_2 \\
\vdots \\
u_m
\end{matrix} \right] U m × n ( o u t s i d e ) = ⎣ ⎢ ⎢ ⎢ ⎡ u 1 u 2 ⋮ u m ⎦ ⎥ ⎥ ⎥ ⎤
V m × n ( c e n t e r ) = [ v 1 v 2 ⋮ v m ] V_{m \times n} (center)= \left[ \begin{matrix}
v_1 \\
v_2 \\
\vdots \\
v_m
\end{matrix} \right] V m × n ( c e n t e r ) = ⎣ ⎢ ⎢ ⎢ ⎡ v 1 v 2 ⋮ v m ⎦ ⎥ ⎥ ⎥ ⎤
對每一個詞作爲中心詞時,計算概率分佈。這裏假定第4個詞作爲中心詞時,有
D m × 1 = U m × n ⋅ v 4 T = [ d 1 d 2 ⋮ d m ] D_{m \times 1} = U_{m \times n} \cdot v_4^T = \left[ \begin{matrix}
d_1 \\
d_2 \\
\vdots \\
d_m
\end{matrix}\right] D m × 1 = U m × n ⋅ v 4 T = ⎣ ⎢ ⎢ ⎢ ⎡ d 1 d 2 ⋮ d m ⎦ ⎥ ⎥ ⎥ ⎤
其中,d爲與m個outside詞的點積,由於兩個向量的點乘可以表示其相似度,進一步可用於表示其出現的概率大小,從而得到概率表示:
P m × 1 = s o f t m a x ( D m × 1 ) = [ p 1 p 2 ⋮ p m ] P_{m \times 1} = softmax(D_{m \times 1}) = \left[ \begin{matrix}
p_1 \\
p_2 \\
\vdots \\
p_m
\end{matrix}\right] P m × 1 = s o f t m a x ( D m × 1 ) = ⎣ ⎢ ⎢ ⎢ ⎡ p 1 p 2 ⋮ p m ⎦ ⎥ ⎥ ⎥ ⎤
這裏原理就很明顯了,我們接下來需要做的,就是通過優化問題來更新矩陣U和V,從而使詞向量模型需對出現在同一個context中的詞賦予較大的概率。
2.3 高頻詞(the)引起的問題
通過以上計算過程可以知道,如果兩個詞出現在一個context的次數越頻繁,那麼他們的詞向量就會越接近,這樣一來像the這樣的高頻詞,就會使它前後的詞向量高度集中,從而導致一些問題。
三、優化基礎
3.1 梯度下降
梯度是指多元函數在某個點上升最快的方向,那麼梯度的反方向當然就是下降最快的方向。從而得到直觀的優化公式:
θ n e w = θ o l d − α ∇ θ J ( θ ) \theta_{new} = \theta_{old} - \alpha \nabla_{\theta}J(\theta) θ n e w = θ o l d − α ∇ θ J ( θ )
此處∇ t h e t a J ( θ ) \nabla_{theta}J(\theta) ∇ t h e t a J ( θ ) 爲損失函數的梯度,α \alpha α 爲學習率或步長,是一個超參數。以上是對整個問題的矩陣表示,但在計算過程中,需要一個個的更新參數,所以有對單個參數θ j \theta_j θ j 表示版本:
θ j n e w = θ j o l d − α ∂ ∂ θ j o l d J ( θ )
\theta _ { j } ^ { n e w } = \theta _ { j } ^ { o l d } - \alpha \frac { \partial } { \partial \theta _ { j } ^ { o l d } } J ( \theta )
θ j n e w = θ j o l d − α ∂ θ j o l d ∂ J ( θ )
在高等數學(同濟)中關於梯度的定義如下,及梯度是各個自變量的偏導組成的向量。
3.2 隨機(stochastic)梯度下降(SGD)
3.1中提到的梯度下降,爲了計算出參數的梯度,需要代入整個數據集,這樣一次更新計算量非常大,因此提出隨機梯度下降方法,即每一個更新都是從數據及中隨機抽樣部分數據(batch), 在詞向量計算中對每一個window數據計算一次更新。
四、word vector優化過程
4.1 SGD引起的稀疏數據
由於使用一個窗口更新一次,由於∇ θ J t ( θ ) \nabla_{\theta}J_t(\theta) ∇ θ J t ( θ ) 是各個詞向量的偏導組成的向量,如果這個詞沒有出現,其偏導也就爲0,因此梯度將非常稀疏。
對應方案:使用稀疏矩陣或者將詞hash映射到具體向量,如果是分佈式計算,必須避免大量的中間數據在節點之間的傳送
4.2 兩種詞向量建模方案
Skip-gram(SG):給定中心詞預測窗口context(outsides)
Continous Bag of Words(CBOW):給定窗口context預測中心詞
4.3 訓練效率提升方案
負採樣。目前爲止仍然以更簡單但是計算量大的傳統softmax爲主要方案, 即公式2.1中的分母(正則項)。
由於經典方案正則化計算量太大,因此我們在作業二中使用負採樣方案。其主要思想爲:訓練一個logistics regression分類器, 判斷一個詞語對是否來自於同一個context。
損失函數:最大化如下函數:
在作業二中,使用的損失函數爲:
J n e g − s a m p l e ( o , v c , U ) = − log ( σ ( u o ⊤ v c ) ) − ∑ k = 1 , k ∼ P ( w ) K log ( σ ( − u k ⊤ v c ) )
J _ { n e g - s a m p l e } \left( \boldsymbol { o } , \boldsymbol { v } _ { c } , \boldsymbol { U } \right) = - \log \left( \sigma \left( \boldsymbol { u } _ { o } ^ { \top } \boldsymbol { v } _ { c } \right) \right) - \sum _ {k = 1 , k \sim P(w) } ^ { K } \log \left( \sigma \left( - \boldsymbol { u } _ { k } ^ { \top } \boldsymbol { v } _ { c } \right) \right)
J n e g − s a m p l e ( o , v c , U ) = − log ( σ ( u o ⊤ v c ) ) − k = 1 , k ∼ P ( w ) ∑ K log ( σ ( − u k ⊤ v c ) )
這裏的P ( w ) P(w) P ( w ) 爲採樣的概率分佈,爲了平衡高頻詞和低頻次的影響,取P ( w ) = U ( w ) 3 / 4 Z P(w) = \frac{U(w)^{3/4}}{Z} P ( w ) = Z U ( w ) 3 / 4 , 這裏U ( w ) U(w) U ( w ) 爲unigram分佈,及按詞頻比例作爲其概率分佈,指數部分取3/4可以平滑詞頻的影響,分母Z表示正則化,將指數操作後(和不爲1)的數值重新變爲概率(和爲1)。
4.4 統計共現(co-occurence)詞對
存在問題:存儲共現矩陣稀疏(O ( n 2 ) O(n^2) O ( n 2 ) 內存)
解決辦法:奇異值分解降維。可以使用numpy庫中的np.lilalg.svd()函數。
五、驗證及其他
5.1 兩種驗證方法
5.2 其他
課程還介紹了很多詞向量的其他細節、例如一詞多義、詞向量訓練參數介紹及各種模型性能對比等,課程後半截聽得有點迷糊,這裏就不給出完整筆記了,如果以後需要衝刷再來補上。
六、作業
6.1 手寫推導部分
感悟:當遇到矩陣或向量求導的時候,要每個元素拆開單獨計算,第4小題比較典型。
一行文字說明下面兩個公式等價,即交叉熵損失與naive-softmax。
J c r o s s − e n t r o p y = − ∑ y w log ( y ^ w ) = − log ( y ^ o ) J_{cross-entropy}=- \sum y _ { w } \log \left( \hat { y } _ { w } \right) = - \log \left( \hat { y } _ { o } \right) J c r o s s − e n t r o p y = − ∑ y w log ( y ^ w ) = − log ( y ^ o )
J n a i v e − s o f t m a x ( v c , o , U ) = − log P ( O = o ∣ C = c ) J_{naive-softmax}\left( \boldsymbol { v } _ { c } , o , \boldsymbol { U } \right) = - \log P ( O = o | C = c ) J n a i v e − s o f t m a x ( v c , o , U ) = − log P ( O = o ∣ C = c )
答:由於y w y_w y w 爲0-1概率分佈,因此J c r o s s − e n t r o p y = − ∑ y w log ( y ^ w ) = − ∑ ( 0 , 1 ) ⋅ log ( y ^ w ) = − log ( y ^ w 1 y ^ w 2 … y ^ w T ) = − log P ( O = o ∣ C = c ) J_{cross-entropy} \\
=- \sum y _ { w } \log \left( \hat { y } _ { w } \right) \\
= - \sum (0,1) \cdot \log \left( \hat { y } _ { w } \right) \\
= - \log \left( \hat { y } _ { w1 } \hat { y } _ { w2 } \dots \hat { y } _ { wT } \right) \\
=- \log P( O = o | C = c ) J c r o s s − e n t r o p y = − ∑ y w log ( y ^ w ) = − ∑ ( 0 , 1 ) ⋅ log ( y ^ w ) = − log ( y ^ w 1 y ^ w 2 … y ^ w T ) = − log P ( O = o ∣ C = c )
we know this deravatives:(這裏第一種解法利用了softmax+交叉熵求導的一般規律,可以推導證明)
解法一:∵ J = C E ( y , y ^ ) y ^ = s o f t m a x ( θ ) ∴ ∂ J ∂ θ = ( y ^ − y ) T \because J = CE(y, \hat{y}) \\ \hat{y} = softmax(\theta)\ \\ \therefore \frac{\partial J}{\partial \theta} = (\hat{y} - y)^T ∵ J = C E ( y , y ^ ) y ^ = s o f t m a x ( θ ) ∴ ∂ θ ∂ J = ( y ^ − y ) T
y y y is a column vector in the above equation. So, we can use chain rules to solve the deravitive:
∂ J ∂ v c = ∂ J ∂ θ ∂ θ ∂ v c = ( y ^ − y ) ∂ U T v c ∂ v c = U T ( y ^ − y ) T \begin{aligned} \frac{\partial J}{\partial v_c} &= \frac{\partial J}{\partial \theta} \frac{\partial \theta}{\partial v_c} \ &= (\hat{y} - y) \frac{\partial U^Tv_c}{\partial v_c} \ &= U^T(\hat{y} - y)^T \end{aligned} ∂ v c ∂ J = ∂ θ ∂ J ∂ v c ∂ θ = ( y ^ − y ) ∂ v c ∂ U T v c = U T ( y ^ − y ) T
解法二:
∂ J ( v c , o , U ) ∂ v c = − ∂ ( u o T v c ) ∂ v c + ∂ ( log ( ∑ w exp ( u w T v c ) ) ) ∂ v c = − u o + 1 ∑ w exp ( u w T v c ) ∂ ( ∑ w exp ( u w T v c ) ) ∂ v c = − u o + ∑ w exp ( u w T v c ) u w ∑ w exp ( u w T v c ) = − u o + ∑ w p ( O = w ∣ C = c ) u w = − y o u o + ∑ w y ^ w u w ( 單 個 u o ) = − U T y + U T y ^ ( 全 體 u , 這 裏 限 定 O = o 所 以 U 實 際 代 表 一 行 ) = U T ( y ^ − y ) \begin{aligned}
\frac{\partial J\left(v_{c}, o, U\right)}{\partial v_{c}} &=-\frac{\partial\left(u_{o}^{T} v_{c}\right)}{\partial v_{c}}+\frac{\partial\left(\log \left(\sum_{w} \exp \left(u_{w}^{T} v_{c}\right)\right)\right)}{\partial v_{c}} \\
&=-u_{o}+\frac{1}{\sum_{w} \exp \left(u_{w}^{T} v_{c}\right)} \frac{\partial\left(\sum_{w} \exp \left(u_{w}^{T} v_{c}\right)\right)}{\partial v_{c}} \\
&=-u_{o}+\sum_{w} \frac{\exp \left(u_{w}^{T} v_{c}\right) u_{w}}{\sum_{w} \exp \left(u_{w}^{T} v_{c}\right)} \\
&=-u_{o}+\sum_{w} p(O=w | C=c) u_{w} \\
&=-y_ou_o+\sum_w\hat y_wu_w (單個u_o)\\
&=-U^T\boldsymbol{y} + U^T\boldsymbol{\hat y}(全體u,這裏限定O=o所以U實際代表一行) \\
&=U^{T}(\hat{y}-y)
\end{aligned} ∂ v c ∂ J ( v c , o , U ) = − ∂ v c ∂ ( u o T v c ) + ∂ v c ∂ ( log ( ∑ w exp ( u w T v c ) ) ) = − u o + ∑ w exp ( u w T v c ) 1 ∂ v c ∂ ( ∑ w exp ( u w T v c ) ) = − u o + w ∑ ∑ w exp ( u w T v c ) exp ( u w T v c ) u w = − u o + w ∑ p ( O = w ∣ C = c ) u w = − y o u o + w ∑ y ^ w u w ( 單 個 u o ) = − U T y + U T y ^ ( 全 體 u , 這 裏 限 定 O = o 所 以 U 實 際 代 表 一 行 ) = U T ( y ^ − y )
similar to the equation above. ∂ J ∂ v c = ∂ J ∂ θ ∂ θ ∂ U = ( y ^ − y ) ∂ U T v c ∂ U = v c ( y ^ − y ) T \begin{aligned} \frac{\partial J}{\partial v_c} &= \frac{\partial J}{\partial \theta} \frac{\partial \theta}{\partial U} \ &= (\hat{y} - y) \frac{\partial U^Tv_c}{\partial U} \ &= v_c(\hat{y} - y)^T \end{aligned} ∂ v c ∂ J = ∂ θ ∂ J ∂ U ∂ θ = ( y ^ − y ) ∂ U ∂ U T v c = v c ( y ^ − y ) T
x x x 爲一個向量,求sigmod函數對x的偏導,結果可以用σ ( x ) 表 示 \sigma(x)表示 σ ( x ) 表 示 。
σ ( x ) = 1 1 + e − x = e x 1 + e x \sigma(x)= \frac{1}{1+e^{-x}}=\frac{e^x}{1+e^x} σ ( x ) = 1 + e − x 1 = 1 + e x e x
答:s i g m o d ( x ) = 1 1 + e − x sigmod(x) = \frac{1}{1+e^{-x}} s i g m o d ( x ) = 1 + e − x 1 , 由於x爲一個向量x = ( x 1 , x 2 , … , x n ) x=(x_1, x_2, \dots, x_n) x = ( x 1 , x 2 , … , x n ) ,而求導實際上是針對單個變量, 由於σ ( x ) \sigma(x) σ ( x ) 是x的函數,所以求導結果應該是一個矩陣:
∂ σ ( x i ) ∂ x i = e − x i ( 1 + e − x i ) 2 = ( 1 + e − x i ) − 1 ( 1 + e − x i ) 2 = σ ( x ) ( 1 − σ ( x ) ) ∂ σ ( x i ) ∂ x j = 0 ∴ ∂ σ ( x ) ∂ x = [ σ ′ ( x 1 ) 0 … 0 0 σ ′ ( x 2 ) … 0 ⋮ ⋮ ⋱ ⋮ 0 0 … σ ′ ( x n ) ] \begin{aligned}
\frac{\partial \sigma(x_i)}{\partial x_i} & = \frac{e^{-x_i}}{(1+e^{-x_i})^2} =\frac{(1+e^{-x_i})-1}{(1+e^{-x_i})^2} = \sigma(x)(1-\sigma(x))\\
\frac{\partial \sigma(x_i)}{\partial x_j} & = 0 \\
\therefore \frac{\partial \sigma(x)}{\partial x} &=
\left[\begin{matrix}
\sigma'(x_1) & 0 & \ldots &0 \\
0 & \sigma'(x_2) & \ldots &0 \\
\vdots & \vdots & \ddots& \vdots\\
0 &0 & \ldots & \sigma'(x_n)\\
\end{matrix} \right]
\end{aligned} ∂ x i ∂ σ ( x i ) ∂ x j ∂ σ ( x i ) ∴ ∂ x ∂ σ ( x ) = ( 1 + e − x i ) 2 e − x i = ( 1 + e − x i ) 2 ( 1 + e − x i ) − 1 = σ ( x ) ( 1 − σ ( x ) ) = 0 = ⎣ ⎢ ⎢ ⎢ ⎡ σ ′ ( x 1 ) 0 ⋮ 0 0 σ ′ ( x 2 ) ⋮ 0 … … ⋱ … 0 0 ⋮ σ ′ ( x n ) ⎦ ⎥ ⎥ ⎥ ⎤
sigmod 函數有一些特性: (1) σ ( − x ) = 1 − σ ( x ) \sigma(-x) = 1-\sigma(x) σ ( − x ) = 1 − σ ( x ) (2) σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x) = \sigma(x)(1-\sigma(x)) σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) )
題目描述如圖
答:根據第四題有( 1 ) ∂ J ∂ v c = − σ ′ ( u o T v c ) u o σ ( u o T v v ) + ∑ k = 1 K σ ′ ( − u k T v c ) u k σ ( − u k T v c ) = ( σ ( u o T v c ) − 1 ) u o + ∑ k = 1 K ( 1 − σ ( − u k T v c ) ) u k = ( σ ( u o T v c ) − 1 ) u o + ∑ k = 1 K σ ( u k T v c ) u k ( 2 ) ∂ J ∂ u o = ( σ ( u o T v c ) − 1 ) v c ( o ∉ K ) ( 3 ) ∂ J ∂ u k = σ ( u k T v c ) v c \begin{aligned}
(1)
\frac{\partial J}{\partial v_c} & = -\frac{\sigma'(u_o^Tv_c)u_o}{\sigma(u_o^Tv_v)} + \sum_{k=1}^K \frac{\sigma'(-u_k^Tv_c)u_k}{\sigma(-u_k^Tv_c)} \\
&=(\sigma(u_o^Tv_c)-1)u_o+\sum_{k=1}^K(1-\sigma(-u_k^Tv_c))u_k \\
& =(\sigma(u_o^Tv_c)-1)u_o+\sum_{k=1}^K\sigma(u_k^Tv_c)u_k \\
(2)\frac{\partial J}{\partial u_o} &= (\sigma(u_o^Tv_c)-1)v_c (o \notin K)\\
(3)\frac{\partial J}{\partial u_k} &=\sigma(u_k^Tv_c)v_c
\end{aligned} ( 1 ) ∂ v c ∂ J ( 2 ) ∂ u o ∂ J ( 3 ) ∂ u k ∂ J = − σ ( u o T v v ) σ ′ ( u o T v c ) u o + k = 1 ∑ K σ ( − u k T v c ) σ ′ ( − u k T v c ) u k = ( σ ( u o T v c ) − 1 ) u o + k = 1 ∑ K ( 1 − σ ( − u k T v c ) ) u k = ( σ ( u o T v c ) − 1 ) u o + k = 1 ∑ K σ ( u k T v c ) u k = ( σ ( u o T v c ) − 1 ) v c ( o ∈ / K ) = σ ( u k T v c ) v c
從偏導可以看出,梯度更新時,使用負採樣計算的參數量遠遠小於naive-softmax。
6.2 代碼
github鏈接
實現word2vec, 實際上是在課程代碼框架下填充部分代碼。
七、收貨與感想
這次課程完成時間比較長,當然收貨也比較大,複習了一遍高數,終於勉強搞懂了矩陣向量求導,算是推公式入門選手了吧。