深度学习之textCNN(四)

本文主要介绍CNN在自然与言处理(文本分类)上的使用,主要分为几个结构

(1)专有名词介绍

(2)模型介绍

(3)应用举例

(4)参数调优

一、专有名词介绍

word vector:词向量、将词汇转换成向量,例如将china转换成300维的向量,则china的word  vector就是300。

Embeding layer:词嵌入、将一个词映射成为固定维度的稠密向量。

channel:每个单词的向量是对应的行。这里的一个句子由多个单词组成,所以就形成一个二维矩阵,这里二维矩阵叫做 一个channel。

filter:过滤器、有时候也叫kernel,是我们常说的卷积核。在自然语言处理中,每行表示一个特征,不能分离,所以这里的filter的长为EmbedSize(Embeding的长度),而宽一般设置为奇数3,4,5。

Strides:步长,无论向右滑动还是向下滑动都是这个大小。(因为这里的Filter长为EmbedSize,所以,这里只能向下滑动)。

Padding:四周填充0。它的用途有两个:1.解决输出大小不一致的问题。2.解决信息丢失的问题(主要是角上的信息)。

Pooling:池化、保留主要特征的同时减少参数和计算量,防止过拟合。

dropou:dropout是一种防止模型过拟合的技术,它的基本思想是在训练的时候随机的dropout(丢弃)一些神经元的激活,这样可以让模型更鲁棒,因为它不会太依赖某些局部的特征(因为局部特征有可能被丢弃)。

二、模型介绍

(1)输入层

  如图所示,输入层是句子中的词语对应的wordvector依次(从上到下)排列的矩阵,假设句子有 n 个词,vector的维数为  k  ,那么这个矩阵就是  n × k 的(在CNN中可以看作一副高度为n、宽度为k的图像)。

  这个矩阵的类型可以是静态的(static),也可以是动态的(non static)。静态就是word vector是固定不变的,而动态则是在模型训练过程中,word vector也当做是可优化的参数,通常把反向误差传播导致word vector中值发生变化的这一过程称为Fine tune。(这里如果word vector如果是随机初始化的,不仅训练得到了CNN分类模型,还得到了word2vec这个副产品了,如果已经有训练的word vector,那么其实是一个迁移学习的过程)

(2)第一层卷积

  输入层通过卷积操作得到若干个Feature Map,卷积窗口的大小为 h ×k ,其中 h  表示纵向词语的个数,而  k  表示word vector的维数。通过这样一个大型的卷积窗口,将得到若干个列数为1的Feature Map。

(3)池化层

  接下来的池化层,文中用了一种称为Max-over-timePooling的方法。这种方法就是简单地从之前一维的Feature Map中提出最大的值,文中解释最大值代表着最重要的信号。可以看出,这种Pooling方式可以解决可变长度的句子输入问题(因为不管Feature Map中有多少个值,只需要提取其中的最大值)。最终池化层的输出为各个Feature Map的最大值们,即一个一维的向量。

(4)全连接层+softmax

       池化层的一维向量的输出通过全连接的方式,连接一个Softmax层,Softmax层可根据任务的需要设置(通常反映着最终类别上的概率分布)。

(5)训练方案

  在倒数第二层的全连接部分上使用Dropout技术,Dropout是指在模型训练时随机让网络某些隐含层节点的权重不工作,不工作的那些节点可以暂时认为不是网络结构的一部分,但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了,它是防止模型过拟合的一种常用的trikc。同时对全连接层上的权值参数给予L2正则化的限制。这样做的好处是防止隐藏层单元自适应(或者对称),从而减轻过拟合的程度。在样本处理上使用minibatch方式来降低一次模型拟合计算量,使用shuffle_batch的方式来降低各批次输入样本之间的相关性(在机器学习中,如果训练数据之间相关性很大,可能会让结果很差、泛化能力得不到训练、这时通常需要将训练数据打散,称之为shuffle_batch)。

三、应用举例

(1)sentence

       上图句子为“[I like this movie very much!” ,一共有两个单词加上一个感叹号,关于这个标点符号,不同学者有不同的操作,比如去除标点符号。在这里我们先不去除,那么整个句子有7个词,词向量维度为5,那么整个句子矩阵大小为7x5。

(2)filters

  ilters的区域大小可以使不同的,在这里取(2,3,4)3种大小,每种大小的filter有两个不同的值的filter,所以一共是有6个filter。(ps:个人理解的卷积核取多组值的原因有两个:一、挖掘更多的特征信息;二、模拟图像处理时的多通道,从多个角度挖掘特征信息。)

(3)featuremaps

  我们在句子矩阵和过滤器矩阵填入一些值,那么我们可以更好理解卷积计算过程,

  比如我们取大小为2的filter,最开始与句子矩阵的前两行做乘积相加,得到0.6 x 0.2 + 0.5 x 0.1 + … + 0.1 x 0.1 = 0.51,然后将filter向下移动1个位置得到0.53.最终生成的feature map大小为(7-2+1x1)=6。为了获得feature map,我们添加一个bias项和一个激活函数,比如Relu。(ps:拿上图对比前一个图的红色部分,正好(filter2->6、filter3->5、filter4->4))。

(4)max

  因为不同大小的filter获取到的feature map大小也不一样,为了解决这个问题,然后添加一层max-pooling,选取一个最大值,相同大小的组合在一起。

(5)concat1max

  经过max-pooling操作之后,我们将固定长度的向量给sofamax,来预测文本的类别。

四、参数调优

(1)由于模型训练过程中的随机性因素,如随机初始化的权重参数,mini-batch,随机梯度下降优化算法等,造成模型在数据集上的结果有一定的浮动,如准确率(accuracy)能达到1.5%的浮动,而AUC则有3.4%的浮动;

(2)词向量是使用word2vec还是GloVe,对实验结果有一定的影响,具体哪个更好依赖于任务本身;

(3)Filter的大小对模型性能有较大的影响,并且Filter的参数应该是可以更新的,为了找到最优的过滤器(Filter)大小,可以使用线性搜索的方法。通常过滤器的大小范围在1-10之间,当然对- 于长句,使用更大的过滤器也是有必要的;

(4)Feature Map的数量也有一定影响,但是需要兼顾模型的训练效率,Feature Map的数量在100-600之间;

(5)1-max pooling的方式已经足够好了,相比于其他的pooling方式而言;

(6)正则化的作用微乎其微;

(7)当发现增加Feature Map的数量使得模型的性能下降时,可以考虑增大正则的力度,如调高dropout的概率;

(8)为了检验模型的性能水平,多次反复的交叉验证是必要的,这可以确保模型的高性能并不是偶然;

(9)可以尽量多尝试激活函数,实验发现ReLU和tanh两种激活函数表现较佳;

(10)使用non-static版本的word2vec或者GloVe要比单纯的one-hot representation取得的效果好得多。

参考链接

猜你喜欢

转载自blog.csdn.net/m0_37565948/article/details/81380876