您的位置:首页 > 其它

深度学习在NLP中的应用

2016-08-17 10:57 393 查看

深度学习在NLP中的应用

1 引言

    文本分类这个在NLP领域是一个很普通而应用很广的课题,而且已经有了相当多的研究成果,比如应用很广泛的基于规则特征的SVM分类器,以及加上朴素贝叶斯方法的SVM分类器,当然还有最大熵分类器、基于条件随机场来构建依赖树的分类方法。在传统的文本分类词袋模型中,在将文本转换成文本向量的过程中,往往会造成文本向量维度过大的问题,当然也有其他的压缩了维度的一些分类方法。还有一些是基于人工的提取规则,甚至是hard
coding方式。这样不利于算法的推广。近些年随着深度神经网络(Deep Neural Network, DNN)的兴起,人们开始尝试用DNN解决文本分类的问题。从2013年的word2vec开始,自然语言处理领域引爆了深度学习这个热点,至今已经快3年了。目前取得重要成果的NLP任务大多在文本理解范畴,如文本分类,机器翻译,文档摘要,阅读理解等。本文主要介绍在文本分类中最常用深度神经网络——卷积神经网络(Convolutional Neural Networks, CNNs)和循环神经网络(Recurrent
Neural Networks,RNNs)。

2 CNN篇

    当听到CNN时,我们首先联想到的它在图像处理领域取得的突破。在ImageNet比赛中,微软团队基于深度卷积神经网络(CNN)的计算机视觉系统首次超越了人类进行对象识别分类的能力。他们的系统在ImageNet 2012分类数据集中的错误率已降低至4.94%。此前同样的实验中,人眼辨识的错误率大概为5.1%。这个数据集包含约120万张训练图像、5万张验证图像和10万张测试图像,分为1000个不同的类别。

2.1 那么,如何将它们用于NLP呢?

    NLP任务的输入不再是像素点了,大多数情况下是以矩阵表示的句子或者文档。矩阵的每一行对应于一个分词元素,一般是一个单词,也可以是一个字符。也就是说每一行是表示一个单词的向量。通常,这些向量都是word embeddings(一种低维度表示)的形式,如word2vec和GloVe,但是也可以用one-hot向量的形式,也即根据词在词表中的索引。若是用100维的词向量表示一句10个单词的句子,我们将得到一个10x100维的矩阵作为输入。这个矩阵相当于是一幅“图像”。

    在计算机视觉的例子里,我们的滤波器每次只对图像的一小块区域运算,但在处理自然语言时滤波器通常覆盖上下几行(几个词)。因此,滤波器的宽度也就和输入矩阵的宽度相等了。尽管高度,或者区域大小可以随意调整,但一般滑动窗口的覆盖范围是2-5行。综上所述,处理自然语言的卷积神经网络结构是这样的(花几分钟时间理解这张图片,以及维度是如何变化的。你可以先暂时忽略池化操作,我们在稍后会解释它):



第一列:把每个单词的word embedding拼接起来组成的矩阵,我们可以把它当做图像处理中的一幅图像。
第二列:这里我们对滤波器设置了三种尺寸:2、3和4行,每种尺寸各有两种滤波器。每个滤波器对句子矩阵做卷积运算,得到不同程度的特征。
第三列:使用激励函数将2维的特征装换成1维的特征。
第四列:然后对每个特征做最大值池化,也就是只记录每个特征的最大值。这样,就由六个不同程度特征生成了一串单变量特征向量,然后这六个特征拼接形成一个特征向量,传给网络的倒数第二层。最后的softmax层以这个特征向量作为输入,用其来对句子做分类
第五列:我们假设这里是二分类问题,最终的输出层有两个节点。

2.2 计算机视觉完美的直观感受这里还存在吗?

       在图像处理中,CNN具有位置不变性和局部组合性对图像来说很直观,但对NLP却并非如此。你也许会很在意一个词在句子中出现的位置。相邻的像素点很有可能是相关联的(都是物体的同一部分),但单词并不总是如此。在很多种语言里,短语之间会被许多其它词所隔离。同样,组合性也不见得明显。单词显然是以某些方式组合的,比如形容词修饰名词,但若是想理解更高级特征真正要表达的含义是什么,并不像计算机视觉那么明显了。

      由此看来,卷积神经网络似乎并不适合用来处理NLP任务。循环神经网络(Recurrent Neural Network)更直观一些。它们模仿我们人类处理语言的方式(至少是我们自己所认为的方式):从左到右的顺序阅读。庆幸的是,这并不意味着CNNs没有效果。许多模型都是错的,只是一些能被利用。实际上CNN对NLP问题的效果非常理想。正如词袋模型(Bag of Words Model),它明显是基于错误假设的过于简化模型,但这不影响它取得了不错的效果。

2.3 实际应用的例子

(1)Convolutional Neural Networks for Sentence Classification

