0. 前言
与图像或相比,语言是一种经过人类智力处理后的、更为抽象的数据对象,因此nlp相比cv相比有许多独特之处,研究起来也比较复杂,其中词的表征方式就是一个重要方面。
1. one-hot向量
词(Word)最简单粗暴的一种表征方式(representation)就是one-hot vector。记 V V V为词库, ∣ V ∣ |V| ∣V∣为词库大小,则每个词可以表征为一个 R ∣ V ∣ × 1 R^{|V|\times 1} R∣V∣×1的向量,其中第 k k k维为1,其他维为0 , k k k是该词在词库中的位置。这种方式的缺点在于:
- 维数可能会很大,词向量会很稀疏
- 无法衡量词与词之间的相似性(任何两个词之间的内积或者余弦相似度都为0)
因此,我们自然而然地想能否将词向量的空间 R ∣ V ∣ R|V| R∣V∣降维成一个子空间,并且这个子空间可以表征出词与词之间的关系。
2. SVD(奇异值分解)
先遍历一个大的文档集,统计每两个词是否配对出现。例如,设文档集里面的句子为如下:
- I enjoy flying.
- I like NLP.
- I like deep learning.
则可以都得到这样的共现矩阵(Co-occurrence Matrix):
对
X
X
X进行SVD分解:
X
=
U
Σ
V
T
(2,1)
X=U\Sigma V^T\\ \tag{2,1}
X=UΣVT(2,1)
假设选取前
k
k
k个奇异值对应主要成分,则应该选择
U
1
:
∣
V
∣
,
1
:
k
U_{1:|V|,1:k}
U1:∣V∣,1:k作为降维后的词嵌入矩阵,这样就得到了词库中每个词的
k
k
k维表征。
这种方法的缺点是:
- 随着新词的引入,共现矩阵的大小会经常变化
- 共现矩阵很高维,而且很稀疏
- SVD分解需要很大的时间开销(约 O ( n 3 ) O(n^3) O(n3))
- SVD的可解释性较差
3. Word2Vec
前面提到的方法需要存储和计算整个语料库的所有信息,而Word2Vec通过上下文来预测词的概率,用迭代学习参数的方法,可以降低复杂度。
Word2Vecd相比one-hot向量的词表示方法,优点在于:
- 降低了向量的维度
- 能够表示词与词之间的关系
为了得到词向量,通常需要用一定的学习算法在大量语料上进行监督学习。随着时代的发展,算法的复杂性越来越小,尤其是在数据集越来越大的趋势下。事实上,我们的目的并不是为了让监督学习有多好的表现,而是为了更好地学习到词嵌入。
它包含两种算法:continuous baf-of-words(CBOW)和skip-gram,两种训练方法:负采样和层级softmax。
3.0. 语言模型——n-gram
用
P
(
ω
1
,
ω
2
,
⋯
,
ω
n
)
P(\omega_1, \omega_2, \cdots, \omega_n)
P(ω1,ω2,⋯,ωn)表示一个具有n个词的序列(句子)的概率。Unigram模型假设每个词之间都是相互独立的,也即
P
(
ω
1
,
ω
2
,
⋯
,
ω
n
)
=
∏
i
=
1
n
P
(
ω
i
)
(3-1)
P(\omega_1, \omega_2, \cdots, \omega_n)=\prod_{i=1}^nP(\omega_i)\\ \tag{3-1}
P(ω1,ω2,⋯,ωn)=i=1∏nP(ωi)(3-1)
Bigram模型假设每个词只与它前面的词有关:
P
(
ω
1
,
ω
2
,
⋯
,
ω
n
)
=
∏
i
=
1
n
P
(
ω
i
∣
ω
i
−
1
)
(3-2)
P(\omega_1, \omega_2, \cdots, \omega_n)=\prod_{i=1}^nP(\omega_i|\omega_{i-1})\\ \tag{3-2}
P(ω1,ω2,⋯,ωn)=i=1∏nP(ωi∣ωi−1)(3-2)
类似地可以得到n-gram的表达式。CBOW和Skip-gram方法的理论基础与n-gram的假设类似,即给定句子内某些词的条件下,去预测另一些词,通过学习出词向量参数,使得最大化一个句子的概率。
简而言之,CBOW的目的是通过上下文来预测中心词,而Skip-gram是通过中心词来预测上下文的分布。它们的作用都是将one-hot表示的词“嵌入”到一个低维空间中,这个方法也叫“词嵌入”(Word Embedding)
3.1. Skip-Gram Model
基本思想是,对于每个句子(记长度为
T
T
T),给定一个大小为
2
m
2m
2m的窗口,利用窗口中心词去预测窗口内其他的词(语境词),目标是最大化所有预测的语境词的概率。似然函数为:
L
(
θ
)
=
∏
t
=
1
T
∏
−
m
≤
j
≤
m
,
j
≠
0
P
(
w
t
+
j
∣
w
t
;
θ
)
(3-3)
L(\theta)=\prod \limits_{t=1}^{T}\prod \limits_{-m\leq j\leq m, j\neq 0}P(w_{t+j}|w_t;\theta)\tag{3-3}
L(θ)=t=1∏T−m≤j≤m,j=0∏P(wt+j∣wt;θ)(3-3)
其中
θ
\theta
θ是待求参数,在这里就是每个词的词向量
对上述似然函数取对数并取负号,再处于句子长度,得到代价函数:
J
(
θ
)
=
−
1
T
∑
t
=
1
T
∑
−
m
≤
j
≤
m
,
j
≠
0
l
o
g
P
(
w
t
+
j
∣
w
t
;
θ
)
(3-4)
J(\theta)=-\frac{1}{T}\sum \limits_{t=1}^{T}\sum \limits_{-m\leq j\leq m, j\neq 0}log\ P(w_{t+j}|w_t;\theta)\tag{3-4}
J(θ)=−T1t=1∑T−m≤j≤m,j=0∑log P(wt+j∣wt;θ)(3-4)
有了上述代价函数的定义,接下来的关键就是如何计算条件概率。一种符合直觉的假设是,中心词与语境词的相似度应该相对非语境词的相似度更高。因此,可以用经过softmax归一化过后的相似度来近似条件概率,也即:
P
(
w
o
∣
w
c
)
=
e
x
p
(
v
o
T
v
c
)
∑
w
∈
V
e
x
p
(
v
w
T
v
c
)
(3-5)
P(w_o|w_c)=\frac{exp(v_o^Tv_c)}{\sum_{w\in V}exp(v_w^Tv_c)}\tag{3-5}
P(wo∣wc)=∑w∈Vexp(vwTvc)exp(voTvc)(3-5)
其中
w
o
,
w
c
w_o,w_c
wo,wc分别代表语境词和中心词,
v
o
,
v
c
v_o,v_c
vo,vc分别代表它们对应的词向量。
上式有一个问题是,在后续反向传播过程中求导时,会比较复杂,因为有可能在一个句子里面,某个词既在语境词里面出现也在中心词里面出现,这样求导之后就会保留一个变量,会比较复杂。因此,为了简化计算,每个词具有两个词向量(理论上这种方法精度没前者高,但是计算简单。有时候会把求得的两个词向量取平均作为最终的词向量):一个是作为中心词的词向量,另一个是作为语境词的词向量。对应的条件概率表达式为:
P
(
u
o
∣
w
c
)
=
e
x
p
(
u
o
T
v
c
)
∑
w
∈
V
e
x
p
(
u
w
T
v
c
)
(3-6)
P(u_o|w_c)=\frac{exp(u_o^Tv_c)}{\sum_{w\in V}exp(u_w^Tv_c)}\tag{3-6}
P(uo∣wc)=∑w∈Vexp(uwTvc)exp(uoTvc)(3-6)
对上述概率的对数求偏导(用于后续反向传播):
∂
l
o
g
(
P
(
u
o
∣
w
c
)
)
∂
v
c
=
u
o
−
∑
x
=
1
V
e
x
p
(
u
x
T
v
c
)
u
x
∑
w
=
1
V
e
x
p
(
u
w
T
v
c
)
=
u
o
−
∑
x
=
1
V
e
x
p
(
u
x
T
v
c
)
u
x
∑
w
=
1
V
e
x
p
(
u
w
T
v
c
)
=
u
o
−
∑
x
=
1
V
P
(
x
∣
c
)
u
x
(3-7)
\begin{aligned} \frac{\partial{log(P(u_o|w_c))}}{\partial{v_c}}&=u_o-\frac{\sum_{x=1}^V exp(u_x^Tv_c)u_x}{\sum_{w=1}^V exp(u_w^Tv_c)}\\ &=u_o-\sum_{x=1}^V\frac{exp(u_x^Tv_c)u_x}{\sum_{w=1}^V exp(u_w^Tv_c)}\\ &=u_o-\sum_{x=1}^V P(x|c)u_x\\ \tag{3-7} \end{aligned}
∂vc∂log(P(uo∣wc))=uo−∑w=1Vexp(uwTvc)∑x=1Vexp(uxTvc)ux=uo−x=1∑V∑w=1Vexp(uwTvc)exp(uxTvc)ux=uo−x=1∑VP(x∣c)ux(3-7)
注意到上式其实就是观测值减去期望值,符合求导的物理意义。
下图是skip-gram的模型结构(窗口大小为C):
注意到, ( 3 − 4 ) (3-4) (3−4)是没有区分一个窗口内部的词的顺序的,因此word2vec模型很难学习到语序信息。