本篇博文将总结 N L P NLP NLP 里面的 e m b e d d i n g embedding embedding, w o r d 2 v e c t o r word2vector word2vector,以及 N N L M NNLM NNLM 的简介。
embedding
在一般任务中,我们总是非常自然的用特征值来表示一个词汇。但是,到底怎么样表示一个词,才是最合理的? 存储其 A S C I I ASCII ASCII 码表示,只会告诉你这个词是什么,并不能表示这个词真正的语义(也许你可以从这个词的词缀中获得该词的词性或其他属性,但也只能获得这些东西)。更进一步的, 我们应该在什么场景下, 将这些词的表示联合起来考虑? 因为我们的神经网络,常常输入维度是整个词典的大小 ∣ V ∣ |V| ∣V∣,输出维度是标签集合的大小(一般远小于 ∣ v ∣ |v| ∣v∣ )。如何从稀疏的高维空间生成较小的维度空间?
如果我们用 o n e − h o t one-hot one−hot 来表示词的话:
我们能得到如图的一个表示: 只有某一维度的值是1,其他维度都是0, 这个值为1的维度就代表这个词。
你可能马上就会意识到,这样表示如果词典大了,会不会向量就太长了?是的! 但这不是这个表示的最大问题,这个表示最大的问题是:它将所有单词视为彼此无关的独立实体。 但是,我们真正想要的表示,是表示词语的语义,显然有很多词的语义是相似的,而不是独立的. 一个好的表示,应该要把这些相似关系也刻画出来。
由此产生了 w o r d − e m b e d d i n g word-embedding word−embedding,给出一个文档,文档就是一个单词序列比如 “ A B A C B F G ” “A\ B\ A\ C\ B\ F\ G” “A B A C B F G”, 希望对文档中每个不同的单词都得到一个对应的向量(往往是低维向量)表示。比如,对于这样的 “ A B A C B F G ” “A\ B\ A\ C\ B\ F\ G” “A B A C B F G” 的一个序列,也许我们最后能得到: A A A 对应的向量为 [ 0.10.6 − 0.5 ] [0.1 0.6 -0.5] [0.10.6−0.5], B B B 对应的向量为 [ − 0.20.90.7 ] [-0.2 0.9 0.7] [−0.20.90.7] (此处的数值只用于示意)之所以希望把每个单词变成一个向量,目的还是为了方便计算,比如“求单词 A A A 的同义词”,就可以通过“求与单词 A A A 在 c o s cos cos 距离下最相似的向量”来做到。
数学上的概念,从一个空间映射到另外一个空间,保留基本属性。
w
o
r
d
e
m
b
e
d
d
i
n
g
word\ embedding
word embedding 就是从一个高维空间(如:维度=词汇表长度=1M),映射到低维度空间(如300)。
在神经网络语言模型中,也就是 e m b e d d i n g l o o k u p embedding\ lookup embedding lookup ,其实就是一个非线性变换。
非线性变换:
e
m
b
e
d
d
i
n
g
l
o
o
k
u
p
embedding\ lookup
embedding lookup
y
=
e
b
l
(
x
)
=
W
[
x
,
:
]
,
W
∈
R
∣
v
∣
∗
d
y = ebl(x) = W [x, :],W\in {R}^{|v|*d}
y=ebl(x)=W[x,:],W∈R∣v∣∗d
作用:
i
n
t
−
>
e
m
b
e
d
d
i
n
g
int -> embedding
int−>embedding,作用就是输入一个整数
x
x
x,得到一个向量。
例如:
那么这个 e m b e d d i n g embedding embedding 矩阵 w w w怎么得到呢?在神经网络语言模型中,首先先验性的给定这个矩阵的 s h a p e shape shape,初始化,然后通过不断的学习学到这个矩阵。
##NNLM(Neural Network Language Model)
首先看看 n − g r a m n-gram n−gram 语言模型潜在的问题:
-
对“词”的理解有限
不能很好的理解每个词之间的联系和含义。 -
上下文的长度有限
我们以 t r i g r a m trigram trigram 举例, [ ( a , b ) , c ] [(a,b),c] [(a,b),c],即已知 a , b a,b a,b 预测 c c c,利用神经网络语言模型。
从上面的图可以看到有层 i n p u t e m b e d d i n g s input\ embeddings input embeddings,那么结合上面说的,这个 e m b e d d i n g embedding embedding 层有上面作用呢?我们可以这样简单理解,在对 w o r d word word 进行 o n t − h o t ont-hot ont−hot 编码时,得出的矩阵是稀疏的,且每个 w o r d word word之间的相互独立的,但是在用 e m b e d d i n g embedding embedding 之后得出的矩阵是稠密的,每个 w o r d word word 都能对于这个矩阵的每一行,可以看做对这个 w o r d word word 提取出了 d i m dim dim 个 f e a t u r e s features features。这样就有以下几个好处:
- 能够捕捉到词法的相似性。
g o o d , b e t t e r good, better good,better - 能够捕捉到语法的相似性。
s e e , s a w see, saw see,saw - 能够捕捉到语义相似性。
d o g , c a t dog, cat dog,cat
找出每个词对应于 e m b e d d i n g embedding embedding矩阵向量,然后将其在二维上可视化如下,越相似的 w o r d word word 距离越近。
N N L M NNLM NNLM 模型的基本思想可以概括如下:
- 假定词表中的每一个 w o r d word word 都对应着一个连续的特征向量;
- 假定一个连续平滑的概率模型,输入一段词向量的序列,可以输出这段序列的联合概率;
- 同时学习词向量的权重和概率模型里的参数。
我们可以将上面整个模型拆分成两部分加以理解:
-
首先是一个线性的 e m b e d d i n g embedding embedding 层。它将输入的 N − 1 N−1 N−1 个 o n e − h o t one-hot one−hot 词向量,通过一个共享的 D × V D×V D×V 的矩阵 C C C,映射为 N − 1 N−1 N−1 个分布式的词向量 ( d i s t r i b u t e d v e c t o r ) (distributed vector) (distributedvector)。其中, V V V 是词典的大小, D D D 是 e m b e d d i n g embedding embedding 向量的维度(一个先验参数)。*** C C C 矩阵里存储了要学习的 w o r d v e c t o r word\ vector word vector。***
-
其次是一个简单的前向反馈神经网络 g g g 。它由一个 t a n h tanh tanh 隐层和一个 s o f t m a x softmax softmax 输出层组成。通过将 e m b e d d i n g embedding embedding 层输出的 N − 1 N−1 N−1 个词向量映射为一个长度为 V V V 的概率分布向量,从而对词典中的 w o r d word word 在输入 c o n t e x t context context 下的条件概率做出预估:
p ( w t ∣ w 1 , w 2 , . . . , w t − 1 ) ≈ f ( w t , w t − 1 , . . . , w t − n + 1 ) = g ( w i , C ( w t − n + 1 ) , . . . , C ( w t − 1 ) ) p({w}_{t}|{w}_{1},{w}_{2},...,{w}_{t−1})≈f({w}_{t},{w}_{t−1},...,{w}_{t−n+1})=g({w}_{i},C({w}_{t−n+1}),...,C({w}_{t−1})) p(wt∣w1,w2,...,wt−1)≈f(wt,wt−1,...,wt−n+1)=g(wi,C(wt−n+1),...,C(wt−1))
我们可以通过最小化一个
c
r
o
s
s
−
e
n
t
r
o
p
y
cross-entropy
cross−entropy 的正则化损失函数来调整模型的参数
θ
θ
θ:
L
(
θ
)
=
1
T
∑
t
l
o
g
f
(
w
t
,
w
t
−
1
,
.
.
.
,
w
t
−
n
+
1
)
+
R
(
θ
)
L(θ)=\frac{1}{T}\sum_{t}^{}logf({w}_{t},{w}_{t−1},...,{w}_{t−n+1})+R(θ)
L(θ)=T1t∑logf(wt,wt−1,...,wt−n+1)+R(θ)
为什么 E m b e d d i n g Embedding Embedding 会有这样的作用?即所谓的“特征学习/表示学习”( r e p r e s e n t a t i o n l e a r n i n g representation\ learning representation learning),也是 D e e p l e a r n i n g Deep\ learning Deep learning 的核心原因之一。
Word2Vec
同 N − g r a m N-gram N−gram 模型一样, N N L M NNLM NNLM 模型只能处理定长的序列。
因此, M i k o l o v Mikolov Mikolov 等人在2010年提出了一种 R N N L M RNNLM RNNLM 模型,用递归神经网络代替原始模型里的前向反馈神经网络,并将 e m b e d d i n g embedding embedding 层与 R N N RNN RNN 里的隐藏层合并,从而解决了变长序列的问题。
另一个问题就比较严重了。*** R N N L M RNNLM RNNLM 的训练太慢了***。即便是在百万量级的数据集上,即便是借助了40个CPU进行训练, R N N L M RNNLM RNNLM 也需要耗时数周才能给出一个稍微靠谱的解来。显然,对于现在动辄上千万甚至上亿的真实语料库,训练一个 R N N L M RNNLM RNNLM 模型几 乎是一个 i m p o s s i b l e m i s s i o n impossible \ mission impossible mission。
我们对原始的 N N L M NNLM NNLM 模型做如下改造:
-
移除前向反馈神经网络中非线性的 h i d d e n l a y e r hidden\ layer hidden layer,直接将中间层的 e m b e d d i n g l a y e r embedding\ layer embedding layer 与输出层的 s o f t m a x l a y e r softmax\ layer softmax layer 连接;
-
忽略上下文环境的序列信息:输入的所有词向量均汇总到同一个 e m b e d d i n g l a y e r embedding\ layer embedding layer;将 f u t u r e w o r d s future\ words future words纳入上下文环境
说下右边 s k i p _ g r a m skip\_gram skip_gram 模型,输入 w ( t ) w(t) w(t)是一个 o n e − h o t one-hot one−hot 类型数据,然后通过一个线性的 e m b e d d i n g embedding embedding 层,也就是通过学习到的 D × V D×V D×V 的矩阵 C C C进行 e m b e d d i n g l o o k u p embedding\ lookup embedding lookup,得到一个稠密向量,再进行 s o f t m a x softmax softmax 来预测上下文的词。这就是 s k i p _ g r a m skip\_gram skip_gram 模型,用来预测目标词周围的词,这里面全是线性的,没有任何非线性的操作。因此这种模型非常快,从而可以处理大量的数据。
用途:
- 寻找近义词。
- 用来作为别的自然语言任务的特征值。(训练过程中学习到 e m b e d d i n g embedding embedding)
- 用来为别的Neural Network做初始化。( w o r d 2 v e c word2vec word2vec 训练出来的 e m b e d d i n g embedding embedding 作为别的神经网络语言模型的 e m b e d d i n g embedding embedding 的初始值)
w o r d 2 V e c word2Vec word2Vec 代码实现可参考tensorflow实现word2vec,代码讲解可参考代码讲解