浅谈CNN和RNN
1 导读
在上一篇文稿中主要对深度学习的基础做了一个阐述,对于其中的神经网络和BP算法进行额外的延伸与拓展。但作为日前最为火热的人工智能技术,掌握这些内容远远还不够。因为深度学习面临的实际问题往往不是线性可分的问题,有时甚至超出了分类的问题,这就必须对深度学习模型加以改进,对其中的训练模型网络进行优化,从而使得用来预测结果数据的网络更加丰富化、智能化。做到实际上的智能,就是训练模型真正的能通过输入的数据来预测结果并且每预测一次都可以对自身网络模型进行加强和优化,也就好比一个“不断学习进步的人”一样。随着时间和训练次数的推进,训练的模型自身能力会越来越强。这样的网络模型才是我们真正需要的。当然要达到这一步光是靠之前的线性网络模型和浅层、深层神经网络远远不够。所以,在一篇文稿中,将对对神经网络进行延伸补充,是对神经网络模型的一次优化,让能运用的实际场景更为广泛和丰富。
2 卷积神经网络(CNN)
2.1 卷积神经网络VS传统神经网络
CNN称为卷积神经网络,那么卷积神经与之前的神经网络有什么区别呢?卷积神经网络(Convolutional Neural Network)可以有效地减少了传统的神经网络对输入数据所进行的预处理环节,降低了过程的复杂性。但是这种方式会导致网络结构的整体复杂性增加,因为它是通过输入层或者隐层进行傅里叶卷积操作来进行输出,增加网络卷积层。这样就会使得网络更加难以优化,很容易产生过拟合现象。所以这种神经网络主要应用在图像分类和物品识别等场景比较多,因为对于图像进行预处理比较复杂,卷积神经网络虽然网络复杂,但是减少了对图像预处理环节,直接把输入的图像作为输入数据即可,并且通过卷积神经网络的非线性可以得出目标函数的近似结构,从而得到更好的特征表达。
2.2 卷积神经网络结构层次
卷积神经网络主要分数据输入层(Input Layer)、卷积计算层(CONV Layer)、ReLU激励层(ReLU Layer)、池化层(Pooling Layer)、全连接层(FC Layer)五个层次,这五个层次都是依次相连,每一层都接受上一层的输出特征数据来提供给下一层。其中数据输入层是对输入数据的特征进行提取;卷积计算层是对这些特征进行卷积映射;激励层是利用非线性激励函数对神经元进行激励达到条件将特征信息传递到下一个神经元;池化层则是用来压缩数据和参数的量,从而减小过拟合情况;全连接层就是连接所有输出层的特征信息,并对这些信息进行汇总整理完成输出。下面分别阐述下这几个层次的具体内容。
2.3 输入层(Input Layer)
2.3.1 预处理原因
和神经网络/机器学习一样,都需要对输入的数据进行预处理操作,进行预处理的主要原因在于:
1.输入的数据单位可能不一样,因此可能会导致神经网络的收敛速度较慢,从而致使训练时间过长;
2.数据范围太大的输入在模式分类中的作用会导致偏大,而数据范围较小的作用也就有可能偏小;
3.由于神经网络中的激活函数是有值域限制的,因此需要将网络训练的目标数据映射到激活函数的值域;
4.Sigmod激活函数(0,1)区间以外区域很平缓,从而导致区分度太小,影响最终的输出效果。
2.3.2预处理方式
输入层对数据进行预处理主要有3种方式,这3中数据预处理方式各有不同,分别是:
1.去均值:就是将输入数据的各个维度中心化到0;
2.归一化:将输入的数据的各个维度的幅度归一化到同一范围,具体操作在之前的推荐系统文稿里有介绍。
3.PCA/白化:也就是用PCA降维或者是白化,也就是将数据的每个特征轴上的幅度归一化,也是平时用的最多的数据预处理方法。
2.3.3 预处理效果
三种预处理方法的效果图如下所示:
例如,利用白化进行预处理后就会使得输入的数据或者特征之间相关性较低,并且使得所有特征具有相同的方差。
2.4 卷积层(CONV Layer)
2.4.1 卷积神经网络
在将卷积层之前,首先大致了解下卷积神经网络。卷积神经网络是保存了层级的网络结构,以至于使得不同的层次有不同的形式或者运算与功能。而卷积神经网络是主要适用于图片信息处理的场景,而卷积层就是识别图像中一个最为关键的步骤或者层级。类似人的大脑在识别图片的过程中,不同的脑皮质层会处理来自不同方面的数据,例如颜色、形状等,然后通过不同皮质层的处理结果进行合并并且映射操作,从而得出最终的结果。也就是说第一部分实质上是一个局部的观察结果,第二部分是一个整体的结果合并。因此卷积神经网络就是基于人的大脑识别图片的过程,每个神经元就没有必要对全局的图像进行感知,只需要对局部的图像进行感知即可,最后在更高层次对局部的信息进行综合操作得出全局的信息。
2.4.2 卷积层参数
卷积层也叫卷积计算层,类比人脑识别图像过程,它主要有以下几个概念:
1局部关联:每个神经元看作是一个filter,进行,作用就是对局部数据进行识别;
2.窗口(receptive field)滑动,也就是将filter对局部数据进行计算,滑动预先会设定步长,移动位置来得到下一个窗口;
3.对于窗口中滑动过程中,有深度(depth)、步长(stride)、填充值(zero-padding)这几个重要参数,深度即转换的次数(结果产生的depth);步长就是设定每一步移动多少;填充值就是在矩阵周边添加一些扩充值(目的就是解决图片输入不规整)
计算模型如下图所示:
2.4.3 卷积计算
卷积计算过程中有一个重要机制就是参数共享机制,假设每个神经元连接数据窗的权重是固定的,也就是固定每个神经元的连接权重,因此就可以将神经元看成一个模块;也就是每个神经元只关注一个特性,从而使得需要计算的权重个数会大大的减少。而卷积计算就是将一组固定的权重和不同窗口内数据做内积,就叫卷积。
2.5 激励层(ReLU Layer)
2.5.1 非线性激励函数
激励层,顾名思义就是加一个激励函数对其神经元进行刺激或者激励,也就是使用映射函数来完成非线性的映射。在卷积神经网络中,激励函数是非线性的。激励层是接在卷积层后面的一层网络,负责将卷积层的输出结果做一次非线性的映射,即激励。在卷积神经网络中,经常用到的非线性映射函数有S函数(Sigmoid)、双曲正切函数(Tanh)、ReLU、Leaky ReLu、ELU和Maxout等。如下就是某些激励函数的函数图像:
2.5.2 激励层选取
由于非线性激励函数较多,但是各有不同,因此在选择激励层的非线性激励函数时,有不同的采取建议:
1.卷积神经网络(CNN)首先尽量不要使用S函数(sigmoid),如果要使用,建议只在全连接层使用;
2.优先建议使用RELU,因为RELU函数的迭代速度快,但是有可能会导致效果不佳;
3.如果在选取RELU激励函数后,达不到想要的效果(激励函数失效)的情况下,则考虑使用Leaky ReLu或者Maxout;
4.双曲正切函数(tanh)在某些情况下会有比较好的效果,但是能应用的场景比较少。
因此总结起来就是:双曲正切函数和S函数用于全连接层,ReLu用于卷积计算层,普遍使用ELU,而Maxout是使用最大值来设置值。
2.6 池化层(Pooling Layer)
池化层存在于连续的卷积层中间,它的主要功能就是通过逐步减小表征的空间尺寸从而减小参数量和网络中的计算复杂度;并且池化层都是在每一个特征图上独立进行操作。所以使用池化层有一个明显的优势就是可以压缩数据和参数的量,来解决过拟合问题。
在池化层中,一般采用两种策略去进行压缩来减少特征数量,分别为最大池化(Max Pooling)和平均池化(Average Pooling)。例如给定某一个向量表征图像,如下所示:
对于上面向量表征图像池化为四个网格的小表征图,那么利用最大池化策略就是每四个正方形格子取最大值,就分别得到6、8、3、4,同理可得,平均池化就是计算每四个正方形格子的平均值,就分别得到3、5、2、2,分别得到如上图所示的网格。
2.7 全连接层(FC Layer)
类似传统神经网络中的结构,卷积神经网络中的池化层(FC)中的神经元跟之前层次的所有激活输出都是连接着的,也就是说两层之间所有的神经元都有权重连接;作为最终的连接整理输出,对每层的输出结果进行汇总计算,全连接层只会在卷积神经网络的尾部出现。
3 CNN训练算法与CNN优缺点
3.1 CNN训练算法
CNN训练算法和一般的机器学习算法一样,首先需要定义损失函数(Loss Function)来计算损失值,从而衡量出预测值和实际值之间的误差,在这里一般采用平方和误差公式。对于在网络中找到最小损失函数的W和b的值,卷积神经网络通畅采用随机梯度下降算法(SGD),这个算法在之前的推荐算法文稿中有所阐述。简而言之,卷积神经网络的训练算法其实就是一个机器学习中的反向传播(BP)算法,SGD需要计算W和b的偏导,根据偏导来不断迭代更新W和b。
3.2 CNN优缺点
对于卷积神经网络,有以下几个优点:
1.可以共享卷积核(共享参数),使得卷积神经网络对高维的数据处理没有压力;
2.不需要选择特征属性,只需要训练好每一个权重,也就可以得到特征值;
3.在深层次的神经网络中,使得对图像信息的抽取更为丰富,从而使得最终表达效果好;
但是卷积神经网络同样也有一些缺点,比如在卷积神经网络中需要调参,这就会导致需要大量的样本,使得训练迭代次数比较多,最好使用GPU来训练;另外对于卷积神经网络每一层的输出结果的物理含义并不明确,也就是很难从每一层输出看出含义,即可解释性较差。
4 正则化和Dropout延伸
神经网络的学习能力受神经元数目和神经网络的层级影响,一般来说,神经元数目越多,神经网络的层级就越高,那么这个神经网络的学习能力就越强,但是有可能就会出现过拟合(overfitting)的问题。解决过拟合的方法主要还是正则化(Regularization)和Dropout,这两个方法在之前的神经网络文稿中有所阐述,在这里进一步说明下:
1.正则化是通过降低模型的复杂度,通过在cost函数上添加一个正则项的方式来降低overfitting;Dropout是通过随机删除神经网络中的部分神经元来解决过拟合问题,使得在每次仅限迭代时,只是用部分神经元训练模型来获取W和d的值,从而使得CNN没有太多的泛化能力,通过合并多次迭代的结果可以增加模型的准确率。
2.一般情况下,对于同一组训练数据,利用不同的神经网络之后,求它输出的平均值就可以减少过拟合。因此Dropout就是利用这个原理,每次都丢掉一半左右的隐藏层神经元,也就相当于在不同的神经网络上进行训练,这样就减少了神经元之间的依赖性,即每个神经元不能依赖于某几个其他神经元(在这里指层与层之间想连接的神经元),使得神经网络更具健壮性的特征,还能更好的提高准确率。
对于一些典型的卷积神经网络模型介绍,网上都有资料,读者感兴趣的话可以自己搜索浏览下,在这里就不赘述了。
5 循环神经网络(RNN)
5.1 应用场景
循环神经网络的运用场景较多,在目前的互联网或者信息科技公司运用循环神经网络最多的几个场景有自然语言处理(NLP)、机器翻译、语音识别、图像描述生成,自然语言处理也包括了语言模型与文本的生成,在互联网行业主要划分为语音/语义识别部门。对推向进行识别描述,与卷积神经网络(CNN)不同点在于:CNN是去做一个图片的识别,例如图片的的东西是什么,而RNN虽然也可以识别图片里的东西是什么,但是运用RNN更多的是度图片上的东西进行描述,提供出图片上的内容信息。
那么有人就会问,既然有BP神经网络和CNN,为什么还要RNN呢?这个就跟RNN的循环有关了,之前的BP神经网络和CNN的每一个神经元输入输出都是相互独立的,互相并没有产生干扰或者联系,而在实际应用场景中呢?有些场景的输出内容和之前的内容是有关联的,也就是一种“记忆”的概念,因此RNN引入这个概念,循环就是指每一个神经元都执行相同的任务,但是输出不仅依赖于输入,还依赖于神经元自身之前的“记忆”。
5.2 RNN结构
因为“记忆”的概念与时间的先后有关,所以讲神经元序列按照时间先后展开就可以得到RNN的结构如下图所示:
在上述结构中, 是时间t的输入, 是时间t出的“记忆”, 是时间t的输出。
还有一种循环神经网络是双向RNN(Bidirectional RNN),也就是在之前的结构中当前t的输出不仅仅和之前的序列有关,而且还与之后的序列有关。例如:预测一个语句中缺失的词语,那么就需要根据上下文进行预测。双向RNN其实是一个相对简单的RNN结构,是有两个RNN上下叠加在一起组成。输出就是有这两个RNN的隐藏层的状态决定。
5.3 训练算法
5.3.1 BPTT算法
循环神经网络(RNN)的训练其实也很CNN训练一样,同样可以用BP反向传播误差算法。唯一的区别就在于:RNN中的参数W是共享的,并且在随机梯度下降算法中,每一步的输出不仅仅依赖当前步的网络,并且还需要前若干步网络的状态,也就是对之前的BP短发进行改版,这个改版的BP算法叫做BPTT(Backpropagation Through Time),BPTT算法和BP算法一样,在多层训练时,都有可能产生梯度消失和爆炸的问题。BPTT算法的思路和BP算法一样,都是求偏导,但是需要同时考虑到时间对step的影响。
5.3.2 LSTM
对于BPTT算法中可能产生梯度消失和梯度爆炸的问题,这是由于在BPTT计算中,对于长期依赖“记忆”问题导致的,而LSTM就特别适合解决这类长时间依赖的问题。LSTM是RNN的一种,大致结构一致,区别在于LSTM的“记忆神经元”是改造过后的,并且记录的信息就会一致传递下去,不该记录的信息就会被截断掉。 如下图所示
LSTM结构图
在LSTM中,有一个关键点在于“细胞状态”,也就是记忆神经元的状态。细胞状态类似于传送带,都是直接在整个链上运行,只有一些少量的线性交互过程,这样就使得信息在上面流传是保持不变较为容易。那么怎么去控制“细胞状态”呢?控制“细胞状态”的过程有以下几个步骤:
1.LSTM可以通过“门”(gates)这种结构来去除或者增加“细胞状态”的信息;
2.用包含一个sigmoid神经网络层次和一个pointwist乘法操作;
3.Sigmoid层输出一个0到1之间的概率值,描述每个部分有多少量可以通过,0表示“不允许任务变量通过”,1表示“运行所有变量通过”;
4.LSTM中主要有是三个“门”结构来控制“细胞状态”。
5.3.3 三个“门”?
下面对LSTM的三个“门”进行延伸:
1.第一个“门”也叫“忘记门”,它决定了从“细胞状态”中丢弃什么信息;比如在语言模型中,细胞状态可能包含了性别信息,当我们看到新的名词后,就可以考虑忘记掉旧的数据信息;
2.第二个门也叫“信息增加门”,它决定了放什么新的信息到“细胞状态”中去,其中Sigmoid层决定什么值需要更新;Tanh层创建一个新的候选向量,主要都是为了进行状态更新做准备。
3.第三个“门”就是基于“细胞状态”得到输出,经过第一个“门”和第二个“门”后,可以缺东传递信息的删除和增加,也就可以进行“细胞状态”的更新,第三个“门”首先运行一个Sigmoid层来确定细胞状态的哪个部分被输出,然后再使用tanh处理细胞状态得到-1到1之间的值,再将它与sigmoid门的输出相乘,输出过程确定了输出的部分。
三个“门”的部分图分别如下所示:
5.3.4 LSTM结构改造
对于上述的LSTM结构,也有针对其中的某些部分进行改造,其中例如有在第二个“门”之前增加“配额phone connections”层,从而使得“门”层也接受细胞状态的输入;还有通过耦合忘记门和更新输入门,不在单独考虑忘记什么信息、增加什么信息,而是放在一起进行考虑。
在对LSTM结构进行设计改造中,相对比较出众的就是2014年提出的一个结构,如下图所示,主要区别在于以下几点:
1.该结构将忘记门和输入门合并成为一个单一的更新门,也就是将忘记的信息和输入的信息一并进行考虑;
2.合并了数据单元状态与隐藏状态;
3.它的结构比LSTM的结构更为简单。
6 总结与补充
6.1 总结
深度学习的神经网络在目前主要运用场景为图片识别、文本识别、游戏、语言识别等。其中的一些主要算法在上面也已经进行了阐述。除此之外还有一些辅助算法如极大极小值算法。对于这一块内容我将在下文提到。因此在学习神经网络这一块的时候,一定要分类去理解、分情况去讨论,结合实际的运用场景功能来完成神经网络模型的选择与训练,从而达到最好的输出效果。关于CNN和RNN的一些扩展,其中包括Fast R-CNN(快速卷积)和R-FCN(基于区域的全卷积)这些内容和结构,有兴趣的读者可以自行了解下,实际运用的场景并不多。
6.2 补充
对于运用神经网络知识这一块的深度学习领域,还有额外的一些需要了解的知识内容,例如迁移学习和极大极小值算法等。在这里我将对这些进行一个补充,仅仅作为一个引子,来激发读者更多的探讨兴趣。
6.2.1 迁移学习
迁移学习就是一个算法思想、一个算法训练方式,一般的深度学习算法都会要求我们的训练数据集中数据标注数据比较多,但是在实际应用中,有很多场景标注的数据是比较少的。因此使用比较少的数据来进行训练而达到跟之前一样很好的效果是非常困难的。而迁移学习就是一个解决这一类问题的算法思想,它是指用基于很少标注的数据集进行高质量的模型训练。在目前运用场景中,使用迁移学习的主要是在图片检测或者标注这一块。
6.2.2 极大极小值算法