为什么用word vectors?
开始时使用one-hot编码,其中一位为1,其余全为0,向量长度和词表等长。
motel = [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
hotel = [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
但是存在以下问题:
- 词表长度为百万、千万时,one-hot会极其长,而且只有一位是1。
- 任意两个向量都正交(点乘=0),无法衡量两个向量的相似度
所以提出了分布式表示word vectors。
什么是word vectors?
首先分布式表示指使用单词附近的词表示这个单词的含义
为每个单词构建一个密集向量,如果两个单词出现的上下文相似,那么其向量也相似。
怎样得到word vectors?
常见的有三种思路:
- skip-gram
- CBOW
- GLOVE
第三种在下一讲中讲到了。前两种skip-gram和CBOW原理很相似。 skip-gram以中心词Wt 作为输入,窗口内 Wt 周围的其他词作为label,训练一个通过中心词预测上下文词的模型,而CBOW与之相反,输入上下文词来预测中心词
怎么训练呢?
以skip-gram为例,对每个中心词Wt,预测概率之和(似然函数)如下:
L
i
k
e
l
i
h
o
o
o
d
=
L
(
θ
)
=
∏
t
=
1
T
∏
−
m
≤
j
≤
m
j
≠
0
P
(
w
t
+
j
∣
w
t
;
θ
)
Likelihoood = L(\theta) = \prod^{T}_{t=1} \prod_{-m \leq j \leq m \atop j \neq 0} P(w_{t+j} | w_{t} ; \theta)
Likelihoood=L(θ)=t=1∏Tj=0−m≤j≤m∏P(wt+j∣wt;θ)
T是序列总长度,m是窗口的大小,θ是模型的所有参数。
由此目标函数(损失函数)也得到了:
J
(
θ
)
=
−
1
T
log
L
(
θ
)
=
−
1
T
∑
t
=
1
T
∑
−
m
≤
j
≤
m
j
≠
0
log
P
(
w
t
+
j
∣
w
t
;
θ
)
J(\theta)=-\frac{1}{T} \log L(\theta)=-\frac{1}{T} \sum_{t=1}^{T} \sum_{-m \leq j \leq m \atop j \neq 0} \log P\left(w_{t+j} | w_{t} ; \theta\right)
J(θ)=−T1logL(θ)=−T1t=1∑Tj=0−m≤j≤m∑logP(wt+j∣wt;θ)
其中P的计算使用softmax,max是指给定一个序列,放大了最大值的概率,soft则表示也将一部分概率分给其他值,比较平滑。
每个单词w都对应两个向量:
v_w: 当 w 是中心词时
u_w :当 w 是上下文词时
P
(
o
∣
c
)
=
exp
(
u
o
T
v
c
)
∑
w
∈
V
exp
(
u
w
T
v
c
)
P(o | c)=\frac{\exp \left(u_{o}^{T} v_{c}\right)}{\sum_{w \in V} \exp \left(u_{w}^{T} v_{c}\right)}
P(o∣c)=∑w∈Vexp(uwTvc)exp(uoTvc)
通过计算u_o与v_c的相似度(点乘)衡量u_o为周围单词的概率。可以这么理解,u_o与v_c越相似,点乘结果越大,那么softmax之后对应的概率也最大,最终达到相似的上下文词,其中心词也比较相似的目的。