cnn,rnn,dnn
CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
https://www.zhihu.com/question/34681168
首先,我感觉不必像 @李Shawn 同学一样认为DNN、CNN、RNN完全不能相提并论。从广义上来说,NN(或是更美的DNN)确实可以认为包含了CNN、RNN这些具体的变种形式。在实际应用中,所谓的深度神经网络DNN,往往融合了多种已知的结构,包括卷积层或是LSTM单元。但是就题主的意思来看,这里的DNN应该特指全连接的神经元结构,并不包含卷积单元或是时间上的关联。因此,题主一定要将DNN、CNN、RNN等进行对比,也未尝不可。
其实,如果我们顺着神经网络技术发展的脉络,就很容易弄清这几种网络结构发明的初衷,和他们之间本质的区别,希望对题主有所帮助。
=========================== 分 割 线 就 是 我 ================================
神经网络技术起源于上世纪五、六十年代,当时叫感知机(perceptron),拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果。早期感知机的推动者是Rosenblatt。(扯一个不相关的:由于计算技术的落后,当时感知器传输函数是用线拉动变阻器改变电阻的方法机械实现的,脑补一下科学家们扯着密密麻麻的导线的样子…)
但是,Rosenblatt的单层感知机有一个严重得不能再严重的问题,即它对稍复杂一些的函数都无能为力(比如最为典型的“异或”操作)。连异或都不能拟合,你还能指望这货有什么实际用途么o(╯□╰)o
随着数学的发展,这个缺点直到上世纪八十年代才被Rumelhart、Williams、Hinton、LeCun等人(反正就是一票大牛)发明的多层感知机(multilayer perceptron)克服。多层感知机,顾名思义,就是有多个隐含层的感知机(废话……)。好好,我们看一下多层感知机的结构:
图1上下层神经元全部相连的神经网络——多层感知机
多层感知机可以摆脱早期离散传输函数的束缚,使用sigmoid或tanh等连续函数模拟神经元对激励的响应,在训练算法上则使用Werbos发明的反向传播BP算法。对,这货就是我们现在所说的神经网络NN——神经网络听起来不知道比感知机高端到哪里去了!这再次告诉我们起一个好听的名字对于研(zhuang)究(bi)很重要!
多层感知机解决了之前无法模拟异或逻辑的缺陷,同时更多的层数也让网络更能够刻画现实世界中的复杂情形。相信年轻如Hinton当时一定是春风得意。
多层感知机给我们带来的启示是,神经网络的层数直接决定了它对现实的刻画能力——利用每层更少的神经元拟合更加复杂的函数[1]。
(Bengio如是说:functions that can be compactly represented by a depth k architecture might require an exponential number of computational elements to be represented by a depth k − 1 architecture.)
即便大牛们早就预料到神经网络需要变得更深,但是有一个梦魇总是萦绕左右。随着神经网络层数的加深,优化函数越来越容易陷入局部最优解,并且这个“陷阱”越来越偏离真正的全局最优。利用有限数据训练的深层网络,性能还不如较浅层网络。同时,另一个不可忽略的问题是随着网络层数增加,“梯度消失”现象更加严重。具体来说,我们常常使用sigmoid作为神经元的输入输出函数。对于幅度为1的信号,在BP反向传播梯度时,每传递一层,梯度衰减为原来的0.25。层数一多,梯度指数衰减后低层基本上接受不到有效的训练信号。
2006年,Hinton利用预训练方法缓解了局部最优解问题,将隐含层推动到了7层[2],神经网络真正意义上有了“深度”,由此揭开了深度学习的热潮。这里的“深度”并没有固定的定义——在语音识别中4层网络就能够被认为是“较深的”,而在图像识别中20层以上的网络屡见不鲜。为了克服梯度消失,ReLU、maxout等传输函数代替了sigmoid,形成了如今DNN的基本形式。单从结构上来说,全连接的DNN和图1的多层感知机是没有任何区别的。
值得一提的是,今年出现的高速公路网络(highway network)和深度残差学习(deep residual learning)进一步避免了梯度消失,网络层数达到了前所未有的一百多层(深度残差学习:152层)[3,4]!具体结构题主可自行搜索了解。如果你之前在怀疑是不是有很多方法打上了“深度学习”的噱头,这个结果真是深得让人心服口服。
图2缩减版的深度残差学习网络,仅有34层,终极版有152层,自行感受一下
如图1所示,我们看到全连接DNN的结构里下层神经元和所有上层神经元都能够形成连接,带来的潜在问题是参数数量的膨胀。假设输入的是一幅像素为1K*1K的图像,隐含层有1M个节点,光这一层就有10^12个权重需要训练,这不仅容易过拟合,而且极容易陷入局部最优。另外,图像中有固有的局部模式(比如轮廓、边界,人的眼睛、鼻子、嘴等)可以利用,显然应该将图像处理中的概念和神经网络技术相结合。此时我们可以祭出题主所说的卷积神经网络CNN。对于CNN来说,并不是所有上下层神经元都能直接相连,而是通过“卷积核”作为中介。同一个卷积核在所有图像内是共享的,图像通过卷积操作后仍然保留原先的位置关系。两层之间的卷积传输的示意图如下:
图3卷积神经网络隐含层(摘自Theano教程)
通过一个例子简单说明卷积神经网络的结构。假设图3中m-1=1是输入层,我们需要识别一幅彩色图像,这幅图像具有四个通道ARGB(透明度和红绿蓝,对应了四幅相同大小的图像),假设卷积核大小为100*100,共使用100个卷积核w1到w100(从直觉来看,每个卷积核应该学习到不同的结构特征)。用w1在ARGB图像上进行卷积操作,可以得到隐含层的第一幅图像;这幅隐含层图像左上角第一个像素是四幅输入图像左上角100*100区域内像素的加权求和,以此类推。同理,算上其他卷积核,隐含层对应100幅“图像”。每幅图像对是对原始图像中不同特征的响应。按照这样的结构继续传递下去。CNN中还有max-pooling等操作进一步提高鲁棒性。
图4一个典型的卷积神经网络结构,注意到最后一层实际上是一个全连接层(摘自Theano教程)
在这个例子里,我们注意到输入层到隐含层的参数瞬间降低到了100*100*100=10^6个!这使得我们能够用已有的训练数据得到良好的模型。题主所说的适用于图像识别,正是由于CNN模型限制参数了个数并挖掘了局部结构的这个特点。顺着同样的思路,利用语音语谱结构中的局部信息,CNN照样能应用在语音识别中。
全连接的DNN还存在着另一个问题——无法对时间序列上的变化进行建模。然而,样本出现的时间顺序对于自然语言处理、语音识别、手写体识别等应用非常重要。对了适应这种需求,就出现了题主所说的另一种神经网络结构——循环神经网络RNN。
在普通的全连接网络或CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被成为前向神经网络(Feed-forward Neural Networks)。而在RNN中,神经元的输出可以在下一个时间戳直接作用到自身,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出!表示成图就是这样的:
图5 RNN网络结构
我们可以看到在隐含层节点之间增加了互连。为了分析方便,我们常将RNN在时间上进行展开,得到如图6所示的结构:
图6 RNN在时间上进行展开
Cool,(t+1)时刻网络的最终结果O(t+1)是该时刻输入和所有历史共同作用的结果!这就达到了对时间序列建模的目的。
不知题主是否发现,RNN可以看成一个在时间上传递的神经网络,它的深度是时间的长度!正如我们上面所说,“梯度消失”现象又要出现了,只不过这次发生在时间轴上。对于t时刻来说,它产生的梯度在时间轴上向历史传播几层之后就消失了,根本就无法影响太遥远的过去。因此,之前说“所有历史”共同作用只是理想的情况,在实际中,这种影响也就只能维持若干个时间戳。
为了解决时间上的梯度消失,机器学习领域发展出了长短时记忆单元LSTM,通过门的开关实现时间上记忆功能,并防止梯度消失,一个LSTM单元长这个样子:
图7 LSTM的模样
除了题主疑惑的三种网络,和我之前提到的深度残差学习、LSTM外,深度学习还有许多其他的结构。举个例子,RNN既然能继承历史信息,是不是也能吸收点未来的信息呢?因为在序列信号分析中,如果我能预知未来,对识别一定也是有所帮助的。因此就有了双向RNN、双向LSTM,同时利用历史和未来的信息。
图8双向RNN
事实上,不论是那种网络,他们在实际应用中常常都混合着使用,比如CNN和RNN在上层输出之前往往会接上全连接层,很难说某个网络到底属于哪个类别。不难想象随着深度学习热度的延续,更灵活的组合方式、更多的网络结构将被发展出来。尽管看起来千变万化,但研究者们的出发点肯定都是为了解决特定的问题。题主如果想进行这方面的研究,不妨仔细分析一下这些结构各自的特点以及它们达成目标的手段。入门的话可以参考:
Ng写的Ufldl:UFLDL教程 - Ufldl
也可以看Theano内自带的教程,例子非常具体:Deep Learning Tutorials
欢迎大家继续推荐补充。
当然啦,如果题主只是想凑个热闹时髦一把,或者大概了解一下方便以后把妹使,这样看看也就罢了吧。
参考文献:
[1] Bengio Y. Learning Deep Architectures for AI[J]. Foundations & Trends® in Machine Learning, 2009, 2(1):1-127.
[2] Hinton G E, Salakhutdinov R R. Reducing the Dimensionality of Data with Neural Networks[J]. Science, 2006, 313(5786):504-507.
[3] He K, Zhang X, Ren S, Sun J. Deep Residual Learning for Image Recognition. arXiv:1512.03385, 2015.
[4] Srivastava R K, Greff K, Schmidhuber J. Highway networks. arXiv:1505.00387, 2015.
【“科研君”公众号初衷始终是希望聚集各专业一线科研人员和工作者,在进行科学研究的同时也作为知识的传播者,利用自己的专业知识解释和普及生活中的 一些现象和原理,展现科学有趣生动的一面。该公众号由清华大学一群在校博士生发起,目前参与的作者人数有10人,但我们感觉这远远不能覆盖所以想科普的领域,并且由于空闲时间有限,导致我们只能每周发布一篇文章。我们期待更多的战友加入,认识更多志同道合的人,每个人都是科研君,每个人都是知识的传播者。我们期待大家的参与,想加入我们,进QQ群吧~:108141238】
【非常高兴看到大家喜欢并赞同我们的回答。应许多知友的建议,最近我们开通了同名公众号:PhDer,也会定期更新我们的文章,如果您不想错过我们的每篇回答,欢迎扫码关注~ 】
个人觉得CNN、RNN和DNN不能放在一起比较。
DNN是一个大类,CNN是一个典型的空间上深度的神经网络,RNN是在时间上深度的神经网络。
推荐你从UFLDL开始看,这是斯坦福深度学习的课程,了解一些神经网络的基础,会对你的学习有很大帮助。
=============================分割线======================================
前面一位同学回答得非常详细完整,我再回来谈一谈怎么学习这些模型,我来分享一下我的学习历程。我也是在学习中,以后会慢慢继续补充。
1、http://ufldl.stanford.edu/wiki/index.php/UFLDL教程
这是我最开始接触神经网络时看的资料,把这个仔细研究完会对神经网络的模型以及如何训练(反向传播算法)有一个基本的认识,算是一个基本功。
2、Deep Learning Tutorials
这是一个开源的深度学习工具包,里面有很多深度学习模型的python代码还有一些对模型以及代码细节的解释。我觉得学习深度学习光了解模型是不难的,难点在于把模型落地写成代码,因为里面会有很多细节只有动手写了代码才会了解。但Theano也有缺点,就是极其难以调试,以至于我后来就算自己动手写几百行的代码也不愿意再用它的工具包。所以我觉得Theano的正确用法还是在于看里面解释的文字,不要害怕英文,这是必经之路。PS:推荐使用python语言,目前来看比较主流。(更新:自己写坑实在太多了,CUDA也不知道怎么用,还是乖乖用theano吧...)
3、Stanford University CS231n: Convolutional Neural Networks for Visual Recognition
斯坦福的一门课:卷积神经网络,李飞飞教授主讲。这门课会系统的讲一下卷积神经网络的模型,然后还有一些课后习题,题目很有代表性,也是用python写的,是在一份代码中填写一部分缺失的代码。如果把这个完整学完,相信使用卷积神经网络就不是一个大问题了。
这可能是机器学习领域最经典最知名的公开课了,由大牛Andrew Ng主讲,这个就不仅仅是深度学习了,它是带你领略机器学习领域中最重要的概念,然后建立起一个框架,使你对机器学习这个学科有一个较为完整的认识。这个我觉得所有学习机器学习的人都应该看一下,我甚至在某公司的招聘要求上看到过:认真看过并深入研究过Andrew Ng的机器学习课程,由此可见其重要性。
2017年7月3日 更新
不同网络的区别:人们在网络中实现加入的先验知识的不同。
整体解释:公开课 | 深层神经网络设计理念 附带 ppt下载(无视频版)
神经网络入门:深层学习为何要“Deep”(上)
前馈神经网络引入的先验知识:并行、迭代;
- 详细解释:深层学习为何要“Deep”(下) 较难懂,建议先看完公开课再看该篇文章。
循环神经网络引入的先验知识:时间共享;
- 详细解释:循环神经网络--介绍
循环神经网络引入的先验知识:空间共享;
- 详细解释:卷积神经网络--介绍
深层学习的“深”字是由于将分类/回归和特征提取两者结合在一起来训练了。
Recurrent layer和convolutional layer都可以看成是特征提取层。
- 语音识别用Recurrent layer去学习“如何”去听,再用学好的听取方式去处理声音再送入分类器中。人脑举例子,我们大脑已有从中文学来的对语音的“特征提取层”和“分类层”。学习外语的时候,只是新训练了一个“分类层”,继续用中文的语音的“特征提取层”,这是外语听力的不好的原因之一。
- 画面识别convolutional layer学习“如何”去观察,再用学好的观察方式去处理画面再送入分类器中。人脑举例子,我们在观察图片的时候并不是一眼把所有画面都送入大脑进行识别的,而是跟convolutional layer的处理方式一样,逐一扫描局部后再合并。不同的扫描方式,所观察出的内容也不同。
具体可以看下面的部分
简单理解神经网络应该分为两部分:
- 网络结构:神经网络是怎么计算预测的,以及神经网络为什么好用。
- 网络训练:神经网络是怎么训练的,以及如何克服在训练时所遇到的如过拟合,梯度消失等问题。
进一步理解围绕“深层”二字来神经网络的的话应该在网络结构中细分两类: 网络结构:
- 特征结构:之所以要深层是因为一部分的层在完成“学习如何提取特征”的任务。比如画面处理的convolutional layers ,时间序列处理的Recurrent layers。甚至feedforward layers也能完成此任务。
- 分类/递归结构:如果仅需完成分类器的任务的话,一个hidden feedforward足以。其他的机器学习算法如SVM,GP甚至做的要比神经网络要好。
举例说明:比如图片识别。一个图片究竟是什么不仅取决于图片本身,还取决于识别者“如何观察”。
如果这是一个训练样本。
- 当你给的标签是少女的时候,convolutional layers会以此学习“如何观察”成少女
- 当你给的标签是老妇的时候,convolutional layers会以此学习“如何观察”成老妇
- 之所以深层,是因为一定数量的层数在学习“如何观察”。再学习完如何观察后再传递给“分类层”中去。而分类层并不需要“深”。
- 网络结构中最重要的是特征结构层,画面处理的convolutional layers ,时间序列处理的Recurrent layers最好理解为特征结构层。
一、深度学习:
深度学习是机器学习的一个分支。可以理解为具有多层结构的模型。
二、基本模型:
给大家总结一下深度学习里面的基本模型。我将这些模型大致分为了这几类:多层感知机模型;深度神经网络模型和递归神经网络模型。
2.1 多层感知机模型(也就是你这里说的深度神经网络):
2.1.1 Stacked Auto-Encoder堆叠自编码器
堆叠自编码器是一种最基础的深度学习模型,该模型的子网络结构自编码器通过假设输出与输入是相同的来训练调整网络参数,得到每一层中的权重。通过堆叠多层自编码网络可以得到输入信号的几种不同表征(每一层代表一种表征),这些表征就是特征。自动编码器就是一种尽可能复现输入信号的神经网络。为了实现这种复现,自编码器就必须捕捉可以代表输入数据的最重要的因素,就像PCA那样,找到可以代表原信息的主要成分。
2.1.1.1 网络结构
堆叠自编码器的网络结构本质上就是一种普通的多层神经网络结构。
图1 自编码器网络结构
2.1.1.2 训练过程
堆叠自编码器与普通神经网络不同之处在于其训练过程,该网络结构训练主要分两步:非监督预训练和有监督微调训练。
(1)非监督预训练
自编码器通过自学习得到原始数据的压缩和分布式表征,一般用于高层特征提取与数据非线性降维。结构上类似于一个典型的三层BP神经网络,由一个输入层,一个中间隐含层和一个输出层构成。但是,输出层与输入层的神经元个数相等,且训练样本集合的标签值为输入值,即无标签值。输入层到隐含层之间的映射称为编码(Encoder),隐含层到输出层之间的映射称为解码(Decoder)。非监督预训练自编码器的中间层为特征层,在训练好第一层特征层后,第二层和第一层的训练方式相同。我们将第一层输出的特征层当成第二层的输入层,同样最小化重构误差,就会得到第二层的参数,并且得到第二层输入的特征层,也就是原输入信息的第二个表征。以此类推可以训练其他特征层。
(3)有监督微调训练
经过上面的训练方法,可以得到一个多层的堆叠自编码器,每一层都会得到原始输入的不同的表达。到这里,这个堆叠自编码器还不能用来分类数据,因为它还没有学习如何去连结一个输入和一个类。它只是学习获得了一个可以良好代表输入的特征,这个特征可以最大程度上代表原输入信号。那么,为了实现分类,我们就可以在AutoEncoder的最顶的编码层添加一个分类器(例如逻辑斯蒂回归、SVM等),然后通过标准的多层神经网络的监督训练方法(梯度下降法)微调训练。
2.1.1.3 典型改进
(1)Sparse AutoEncoder稀疏自编码器
在AutoEncoder的基础上加上L1的稀疏限制(L1主要是约束每一层中的节点中大部分都要为0,只有少数不为0,这就是Sparse名字的来源)来减小过拟合的影响,我们就可以得到稀疏自编码器。
(2)Denoising AutoEncoders降噪自编码器
降噪自动编码器是在自动编码器的基础上,训练数据加入噪声,所以自动编码器必须学习去去除这种噪声而获得真正的没有被噪声污染过的输入。因此,这就迫使编码器去学习输入信号的更加鲁棒的表达,这也是它的泛化能力比一般编码器强的原因。
2.1.1.4 模型优缺点
(1)优点:
(1)、可以利用足够多的无标签数据进行模型预训练;
(2)、具有较强的数据表征能力。
(2)缺点:
(1)、因为是全连接网络,需要训练的参数较多,容易出现过拟合;深度模型容易出现梯度消散问题。
(2)、要求输入数据具有平移不变性。
2.1.2、Deep belief network 深度信念网络
2006年,Geoffrey Hinton提出深度信念网络(DBN)及其高效的学习算法,即Pre-training+Fine tuning,并发表于《Science》上,成为其后深度学习算法的主要框架。DBN是一种生成模型,通过训练其神经元间的权重,我们可以让整个神经网络按照最大概率来生成训练数据。所以,我们不仅可以使用DBN识别特征、分类数据,还可以用它来生成数据。
2.1.2.1 网络结构
深度信念网络(DBN)由若干层受限玻尔兹曼机(RBM)堆叠而成,上一层RBM的隐层作为下一层RBM的可见层。下面先介绍RBM,再介绍DBN。
(1) RBM
图2 RBM网络结构
一个普通的RBM网络结构如上图所示,是一个双层模型,由m个可见层单元及n个隐层单元组成,其中,层内神经元无连接,层间神经元全连接,也就是说:在给定可见层状态时,隐层的激活状态条件独立,反之,当给定隐层状态时,可见层的激活状态条件独立。这保证了层内神经元之间的条件独立性,降低概率分布计算及训练的复杂度。RBM可以被视为一个无向图模型,可见层神经元与隐层神经元之间的连接权重是双向的,即可见层到隐层的连接权重为W,则隐层到可见层的连接权重为W’。除以上提及的参数外,RBM的参数还包括可见层偏置b及隐层偏置c。
RBM可见层和隐层单元所定义的分布可根据实际需要更换,包括:Binary单元、Gaussian单元、Rectified Linear单元等,这些不同单元的主要区别在于其激活函数不同。
(2) DBN
图3 DBN模型结构
DBN模型由若干层RBM堆叠而成,如果在训练集中有标签数据,那么最后一层RBM的可见层中既包含前一层RBM的隐层单元,也包含标签层单元。假设顶层RBM的可见层有500个神经元,训练数据的分类一共分成了10类,那么顶层RBM的可见层有510个显性神经元,对每一训练数据,相应的标签神经元被打开设为1,而其他的则被关闭设为0。
2.1.2.2 训练过程
DBN的训练包括Pre-training和Fine tuning两步,其中Pre-training过程相当于逐层训练每一个RBM,经过Pre-training的DBN已经可用于模拟训练数据,而为了进一步提高网络的判别性能, Fine tuning过程利用标签数据通过BP算法对网络参数进行微调。
(1) Pre-training
如前面所说,DBN的Pre-training过程相当于逐层训练每一个RBM,因此进行Pre-training时直接使用RBM的训练算法。
(2) Fine tuning
建立一个与DBN相同层数的神经网络,将Pre-training过程获得的网络参数赋给此神经网络,作为其参数的初始值,然后在最后一层后添加标签层,结合训练数据标签,利用BP算法微调整个网络参数,完成Fine tuning过程。
2.1.2.3 改进模型
DBN的变体比较多,它的改进主要集中于其组成“零件”RBM的改进,下面列举两种主要的变体。(这边的改进模型暂时没有深入研究,所以大概参考网上的内容)
(1) 卷积DBN(CDBN)
DBN并没有考虑到图像的二维结构信息,因为输入是简单的将一个图像矩阵转换为一维向量。而CDBN利用邻域像素的空域关系,通过一个称为卷积RBM(CRBM)的模型达到生成模型的变换不变性,而且可以容易得变换到高维图像。
(2) 条件RBM(Conditional RBM)
DBN并没有明确地处理对观察变量的时间联系的学习上,Conditional RBM通过考虑前一时刻的可见层单元变量作为附加的条件输入,以模拟序列数据,这种变体在语音信号处理领域应用较多。
2.1.2.4 典型优缺点
对DBN优缺点的总结主要集中在生成模型与判别模型的优缺点总结上。
(1)优点:
(1)、生成模型学习联合概率密度分布,所以就可以从统计的角度表示数据的分布情况,能够反映同类数据本身的相似度;
(2)、生成模型可以还原出条件概率分布,此时相当于判别模型,而判别模型无法得到联合分布,所以不能当成生成模型使用。
(2)缺点:
(1)、 生成模型不关心不同类别之间的最优分类面到底在哪儿,所以用于分类问题时,分类精度可能没有判别模型高;
(2)、由于生成模型学习的是数据的联合分布,因此在某种程度上学习问题的复杂性更高。
(3)、要求输入数据具有平移不变性。
2.2、Convolution Neural Networks卷积神经网络
卷积神经网络是人工神经网络的一种,已成为当前语音分析和图像识别领域的研究热点。它的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。
2.2.1 网络结构
卷积神经网络是一个多层的神经网络,其基本运算单元包括:卷积运算、池化运算、全连接运算和识别运算。
图4 卷积神经网络结构
l 卷积运算:前一层的特征图与一个可学习的卷积核进行卷积运算,卷积的结果经过激活函数后的输出形成这一层的神经元,从而构成该层特征图,也称特征提取层,每个神经元的输入与前一层的局部感受野相连接,并提取该局部的特征,一旦该局部特征被提取,它与其它特征之间的位置关系就被确定。
l 池化运算:它把输入信号分割成不重叠的区域,对于每个区域通过池化(下采样)运算来降低网络的空间分辨率,比如最大值池化是选择区域内的最大值,均值池化是计算区域内的平均值。通过该运算来消除信号的偏移和扭曲。
l 全连接运算:输入信号经过多次卷积核池化运算后,输出为多组信号,经过全连接运算,将多组信号依次组合为一组信号。
l 识别运算:上述运算过程为特征学习运算,需在上述运算基础上根据业务需求(分类或回归问题)增加一层网络用于分类或回归计算。
2.2.2 训练过程
卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。卷积网络执行的是有监督训练,所以其样本集是由形如:(输入信号,标签值)的向量对构成的。
2.2.3 典型改进
卷积神经网络因为其在各个领域中取得了好的效果,是近几年来研究和应用最为广泛的深度神经网络。比较有名的卷积神经网络模型主要包括1986年Lenet,2012年的Alexnet,2014年的GoogleNet,2014年的VGG,2015年的Deep Residual Learning。这些卷积神经网络的改进版本或者模型的深度,或者模型的组织结构有一定的差异,但是组成模型的机构构建是相同的,基本都包含了卷积运算、池化运算、全连接运算和识别运算。
2.2.4 模型优缺点
(1)优点:
(1)、权重共享策略减少了需要训练的参数,相同的权重可以让滤波器不受信号位置的影响来检测信号的特性,使得训练出来的模型的泛化能力更强;
(2)、池化运算可以降低网络的空间分辨率,从而消除信号的微小偏移和扭曲,从而对输入数据的平移不变性要求不高。
(2)缺点:
(1)、深度模型容易出现梯度消散问题。
2.3、Recurrent neural network 递归神经网络
在深度学习领域,传统的多层感知机为基础的上述各网络结构具有出色的表现,取得了许多成功,它曾在许多不同的任务上——包括手写数字识别和目标分类上创造了记录。但是,他们也存在一定的问题,上述模型都无法分析输入信息之间的整体逻辑序列。这些信息序列富含有大量的内容,信息彼此间有着复杂的时间关联性,并且信息长度各种各样。这是以上模型所无法解决的,递归神经网络正是为了解决这种序列问题应运而生,其关键之处在于当前网络的隐藏状态会保留先前的输入信息,用来作当前网络的输出。
许多任务需要处理序列数据,比如Image captioning, speech synthesis, and music generation 均需要模型生成序列数据,其他领域比如 time series prediction, video analysis, and musical information retrieval 等要求模型的输入为序列数据,其他任务比如机器翻译,人机对话,controlling a robot 的模型要求输入输出均为序列数据。
2.3.1 网络结构
图4.1左侧是递归神经网络的原始结构,如果先抛弃中间那个令人生畏的闭环,那其实就是简单“输入层=>隐藏层=>输出层”的三层结构,但是图中多了一个非常陌生的闭环,也就是说输入到隐藏层之后,隐藏层还会输入给自己,使得该网络可以拥有记忆能力。我们说递归神经网络拥有记忆能力,而这种能力就是通过W将以往的输入状态进行总结,而作为下次输入的辅助。可以这样理解隐藏状态:
h=f(现有的输入+过去记忆总结)
图5 递归神经网络结构图
2.3.2 训练过程
递归神经网络中由于输入时叠加了之前的信号,所以反向传导时不同于传统的神经网络,因为对于时刻t的输入层,其残差不仅来自于输出,还来自于之后的隐层。通过反向传递算法,利用输出层的误差,求解各个权重的梯度,然后利用梯度下降法更新各个权重。
2.3.3 典型改进
递归神经网络模型可以用来处理序列数据,递归神经网络包含了大量参数,且难于训练(时间维度的梯度消散或梯度爆炸),所以出现一系列对RNN优化,比如网络结构、求解算法与并行化。今年来bidirectional RNN (BRNN)与 LSTM在image captioning, language translation, and handwriting recognition这几个方向上有了突破性进展 。
2.3.4 模型优缺点
(1)优点:
(1)、模型是时间维度上的深度模型,可以对序列内容建模;
(2)缺点:
(1)、需要训练的参数较多,容易出现梯度消散或梯度爆炸问题;
(2)、不具有特征学习能力。
链接:知乎专栏
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
首先, 要看RNN和对于图像等静态类变量处理立下神功的卷积网络CNN的结构区别来看, “循环”两个字,已经点出了RNN的核心特征, 即系统的输出会保留在网络里, 和系统下一刻的输入一起共同决定下一刻的输出。这就把动力学的本质体现了出来, 循环正对应动力学系统的反馈概念,可以刻画复杂的历史依赖。另一个角度看也符合著名的图灵机原理。 即此刻的状态包含上一刻的历史,又是下一刻变化的依据。 这其实包含了可编程神经网络的核心概念,即, 当你有一个未知的过程,但你可以测量到输入和输出, 你假设当这个过程通过RNN的时候,它是可以自己学会这样的输入输出规律的, 而且因此具有预测能力。 在这点上说, RNN是图灵完备的。
图: 图1即CNN的架构, 图2到5是RNN的几种基本玩法。图2是把单一输入转化为序列输出,例如把图像转化成一行文字。 图三是把序列输入转化为单个输出, 比如情感测试,测量一段话正面或负面的情绪。 图四是把序列转化为序列, 最典型的是机器翻译, 注意输入和输出的“时差”。 图5是无时差的序列到序列转化, 比如给一个录像中的每一帧贴标签。 图片来源 The unreasonable effective RNN。
我们用一段小巧的python代码让你重新理解下上述的原理:
classRNN:
# ...
def step(self, x):
# update the hidden state
self.h = np.tanh(np.dot(self.W_hh, self.h) + np.dot(self.W_xh, x))
# compute the output vector
y = np.dot(self.W_hy, self.h)
return y
这里的h就是hidden variable 隐变量,即整个网络每个神经元的状态,x是输入, y是输出, 注意着三者都是高维向量。隐变量h,就是通常说的神经网络本体,也正是循环得以实现的基础, 因为它如同一个可以储存无穷历史信息(理论上)的水库,一方面会通过输入矩阵W_xh吸收输入序列x的当下值,一方面通过网络连接W_hh进行内部神经元间的相互作用(网络效应,信息传递),因为其网络的状态和输入的整个过去历史有关, 最终的输出又是两部分加在一起共同通过非线性函数tanh。 整个过程就是一个循环神经网络“循环”的过程。 W_hh理论上可以可以刻画输入的整个历史对于最终输出的任何反馈形式,从而刻画序列内部,或序列之间的时间关联, 这是RNN强大的关键。
那么CNN似乎也有类似的功能? 那么CNN是不是也可以当做RNN来用呢? 答案是否定的,RNN的重要特性是可以处理不定长的输入,得到一定的输出。当你的输入可长可短, 比如训练翻译模型的时候, 你的句子长度都不固定,你是无法像一个训练固定像素的图像那样用CNN搞定的。而利用RNN的循环特性可以轻松搞定。
图, CNN(左)和RNN(右)的结构区别, 注意右图中输出和隐变量网络间的双向箭头不一定存在,往往只有隐变量到输出的箭头。
在序列信号的应用上,CNN是只响应预先设定的信号长度(输入向量的长度),RNN的响应长度是学习出来的。
CNN对特征的响应是线性的,RNN在这个递进方向上是非线性响应的。这也带来了很大的差别。CNN 专门解决图像问题的,可用把它看作特征提取层,放在输入层上,最后用MLP 做分类。
RNN 专门解决时间序列问题的,用来提取时间序列信息,放在特征提取层(如CNN)之后。
DNN 说白了就是 多层网络,只是用了很多技巧,让它能够 deep 。
工具及教程:
http://tensorlayer.readthedocs.io
https://www.tensorflow.org/versions/r0.9/tutorials/index.html