20189230杨 2018-2019-2 论文学习与报告总结

课程:《密码与安全新技术专题》python

班级:1892
姓名:杨
学号:20189230
上课教师:王志强
上课日期:2019年5月21日
必修/选修:选修git

1.学习论文的总结

论文名称:Convolutional Neural Networks for Sentence Classification(卷积神经网络用于句子分类)
论文来源:天然语言处理领域顶级国际会议EMNLP2014
github

文献原文,全篇翻译和课堂介绍所用PPT能够经过连接下载:https://pan.baidu.com/s/19uKDPYW5QtX_ky1ldMbvTg,提取码:m81o

Part1背景介绍:为何要用CNN(卷积神经网络)对句子分类?

(1)特征提取的高效性
机器学习首先须要选取好特征,每个特征即为一个维度,特征数目过少,咱们可能没法精确的分类出来,即咱们所说的欠拟合;若是特征数目过多,可能会致使咱们在分类过程当中过于注重某个特征致使分类错误,即过拟合。这样就须要咱们在特征工程上花费不少时间和精力,才能使模型训练获得一个好的效果。然而神经网络的出现使咱们不须要作大量的特征工程,譬如提早设计好特征的内容或者说特征的数量等等,咱们能够直接把数据灌进去,让它本身训练,自我“修正”,便可获得一个较好的效果。
(2)数据格式的简易性
在一个传统的机器学习分类问题中,咱们“灌”进去的数据是不能直接灌进去的,须要对数据进行一些处理,譬如量纲的归一化,格式的转化等等,不过在神经网络里咱们不须要额外的对数据作过多的处理。
(3)参数数目的少许性
在面对一个分类问题时,若是用SVM来作,咱们须要调整的参数包括核函数,惩罚因子,松弛变量等等,不一样的参数组合对于模型的效果也不同,想要迅速而又准确的调到最适合模型的参数须要对背后理论知识的深刻了解(固然,若是所有都试一遍也是能够的,可是花的时间可能会更多)。对于一个基本的三层神经网络来讲(输入-隐含-输出),咱们只须要初始化时给每个神经元上随机的赋予一个权重w和偏置项b,在训练过程当中,这两个参数会不断的修正,调整到最优质,使模型的偏差最小。因此从这个角度来看,咱们对于调参的背后理论知识并不须要过于精通(只不过作多了以后可能会有一些经验,在初始值时赋予的值更科学,收敛的更快罢了)。
尤为是在图像领域,用传统的神经网络并不合适。由于图像是由一个个像素点构成,每一个像素点有三个通道,分别表明RGB颜色,那么,若是一个图像的尺寸是(28,28,1),即表明这个图像的是一个长宽均为28,channel为1的图像(channel也叫depth,此处1表明灰色图像)。若是使用全链接的网络结构,即,网络中的神经与与相邻层上的每一个神经元均链接,那就意味着咱们的网络有28 * 28 =784个神经元,hidden层采用了15个神经元,那么简单计算一下,咱们须要的参数个数(w和b)就有:7841510+15+10=117625个,这个参数太多了,随便进行一次反向传播计算量都是巨大的,从计算资源和调参的角度都不建议用传统的神经网络。算法

Part2模型介绍

下图是原论文中给出的用于句子分类的CNN模型:

用一张释义更明确的图来说解该模型的结构:

数组

输入矩阵

CNN输入矩阵的大小取决于两个因素:
A.句子长度(包含的单词的个数)
B.每一个字符的长度

假设输入X包含m个单词,而每一个单词的字嵌入(Word Embedding)长度为d,那么此时的输入就是m d的二维向量。对于I like this movie very much!来讲,当字嵌入长度设为5时,输入即为75的二维向量。
卷积过程

文中使用了2种过滤器(卷积核),每种过滤器有三种高度(区域大小),即有6种卷积结构。每一个卷积核的大小为filter_size embedding_size。

A.filter_size表明卷积核纵向上包含单词个数,即认为相邻几个词之间有词序关系,代码里使用的是[3,4,5]。
B.embedding_size就是词向量的维数。每一个卷积核计算完成以后咱们就获得了1个列向量,表明着该卷积核从句子中提取出来的特征。有多少卷积核就能提取出多少种特征。
池化过程

