博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【论文阅读笔记】Convolutional Neural Networks for Sentence Classification
阅读量:2135 次
发布时间:2019-04-30

本文共 4033 字,大约阅读时间需要 13 分钟。

1 概览

Convolutional Neural Networks for Sentence Classification 的 ,本文将CNN和NLP结合;

介绍了一系列的对比实验,实验结果证明了:

  • 一个简单的(单层神经网络)的CNN模型
  • 一点超参数的调节(Filter的个数)
  • static word vector

另外,对cnn模型进行了小改动:将static vectors和non static vectors变成cnn模型中的两个channels,类似于图像中的rgb三通道。

  • non-static:就是词向量随着模型训练变化,这样的好处是词向量可以根据数据集做适当调整
  • static:就是直接使用word2vec训练好的词向量即可

卷积之后得到的列向量维度也是不同的,可以通过pooling来消除句子之间长度不同的差异

1.1 Pre-trained Word Vectors

当手头上没有large supervised training dataset的时候,用word2vec(或相似的unsupervised nlp模型得到)初始化word vectors能提高performance。

2 Model

这是本文的模型,基本也就是CNN的结构,可以看出TextCNN由输入层,卷积层,最大池化层,全连接层等四层构成。

在这里插入图片描述

2.1 输入层

一般由是onehot处理后的非负整数构成的向量,这里使用word2vec预训练好的词向量构建(或者随机初始化)。一般都会定义最大文本长度(25啊,50啊什么的),padding实现;

  • 左边是一个n*k的矩阵,表示一句话的n个词语,每个词语是一个k维向量(这里是 word2vec

2.2 卷积层

上图中是双通道2*3=6个卷积核,卷积核大小为 卷积大小(n-gram) * 词向量维度(embed) = 2 * 300 = 600,一般卷积大小设2,3,4,5等。论文中实现的是

  • a. CNN-rand(随机初始化词向量);

  • b.CNN-static(word2vec预训练词向量,训练过程中不变);

  • c. CNN-no-static(word2vec预训练词向量,训练过程中微调);

  • d. CNN-multichannel(多个通道,论文中使用的是双通道,即b和c)

  • 然后设置一个滑窗的长度h,用这个滑窗滑过整个矩阵,然后通过下面这个公式的计算,算出h对应的一个特征的向量c

    在这里插入图片描述

  • w是权重,b是偏移量,f就是一个非线性函数,即激活函数。

  • 形成这个向量,称为feature map。我们可以通过改变h的大小,生成很多feature maps

现在一般不直接用词向量,会构建Embedding层嵌入。

2.3 池化层

池化层工作与卷积层大同小异,不同于卷积层将卷积核中数据相加;池化层的池化核将池化核中数据求平均或者是只保留最大值。

论文中采用的是最大池化,然后级联。

最大池化层:对于每个feature map,采取选出这个向量中的最大值(意在找到最重要的特征),同时也解决了每个feature map不等长,统一了维度的问题。

2.4 全连接层

也叫输出层,是池化后级联,再使用图像领域中首先提出的的dropout,防止过拟合(也可加l2正则化b),然后使用激活函数分类输出。

然后再将这个传递到 全连接层:这是一个softmax层(因为涉及到句子的分类问题),输出的就是对于不同的label的概率分布

由于数据集相对较小,很容易就会发生过拟合现象,所以这里引如dropout来减少过拟合现象。

也就是产生一定的概率来mask掉一些点。

3 Model Variations

CNN-rand : 所有的word vector都是随机初始化的,在训练过程中更新

CNN-static : word vector用word2vec得出的结果,在整个train process中所有的words保持不变,只学习其他参数
CNN-non-static : pretrained vector在训练过程中要被fine-tuned
CNN-multichannel : two sets of word vectors. 初始化时两个channel都直接赋值word2vec得出的结果,每个filter也会分别applied到两个channel,但是训练过程中只有一个channel会进行BP
模型中除了这些参数改变,其他参数相同。

模型根据词向量的不同分为四种:

CNN-rand,所有的词向量都随机初始化,并且作为模型参数进行训练。

CNN-static,即用word2vec预训练好的向量(Google News),在训练过程中不更新词向量,句中若有单词不在预训练好的词典中,则用随机数来代替。
CNN-non-static,根据不同的分类任务,进行相应的词向量预训练。
CNN-multichannel,两套词向量构造出的句子矩阵作为两个通道,在误差反向传播时,只更新一组词向量,保持另外一组不变。
在七组数据集上进行了对比实验,证明了单层的CNN在文本分类任务中的有效性,同时也说明了用无监督学习来的词向量对于很多nlp任务都非常有意义。

static模型中word2vec预训练出的词向量会把good和bad当做相似的词,在sentiment classification任务中将会导致错误的结果,而non-static模型因为用了当前task dataset作为训练数据,不会存在这样的问题。具体可参看下图:

在这里插入图片描述

4 关于two channels of word vectors

one channel将word2vec得到的结果直接static的传入整个模型,另一个channel在BP训练过程中要进行fine-tune。每一个filter都要分别应用到这两个channels上。

例如上图中就能看出,系统有2 filters,对2个channels分别卷积后得到4 stacks。

5 Regularization

这里用到了dropout和l2正则项,避免过拟合。

dropout就是将pooling之后的结果随机mask一部分值。

比如,我们在这里pooling之后的结果是z,我们将z处理成y之后向前传递的时候,然后我们就做一个 and 操作。

每一次梯度下降,调整参数的时候,依靠这个阈值s来约束中间的参数。

6 Static vs. Non-static Representations

一句话,non-static更适应specific task

7 结论

  • CNN在NLP的一个尝试,并且效果还不错。

  • 同时证明了,pre-trained的word vector 是deep learning在NLP领域重要的组成部分

8 神经网络各层

  • 对于文本任务,输入层自然使用了word embedding来做input data representation。
  • 接下来是卷积层,大家在图像处理中经常看到的卷积核都是正方形的,比如44,然后在整张image上沿宽和高逐步移动进行卷积操作。但是nlp中输入的“image”是一个词矩阵,比如n个words,每个word用200维的vector表示的话,这个”image”就是n200的矩阵,卷积核只在高度上已经滑动,在宽度上和word vector的维度一致(=200),也就是说每次窗口滑动过的位置都是完整的单词不会将几个单词的一部分“vector”进行卷积,这也保证了word作为语言中最小粒度的合理性。(当然,如果研究的粒度是character-level而不是word-level,需要另外的方式处理
  • 由于卷积核和word embedding的宽度一致,一个卷积核对于一个sentence,卷积后得到的结果是一个vector, shape=(sentence_len - filter_window + 1, 1),那么,在max-pooling后得到的就是一个Scalar。所以,这点也是和图像卷积的不同之处,需要注意一下。
  • 正是由于max-pooling后只是得到一个scalar,在nlp中,会实施多个filter_window_size(比如3,4,5个words的宽度分别作为卷积的窗口大小),每个window_size又有num_filters个(比如64个)卷积核。一个卷积核得到的只是一个scalar太孤单了,智慧的人们就将相同window_size卷积出来的num_filter个scalar组合在一起,组成这个window_size下的feature_vector。
  • 最后再将所有window_size下的feature_vector也组合成一个single vector,作为最后一层softmax的输入。

注意到:一个卷积核对于一个句子,convolution后得到的是一个vector;max-pooling后,得到的是一个scalar。

9 模型的参数设置

  • filter windows: [3,4,5]
  • filter maps: 100 for each filter window
  • dropout rate: 0.5
  • l2 constraint: 3
  • randomly select 10% of training data as dev set(early stopping)
  • word2vec(google news) as initial input, dim = 300
  • sentence of length: n, padding where necessary
  • number of target classes
  • dataset size
  • vocabulary size

参考

[1]

[2]
[3]

转载地址:http://yyugf.baihongyu.com/

你可能感兴趣的文章
Redis学习笔记(三)—— 使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题
查看>>
Intellij IDEA使用(一)—— 安装Intellij IDEA(ideaIU-2017.2.3)并完成Intellij IDEA的简单配置
查看>>
Intellij IDEA使用(二)—— 在Intellij IDEA中配置JDK(SDK)
查看>>
Intellij IDEA使用(三)——在Intellij IDEA中配置Tomcat服务器
查看>>
Intellij IDEA使用(四)—— 使用Intellij IDEA创建静态的web(HTML)项目
查看>>
Intellij IDEA使用(五)—— Intellij IDEA在使用中的一些其他常用功能或常用配置收集
查看>>
Intellij IDEA使用(六)—— 使用Intellij IDEA创建Java项目并配置jar包
查看>>
Eclipse使用(十)—— 使用Eclipse创建简单的Maven Java项目
查看>>
Eclipse使用(十一)—— 使用Eclipse创建简单的Maven JavaWeb项目
查看>>
Intellij IDEA使用(十三)—— 在Intellij IDEA中配置Maven
查看>>
面试题 —— 关于main方法的十个面试题
查看>>
集成测试(一)—— 使用PHP页面请求Spring项目的Java接口数据
查看>>
使用Maven构建的简单的单模块SSM项目
查看>>
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
Redis学习笔记(四)—— redis的常用命令和五大数据类型的简单使用
查看>>
Win10+VS2015编译libcurl
查看>>
Windows下使用jsoncpp
查看>>
Ubuntu下测试使用Nginx+uWsgi+Django
查看>>
Windows下编译x264
查看>>
visual studio调试内存泄漏工具
查看>>