Introduction to Word Embeddings
Word Representation
在之前的学习中,我们已经学习使用了one-hot的方式对单词进行编码。
但是这种one-hot的方式的缺点就是每个单词都是相互独立的,无法知道不同单词之间的相似程度。例如Apple和Orange都是水果,词性相近,但是单从one-hot编码上来看,内积为零,无法知道两者的相似性。但是我们希望能得到单词之间的相似程度。
因此我们使用了特征表征:词嵌入的方法对每个单词进行编码。也就是使用一个特征向量表征单词,特征向量的每个元素都是对该单词某一特征的量化描述,量化范围可以是[-1,1]之间。
这种表征方式使得词与词之间的相似性很容易地表征出来,这样对于不同的单词,模型的泛化性能会好很多。
每个单词都由高维特征向量表征,为了可视化不同单词之间的相似性,可以使用降维操作,例如t-SNE算法,将300D降到2D平面上。如下图所示:
而且很明显,我们可以看出词嵌入确实容易使词与词之间的相似性表现出来。
Using word embeddings
Word Embeddings对不同单词进行了实现了特征化的表示,那么如何将这种表示方法应用到自然语言处理的应用中呢?
名字实体识别的例子:
如下面的一个句子中名字实体的定位识别问题,假如我们有一个比较小的数据集,可能不包含durain(榴莲)和cultivator(培育家)这样的词汇,那么我们就很难从包含这两个词汇的句子中识别名字实体。但是如果我们从网上的其他地方获取了一个学习好的word Embedding,它将告诉我们榴莲是一种水果,并且培育家和农民相似,那么我们就有可能从我们少量的训练集中,归纳出没有见过的词汇中的名字实体。
词嵌入的迁移学习:
方法是:
- 从海量词汇库中学习word embeddings,即所有单词的特征向量。或者从网上下载预训练好的word embeddings。
- 使用较少的训练样本,将word embeddings迁移到新的任务中。
- (可选):继续使用新数据微调word embeddings。
建议仅当训练样本足够大的时候,再进行上述第三步。
有趣的是,word embeddings与之前卷积神经网络介绍的人脸编码之间存在一定的联系。人脸图片经过Siamese网络,得到其特征向量f(x),这点跟word embedding是类似的。二者不同的是Siamese网络输入的人脸图片可以是数据库之外的;而word embedding一般都是已建立的词汇库中的单词,非词汇库单词统一用< UNK >表示。
Properties of word embeddings
Word embeddings可以帮助我们找到不同单词之间的相似类别关系。如下图所示:
上例中,特征维度是4维的,分别是[Gender, Royal, Age, Food]。常识上 ,Man与Woman的关系类比于King与Queen的关系。
计算词与词之间的相似度,实际上是在多维空间中,寻找词向量之间各个维度的距离相似度。
如上图所示,根据等式
e
m
a
n
−
e
w
o
m
a
n
≈
e
k
i
n
g
−
e
?
e_{man}−e_{woman}≈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.
关于相似函数,比较常用的是cosine similarity。其表达式为:
S
i
m
(
u
,
v
)
=
u
T
v
∣
∣
u
∣
∣
⋅
∣
∣
v
∣
∣
Sim(u,v)=\frac{u^Tv}{||u||\cdot ||v||}
Sim(u,v)=∣∣u∣∣⋅∣∣v∣∣uTv
还可以计算Euclidian distance来比较相似性,即
∣
∣
u
−
v
∣
∣
2
||u−v||^2
∣∣u−v∣∣2。距离越大,相似性越小。
Embedding matrix
上述图片表示单词表中包含10000个单词,每个单词包含的特征维度为300,那么表征所有单词的embedding matrix维度为300X10000,用E来表示。某单词j的one-hot向量表示为 O j O_j Oj,维度为10000X1,则该单词的embedding vector表达式为:
e j = E ⋅ O j e_j=E\cdot O_j ej=E⋅Oj
值得一提的是,上述这种矩阵乘积运算 E ⋅ O j E⋅O_j E⋅Oj效率并不高,矩阵维度很大,且 O j O_j Oj大部分元素为零。通常做法是直接从E中选取第j列作为 e j e_j ej即可。
Learning Word Embeddings:Word2vec & GloVe
Learning word embeddings
embedding matrix E可以通过构建自然语言模型,运用梯度下降算法得到。比如说,输入样本是下面这句话:
I want a glass of orange (juice).
通过这句话的前6个单词,预测最后的单词“juice”。E未知待求,每个单词可用embedding vector e w e_w ew表示。构建的神经网络模型结构如下图所示:
神经网络输入层包含6个embedding vactors,每个embedding vector维度是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]为待求值。对足够的训练例句样本,运用梯度下降算法,迭代优化,最终求出embedding matrix E。
这种算法的效果还不错,能够保证具有相似属性单词的embedding vector相近。
为了让神经网络输入层数目固定,可以选择只取预测单词的前4个单词作为输入,例如该句中只选择“a glass of orange”四个单词作为输入。当然,这里的4是超参数,可调。
一般地,我们把输入叫做context,输出叫做target。对应到上面这句话里:
-
context: a glass of orange
-
target: juice
关于context的选择有多种方法:
-
target前n个单词或后n个单词,n可调
-
target前1个单词
-
target附近某1个单词(Skip-Gram)
事实证明,不同的context选择方法都能计算出较准确的embedding matrix EE。
Word2Vec
Word2Vec算法是一种简单的计算更加高效的方式来实现对词嵌入的学习。
Skip-grams:
在Skip-grams模型中,我们需要抽取上下文(Content)和目标词(Target)配对,来构造一个监督学习问题。
上下文不一定是要目标词前面或者后面离得最近的几个单词,而是随机选择一个词作为上下文,同时在上下文的一定距离范围内随机选择另外一个词作为目标词。构造这样一个监督学习问题的目的,并不是想要解决监督学习问题本身,而是想要使用这个问题来学习一个好的词嵌入模型。
模型流程:
- 使用一个具有大量词汇的词汇表,如Vocab size = 10000k;
- 构建基本的监督学习问题,也就是构建上下文(C)和目标词(T)的映射关系:C——T;
- o c o_c oc(one-hot)——E(词嵌入矩阵)—— e c = E ∗ o c e_c=E∗o_c ec=E∗oc(词嵌入)——Softmax层——ŷ ;
- Softmax: p ( t ∣ c ) = e Θ t T e c ∑ j = 1 10000 e Θ j T e c p(t|c)=\frac{e^{Θ^T_te_c}}{∑_{j=1}^{10000}e^{Θ^T_je_c}} p(t∣c)=∑j=110000eΘjTeceΘtTec,其中 Θ t Θ_t Θt是与输出t有关的参数;
- 损失函数: L ( y ^ , y ) = − ∑ i = 1 10000 y i l o g y ^ i L(\hat{y},y)=−∑_{i=1}^{10000}y_ilog{\hat{y}_i} L(y^,y)=−∑i=110000yilogy^i,这是在目标词y表示为one-hot向量时,常用的softmax损失函数。
- 通过反向传播梯度下降的训练过程,可以得到模型的参数E和softmax的参数。
存在的问题:
- 计算速度的问题,如在上面的Softmax单元中,我们需要对所有10000个整个词汇表的词做求和计算,计算量庞大。
- 简化方案:使用分级softmax分类器(相当于一个树型分类器,每个节点都是可能是一个二分类器),其计算复杂度是前面的log|v|级别。在构造分级softmax分类器时,一般常用的词会放在树的顶部位置,而不常用的词则会放在树的更深处,其并不是一个平衡的二叉树。
如何采样上下文:
在构建上下文目标词对时,如何选择上下文与模型有不同的影响。
- 对语料库均匀且随机地采样:使得如the、of、a等这样的一些词会出现的相当频繁,导致上下文和目标词对经常出现这类词汇,但我们想要的目标词却很少出现。
- 采用不同的算法来平衡常见和不常见的词进行采样。这种方法是实际使用的方法。
Negative Sampling
Skip-grams模型可以帮助我们构造一个监督学习任务,将上下文映射到目标词上,从而让我们能够学习到一个实用的词嵌入模型。但是其缺点就是softmax计算的时间复杂度较高。下面介绍一种改善的学习问题:负采样。其能够做到的和Skip-grams模型相似,但其学习算法更加有效。
它的做法是判断选取的context word和target word是否构成一组正确的context-target对,一般包含一个正样本和k个负样本。例如,“orange”为context word,“juice”为target word,很明显“orange juice”是一组context-target对,为正样本,相应的target label为1。若“orange”为context word不变,target word随机选择“king”、“book”、“the”或者“of”等。这些都不是正确的context-target对,为负样本,相应的target label为0。一般地,固定某个context word对应的负样本个数k一般遵循:
- 若训练样本较小,k一般选择5~20;
- 若训练样本较大,k一般选择2~5即可。
Negative sampling的数学模型为:
P
(
y
=
1
∣
c
,
t
)
=
σ
(
θ
t
T
⋅
e
c
)
P(y=1|c,t)=σ(θ^T_t⋅e_c)
P(y=1∣c,t)=σ(θtT⋅ec)
其中,σ表示sigmoid激活函数。
很明显,negative sampling某个固定的正样本对应k个负样本,即模型总共包含了k+1个binary classification。对比之前介绍的10000个输出单元的softmax分类,negative sampling转化为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}}{∑^{10000}_jf(w_j)^{\frac{3}{4}}} P(wi)=∑j10000f(wj)43f(wi)43
其中, f ( w i ) f(w_i) f(wi)表示单词 w i w_i wi在单词表中出现的频率。
GloVe word vectors
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}≠X_{ji} Xij̸=Xji。接下来的讨论中,我们默认存在对称关系 X i j = X j i X_{ij}=X_{ji} Xij=Xji。
模型的优化目标如下:
m i n i m i z e ∑ i = 1 10000 ∑ j = 1 10000 f ( X i j ) ( Θ i T e j + b i + b j − l o g X i j ) 2 minimize∑_{i=1}^{10000}∑_{j=1}^{10000}f(X_{ij})(Θ^T_ie_j+b_i+b_j−logX_{ij})^2 minimize∑i=110000∑j=110000f(Xij)(ΘiTej+bi+bj−logXij)2
- 其中,因为当 X i j X_{ij} Xij为0时, l o g X i j logX_{ij} logXij便没有意义,所以添加 f ( X i j ) f(X_{ij}) f(Xij)的加权项,当 X i j = 0 X_{ij}=0 Xij=0时, f ( X i j ) = 0 f(X_{ij})=0 f(Xij)=0,另外 f ( X i j ) f(X_{ij}) f(Xij)对于一些频繁词和不频繁词有着启发式的平衡作用;
- 另外, Θ i T e j Θ^T_ie_j ΘiTej这一项中, Θ i T Θ^T_i ΘiT和 e j e_j ej都是需要学习的参数,在这个目标算法中二者是对称的关系,所以我们可以一致地初始化Θ和e,然后用梯度下降来最小化输出,在处理完所有词后,直接取二者的平均值作为词嵌入向量: e w f i n a l = e w + Θ w 2 e^{final}_w=\frac{e_w+Θ_w}{2} ewfinal=2ew+Θw,这与前面的算法有所不同。
从上面的目标中,可以看出我们想要学习一些向量,他们的输出能够对上下文和目标两个词同时出现的频率进行很好的预测,从而得到我们想要的词嵌入向量。
最后提一点的是,无论使用Skip-Gram模型还是GloVe模型等等,计算得到的embedding matrix E的每一个特征值不一定对应有实际物理意义的特征值,如gender,age等。
Application using Word Embeddings
Sentiment Classification
情感分类一般是根据一句话来判断其喜爱程度,例如1~5星分布。如下图所示:
情感分类问题的一个主要挑战是缺少足够多的训练样本。而Word embedding恰恰可以帮助解决训练样本不足的问题。
首先介绍使用word embedding解决情感分类问题的一个简单模型算法。
上图利用四个单词的embedding vector表示,通过计算均值,得到的向量维度依然为300.最后经过softmax输出1-5星。这种模型结构简单,计算量不大,不论句子长度多长,都使用平均的方式得到300D的embedding vector。该模型实际表现较好。
但是,这种简单模型的缺点是使用平均方法,没有考虑句子中单词出现的次序,忽略其位置信息。而有时候,不同单词出现的次序直接决定了句意,即情感分类的结果。例如下面这句话:
Completely lacking in good taste, good service, and good ambience.
虽然这句话中包含了3个“good”,但是其前面出现了“lacking”,很明显这句话句意是negative的。如果使用上面介绍的平均算法,则很可能会错误识别为positive的,因为忽略了单词出现的次序。
为了解决这一问题,情感分类的另一种模型是RNN。
该RNN模型是典型的many-to-one模型,考虑单词出现的次序,能够有效识别句子表达的真实情感。
值得一提的是使用word embedding,能够有效提高模型的泛化能力,即使训练样本不多,也能保证模型有不错的性能。
###Debiasing word embeddings
Word embeddings中存在一些性别、宗教、种族等偏见或者歧视。例如下面这三句话:
Man: Woman as King: Queen
Man: Computer programmer as Woman: Homemaker
Father: Doctor as Mother: Nurse
很明显,第二句话和第三句话存在性别偏见,因为Woman和Mother也可以是Computer programmer和Doctor。
以性别偏见为例,我们来探讨下如何消除word embeddings中偏见。
首先,确定偏见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})+⋯) bias direction=N1((ehe−eshe)+(emale−efemale)+⋯)
然后,单词中立化(Neutralize)。将需要消除性别偏见的单词投影到non-bias direction上去,消除bias维度,例如babysitter,doctor等。
最后,均衡对(Equalize pairs)。让性别对立单词与上面的中立词距离相等,具有同样的相似度。例如让grandmother和grandfather与babysitter的距离同一化。
值得注意的是,掌握哪些单词需要中立化非常重要。一般来说,大部分英文单词,例如职业、身份等都需要中立化,消除embedding vector中性别这一维度的影响。