这篇文章使用MaxPooling的方法对Filter提取的特征进行降维操做,造成最终的特征。每一个卷积的结果将变为一个特征值,最终生成一个特征向量。
如下图为例,池化层采用MaxPooling,大小为2
2,步长为1,取每一个窗口的最大值更新,那么图片的尺寸会由3 3变成22。
注意:这一步统一了维度!
补充:池化方法通常有两种:MaxPooling:取滑动窗口里最大的值;AveragePooling:取滑动窗口内全部值的平均值。

全链接层(含Dropout和Softmax)

A.要处理的问题
二分类问题:正面评价;负面评价。
B.全链接层
把权重矩阵与输入向量相乘再加上偏置,实际上就是三层神经网络的隐层到输出层的映射。

C.添加Dropout
因为实验中所用的数据集相对较小,很容易就会发生过拟合现象,因此要引入Dropout来减小过拟合现象。

神经元激活的几率,能够在参数 dropout_keep_prob 中设置。这篇文章里选择的是0.5。
D.Softmax分类层
咱们能够应用Softmax函数来将原始分数转换为归一化几率,从而获得几率最大的输出,最终达到预测的目的。

补充:Dropout的做用原理
按照必定的几率来“禁用”一些神经元的发放。这种方法能够防止神经元共同适应一个特征,而迫使它们单独学习有用的特征。

Part3数据集

(1)文章中使用的数据集包括:
•MR:电影评论,每次评论一句话。分类包括检测积极/消极的评论。
•SST-1:Stanford Perfection Treebank是MR的扩展,但提供了train/dev/test分割和细粒度标签(很是积极、积极、中立、消极、很是消极)。
•SST-2:与SST-1相同,但删除中立评论。•Subj:主观性数据集,将句子分类为主观性或客观性两种。
•TREC:数据集将问题分为6种类型(是否涉及人员、位置、数字信息)。
•CR:客户对各类产品(相机、MP3等)的正面/负面评论。
•MPQA:用于意见极性检测。

