本小白是一名立志从事NLP的菜鸟,本来只准备写一篇TextCNN来加深自己理解地,但想要了解TextCNN那必然需要了解CNN的原理,写的过程中突然想起了自己在学习时各种看博客的心路历程,看一篇博客要是有太多的地方博主没怎么介绍,而自己又不懂的话就会特别烦,看一半就会不想看了,又再去茫茫互联网中搜索其他的博客实在是太没效率和打击学习积极性了,于是写着写着就写了这篇终极小白文,尽量做到每个知识点都覆盖且简单易懂,本人才疏学浅,可能会有不严谨的地方,如有错误,欢迎指正~废话不多说,走起!!!
1.卷积神经网络原理 CNN
卷积神经网络结构:
上图是一幅完整的CNN网络结构图,输入层input layer、卷积层CONV layer、ReLU激励层ReLU layer、池化层Pooling layer、全连接层FNN layer组成。
1.1输入层
目前CNN被广泛运用于计算机视觉中,因此大部分人都直接把CNN的输入层输入的数据默认为是3维数据,即平面上的二维像素点和RGB通道。
例如上图一张彩色图片由三张二维图片构成,每一张二维的图片又被称作是一个feature map,这里有三个feature map,输入的数据就是 6 x 6 x 3
在输入层需要对原始数据进行预处理,常见的方法有:
去均值:顾名思义,就是RGB三个维度上的数据,每一个数据点都减去他们所在维度的均值就行了
归一化:就是在去均值的基础上再除以一个标准差
不得不吐槽一下我自己,我不仅是个菜鸟而且是一只喜欢钻牛角尖的菜鸟,为什么要去均值?为什么要进行归一化?有什么好处呢?
原因:去均值和归一化都有一个很重要的原因就是可以加快梯度下降训练迭代速度,加速达到收敛
为什么去均值和归一化就能加快训练迭代速度呢?(你丫是十万个为什么吗?)
原因:根据反向传播的公式,
如果不去均值,如果X很大地话,那么我们的学习率就必须选得很小,不然的话梯度下降训练时很容易就越过了局部最优点,导致无法收敛,如果不进行归一化的话,如果X数据分布不均衡,因为对于一组x,学习率都是一样地,那么可能就会存在某些x特征收敛得快,某些收敛得慢,这样又会减慢整体到达局部最优点的速度
1.2卷积层
卷积层是CNN中最重要的部分,那么如何进行卷积呢?这里就不得不提一个概念:卷积核 kernel
卷积核
卷积核有长宽深三个维度,长和宽都是人为指定地,一般常用3x3,5x5,自己视情况而定,而深是输入卷积层的feature map的数量,例如输入卷积层的数据为 6x6x3 ,那么卷积核的维度可以是 3x3x3
那么如何进行卷积计算呢?
每一张feature map 对应一张 kernel ,根据卷积核的长宽在feature map 上选定滑动窗口,然后窗口中与卷积核对应位置的数字相乘然后相加求和(如果有偏置项还要加上偏置)就得到了该滑动窗口卷积之后的结果,计算公式见图右上角。
计算完后滑动窗口向右滑动,一般滑动1,2格,也就是步长 stride,因为滑动得太多的话,可能导致信息丢失。滑动到位置后,继续按上面步骤卷积计算下一个值。滑动到最右端无法再滑动时返回到起始侧然后向下滑动步长。
这里就产生了一个问题:
假如我的feature map 如上图所示为5x5,而我设定的卷积核是2x2,每次移动步长=2,那么最后一列就取不到了?这个时候可以进行填充,padding
如上图所示,可以将feature map 填充成6x6,这样就能全部取到了,这里填充全部采用0填充为什么呢?
因为0乘以任何一个数都为0,所以就算填充了也不会影响我们的卷积计算结果
上图是一个输入数据为5x5x3 和 两个 3x3x3 卷积核 步长为2 卷积生成两个 output feature map 的整体图 ,这里对这个图解释一下:
问题1:3个feature map 跟 卷积核怎么计算呢?
答:3个feature map 分别与对应的卷积核中的一维按上面所说计算,然后再把3个值相加,就是得到的对应的output feature map中的值,有多少个卷积核就对应着生成多少个output feature map,output feature map 又可以作为下一层卷积层的feature map输入
问题2:5x5 和 3x3 以步长为2 卷积能够全部都取到啊 为什么还要加上一层padding呢?
答:因为如果不做padding的话,那么是不是相当于我们左上角的那部分数据只能在一个滑动窗口里计算1次,这样的话本身这个数据维度就不大,再只计算一次的话就可能会损失一些关键信息,加了一层padding之后,那么就可以多计算几次,获取的信息也会更多
问题3:这图上面到底有几个卷积核?
答:注意红线和紫线框起来的分别代表2个卷积核,并不是6个,这就是CNN的参数共享机制,3个feature map 共享一个卷积核,一个卷积核也就是一个神经元
问题4:为什么图上面在卷积核部分显示的是filter,filter是个什么鬼?
答:filter也就是过滤器,在一些文档中filter就等于卷积核,两者没有区别,但是在TensorFlow中filter还包含了卷积核的个数,即上面图中2个卷积核表示1个filter
问题5:我怎么确定卷积核的值呢?
答:卷积核虽然是我们自己取地,但是我们只能取一个卷积核的特定维度,具体的值是通过梯度下降训练出来地
1.3ReLU激励层
就跟神经网络一样,需要对于卷积的结果进行一个非线性函数的映射
激活函数需要介绍一下吗?算了,既然是史上最小白系列,那么把激活函数也讲一下吧。
什么是激活函数?
激活函数通俗理解就是把被激活的神经元的一些特征通过函数保留并且映射出来,将原本的线性函数转换成非线性函数,从而解决一些非线性问题。从上面我们的介绍也可以看出,其实feature map 跟卷积核的计算就是一个Wx+b的线性计算,因此需要对结果进行非线性变换
激活函数有哪些:
Sigmoid函数:
基本上不用,除了在最后的全连接层时,如果需要输出的是二分类可以尝试,但基本上sigmoid就相当于是输出为2类的特殊的softmax,所以sigmoid在CNN里面完全没有用。
不过对于sigmoid基本上刚开始学习机器学习的朋友们一开始都是先在逻辑回归中接触的这个激活函数,毕竟第一次遇见的激活函数嘛,怎么能始乱终弃呢?你是不是以为自己学了点DL的皮毛你就飘了?你这个铁渣男!!!
我没有!不是我!别瞎说!是因为在神经网络的反向传播中,使用sigmoid函数会出现梯度消散的问题。来看看sigmoid函数的求导图:
当x=0时,能够取导数最大值0.25,再看看反向传播求导公式,w是我们初始化地均值为0标准差为1的权重,那么大量小于1的值连乘,只会是结果迅速变小,出现梯度消失现象,无法对参数进行更新,因此不选用sigmoid激活函数
ReLU函数:
CNN一般都是采用ReLU激活函数
优点:
1.解决了梯度消失的问题(在正区间)
2.计算速度快(只需要判断输入是否是大于0)
3.收敛速度快
1.4池化层
池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。
为什么会减少过拟合呢?
原理上相当于是降噪,以一张图片为例,可能原本256x256x3的图片,只需要72x72x3就能把图片的信息完整表达出来了,减少了一些不必要的噪音,达到减少过拟合的效果
池化层主要使用两种方法:Max pooling 和 average pooling
Max pooling:各个2x2颜色区块内取最大值
average pooling:各个2x2颜色区块取均值
1.5全连接层
全连接层就是传统的神经网络了,全连接神经网络不必说了吧,给你一张图自己体会!!!
2.TextCNN原理
接下来介绍一下CNN在NLP方面的应用TextCNN,TextCNN主要用于文本分类。
TextCNN结构:嵌入层embedding layer、卷积层CONV layer、池化层 Pooling layer、激励层ReLU layer、全连接层 FNN layer
相信完全弄懂了上面的CNN原理,那么对我们来说TextCNN简直是太简单了
TextCNN 网络结构:
2.1嵌入层
嵌入层就相当于CNN中的输入层,只不过在NLP中,每个单词/词语 是以词向量的形式来表示地,所以这里的数据输入如上图所示,是一个个词向量堆叠形成的二维矩阵,也不需要对词向量进行预处理,可以使用word2vec或者Golve
2.2卷积层
因为嵌入层是二维数据,也就是只相当于CNN中的一个feature map,然后我们设定的卷积核也就是二维数据,由于词向量只表征他对应的一个词,被切割之后是没有意义地,所以feature map中在同一行的数据是不能被滑动窗口给切割地,所以卷积核的维度,长可以自己设置,宽为词向量的维度,可以设置多个卷积核,采用不同长,同一宽。上图中定义了6个卷积核,长分别为2、3、4,我们可以理解成就是Language Model中的N-gram模式,这样能够表达词语的上下文信息。
计算的话跟CNN一样,更加简单,只有一个feature map 与6个卷积核做卷积,具体多少个卷积核是自己设置地。
2.3激励层
与CNN一样使用ReLU不在赘述
2.4池化层
对生成的每一个output feature map 取max最大值 ,然后把所有的outputs feature map 池化后的数据进行级联,得到最后的特征表达
2.5全连接层
输入全连接层,按照正常的神经网络文本分类来操作即可。
3.结语
TextCNN介绍得很简单,因为我觉得已经在CNN中把原理解释得够清楚了,搞懂了CNN,TextCNN就相当于是计算输入数据为二维的CNN,如果是对我TextCNN里面说的一些词向量,word2vec,Golve,Language Model,N-gram这些不懂的话,那么得先补补NLP的基础知识啦,如果还是存在有疑问的地方或者错误的地方,欢迎在评论里指正~
4.参考
一文让你理解什么是卷积神经网络
CNN中feature map、卷积核、卷积核个数、filter、channel的概念解释,以及CNN 学习过程中卷积核更新的理解
TextCnn原理及实践