文章目录
一、词嵌入
1、词嵌入
1.1、意义–词汇表征
上一节中通过词汇表向量将单词转化为一个个独立编码,都是向量,且这些向量之间的内积为0,这样就无法知道词汇间的相似性,为了掌握不同单词之间的相似程度,则使用特征表征的方法对每个单词进行编码,上诉的方法又叫单词嵌入。
- 如何进行单词嵌入?
特征表征的每个元素都是对该单词某一特征的量化描述,量化范围是[-1,1]之间。如下所示:
- 使用单词嵌入的优点
根据向量能清晰知道不同单词之间的相似度,提高了有限词汇量的泛化能力,这种特征化单词的操作称为单词嵌入。
- 单词嵌入的特征
每个单词都由高纬度特征向量表征,为了可视化不同单词之间的相似性,可以使用降维操作,例如t-SNE算法,将nD维降到2D平面上。如图所示:
- 简单的理解:把单词表示成向量,然后运用旧向量去预测新向量,进而预测出新的单词。
1.2、词嵌入的特性–类比推理
例子,特征维度是4维,分别是[Gender, Royal, Age, Food]。单词“Man”与“Woman”的关系类比于“King”与“Queen”的关系,可以利用词嵌入找到这样的对应类比关系。
做法:
将“Man”的词嵌入向量与“Woman”的词嵌入向量相减:
e
m
a
n
−
e
w
o
m
a
n
=
[
−
1
0.01
0.03
0.09
]
−
[
−
1
0.02
0.02
0.01
]
≈
[
−
2
0
0
0
]
e_{man}-e_{woman}=\begin{bmatrix} -1 \\ 0.01 \\0.03\\0.09 \end{bmatrix}-\begin{bmatrix} -1 \\ 0.02 \\0.02\\0.01 \end{bmatrix} \approx \begin{bmatrix} -2 \\ 0 \\0\\0 \end{bmatrix}
eman−ewoman=⎣⎢⎢⎡−10.010.030.09⎦⎥⎥⎤−⎣⎢⎢⎡−10.020.020.01⎦⎥⎥⎤≈⎣⎢⎢⎡−2000⎦⎥⎥⎤
类似地,将将“King”的词嵌入向量与“Queen”的词嵌入向量相减:
e
k
i
n
g
−
e
q
u
e
e
n
=
[
−
0.95
0.93
0.70
0.02
]
−
[
0.97
0.95
0.69
0.01
]
≈
[
−
2
0
0
0
]
e_{king}-e_{queen}=\begin{bmatrix} -0.95 \\ 0.93 \\0.70\\0.02 \end{bmatrix}-\begin{bmatrix} 0.97 \\ 0.95 \\0.69\\0.01 \end{bmatrix} \approx \begin{bmatrix} -2 \\ 0 \\0\\0 \end{bmatrix}
eking−equeen=⎣⎢⎢⎡−0.950.930.700.02⎦⎥⎥⎤−⎣⎢⎢⎡0.970.950.690.01⎦⎥⎥⎤≈⎣⎢⎢⎡−2000⎦⎥⎥⎤
一般地,A类比于B相当于C类比于?,这类问题可用词嵌入进行运算,如下图:
根据等式
e
m
a
n
−
e
w
o
m
a
n
≈
e
k
i
n
g
=
e
?
e_{man}-e_{woman}\approx e_{king}=e_?
eman−ewoman≈eking=e?得:
e
?
=
e
k
i
n
g
−
e
m
a
n
+
e
w
o
m
a
n
e_? = e_{king}-e_{man}+e_{woman}
e?=eking−eman+ewoman
利用相似函数,计算与
e
k
i
n
g
−
e
m
a
n
+
e
w
o
m
a
n
e_{king}-e_{man}+e_{woman}
eking−eman+ewoman相似性最大的
e
?
e_?
e?,得到
e
?
=
e
q
u
e
e
n
e_?=e_{queen}
e?=equeen
常用的相似函数为余弦相似度度,其表达式为:
S
i
m
(
u
,
v
)
=
u
T
v
∣
∣
u
∣
∣
∣
∣
v
∣
∣
Sim(u,v)=\frac{u^Tv}{||u|| ||v||}
Sim(u,v)=∣∣u∣∣∣∣v∣∣uTv
还可以用欧式距离来比较相似性,即||u-v||^2。距离越大,相似性越小。
1.3、词嵌入矩阵
例子,某个词汇库包含10000个单词,每个单词包含的特征维度为300,那么表征所有单词的词嵌入矩阵维度为300X10000,用E表示。某单词w的独热编码向量表示为
O
w
O_w
Ow,维度为10000x1,则该单词的词嵌入向量
e
w
e_w
ew表达式为:
e
w
=
E
∗
O
w
e_w=E*O_w
ew=E∗Ow
上诉矩阵乘积运算
E
∗
O
w
E*O_w
E∗Ow效率并不高,矩阵维度很大,且
O
w
O_w
Ow大部分元素为零,通常做法是直接从E中选取第w列作为
e
w
e_w
ew即可。
1.4、学习词嵌入
例子,输入一句话:I want a glass of orange (juice)。通过这句话前6个单词,预测最后的单词“juice”。每个单词可用词嵌入向量表示。构建的神经网络模型结果如下图所示:
神经网络包含6个词嵌入向量,每个词嵌入向量维度是300,则输入层总共有1800个输入,softmax层有10000个概率输出,与词汇表包含的单词数目一致。正确的输出label是“juice”,其中
E
,
W
[
1
]
,
b
[
1
]
,
W
[
2
]
,
b
[
2
]
E,W^{[1]},b^{[1]},W^{[2]},b^{[2]}
E,W[1],b[1],W[2],b[2]为待求值。对足够的训练例句样本,运用梯度下降算法,迭代优化,最终求出词汇矩阵E。
为了让神经网络输入层固定,可以选择只取预测单词的前4个单词作为输入,例如该句中只选择“a glass of orange”四个单词作为输入。
一般,我们把输入叫做context,输出叫做target。
- context:a glass of orange
- target:juice
关于context的选择有多种方法:
- target前n个单词或后n个单词,n可调
- target前1个单词
- target附件某1个单词(skip-gram)
1.5、word2vec
aj. I want a glass of orange juice to go along with my cereal。
skip-gram模型的做法:首先选择一个单词作为context,例如“orange”,然后使用一个宽度为5或10的滑动窗,在context附近选择一个单词作为target,可以是juice、glass、my等等,最终得到了多个context-target对作为监督式学习样本。
训练的过程是构建自然语言模型,经过softmax单元的输出为:
y
^
=
e
θ
t
T
e
c
∑
j
=
1
10000
e
θ
j
T
e
c
\hat y=\frac{e^{\theta_t^T e_c}}{\sum_{j=1}^{10000}e^{\theta_j^T e_c}}
y^=∑j=110000eθjTeceθtTec
其中,
θ
t
\theta_t
θt为target对应的参数,
e
c
e_c
ec为context的词嵌入向量,且
e
c
=
E
O
c
e_c=EO_c
ec=EOc,相应的loss function为:
L
(
y
^
,
y
)
=
−
∑
i
=
1
10000
y
i
l
o
g
y
^
i
L(\hat y,y)=-\sum_{i=1}^{10000}y_ilog{\hat y_i}
L(y^,y)=−i=1∑10000yilogy^i
然后运用梯度下降算法,迭代优化,最终得到词嵌入矩阵E。
然而,这种算法计算量大,影响运算速度,主要因为softmax输出单元为10000个,
y
^
\hat y
y^计算公式中包含大量的求和运算,解决办法之一是使用hierarchical softmax classifier,即树形分类器,其结构如下图所示:
这种树形分类器是一种二分类,与之前的softmax分类器不同,它在每个树节点上对目标单词进行区间判断,最终定位到目标单词。这种树形分类器最多需要logN步就能找到目标单词,N为单词总数。
实际应用中,对树形分类器做了一些改进,改进后的树形分类器是非对称的,通常选择把比较常用的单词放在树的顶层,而把不常用的单词放在树的底层,这样更能提高搜索速度。
除此之外,关于context采样,需要注意的是如果使用均匀采样,那么一些常用的介词、冠词,例如the,of,a,and,to等出现的概率更大一些,但是,这些单词的词嵌入向量通常不是我们最关心的,我们更关心例如orange、apple、juice等名词,所以,实际应用中,一般不选择随机均匀采样的方式来选择context,而是使用其它算法来处理这类问题。
1.6、负采样
负采样是另外一种有效求解词嵌入向量E的方法,它的做法是判断选取的文本单词和目标单词是否构成一组正确的context-target对,一般包含一个正样本和k个负样本。一般地,固定某个context word对应的负样本个数k一般遵循:
- 若训练样本较小,k一般选择5-20
- 若训练样本较大,k一般选择2-5即可
负采样的数学模型为:
P
(
y
=
1
∣
c
,
t
)
=
σ
(
θ
t
T
e
c
)
P(y=1|c,t)=\sigma(\theta_t^Te_c)
P(y=1∣c,t)=σ(θtTec)
其中,
θ
\theta
θ表示sigmoid激活函数。
负采样某个固定的正样本对应k个负样本,即模型总共包含了k+1个二分类,对比之前介绍的10000个输出单元的softmax分类,负采样转化为k+1个二分类问题,计算量要小很多,大大提高了模型运算速度。
如何选择负样本对应的target单词,可以使用随机选择的方法,根据该词出现的频率进行选择,相应的概率公式为:
P
(
w
i
)
=
f
(
w
i
)
3
4
∑
j
10000
f
(
w
j
)
3
4
P(w_i)=\frac{f(w_i)^{\frac{3}{4}}}{\sum_j^{10000}f(w_j)^{\frac{3}{4}}}
P(wi)=∑j10000f(wj)43f(wi)43
其中,f(w_i)表示单词w_i在单词表中出现的概率。
1.7、glove word vector
glove算法引入了一个新的参数:
- X i j X_{ij} Xij:表示i出现在j之前的次数,即i和j同时出现的次数。
其中,i表示context,j表示target。一般,如果不限定context一定在target前面,则有对称关系
X
i
j
=
X
j
i
X_{ij}=X_{ji}
Xij=Xji,如果有限定先后,则
X
i
j
≠
X
j
i
X_{ij} \neq X_{ji}
Xij=Xji。接下来的讨论中,默认存在对称关系
X
i
j
=
X
j
i
X_{ij}=X_{ji}
Xij=Xji。
glove模型的loss function为:
L
=
∑
i
=
1
10000
∑
j
=
1
10000
(
θ
i
T
e
j
−
l
o
g
X
i
j
)
2
L=\sum_{i=1}^{10000}\sum_{j=1}^{10000}(\theta_i^Te_j-logX_{ij})^2
L=i=1∑10000j=1∑10000(θiTej−logXij)2
若两个词的词嵌入向量越相近,同时出现的次数越多,则对应的loss越小。
为了防止出现log0,即两个单词不会同时出现 ,无相关性的情况,对loss function引入一个权重因子
f
(
X
i
j
)
f(X_{ij})
f(Xij):
L
=
∑
i
=
1
10000
∑
j
=
1
10000
f
(
X
i
j
)
(
θ
i
T
e
j
−
l
o
g
X
i
j
)
2
L=\sum_{i=1}^{10000}\sum_{j=1}^{10000}f(X_{ij})(\theta_i^Te_j-logX_{ij})^2
L=i=1∑10000j=1∑10000f(Xij)(θiTej−logXij)2
当
X
i
j
=
0
X_{ij}=0
Xij=0时,权重因子
f
(
X
i
j
)
=
0
f(X_{ij})=0
f(Xij)=0。这种做法直接忽略了无任何相关性的context和target,只考虑
X
i
j
>
0
X_{ij}>0
Xij>0的情况。
出现频率较大的单词相应的权重因子
f
(
X
i
j
)
f(X_{ij})
f(Xij)较大,出现频率较小的单词相应的权重因子
f
(
X
i
j
)
f(X_ij)
f(Xij)较小一些,具体的权重因子
f
(
x
i
j
)
f(x_{ij})
f(xij)选取方法可查阅相关论文资料。
一般地,引入偏移量,则loss function表达式为:
L
=
∑
i
=
1
10000
∑
j
=
1
10000
f
(
X
i
j
)
(
θ
i
T
e
j
+
b
i
+
b
j
′
−
l
o
g
X
i
j
)
L=\sum_{i=1}^{10000}\sum_{j=1}^{10000}f(X_{ij})(\theta_i^Te_j+b_i+b_j^{'}-logX_{ij})
L=i=1∑10000j=1∑10000f(Xij)(θiTej+bi+bj′−logXij)
参数
θ
i
\theta_i
θi和
e
j
e_j
ej是对称的,使用优化算法得到所有参数之后,最终的
e
w
e_w
ew可表示为:
e
w
=
e
w
+
θ
w
2
e_w=\frac{e_w+\theta_w}{2}
ew=2ew+θw
无论使用skip-gram模型还是glove模型等等,计算得到的词嵌入向量E的每一个特征值不一定对应有实际物理意义的特征值,如gender,age等。
1.8、例子–情感分类
情感分类一般是根据一句话来判断其喜爱程度,例如1-5星分布,如下图所示:
情感分类问题的一个主要挑战是缺少足够多的训练样本,而单词嵌入恰恰可以帮助解决训练样本不足的问题。
首先介绍使用单词嵌入解决情感分类问题的一个简单模型算法。
这句话的4个单词分别用单词向量表示,
e
8928
,
e
2468
,
e
4694
,
e
3180
e_{8928},e_{2468},e_{4694},e_{3180}
e8928,e2468,e4694,e3180计算均值,这样得到的平均向量的维度仍是300,最后经过softmax输出1-5星,这种模型结构简单,计算量不大,不论句子长度多长,都使用平均的方式得到300D的词嵌入向量,该模型实际表现较好。但是,这种简单模型的缺点是使用平均方法,没有考虑句子中单词出现的次序,忽略其位置信息,而有时候,不同单词出现的次序直接决定了句意,即情感分类的结果,例如下面这句话:
Completely lacking in good taste, good service, and good ambience.
虽然这句话中包含了3个good,但其前面出现了lacking,很明显这句话句意是negative的,但是使用上面介绍的平均算法,则很可能会错误识别为positive的,因为忽略了单词出现的次序。
为了解决这一问题,情感分类的另一种模型是RNN。
该RNN模型是典型的many-to-one模型,考虑单词出现的次序,能够有效识别句子表达的真实情感。
值得一提的是使用词嵌入,能够有效提高模型的泛化能力,即使训练样本不多,也能保证模型有不错的性能。
1.9、词嵌入除偏
单词嵌入中存在一些性别、宗教、种族等偏见或者歧视,例如:
Man: Woman as King: Queen
Man: Computer programmer as Woman: Homemaker
Father: Doctor as Mother: Nurse
很明显,第二句话和第三句话存在性别偏见,因为woman和mother也可以是computer programmer和doctor。
例子:以性别偏见为例,来探讨如何消除单词嵌入中偏见。
首先,确定偏见bias的方向,方法是对所有性别对立的单词求差值,再平均,上图展示了bias direction和non-bias direction。
b
i
a
s
d
i
r
e
c
t
i
o
n
=
1
N
(
(
e
h
e
−
e
s
h
e
)
+
(
e
m
a
l
e
−
e
f
e
m
a
l
e
)
+
…
)
bias direction = \frac{1}{N}((e_{he}-e_{she})+(e_{male}-e_{female})+\dots)
biasdirection=N1((ehe−eshe)+(emale−efemale)+…)
然后,单词中立化,将需要消除性别偏见的单词投影到non-bias direction上去,消除bias维度,例如babysitter,doctor等。
最后,均衡对,让性别对立单词与上面的中立词距离相等,具有同样的相似度。例如让grandmother和grandfather与babysitter的距离同一化。
值得注意的是,掌握哪些单词需要中立化非常重要,一般来说,大部分英文单词,例如职业、身份等都需要中立化,消除词嵌入中性别这一维度的影响。