其中,c是目标类的数目;l是语句平均长度;N是数据集大小;|V|是词典大小;|Vpre|是预先训练过的单词向量集中出现的单词数;Test是测试集的大小(CV:没有训练/测试集的划分,于是采用十折交叉验证的方法。
(2)复现时使用的是MR(Movie Review data from Rotten Tomatoes),来自烂番茄的电影评论数据。数据集包含10662个示例评论句,半正半负。词汇表大小约为20k。因为此数据集很是小,使用强大的模型可能会形成过拟合。此外,数据集没有进行train/test分割,所以咱们将数据集分红十份,轮流将其中9份做为训练数据,1份做为测试数据。10次结果的平均值做为对算法精度的估计(十折交叉验证)。
A.数据清洗:将重复、多余的数据筛选清除,将缺失的数据补充完整,将错误的数据纠正或者删除,最后整理成为咱们能够进一步加工、使用的数据。
B.数据集里最大的句子长度为59,所以为了更方便地进行批处理,须要用0将其余句子填充到这个长度。填充操做并不会对结果形成大的影响,由于最后的MaxPooling会选取最大特征值。
C.构建词汇索引表,将每一个单词映射到 0 ~ 18765 之间(18765是词汇量大小),那么每一个句子都变成了一个向量。
D.批处理。浏览器

Part4实验结论

(1)Model Variations
A.CNN-rand:全部的word vector都是随机初始化的,同时当作训练过程当中优化的参数;
B.CNN-static:全部的word vector直接使用无监督学习即Google的word2vector工具获得的结果,而且是固定不变的;
C.CNN-non-static:全部的word vector直接使用无监督学习即Google的word2vector工具获得的结果,可是会在训练过程当中被微调;
D.CNN-multichannel:CNN-static和CNN-non-static的混合版本,即两种类型的输入。
本文实现的CNN模型及其变体在不一样的数据集上和前人方法的比较:

(2)结论
A.CNN-static优于CNN-rand,由于采用训练好的word2vector向量利用了更大规模的文本信息,提升acc;
B.CNN-non-static优于CNN-static,由于BP算法微调参数使得word2vector更加贴近于某一个具体的任务,提升acc;
C.CNN-multichannel在小规模数据集上的表现优于CNN-single。它体现的是一种折中思想,即既不但愿微调参数后的word2vector距离原始值太远,但同时保留其必定的变化空间。
(3)其余结论(十分有趣哦❤)

A.CNN-static中,bad对应的最相近词为good,缘由是这两个词在句法上的使用是极其相似的(能够简单替换,不会出现语句毛病);而在CNN-non-static的版本中,bad对应的最相近词为terrible,这是由于在微调参数的过程当中,word2vector的值发生改变从而更加贴切数据集(是一个情感分类的数据集),因此在情感表达的角度这两个词会更加接近;
B.句子中的!最接近一些表达形式较为激进的词汇,如lush(酷)等;而,则接近于一些链接词,这和咱们的主观感觉也是相符的。不过在某种程度上这种"过分推断"容易形成过拟合,于是做者将这两种词向量做为了输入层不一样的channel来进行训练,取得了还不错的效果。安全

Part5论文复现

运行环境

Windows10;
Anaconda 2019.03;
Python 3.7.3;
Tensorflow1.13.1(CPU版);
TensorBoard 1.13.1。
服务器

训练/测试集的划分:activate tensorflow——导入数据集rt-polaritydata——python train.py——python eval.py

十折交叉验证(10-fold cross-validation)是一种经常使用的测试方法:将数据集分红十份,轮流将其中9份做为训练数据,1份做为测试数据,进行试验。每次试验都会得出相应的正确率(或差错率)。10次的结果的正确率(或差错率)的平均值做为对算法精度的估计。

step=30000(步进值为1)



从图中能够看出,loss值不断降低,acc值最终达到0.753982。
Tensorboard可视化

tensorboard.exe--logdir="C:\Users\yangxiaopang\Desktop\cnn-text-classification-tf-master\runs\1558944107\summaries\train"——用Chrome浏览器打开http://LAPTOP-4731L8IJ:6006便可

A.卷积神经网络结构图(含节点及关联关系)
Main Graph和Auxiliary Nodes——

conv maxpooling4局部节点——

B.Model Variations(4种)的acc和loss值
命令语句分别为:
使用随机初始化的词向量进行训练:python train.py --input_layer_type 'CNN-rand';
使用与训练好的GloVe 词向量训练,在训练过程当中词向量不可训练,是固定的:python train.py --input_layer_type 'CNN-static';
使用与训练好的GloVe 词向量训练,在训练中微调词向量:python train.py --input_layer_type 'CNN-non-static';
使用两个词向量组成双通道做为输入,一个固定,另外一个能够微调:python train.py --input_layer_type 'CNN-multichannel'。
acc值:


loss值:

由上面的图表可知,四种Model Variations的acc值较原论文中偏小,可是相互间的大小关系和原论文中一致。
C.其余可视化结果
标量Scalars/数据分布Distribution /直方图Histograms

D.改进方向

如上图,测试集(红)的精度明显低于训练集(蓝)(CNN-static),代表过拟合了。要想改进实验,咱们须要更多的数据、更强的正则化或更少的模型参数。

2.学习中遇到的问题及解决

  • 问题1:究竟什么是Word Embedding?
  • 问题1解决方案:
    Word Embedding本质是将文本数据转换为数值型数据,能够当作一种映射。
    举例——“apple on a apple tree”
    (1)Word Embedding的输入是原始文本中的一组不重叠的词汇,即一个dictionary:["apple", "on", "a", "tree"]。
    (2)Word Embedding的输出就是每一个word的向量表示。使用最简单的one hot编码方式,那么每一个word都对应了一种数值表示。
    例如,apple对应的vector就是[1, 0, 0, 0],a对应的vector就是[0, 0, 1, 0]。
    由上例,Word Embedding实质上是特征提取器,在指定维度中编码语义特征。
    语义相近的词, 它们的欧氏距离或余弦距离也比较近。
    这时候的句子就天然而然地成为了天然语言处理中的“图像”。
    Word Embedding主要分为如下两类:
    基于频率的Word Embedding(Frequency based embedding);
    基于预测的Word Embedding(Prediction based embedding)。
  • 问题2:究竟什么是Word2Vector?
  • 问题2解决方案:
    Word2Vector本质就是进行词向量化,使得机器可以处理文字类型的数据(文本)。
    (1)发展历史:在Word2Vector出现以前,对于天然语言的处理的词的向量化使用的是One-Hot Encoder。它的特色是:词向量维度大小为整个词汇表的大小,对于每一个具体的词汇表中的词,将对应的位置置为1。好比咱们有下面的5个词组成的词汇表,词"Queen"的序号为2, 那么它的词向量就是(0,1,0,0,0)(0,1,0,0,0)。一样的道理,词"Woman"的词向量就是(0,0,0,1,0)(0,0,0,1,0)。
    (2)One-Hot Encoder的缺点:过于稀疏;不能体现词与词之间的关系;对于词量大时会出现维度灾难。

    (3)解决办法:使用Vector Representations能够有效解决这个问题。Word2Vector能够将One-Hot Encoder转化为低维度的连续值,也就是稠密向量,而且其中意思相近的词将被映射到向量空间中相近的位置。 咱们能够发现,华盛顿和纽约汇集在一块儿,北京上海汇集在一块儿,且北京到上海的距离与华盛顿到纽约的距离相近。也就是说模型学习到了城市的地理位置,也学习到了城市位置之间的关系。

    有了用Dristributed representation表示的较短的词向量,咱们就能够较容易的分析词之间的关系了,好比咱们将词的维度降维到2维,有一个有趣的研究代表,用下图的词向量表示咱们的词时,咱们能够发现:King−Man+Woman=Queen。

    (4)模型拆解
    Word2Vector模型其实就是简单化的神经网络。

    输入是One-Hot Vector,Hidden Layer没有激活函数,也就是线性的单元。Output Layer维度跟Input Layer的维度同样,用的是Softmax回归。咱们要获取的dense vector其实就是Hidden Layer的输出单元。有的地方定为Input Layer和Hidden Layer之间的权重,其实说的是一回事。
  • 问题3:池化层还能够进一步改进以提升模型提取特征的能力么?
  • 问题3解决方案:用其余池化方法
    (1)K-MaxPooling——
    原先的Max Pooling从Convolution层一系列特征值中只取最强的那个值,那么咱们思路能够扩展一下,K-Max Pooling能够取全部特征值中得分在Top-K的值,并保留这些特征值原始的前后顺序,就是说经过多保留一些特征信息供后续阶段使用。
    很明显,K-Max Pooling能够表达同一类特征出现屡次的情形,便可以表达某类特征的强度;另外,由于这些Top-K特征值的相对顺序得以保留,因此应该说其保留了部分位置信息,可是这种位置信息只是特征间的相对顺序,而非绝对位置信息。

    (2)Chunk-Max Pooling——
    把某个Filter对应的Convolution层的全部特征向量进行分段,切割成若干段后,在每一个分段里面各自取得一个最大特征值,好比将某个Filter的特征向量切成3个Chunk,那么就在每一个Chunk里面取一个最大值,因而得到3个特征值。

    K-Max Pooling是一种全局取Top-K特征的操做方式,而Chunk-Max Pooling则是先分段,在分段内包含特征数据里面取最大值,因此实际上是一种局部Top-K的特征抽取方式。网络

    3.学习感想和体会

    经过此次论文学习与报告总结的工做,我收获良多。
    (1)在选择论文进行复现的阶段,我选择了我一直特别感兴趣的深度学习领域的论文来进行复现,可是说到底,这种“兴趣”一直停留在“兴趣”层面。研一一年,个人研究方向一直集中在指静脉识别领域,所阅读的论文和复现的工做一直是使用传统的方法来进行特征的提取,进而加密。可是指静脉领域当前的研究热点主要集中在经过机器学习方法来对样本数较少的数据集进行识别。
    出于为未来的工做打基础的考虑,我选择了一篇用卷积神经网络对句子进行分类的天然语言处理领域的经典文章来进行复现。在查找选择的过程当中,我了解到有许多提供开源代码和相应论文的网站,上面的种类也有不少,好比:Papers with Code。首先在天然语言处理(NLP)领域,我了解到分类主要包括:Machining Translation,Language Modeling,Question Answering,Sentiment Analysis以及Natural Language Inference等等。其次。在选择论文的过程当中,我了解到7种基本的深度学习工具的基础知识及使用。其中经常使用的有如下几种:
    A.TensorFlow
    TensorFlow是Google基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于自己的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从图像的一端流动到另外一端的计算过程。TensorFlow是将复杂的数据结构,传输至人工智能神经网中进行分析和处理过程的系统。TensorFlow表达了高层次的机器学习计算,可被用于语音识别或图像识别等多项机器深度学习领域。TensorFlows对2011年开发的深度学习基础架构DistBelief进行了各方面的改进,可在小到一部智能手机,大到数千台数据中心服务器的各类设备上运行。TensorFlow彻底开源。
    B.Caffe
    Caffe是一个清晰而高效的深度学习框架,做者是毕业于UC Berkeley的贾扬清。Caffe的全称应该是Convolutional Architecture for Fast Feature Embedding,它是开源的,核心语言是C++,支持命令行、Python和MATLAB接口。既能够在CPU上运行也能够在GPU上运行。License是BSD 2-Clause。Caffe能够应用在视觉、语音识别、机器人、神经科学和天文学领域。
    C.Torch
    Torch已经存在了十多年的时间,是一个普遍支持机器学习算法的科学计算框架,具备简单和快速的脚本语言LuaJIT和底层C/CUDA实现, Facebook开源了Torch深度学习库包。
    Torch的特色包括:具备强大的n维数组;具备丰富的索引、切片和transposing的例程;经过LuaJIT的C接口;线性代数例程;基于能量的神经网络模型;数值优化例程;支持快速高效的GPU;可移植嵌入到iOS、Android和FGPA平台。
    ❤最终我选择用Tensorflow来实现一个简单的用于文本分类的卷积神经网络❤
    (2)在整个阅读论文、理解论文、复现论文的过程当中,我意识到本身在“读论文”这方面还存在很大的不足。拿到一篇论文,先翻译成中文读一遍,在读一遍英文确认细节,看似好像没有问题,也算是“完成了任务 ”,可是对于一篇好论文来讲是远远不够的。论文中的精髓部分仍是没有学习和领会到,只是草草了事罢了。我认为要想读好一篇论文,读懂表面意思只是第一步,第二步也是最重要的一步就是尝试去复现论文里所做的工做。在复现的过程当中,一遍遍地去读论文,五遍十遍都不为过,每一遍都能有新的体会,新的思考,读完每一遍都能发现上一遍本身陷入了哪些误区,哪些知识点自觉得懂了,可是其实没有。我以为这个过程是使人欣喜的,使人不断地思考本身在学习的过程当中存在哪些不足。做者为何要选取这种方法,做者是如何创建模型的,针对某一类问题选择这个模型的依据在哪里。为了复现论文里的工做,首先个人数据集从哪里来,在这样一个小数据集的状况下,我怎么去划分训练集和测试集。我如何选取一个单变量,从而造成对比。在训练时,参数如何选取,这个参数是始终肯定的,仍是不断根据模型更新的。这些都是须要考虑的问题。我一开始以为这些都是细节,可是时间久了才发现,“由小见大”,“因小失大”说的都是细节处见真知的道理。
    (3)在此次论文复现的过程当中,个人另外一个重要感想就是凡事不能到了眼前再打算。一开始以为一周时间搞定一篇论文绰绰有余,但是当事情真的逼到眼前了,才发现这个时候可能还有其余事的存在会影响本身的进度。不知不觉中,研一已通过去了。在这一年里,有收获也有对不足的反思。但愿从如今开始,抓紧时间,多读论文,投身科研吧!

3.参考资料

Papers with Code
深度学习工具介绍
Convolutional Neural Networks for Sentence Classifification
Convolutional Neural Network for Text Classification in Tensorflow
Word Embedding的发展和原理简介
Word2Vector
TensorBoard可视化工具
softmax函数详解
天然语言处理中CNN模型几种常见的Max Pooling操做
Implementing a CNN for Text Classification in TensorFlow

相关文章
相关标签/搜索