Yoon Kim在不同的分类数据集上评估CNN模型,主要是基于语义分析和话题分类任务。CNN模型在各个数据集上的表现非常出色,甚至有个别刷新了目前最好的结果。令人惊讶的是,这篇文章采用的网络结构非常简单,但效果相当棒。输入层是一个表示句子的矩阵,每一行是word2vec词向量。接着是由若干个滤波器组成的卷积层,然后是最大池化层,最后是softmax分类器。该论文也尝试了两种不同形式的通道,分别是静态和动态词向量,其中一个通道在训练时动态调整而另一个不变。



Yoon Kim在7个数据集上做了验证,其中4个数据集上CNN取得了最好的效果。





(2)A Convolutional Neural Network for Modelling Sentences
在此基础上,Nal Kalchbrenner等人提出一个类似的结构,但更复杂一些。



Nal Kalchbrenne做了三组实验:
(a) Sentiment Prediction in Movie Reviews
实验数据是Stanford Sentiment Treebank的电影评论数据,输出是2类(积极、消极)和5类(negative, somewhat negative, neutral, somewhat positive, positive)。2类问题上训练集/验证集/测试集的大小为:6920/872/1821;5类问题上训练集/验证集/测试集的大小为:8544/1101/2210。用准确率来衡量结果,实验结果如下:



(b) Question Type Classification
为了协助问答系统,一条问题需要被分到相应的类别。实验数据选用TREC questions dataset,数据集包括6个类。训练数据有5425条,测试数据有500条。实验结果如下:



(c) Twitter Sentiment Prediction
第三个实验有关Twitter的情感分析。根据情感符号,标注了160万条的训练数据;然后手工标注了400条的测试数据。实验结果如下:



3 RNN篇

    循环神经网络(Recurrent Neural Networks,RNNs)已经在众多自然语言处理任务中取得了巨大成功以及广泛应用。RNN主要用于处理序列数据。在传统的神经网络模型中,层与层之间是全连接的,层内的节点是无连接的。这种普通的神经网络对于很多问题表现欠佳。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNN之所以称为循环神经网路是因为序列中每个元素的输出不仅与当前的输入有关,而且与之前的状态有关。我们可以把RNN当做是有记忆的网络,会对前面的信息进行记忆并应用于当前输出的计算中。理论上,RNN能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关。下图是RNN一种典型样例:



3.1 为什么RNN如此引人痴迷?

传统的神经网络以及CNN都有一个明显的限制:它们的输入、输出都是固定大小的。除此之外,这些模型使用固定的计算步骤来将输入映射到输出,比如说固定的层数。RNN就很好的突破了这两个限制,RNN允许输入、输出都是序列。下面几个例子能更生动解释这点。



上图每个矩形框代表一个vector,允许对其进行各种操作。我们用红色的矩形框代表输入、绿色的代表隐含层的状态、蓝色代表网络的输出。从左到右依次解释着5个网络。(a)没有利用RNN,固定的输入映射到固定的输出(例如:图片分类)。(b)固定的输入,序列输出(例如:图片描述,给定一张固定大小的图片,输出一句描述图片内容的自然语言)。(c)序列输入、固定的输出(例如:情感分析,输入是一条句子,输出是积极或者消极的情感判断)。(d)序列的输入、序列的输出(例如:机器翻译,输入是一条英文句子,输出是一条中文句子)。(e)同步的序列输入、序列输出(例如:视频镜头的分类,输入是一部video,输出是对每一帧的分类)。

3.2 RNN能做什么?

    RNN在许多NLP任务中已经取得了成功应用。前面粗略的介绍了一些不同结构RNN的应用,下面将更加详细的介绍他在传统的NLP tasks上的应用,并给出一些拓展阅读文献。

(1)语言模型和文本生成

给定一条文字序列,我们想要判定在给定之前字的情况下,当前字出现的概率。这就是语言模型的任务,它可以用于评估一条文字序列是通顺句子的概率。换一个角度,给定一条文字序列,判断下一个最有可能的文字。这就可以用于文章生成。Andrej Karpathy使用莎士比亚的作品作为训练集,最后生成具有莎士比亚风格的文章。Rui
Yan等人在ACL2016上发表了他们使用RNN网络自动生成对联。

更多语言模型和文本生成的内容可以阅读下面的论文:

Recurrent neural network based language model
Extensions of Recurrent neural network based language model
Generating Text with Recurrent Neural Networks
(2)机器翻译

到目前为止,机器翻译仍是NLP的一个难点。机器翻译有点类似于语言模型,输入输出都是序列。不同之处在于机器翻译的只有在源语句全部输入后,目标语句才开始输出。因为翻译输出的第一个词可能要求获取整个句子的信息。



更多机器翻译的内容可以阅读下面的论文:

A Recursive Recurrent Neural Network for Statistical Machine Translation
Sequence to Sequence Learning with Neural Networks
Joint Language and Translation Modeling with Recurrent Neural Networks
(3)语言识别

给定一条语音信号的输入,我们可以预测对应的文字输出。

具体的论文如下:

Towards End-to-End Speech Recognition with Recurrent Neural Networks
【参考文献】
Recurrent Neural Networks Tutorial
Understanding Convolutional Neural Networks
for NLP

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息