NLP & Word Embeddings
参考博文:红色石头Will
一、词汇表征
之前的单词都是使用one-hot编码进行表示,one-hot表征单词的最大缺点是每个单词都是独立、正交的,不能知道单词之间的相似程度。
例如:
I want a glass of apple____
Iwant a glass of Orange ____
也许语言模型能够找到下一个单词是juice,但是不能学习到apple和Orange都是水果,词性相近;即学习到apple后面是juice,但是算法泛化能力差,不能推出与apple相近的orange后面也应该是juice。
在NLP中,希望算法能够掌握不同单词之间的相似程度,提高算法泛化能力。
因此,可以使用特征表征方式对单词进行编码。即使用一些列的features对单词进行量化,使用特征向量表示单词,如下图:
【有点类似协同过滤中电影特征的描述】
Apple和orang词性相近,所以在数值上会比较相近。在学习下面两句话时,可以根据这两个单词距离较近,通过第一句话的学习泛化到第二句话上。
I want a glass of apple____
Iwant a glass of Orange ____
特征表征方式也叫做词嵌入,直观理解就是:假设使用300个feature来量化单词,apple就会被嵌入到300维空间的某一位置,orange也会被嵌入到300维空间的某个位置,这两个单词在300维空间上的位置也许比较靠近。
二、使用词嵌入
使用特征表征方式(featurized representation)对单词编码,并构造RNN模型用于寻找句子中的人名。如下图:
通过学习第一句话,可以得到前面两个是人名;当我们测试第二句话时,因为apple和orange词性相近,所以也能得出这个句子前面的是人名。可以看出featurized representation优点是可以减少训练样本数目,并且使用更低维度的、更紧凑的向量来描述单词。
若句子最后两个单词是陌生单词(训练集没有这个单词)Durian cultivator(榴莲培育家),但是如果已经有了一个已经学习好的词嵌入,它会告诉你这个词组与apple farmer词性接近;这样即使训练集样本很少,也可以学习到Durian cultivator前面对应的是个人名。
这就是迁移学习的魅力,把从互联网上免费获得的大量无标签文本中学习到的知识(能够分辨Durian 、apple、orange都是水果的知识)迁移到姓名识别的任务里。
featurized representation的特性使得很多NLP任务能方便地进行迁移学习。迁移学习流程:
- 从海量词汇库中学习词嵌入(word embeddings),或者从网上下载训练好的词嵌入。
- 使用较少的训练样本,将词嵌入迁移到新的任务中取
- (可选)继续使用新数据微调词嵌入
建议仅当训练样本足够大的时候,再进行上述第三步。
词嵌入和人脸识别很像,不太一样的地方是人脸图片是不固定的,可以是数据库之外的。但是词嵌入中的单词都是固定的,当出现vocabulary之外的单词会用<UNK>表示。
三、词嵌入的特性
词嵌入可以帮我们找到不同单词之间的类似关系,如下图:
在人类常识中,“Man”和“Woman”的关系类似于“King”和“Queuen”的关系。利用词嵌入就能找到这种对应的类比关系。
将“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}≈\begin{bmatrix} -2 \\ 0 \\0\\0 \end{bmatrix} eman−ewoman=⎣ ⎡−10.010.030.09⎦ ⎤−⎣ ⎡10.020.020.01⎦ ⎤≈⎣ ⎡−2000⎦ ⎤
相同的操作给到“King”和“Queuen”:
e
K
i
n
g
−
e
Q
u
e
u
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_{Queuen}=\begin{bmatrix} -0.95 \\ 0.93 \\0.70\\0.02 \end{bmatrix}-\begin{bmatrix} 0.97 \\ 0.95 \\0.69\\0.01 \end{bmatrix}≈\begin{bmatrix} -2 \\ 0 \\0\\0 \end{bmatrix}
eKing−eQueuen=⎣
⎡−0.950.930.700.02⎦
⎤−⎣
⎡0.970.950.690.01⎦
⎤≈⎣
⎡−2000⎦
⎤
可以看到计算出来的结果是比较类似的,直观的感受是这两个词之间都是存在性别上的差异,所以第一个feature值特别大,其他feature特别小。
因此,A类比于B相当于C类比于“?”,这种问题可以使用词嵌入解决。
上面的问题就是寻找某个单词与"King"的关系,就想“Man”和“Woman”之间的关系一样,列出等式:
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 w o m a n − e m a n e_{?}≈e_{king}+e_{woman}-e_{man} e?≈eking+ewoman−eman
利用相似函数,问题变成找到与 e k i n g + e w o m a n − e m a n e_{king}+e_{woman}-e_{man} eking+ewoman−eman最相似的 e ? e_{?} e?;
常用的相似函数是余弦相似度函数(cosine similarity),表达式为:
S
i
m
(
u
,
v
)
=
u
T
⋅
v
∣
∣
u
∣
∣
⋅
∣
∣
v
∣
∣
Sim(u,v)=\frac{u^T\cdot v}{||u||⋅||v||}
Sim(u,v)=∣∣u∣∣⋅∣∣v∣∣uT⋅v
这个式子的值就是向量
u
u
u和
v
v
v之间夹角的余弦值。
u
u
u和
v
v
v夹角越小,值就越大(
c
o
s
0
=
1
cos0=1
cos0=1)
当然也可以使用欧式距离来计算相似度,即 ∣ ∣ u − v ∣ ∣ 2 ||u−v||^2 ∣∣u−v∣∣2,距离越大,相似性越小。
四、词嵌入矩阵
若某个词汇库包含了1000个单词,每个单词的特征维度是300;那么这个词嵌入矩阵维度是300x1000,用
E
E
E来表示这个矩阵。然后用
O
O
O+索引下标来表示one-hot编码,如下图所示:
我们想要提取orange的特征向量,用
E
E
E乘于
O
6
253
O_6253
O6253即可:
E
300
×
10
K
⋅
O
6257
=
[
…
…
]
300
×
1
=
e
6257
E_{300\times10K}\cdot O_{6257}= \begin{bmatrix} … \\…\\ \end{bmatrix}_{300\times 1}=e_{6257}
E300×10K⋅O6257=[……]300×1=e6257
但是效率不高,有很多的0乘运算。通常做法是直接从 E E E中选取第 w w w列作为 e w e_w ew即可。
五、学习词嵌入
词嵌入矩阵 E E E可以通过构建自然语言模型,运用梯度下降算法得到。
如我们的训练样本是下面这句话:
I w a n t a g l a s s o f o r a n g e ( j u i c e ) ————— . I\ want\ a\ glass\ of\ orange\ \underset{—————}{(juice)}. I want a glass of orange —————(juice).
想要预测单词是juice。
E
E
E是未知的,这几个单词的嵌入向量都可以使用
E
E
E和
o
w
o_w
ow计算出来;我们为了学习词嵌入矩阵构建了下图的自然语言模型:
这个模型中
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]都是需要学习的参数。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
E
E了。
未来保证神经网络输入维度固定,可以设置一个超参数:窗口值;窗口值指的是只看几个单词就进行预测。
如我们设置窗口值为4,只看前面4个单词即可:
- c o n t e x t : a g l a s s o f o r a n g e context:a\ glass\ of\ orange context:a glass of orange
- t a r g e t : j u i c e target:juice target:juice
c o n t e x t context context选择多种多样:
-
- target的前/后4个词
-
- 只看target附近的的1个词,如只看 g l a s s glass glass
-
- 只看target的前一个词,如只看 o r a n g e orange orange
如果想要构建自然语言模型,一般选取目标词的前几个单词作为
c
o
n
t
e
n
t
content
content;
若目标是学习
E
E
E,那么其他的
c
o
n
t
e
x
t
context
context选取方式都能得到不错的嵌入矩阵
E
E
E。
六、Word2Vec
下面介绍Skip-Gram模型:
以下面这个句子为例:
I want a glass of orange juice to go along with my cereal.
Skip-Gram模型做的是:
先随机选取一个单词作为
c
o
n
t
e
x
t
context
context,比如选择了
o
r
a
n
g
e
orange
orange;然后自定义一个范围,比如±10,在这个范围内随机选取一个单词作为
c
o
n
t
e
x
t
context
context,可以是
j
u
i
c
e
、
g
l
a
s
s
juice、glass
juice、glass或者是
m
y
my
my,假设选取的是
j
u
i
c
e
juice
juice。这样就构建了从
o
r
a
n
g
e
orange
orange到
j
u
i
c
e
juice
juice的监督学习样本。
采用上节课的自然语言模型,经过softmax层的输出为:
P
(
t
a
r
g
e
t
∣
c
o
n
t
e
x
t
)
=
y
^
=
e
θ
t
T
⋅
e
c
∑
j
=
1
10000
e
θ
j
T
⋅
e
c
P(target|context)=\hat{y}=\frac{e^{θ^T_{t}\cdot e_c}}{\sum^{10000}_{j=1}e^{θ^T_{j}\cdot e_c}}
P(target∣context)=y^=∑j=110000eθjT⋅eceθtT⋅ec
- θ t T θ^T_{t} θtT表示为 t a r g e t target target的参数
- e c e_c ec表示为 c o n t e n t content content的嵌入向量
- e c = E ⋅ o c e_c=E\cdot o_c ec=E⋅oc
对应损失函数为:
L
(
y
^
,
y
)
=
−
∑
i
=
1
10000
y
i
⋅
l
o
g
y
^
i
L(\hat{y},y)=-\sum\limits_{i=1}^{10000} {y_i\cdot log \hat{y}_i}
L(y^,y)=−i=1∑10000yi⋅logy^i
优化这个损失函数,就会得到一个不错的词嵌入举证 E E E。
但是在计算
y
^
\hat{y}
y^的时候,softmax的输出是10000个,所以分母计算量很大。解决的方式之一是使用hierarchical softmax classifier(分层softmax分类器);即在输出的时候采用二分类的方式逐层找到输出的值。分层softmax分类器输出可以如下图所示,一般是哈夫曼树:
Skip-Gram模型中随机采样的缺点:
the、of、a等此类单词出现频率高,因此会有很多时间都花在这些常用词身上,我们更希望能够花时间在apple、juice、orange这些词上。实际应用中,一般不选择随机均匀采样的方式来选择context,而是使用其它算法来处理这类问题。
七、负采样
Negative sampling(负采样)是另一种有效求解 E E E的方法。
它做法是选取一个正样本对,其label设置为y=1;如选取“orange”作context 、“juice”作target ;再选取k个负样本对,其label设置为y=0;如下图所示:
一般k的选取要满足:
- 若训练样本较小,k一般选择5~20;
- 若训练样本较大,k一般选择2~5即可。
接下来将原来的softmax的10000个输出看作是10000个二分类问题,使用sigmoid的就能解决。
则这10000个二分类输出的值含义为:
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)
即当选定
c
o
n
t
e
n
t
content
content和
t
a
r
g
e
t
target
target时,y=1的概率。
在训练时,只更新这k+1个二分类问题分支,其余10000-(k+1)节点不管。negative sampling转化为k+1个二分类问题,计算量要小很多,大大提高了模型运算速度。
如何随机抽取负样本?
可以根据单词出现的频率进行选择,单词抽取概率公式为:
P
(
w
i
)
=
f
(
w
i
)
3
4
∑
j
10000
f
(
w
i
)
3
4
P(w_i)=\frac{f(w_i)^{\frac{3}{4}}}{\sum ^{10000}_jf(w_i)^{\frac{3}{4}}}
P(wi)=∑j10000f(wi)43f(wi)43
- f ( w i ) f(w_i) f(wi)为单词 w i w_i wi出现的频率。
八、GloVe词向量
【没听懂,待完善,此部分来自红色石头Will博客】
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。
GloVe模型的loss function为:
L = ∑ i = 1 10000 ∑ j = 1 10000 ( θ i T e j − l o g X i j ) 2 L=\sum\limits_{i=1}^{10000} \sum\limits_{j=1}^{10000} {(θ^T_ie_j−logX_{ij})^2} L=i=1∑10000j=1∑10000(θiTej−logXij)2
从上式可以看出,若两个词的embedding vector越相近,同时出现的次数越多,则对应的loss越小。
为了防止出现“log 0”,即两个单词不会同时出现,无相关性的情况,对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\limits_{i=1}^{10000} \sum\limits_{j=1}^{10000} {f(X_{ij})(θ^T_ie_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)也小,可采取其他的取值方式,具体的权重因子 f ( X i j ) f(X_{ij}) f(Xij)选取方法可查阅相关论文资料。
值得注意的是,参数
θ
i
θ_i
θi和
e
j
e_j
ej是对称的。使用优化算法得到所有参数之后,最终的
e
w
e_w
ew可表示为:
e
w
=
e
w
+
θ
w
2
e_w=\frac{e_w+θ_w}{2}
ew=2ew+θw
最后提一点的是,无论使用Skip-Gram模型还是GloVe模型等等,计算得到的embedding matrix E E E的每一个特征值不一定对应有实际物理意义的特征值,如gender,age等。
九、情绪分类
情绪分类:根据一句话来判断其喜爱程度。例如外卖后的服务反馈,如下图:
上图的情绪分类问题就是寻找一句话( x x x)到喜爱程度( y y y)的映射。
情绪分类问题的主要问题是缺失足够多的训练样本,但词嵌入(迁移学习)可以解决训练样本不够的问题。
使用词嵌入的情感问题模型结构如下:
我们想要判断The dessert is excellent这句话的情绪分(1-5分)。
和之前一样,将各单词的one-hot编码与 E E E相乘得到各单词的嵌入向量 e w e_w ew;然后将所以单词的嵌入向量 e w e_w ew相加取平均,平均后的结果向量作为softmax函数的输入,最后输出1-5分的预测值 y ^ \hat{y} y^。
取平均这个做法存在问题,如下面这句话:
Completely lacking in good taste, good service, and good ambience.
有很多的good,平均后情绪会偏向好的情感。但是前面有个否定词lacking,这样预测的结果就会相反了。
为了解决这个问题,采用RNN情感分类模型,模型结构如下图所示:
只在最后一个时间步输出情感分类;该RNN模型是典型的many-to-one模型,考虑单词出现的次序,能够有效识别句子表达的真实情感。值得一提的是使用word embedding,能够有效提高模型的泛化能力,即使训练样本不多,也能保证模型有不错的性能。
十、词嵌入去除偏见
词嵌入存在性别、宗教、种族上的一些偏见。
例如:
人们在寻找Man:Computer programmer相类比的Woman:“?”时;结果是Homemaker。很明显,这存在着偏见,因为Man和Woman都可以是Computer programmer。
以性别为例子,如何消除词嵌入中的偏见呢?【红色石头Will】
首先,确定偏见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})+⋯) biasdirection=N1((ehe−eshe)+(emale−efemale)+⋯)
然后,单词中立化(Neutralize)。将需要消除性别偏见的单词投影到non-bias direction上去,消除bias维度,例如babysitter,doctor等。
最后,均衡对(Equalize pairs)。让性别对立单词与上面的中立词距离相等,具有同样的相似度。例如让grandmother和grandfather与babysitter的距离同一化。
值得注意的是,掌握哪些单词需要中立化非常重要。一般来说,大部分英文单词,例如职业、身份等都需要中立化,消除embedding vector中性别这一维度的影响。