CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?

-

CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?以及他们的主要用途是什么?只知道CNN是局部感受和参数共享,比较适合用于图像这方面。刚入门的小白真心求助

人工智能 语音识别 图像识别 神经网络 深度学习(Deep Learning)

首先,我感觉不必像 @李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,也会定期更新我们的文章,如果您不想错过我们的每篇回答,欢迎扫码关注~ 】


weixin.qq.com/r/5zsuNoH (二维码自动识别)

个人觉得CNN、RNN和DNN不能放在一起比较。
DNN是一个大类,CNN是一个典型的空间上深度的神经网络,RNN是在时间上深度的神经网络。
推荐你从UFLDL开始看,这是斯坦福深度学习的课程,了解一些神经网络的基础,会对你的学习有很大帮助。
=============================分割线======================================
前面一位同学回答得非常详细完整,我再回来谈一谈怎么学习这些模型,我来分享一下我的学习历程。我也是在学习中,以后会慢慢继续补充。
1、ufldl.stanford.edu/wiki教程
这是我最开始接触神经网络时看的资料,把这个仔细研究完会对神经网络的模型以及如何训练(反向传播算法)有一个基本的认识,算是一个基本功。

2、Deep Learning Tutorials
这是一个开源的深度学习工具包,里面有很多深度学习模型的python代码还有一些对模型以及代码细节的解释。我觉得学习深度学习光了解模型是不难的,难点在于把模型落地写成代码,因为里面会有很多细节只有动手写了代码才会了解。但Theano也有缺点,就是极其难以调试,以至于我后来就算自己动手写几百行的代码也不愿意再用它的工具包。所以我觉得Theano的正确用法还是在于看里面解释的文字,不要害怕英文,这是必经之路。PS:推荐使用python语言,目前来看比较主流。(更新:自己写坑实在太多了,CUDA也不知道怎么用,还是乖乖用theano吧...)

3、Stanford University CS231n: Convolutional Neural Networks for Visual Recognition
斯坦福的一门课:卷积神经网络,李飞飞教授主讲。这门课会系统的讲一下卷积神经网络的模型,然后还有一些课后习题,题目很有代表性,也是用python写的,是在一份代码中填写一部分缺失的代码。如果把这个完整学完,相信使用卷积神经网络就不是一个大问题了。

4、斯坦福大学公开课 :机器学习课程
这可能是机器学习领域最经典最知名的公开课了,由大牛Andrew Ng主讲,这个就不仅仅是深度学习了,它是带你领略机器学习领域中最重要的概念,然后建立起一个框架,使你对机器学习这个学科有一个较为完整的认识。这个我觉得所有学习机器学习的人都应该看一下,我甚至在某公司的招聘要求上看到过:认真看过并深入研究过Andrew Ng的机器学习课程,由此可见其重要性。

在序列信号的应用上,CNN是只响应预先设定的信号长度(输入向量的长度),RNN的响应长度是学习出来的。

CNN对特征的响应是线性的,RNN在这个递进方向上是非线性响应的。这也带来了很大的差别。

我不把他们叫做CNN或RNN,而叫convolutional layers,recurrent layers,feedforward layers。
所有layers的本质都是feedforward。

  1. feedforward layer是指在一个vector内部的不同维度之间进行一次信息交互
  2. convolutional layer以逐次扫描的方式在一个vector的局部进行多次信息交互
  3. recurrent layer就是在hidden state上增加了loop,看似复杂,其实就是从时间维度上进行了展开是在不同时刻的多个vectors之间进行信息交互

深层学习的“深”字是由于将分类/回归特征提取两者结合在一起来训练了。
Recurrent layer和convolutional layer都可以看成是特征提取层。
  1. 语音识别用Recurrent layer去学习“如何”去听,再用学好的听取方式去处理声音再送入分类器中。
    人脑举例子,我们大脑已有从中文学来的对语音的“特征提取层”和“分类层”。学习外语的时候,只是新训练了一个“分类层”,继续用中文的语音的“特征提取层”,这是外语听力的不好的原因之一。
    
  2. 画面识别convolutional layer学习“如何”去观察,再用学好的观察方式去处理画面再送入分类器中。
    人脑举例子,我们在观察图片的时候并不是一眼把所有画面都送入大脑进行识别的,而是跟convolutional layer的处理方式一样,逐一扫描局部后再合并。不同的扫描方式,所观察出的内容也不同。
    
具体可以看下面的部分

链接:理解"深层"神经网络 - YJango的文章 - 知乎专栏

简单理解神经网络应该分为两部分:

  • 网络结构:神经网络是怎么计算预测的,以及神经网络为什么好用。
  • 网络训练:神经网络是怎么训练的,以及如何克服在训练时所遇到的如过拟合,梯度消失等问题。

进一步理解围绕“深层”二字来神经网络的的话应该在网络结构细分两类
网络结构:

  • 特征结构:之所以要深层是因为一部分的层在完成“学习如何提取特征”的任务。比如画面处理的convolutional layers ,时间序列处理的Recurrent layers。甚至feedforward layers也能完成此任务。
  • 分类/递归结构:如果仅需完成分类器的任务的话,一个hidden feedforward足以。其他的机器学习算法如SVM,GP甚至做的要比神经网络要好。
举例说明:比如图片识别。一个图片究竟是什么不仅取决于图片本身,还取决于识别者“如何观察”。

如果这是一个训练样本。
  • 当你给的标签是少女的时候,convolutional layers会以此学习“如何观察”成少女
  • 当你给的标签是老妇的时候,convolutional layers会以此学习“如何观察”成老妇
  • 之所以深层,是因为一定数量的层数在学习“如何观察”。再学习完如何观察后再传递给“分类层”中去。而分类层并不需要“深”。
  • 网络结构中最重要的是特征结构层,画面处理的convolutional layers ,时间序列处理的Recurrent layers最好理解为特征结构层


