您的位置:首页 > 其它

深度学习-->NLP-->NNLM简介

2017-10-13 09:26 621 查看
本篇博文将总结NLP 里面的embedding,word2vector,以及NNLM 的简介。

embedding

在一般任务中,我们总是非常自然的用特征值来表示一个词汇。但是,到底怎么样表示一个词,才是最合理的? 存储其ASCII 码表示,只会告诉你这个词是什么,并不能表示这个词真正的语义(也许你可以从这个词的词缀中获得该词的词性或其他属性,但也只能获得这些东西)。更进一步的, 我们应该在什么场景下, 将这些词的表示联合起来考虑? 因为我们的神经网络,常常输入维度是整个词典的大小|V|,输出维度是标签集合的大小(一般远小于|v| )。如何从稀疏的高维空间生成较小的维度空间?

如果我们用one−hot 来表示词的话:



我们能得到如图的一个表示: 只有某一维度的值是1,其他维度都是0, 这个值为1的维度就代表这个词。

你可能马上就会意识到,这样表示如果词典大了,会不会向量就太长了?是的! 但这不是这个表示的最大问题,这个表示最大的问题是:它将所有单词视为彼此无关的独立实体。 但是,我们真正想要的表示,是表示词语的语义,显然有很多词的语义是相似的,而不是独立的. 一个好的表示,应该要把这些相似关系也刻画出来。

由此产生了word−embedding,给出一个文档,文档就是一个单词序列比如 “A B A C B F G”, 希望对文档中每个不同的单词都得到一个对应的向量(往往是低维向量)表示。比如,对于这样的“A B A C B F G” 的一个序列,也许我们最后能得到:A 对应的向量为[0.10.6−0.5],B 对应的向量为[−0.20.90.7] (此处的数值只用于示意)之所以希望把每个单词变成一个向量,目的还是为了方便计算,比如“求单词A 的同义词”,就可以通过“求与单词A 在cos 距离下最相似的向量”来做到。

数学上的概念,从一个空间映射到另外一个空间,保留基本属性。

word embedding 就是从一个高维空间(如:维度=词汇表长度=1M),映射到低维度空间(如300)。

在神经网络语言模型中,也就是 embedding lookup ,其实就是一个非线性变换。

非线性变换:embedding lookup

y=ebl(x)=W[x,:],W∈R|v|∗d

作用:int−>embedding,作用就是输入一个整数x,得到一个向量。

例如:



那么这个embedding 矩阵w怎么得到呢?在神经网络语言模型中,首先先验性的给定这个矩阵的shape,初始化,然后通过不断的学习学到这个矩阵。

NNLM(Neural Network Language Model)

首先看看n−gram 语言模型潜在的问题:

对“词”的理解有限

不能很好的理解每个词之间的联系和含义。

上下文的长度有限

我们以trigram 举例,[(a,b),c],即已知a,b 预测c,利用神经网络语言模型。



从上面的图可以看到有层input embeddings,那么结合上面说的,这个embedding 层有上面作用呢?我们可以这样简单理解,在对word 进行ont−hot 编码时,得出的矩阵是稀疏的,且每个word之间的相互独立的,但是在用embedding 之后得出的矩阵是稠密的,每个word 都能对于这个矩阵的每一行,可以看做对这个word 提取出了dim 个features。这样就有以下几个好处:

能够捕捉到词法的相似性。

good,better

能够捕捉到语法的相似性。

see,saw

能够捕捉到语义相似性。

dog,cat

找出每个词对应于embedding矩阵向量,然后将其在二维上可视化如下,越相似的word 距离越近。



NNLM 模型的基本思想可以概括如下:

假定词表中的每一个word 都对应着一个连续的特征向量;

假定一个连续平滑的概率模型,输入一段词向量的序列,可以输出这段序列的联合概率;

同时学习词向量的权重和概率模型里的参数。



我们可以将上面整个模型拆分成两部分加以理解:

首先是一个线性的embedding 层。它将输入的N−1 个one−hot 词向量,通过一个共享的D×V 的矩阵C,映射为N−1 个分布式的词向量(distributedvector)。其中,V 是词典的大小,D 是embedding 向量的维度(一个先验参数)。C 矩阵里存储了要学习的word vector。

其次是一个简单的前向反馈神经网络g 。它由一个tanh 隐层和一个softmax 输出层组成。通过将embedding 层输出的N−1 个词向量映射为一个长度为V 的概率分布向量,从而对词典中的word 在输入context 下的条件概率做出预估:

p(wt|w1,w2,...,wt−1)≈f(wt,wt−1,...,wt−n+1)=g(wi,C(wt−n+1),...,C(wt−1))

我们可以通过最小化一个cross−entropy 的正则化损失函数来调整模型的参数θ:

L(θ)=1T∑tlogf(wt,wt−1,...,wt−n+1)+R(θ)

为什么Embedding 会有这样的作用?即所谓的“特征学习/表示学习”(representation learning),也是Deep learning 的核心原因之一。

Word2Vec

同N−gram 模型一样,NNLM 模型只能处理定长的序列。

因此,Mikolov 等人在2010年提出了一种RNNLM 模型,用递归神经网络代替原始模型里的前向反馈神经网络,并将embedding 层与RNN 里的隐藏层合并,从而解决了变长序列的问题。

另一个问题就比较严重了。RNNLM 的训练太慢了。即便是在百万量级的数据集上,即便是借助了40个CPU进行训练,RNNLM 也需要耗时数周才能给出一个稍微靠谱的解来。显然,对于现在动辄上千万甚至上亿的真实语料库,训练一个RNNLM 模型几 乎是一个impossible mission。

我们对原始的NNLM 模型做如下改造:

移除前向反馈神经网络中非线性的hidden layer,直接将中间层的embedding layer 与输出层的softmax layer 连接;

忽略上下文环境的序列信息:输入的所有词向量均汇总到同一个embedding layer;将future words纳入上下文环境



说下右边skip_gram 模型,输入w(t)是一个one−hot 类型数据,然后通过一个线性的embedding 层,也就是通过学习到的D×V 的矩阵C进行embedding lookup,得到一个稠密向量,再进行softmax 来预测上下文的词。这就是skip_gram 模型,用来预测目标词周围的词,这里面全是线性的,没有任何非线性的操作。因此这种模型非常快,从而可以处理大量的数据。

用途:

寻找近义词。

用来作为别的自然语言任务的特征值。(训练过程中学习到embedding)

用来为别的Neural Network做初始化。(word2vec 训练出来的embedding 作为别的神经网络语言模型的embedding 的初始值)

word2Vec 代码实现可参考tensorflow实现word2vec,代码讲解可参考代码讲解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: