cs224n学习笔记L1:自然语言处理简介
目的:课堂结束后能够读懂词嵌入的论文。
对一个中心词,与窗口内的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∈Vexp(uwvc)exp(uoTvc)(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(wt+j∣wt,θ)
损失函数:
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(θ)=−T1logL(θ)=−T1t=1∑T−m≤j≤m,j=0∑logP(wt+j∣wt,θ)(2.2)
假设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] Um×n(outside)=⎣⎢⎢⎢⎡u1u2⋮um⎦⎥⎥⎥⎤
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] Vm×n(center)=⎣⎢⎢⎢⎡v1v2⋮vm⎦⎥⎥⎥⎤
对每一个词作为中心词时,计算概率分布。这里假定第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] Dm×1=Um×n⋅v4T=⎣⎢⎢⎢⎡d1d2⋮dm⎦⎥⎥⎥⎤
其中,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] Pm×1=softmax(Dm×1)=⎣⎢⎢⎢⎡p1p2⋮pm⎦⎥⎥⎥⎤
这里原理就很明显了,我们接下来需要做的,就是通过优化问题来更新矩阵U和V,从而使词向量模型需对出现在同一个context中的词赋予较大的概率。
通过以上计算过程可以知道,如果两个词出现在一个context的次数越频繁,那么他们的词向量就会越接近,这样一来像the这样的高频词,就会使它前后的词向量高度集中,从而导致一些问题。
3.1中提到的梯度下降,为了计算出参数的梯度,需要代入整个数据集,这样一次更新计算量非常大,因此提出随机梯度下降方法,即每一个更新都是从数据及中随机抽样部分数据(batch), 在词向量计算中对每一个window数据计算一次更新。
由于使用一个窗口更新一次,由于 ∇ θ J t ( θ ) \nabla_{\theta}J_t(\theta) ∇θJt(θ)是各个词向量的偏导组成的向量,如果这个词没有出现,其偏导也就为0,因此梯度将非常稀疏。
对应方案:使用稀疏矩阵或者将词hash映射到具体向量,如果是分布式计算,必须避免大量的中间数据在节点之间的传送
课程还介绍了很多词向量的其他细节、例如一词多义、词向量训练参数介绍及各种模型性能对比等,课程后半截听得有点迷糊,这里就不给出完整笔记了,如果以后需要冲刷再来补上。
感悟:当遇到矩阵或向量求导的时候,要每个元素拆开单独计算,第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) Jcross−entropy=−∑ywlog(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 ) Jnaive−softmax(vc,o,U)=−logP(O=o∣C=c)
答:由于 y w y_w yw为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 ) Jcross−entropy=−∑ywlog(y^w)=−∑(0,1)⋅log(y^w)=−log(y^w1y^w2…y^wT)=−logP(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=CE(y,y^)y^=softmax(θ) ∴∂θ∂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} ∂vc∂J=∂θ∂J∂vc∂θ =(y^−y)∂vc∂UTvc =UT(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} ∂vc∂J(vc,o,U)=−∂vc∂(uoTvc)+∂vc∂(log(∑wexp(uwTvc)))=−uo+∑wexp(uwTvc)1∂vc∂(∑wexp(uwTvc))=−uo+w∑∑wexp(uwTvc)exp(uwTvc)uw=−uo+w∑p(O=w∣C=c)uw=−youo+w∑y^wuw(单个uo)=−UTy+UTy^(全体u,这里限定O=o所以U实际代表一行)=UT(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} ∂vc∂J=∂θ∂J∂U∂θ =(y^−y)∂U∂UTvc =vc(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−x1=1+exex
答: s i g m o d ( x ) = 1 1 + e − x sigmod(x) = \frac{1}{1+e^{-x}} sigmod(x)=1+e−x1, 由于x为一个向量 x = ( x 1 , x 2 , … , x n ) x=(x_1, x_2, \dots, x_n) x=(x1,x2,…,xn),而求导实际上是针对单个变量, 由于 σ ( 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} ∂xi∂σ(xi)∂xj∂σ(xi)∴∂x∂σ(x)=(1+e−xi)2e−xi=(1+e−xi)2(1+e−xi)−1=σ(x)(1−σ(x))=0=⎣⎢⎢⎢⎡σ′(x1)0⋮00σ′(x2)⋮0……⋱…00⋮σ′(xn)⎦⎥⎥⎥⎤
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))
github链接
实现word2vec, 实际上是在课程代码框架下填充部分代码。
这次课程完成时间比较长,当然收货也比较大,复习了一遍高数,终于勉强搞懂了矩阵向量求导,算是推公式入门选手了吧。