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, 实际上是在课程代码框架下填充部分代码。
七、收货与感想
这次课程完成时间比较长,当然收货也比较大,复习了一遍高数,终于勉强搞懂了矩阵向量求导,算是推公式入门选手了吧。