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

释放双眼,带上耳机,听听看~!

本篇博文将总结$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.1 0.6 -0.5]$,$B$ 对应的向量为$[-0.2 0.9 0.7]$ (此处的数值只用于示意)之所以希望把每个单词变成一个向量,目的还是为了方便计算,比如“求单词$A$ 的同义词”,就可以通过“求与单词$A$ 在$cos$ 距离下最相似的向量”来做到。

数学上的概念,从一个空间映射到另外一个空间,保留基本属性。
$word\ embedding$ 就是从一个高维空间(如:维度=词汇表长度=1M),映射到低维度空间(如300)。

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

非线性变换:$embedding\ lookup$
$y = ebl(x) = W [x, :],W\in {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$ 个分布式的词向量$(distributed vector)$。其中,$V$ 是词典的大小,$D$ 是$embedding$ 向量的维度(一个先验参数)。$C$ 矩阵里存储了要学习的$word\ vector$。

其次是一个简单的前向反馈神经网络$g$ 。它由一个$tanh$ 隐层和一个$softmax$ 输出层组成。通过将$embedding$ 层输出的$N−1$ 个词向量映射为一个长度为$V$ 的概率分布向量,从而对词典中的$word$ 在输入$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}))$$

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

$$L(θ)=\frac{1}{T}\sum_{t}^{}logf({w}_{t},{w}_{t−1},…,{w}_{t−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,代码讲解可参考代码讲解

给TA打赏
共{{data.count}}人
人已打赏
安全运维

MongoDB数据建模小案例:物联网时序数据库建模

2021-12-11 11:36:11

安全运维

Ubuntu上NFS的安装配置

2021-12-19 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索