补充:这种特征层 + Mapping层的观点可以从Yoshua Bengio大神在 Deep Learning:Theoretical Motivations 的开头的讲解中找的到
这张图简述了机器学习的发展,从最初的人工定义特征再放入分类器的方法一直到如今的deep learning。
Yoshua Bengio所提到的
automatic feature discovery+ high level 就是特征层,
mapping from features to output 就是 分类/回归层.
可以看出从representation learning 开始就已经融合二者在一个网络之中了,深层学习更是进了一步.同时也能清晰的观察到,deep learning之所以"深"的原因.

当前人们的研究方向
深层神经网络叫做deep neural network (DNN),是指加深后的神经网络。深层学习叫做deep learning (DL),泛指任何加深后的机器学习方法。DNN是DL的一种。
当人们意识到更deep的机器学习方法更加有效时,除了神经网络,人们也在不断的尝试应用其他的深层学习方法。比如加深SVM,加深Gaussian Processes (GP) 就是比较有前景的研究。 在单层的时候SVM和GP都比NN要更加优秀,GP在回归task上额外优秀,但加深GP存在训练上的困难。这也是人们当前在解决的课题之一。

我个人的看法是,DNN是深度学习思想的一个统称,狭义上它是一种逐层贪婪无监督的学习方法,注意它只是一种思想,需要依赖具体的模型去实现,即深度学习 = 逐层贪婪无监督方法 + 特定深度学习模型。而具体的深度学习模型有CNN、RNN、SDA、RBM、RBM等。逐层贪婪无监督的深度学习思想是2006年提出来的,能有效解决深层网络结构训练的梯度弥散等问题。而CNN等网络模型其实很早就提出来了,之前用BP之类的老方法效果一直不太好,等到深度学习思想提出来后,这些老模型就都焕发了新生,带来了今天深度学习的火热。回归到问题上来,就是CNN、RNN、DNN不是一个层次上的东西,分别是具体的模型和通用的思想。这是我的个人理解,还在学习中,如有错误欢迎指出。

DNN以神经网络为载体,重在深度,可以说是一个统称。
RNN,回归型网络,用于序列数据,并且有了一定的记忆效应,辅之以lstm。
CNN应该侧重空间映射,图像数据尤为贴合此场景。

CNN就是全连接权值太多,取的一个折衷策略,只取部分连接边扫描一遍整个输入,最后再汇总(求max等等操作)。
RNN就是在隐层加入了自连边和互连边(即隐层可以相互连接),可以按时序展开为一系列FNN。常见训练算法为bptt和lstm。
DNN个人理解就是隐层有很多层,bp反传时可能梯度会锐减或剧增,导致误差传不回来,可以通过重新设计网络结构(类似lstm)的办法来解决。

DNN区别于浅层神经网络,是所有深度学习中的网络模型统称,包括CNN、RNN等,以后还会有新的网络模型提出。题主说的CNN应该是三大特点:local receptive fields、shared weights 和pooling。他们的用途都是拿数据来训练学习特征(太笼统了,嘿嘿),省去手工提取特征的过程,类似是一个通用的学习框架。 @helloworld00回答中提到的课程不错,针对卷积神经网络和视觉识别的,题主可以深入学习一下。UFLDL也很适合初学者。另外如果真想研究深度学习,还是要看论文的-->Reading List « Deep Learning

中文不好解释,用英文试试,不当之处请谅解。

Artificial neural networks use networks of activation units (hidden units) to map inputs to outputs. The concept of deep learning applied to this model allows the model to have multiple layers of hidden units where we feed output from the previous layers. However, dense connections between the layers is not efficient, so people developed models that perform better for specific tasks.

The whole "convolution" in convolutional neural networks is essentially based on the fact that we're lazy and want to exploit spatial relationships in images. This is a huge deal because we can then group small patches of pixels and effectively "downsample" the image while training multiple instances of small detectors with those patches. Then a CNN just moves those filters around the entire image in a convolution. The outputs are then collected in a pooling layer. The pooling layer is again a down-sampling of the previous feature map. If we have activity on an output for filter a, we don't necessarily care if the activity is for (x, y) or (x+1, y), (x, y+1) or (x+1, y+1), so long as we have activity. So we often just take the highest value of activity on a small grid in the feature map called max pooling.

If you think about it from an abstract perspective, the convolution part of a CNN is effectively doing a reasonable way of dimensionality reduction. After a while you can flatten the image and process it through layers in a dense network. Remember to use dropout layers! (because our guys wrote that paper :P)

I won't talk about RNN for now because I don't have enough experience working with them and according to my colleague nobody really knows what's going on inside an LSTM...but they're insanely popular for data with time dependencies.


Let's talk RNN. Recurrent networks are basically neural networks that evolve through time. Rather than exploiting spatial locality, they exploit sequential, or temporal locality. Each iteration in an RNN takes an input and it's previous hidden state, and produces some new hidden state. The weights are shared in each level, but we can unroll an RNN through time and get your everyday neural net. Theoretically RNN has the capacity to store information from as long ago as possible, but historically people always had problems with the gradients vanishing as we go back further in time, meaning that the model can't be differentiated numerically and thus cannot be trained with backprop. This was later solved in the proposal of the LSTM architecture and subsequent work, and now we train RNNs with BPTT (backpropagation through time). Here's a link that explains LSTMs really well: colah.github.io/posts/2

Since then RNN has been applied in many areas of AI, and many are now designing RNN with the ability to extract specific information (read: features) from its training examples with attention-based models.

© COPYRIGHT BY i How And Why.com 2015