神经网络_标准神经网络、卷积神经网络、递归神经网络 - CSDN
神经网络 订阅
人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connection Model),它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。 [1] 展开全文
人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connection Model),它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。 [1]
信息
简    称
神经网络(NNs)
应用学科
通信
中文名
神经网络
外文名
neural networks
神经网络定义
生物神经网络主要是指人脑的神经网络,它是人工神经网络的技术原型。人脑是人类思维的物质基础,思维的功能定位在大脑皮层,后者含有大约10^11个神经元,每个神经元又通过神经突触与大约103个其它神经元相连,形成一个高度复杂高度灵活的动态网络。作为一门学科,生物神经网络主要研究人脑神经网络的结构、功能及其工作机制,意在探索人脑思维和智能活动的规律。人工神经网络是生物神经网络在某种简化意义下的技术复现,作为一门学科,它的主要任务是根据生物神经网络的原理和实际应用的需要建造实用的人工神经网络模型,设计相应的学习算法,模拟人脑的某种智能活动,然后在技术上实现出来用以解决实际问题。因此,生物神经网络主要研究智能的机理;人工神经网络主要研究智能机理的实现,两者相辅相成。 [2] 
收起全文
  • 卷积神经网络特征、模型视频入门教程,该课程内容包含神经网络的起源、发展、计算和训练,卷积神经网络基础,生成对抗网络、卷积神经网络的实战应用、GAN实例、人工智能案例分享及行业趋势分析。通过本次课程的学习...
  • 一、BP神经网络的概念 BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型:输入向量应为n个特征BP神经网络的过程主要...

    最近学习BP神经网络,网上文章比较参差不齐,对于初学者还是很困惑,本文做一下笔记和总结,方便以后阅读学习。

    一、BP神经网络的概念

        BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型:输入向量应为n个特征

    BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。

              1. 神经元:神经元,或称神经单元/神经节点,是神经网络基本的计算单元,其计算函数称为激活函数(activation function),用于在神经网络中引入非线性因素,可选择的激活函数有:Sigmoid函数、双曲正切函数(tanh)、ReLu函数(Rectified Linear Units),softmax等。

                  1.1  Sigmoid函数,也就是logistic函数,对于任意输入,它的输出范围都是(0,1)。公式如下:

            Sigmoid的函数图如上所示,很像平滑版的阶跃函数。但是,sigmoid 有很多好处,例如:

            (1)它是非线性的

            (2不同于二值化输出,sigmoid 可以输出0 到 1 之间的任意值。对,跟你猜的一样,这可以用来表示概率值。

            ( 3)与 2 相关,sigmoid 的输出值在一个范围内,这意味着它不会输出无穷大的数。但是,sigmoid 激活函数并不完美:         梯度消失。如前面的图片所示,当输入值 z 趋近负无穷时,sigmoid 函数的输出几乎为 0 . 相反,当输入 z 趋近正无穷时,输出值几乎为 1 . 那么这意味着什么?在这两个极端情况下,对应的梯度很小,甚至消失了。梯度消失在深度学习中是一个十分重要的问题,我们在深度网络中加了很多层这样的非线性激活函数,这样的话,即使第一层的参数有很大的变化,也不会对输出有太大的影响。换句话讲,就是网络不再学习了,通常训练模型的过程会变得越来越慢,尤其是使用梯度下降算法时。

          1.2 Tanh函数

           Tanh 或双曲正切是另一个深度神经网络中常用的激活函数。类似于 sigmoid 函数,它也将输入转化到良好的输出范围内。具体点说就是对于任意输入,tanh 将会产生一个介于 -1 与 1 之间的值。

    Tanh函数图

    如前面提及的,tanh 激活函数有点像 sigmoid 函数。非线性且输出在某一范围,此处为 (-1, 1)。不必意外,它也有跟 sigmoid 一样的缺点。从数学表达式就可以看出来,它也有梯度消失的问题,以及也需要进行开销巨大的指数运算。

          1.3

    ReLU

    终于讲到了 Relu,人们起初并不觉得它的效果会好过 sigmoid 和 tanh。但是,实战中它确实做到了。事实上,cs231n 课程甚至指出,应该默认使用 Relu 函数。

     

    ReLU 从数学表达式来看,运算十分高效。对于某一输入,当它小于 0 时,输出为 0,否则不变。下面是 ReLU 的函数表达式。Relu(z) = max(0,z)

    那么你可能会问,「它是线性函数吧?为何我们说它是非线性函数?」

    在线代中,线性函数就是两个向量空间进行向量加和标量乘的映射。

    给定上面的定义,我们知道 max(0, x) 是一个分段线性函数。之所以说是分段线性,是因为它在 (−∞, 0] 或 [0,+∞) 上符合线性函数的定义。但是在整个定义域上并不满足线性函数的定义。例如f(−1) + f(1) ≠f (0)

    所以 Relu 就是一个非线性激活函数且有良好的数学性质,并且比 sigmoid 和 tanh 都运算得快。除此以外,Relu 还因避免了梯度消失问题而闻名。然而,ReLU 有一个致命缺点,叫「ReLU 坏死」。ReLu 坏死是指网络中的神经元由于无法在正向传播中起作用而永久死亡的现象。

    更确切地说,当神经元在向前传递中激活函数输出为零时,就会出现这个问题,导致它的权值将得到零梯度。因此,当我们进行反向传播时,神经元的权重将永远不会被更新,而特定的神经元将永远不会被激活。

    还有件事值得一提。你可能注意到,不像 sigmoid 和 tanh,Relu 并未限定输出范围。这通常会成为一个很大的问题,它可能在另一个深度学习模型如递归神经网络(RNN)中成为麻烦。具体而言,由 ReLU 生成的无界值可能使 RNN 内的计算在没有合理的权重的情况下发生数值爆炸。因此反向传播期间权重在错误方向上的轻微变化都会在正向传递过程中显著放大激活值,如此一来学习过程可能就非常不稳定。我会尝试在下一篇博客文章中详细介绍这一点。(摘自https://my.oschina.net/amui/blog/1633904)

     1.4 softmax简介

    Softmax回归模型是logistic回归模型在多分类问题上的推广,在多分类问题中,待分类的类别数量大于2,且类别之间互斥。比如我们的网络要完成的功能是识别0-9这10个手写数字,若最后一层的输出为[0,1,0, 0, 0, 0, 0, 0, 0, 0],则表明我们网络的识别结果为数字1。

    Softmax的公式为,可以直观看出如果某一个zj大过其他z,那这个映射的分量就逼近于1,其他就逼近于0,并且对所有输入数据进行归一化。

                2.权重:

                3.偏置

                       偏置单元(bias unit),在有些资料里也称为偏置项(bias term)或者截距项(intercept term),它其实就是函数的截距,与线性方程 y=wx+b 中的 b 的意义是一致的。在 y=wx+b中,b表示函数在y轴上的截距,控制着函数偏离原点的距离,其实在神经网络中的偏置单元也是类似的作用。 

     因此,神经网络的参数也可以表示为:(W, b),其中W表示参数矩阵,b表示偏置项或截距项。

    2.反向传播调节权重和偏置




    展开全文
  • 神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向--深度学习的基础。学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助你理解深度学习技术。  本文以一种简单的,循序的...

    神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向--深度学习的基础。学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助你理解深度学习技术。

      本文以一种简单的,循序的方式讲解神经网络。适合对神经网络了解不多的同学。本文对阅读没有一定的前提要求,但是懂一些机器学习基础会更好地帮助理解本文。

      神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。人脑中的神经网络是一个非常复杂的组织。成人的大脑中估计有1000亿个神经元之多。

    图1 人脑神经网络

     

      那么机器学习中的神经网络是如何实现这种模拟的,并且达到一个惊人的良好效果的?通过本文,你可以了解到这些问题的答案,同时还能知道神经网络的历史,以及如何较好地学习它。

      由于本文较长,为方便读者,以下是本文的目录:

      一.前言

      二.神经元

      三.单层神经网络(感知器)

      四.两层神经网络(多层感知器)

      五.多层神经网络(深度学习)

      六.回顾

      七.展望

      八.总结

      九.后记

      十.备注

     

    一. 前言

      让我们来看一个经典的神经网络。这是一个包含三个层次的神经网络。红色的是输入层,绿色的是输出层,紫色的是中间层(也叫隐藏层)。输入层有3个输入单元,隐藏层有4个单元,输出层有2个单元。后文中,我们统一使用这种颜色来表达神经网络的结构。

    图2 神经网络结构图

     

      在开始介绍前,有一些知识可以先记在心里:

    1. 设计一个神经网络时,输入层与输出层的节点数往往是固定的,中间层则可以自由指定;
    2. 神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;
    3. 结构图里的关键不是圆圈(代表“神经元”),而是连接线(代表“神经元”之间的连接)。每个连接线对应一个不同的权重(其值称为权值),这是需要训练得到的。  

      除了从左到右的形式表达的结构图,还有一种常见的表达形式是从下到上来表示一个神经网络。这时候,输入层在图的最下方。输出层则在图的最上方,如下图:

    图3 从下到上的神经网络结构图 

     

      从左到右的表达形式以Andrew Ng和LeCun的文献使用较多,Caffe里使用的则是从下到上的表达。在本文中使用Andrew Ng代表的从左到右的表达形式。

      下面从简单的神经元开始说起,一步一步介绍神经网络复杂结构的形成。

     

    二. 神经元

      1.引子 

      对于神经元的研究由来已久,1904年生物学家就已经知晓了神经元的组成结构。

      一个神经元通常具有多个树突,主要用来接受传入信息;而轴突只有一条,轴突尾端有许多轴突末梢可以给其他多个神经元传递信息。轴突末梢跟其他神经元的树突产生连接,从而传递信号。这个连接的位置在生物学上叫做“突触”。

      人脑中的神经元形状可以用下图做简单的说明:

    图4 神经元

     

       1943年,心理学家McCulloch和数学家Pitts参考了生物神经元的结构,发表了抽象的神经元模型MP。在下文中,我们会具体介绍神经元模型。

       

    图5 Warren McCulloch(左)和 Walter Pitts(右)  

      2.结构 

      神经元模型是一个包含输入,输出与计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。

      下图是一个典型的神经元模型:包含有3个输入,1个输出,以及2个计算功能。

      注意中间的箭头线。这些线称为“连接”。每个上有一个“权值”。

    图6 神经元模型 

     

      连接是神经元中最重要的东西。每一个连接上都有一个权重。

      一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测效果最好。

      我们使用a来表示输入,用w来表示权值。一个表示连接的有向箭头可以这样理解:在初端,传递的信号大小仍然是a,端中间有加权参数w,经过这个加权后的信号会变成a*w,因此在连接的末端,信号的大小就变成了a*w。

      在其他绘图模型里,有向箭头可能表示的是值的不变传递。而在神经元模型里,每个有向箭头表示的是值的加权传递。

    图7 连接(connection)  

     

      如果我们将神经元图中的所有变量用符号表示,并且写出输出的计算公式的话,就是下图。

    图8 神经元计算  

     

      可见z是在输入和权值的线性加权和叠加了一个函数g的值。在MP模型里,函数g是sgn函数,也就是取符号函数。这个函数当输入大于0时,输出1,否则输出0。

      下面对神经元模型的图进行一些扩展。首先将sum函数与sgn函数合并到一个圆圈里,代表神经元的内部计算。其次,把输入a与输出z写到连接线的左上方,便于后面画复杂的网络。最后说明,一个神经元可以引出多个代表输出的有向箭头,但值都是一样的。

      神经元可以看作一个计算与存储单元。计算是神经元对其的输入进行计算功能。存储是神经元会暂存计算结果,并传递到下一层。

    图9 神经元扩展 

     

      当我们用“神经元”组成网络以后,描述网络中的某个“神经元”时,我们更多地会用“单元”(unit)来指代。同时由于神经网络的表现形式是一个有向图,有时也会用“节点”(node)来表达同样的意思。 

      3.效果 

      神经元模型的使用可以这样理解:

      我们有一个数据,称之为样本。样本有四个属性,其中三个属性已知,一个属性未知。我们需要做的就是通过三个已知属性预测未知属性。

      具体办法就是使用神经元的公式进行计算。三个已知属性的值是a1,a2,a3,未知属性的值是z。z可以通过公式计算出来。

      这里,已知的属性称之为特征,未知的属性称之为目标。假设特征与目标之间确实是线性关系,并且我们已经得到表示这个关系的权值w1,w2,w3。那么,我们就可以通过神经元模型预测新样本的目标。

      4.影响

      1943年发布的MP模型,虽然简单,但已经建立了神经网络大厦的地基。但是,MP模型中,权重的值都是预先设置的,因此不能学习。

      1949年心理学家Hebb提出了Hebb学习率,认为人脑神经细胞的突触(也就是连接)上的强度上可以变化的。于是计算科学家们开始考虑用调整权值的方法来让机器学习。这为后面的学习算法奠定了基础。

    图10 Donald Olding Hebb 

     

      尽管神经元模型与Hebb学习律都已诞生,但限于当时的计算机能力,直到接近10年后,第一个真正意义的神经网络才诞生。

     

    三. 单层神经网络(感知器)

      1.引子  

      1958年,计算科学家Rosenblatt提出了由两层神经元组成的神经网络。他给它起了一个名字--“感知器”(Perceptron)(有的文献翻译成“感知机”,下文统一用“感知器”来指代)。

      感知器是当时首个可以学习的人工神经网络。Rosenblatt现场演示了其学习识别简单图像的过程,在当时的社会引起了轰动。

      人们认为已经发现了智能的奥秘,许多学者和科研机构纷纷投入到神经网络的研究中。美国军方大力资助了神经网络的研究,并认为神经网络比“原子弹工程”更重要。这段时间直到1969年才结束,这个时期可以看作神经网络的第一次高潮。

    图11 Rosenblat与感知器 

      2.结构

      下面来说明感知器模型。

      在原来MP模型的“输入”位置添加神经元节点,标志其为“输入单元”。其余不变,于是我们就有了下图:从本图开始,我们将权值w1, w2, w3写到“连接线”的中间。

    图12 单层神经网络 

     

      在“感知器”中,有两个层次。分别是输入层和输出层。输入层里的“输入单元”只负责传输数据,不做计算。输出层里的“输出单元”则需要对前面一层的输入进行计算。

      我们把需要计算的层次称之为“计算层”,并把拥有一个计算层的网络称之为“单层神经网络”。有一些文献会按照网络拥有的层数来命名,例如把“感知器”称为两层神经网络。但在本文里,我们根据计算层的数量来命名。

      假如我们要预测的目标不再是一个值,而是一个向量,例如[2,3]。那么可以在输出层再增加一个“输出单元”。

      下图显示了带有两个输出单元的单层神经网络,其中输出单元z1的计算公式如下图。

    图13 单层神经网络(Z1)

     

      可以看到,z1的计算跟原先的z并没有区别。

      我们已知一个神经元的输出可以向多个神经元传递,因此z2的计算公式如下图。

    图14 单层神经网络(Z2)

     

      可以看到,z2的计算中除了三个新的权值:w4,w5,w6以外,其他与z1是一样的。

      整个网络的输出如下图。

    图15 单层神经网络(Z1和Z2)

     

      目前的表达公式有一点不让人满意的就是:w4,w5,w6是后来加的,很难表现出跟原先的w1,w2,w3的关系。

      因此我们改用二维的下标,用wx,y来表达一个权值。下标中的x代表后一层神经元的序号,而y代表前一层神经元的序号(序号的顺序从上到下)。

      例如,w1,2代表后一层的第1个神经元与前一层的第2个神经元的连接的权值(这种标记方式参照了Andrew Ng的课件)。根据以上方法标记,我们有了下图。

    图16 单层神经网络(扩展)

     

      如果我们仔细看输出的计算公式,会发现这两个公式就是线性代数方程组。因此可以用矩阵乘法来表达这两个公式。

      例如,输入的变量是[a1,a2,a3]T(代表由a1,a2,a3组成的列向量),用向量a来表示。方程的左边是[z1,z2]T,用向量z来表示。

      系数则是矩阵W(2行3列的矩阵,排列形式与公式中的一样)。

      于是,输出公式可以改写成:

    g(W * a) = z;

     

      这个公式就是神经网络中从前一层计算后一层的矩阵运算。

      3.效果

      与神经元模型不同,感知器中的权值是通过训练得到的。因此,根据以前的知识我们知道,感知器类似一个逻辑回归模型,可以做线性分类任务。

      我们可以用决策分界来形象的表达分类的效果。决策分界就是在二维的数据平面中划出一条直线,当数据的维度是3维的时候,就是划出一个平面,当数据的维度是n维时,就是划出一个n-1维的超平面。

      下图显示了在二维平面中划出决策分界的效果,也就是感知器的分类效果。

    图17 单层神经网络(决策分界)

      

      4.影响 

      感知器只能做简单的线性分类任务。但是当时的人们热情太过于高涨,并没有人清醒的认识到这点。于是,当人工智能领域的巨擘Minsky指出这点时,事态就发生了变化。

      Minsky在1969年出版了一本叫《Perceptron》的书,里面用详细的数学证明了感知器的弱点,尤其是感知器对XOR(异或)这样的简单分类任务都无法解决。

      Minsky认为,如果将计算层增加到两层,计算量则过大,而且没有有效的学习算法。所以,他认为研究更深层的网络是没有价值的。(本文成文后一个月,即2016年1月,Minsky在美国去世。谨在本文中纪念这位著名的计算机研究专家与大拿。)

       

    图18 Marvin Minsky

      

      由于Minsky的巨大影响力以及书中呈现的悲观态度,让很多学者和实验室纷纷放弃了神经网络的研究。神经网络的研究陷入了冰河期。这个时期又被称为“AI winter”。

      接近10年以后,对于两层神经网络的研究才带来神经网络的复苏。

     

    四. 两层神经网络(多层感知器)

      1.引子

      两层神经网络是本文的重点,因为正是在这时候,神经网络开始了大范围的推广与使用。

      Minsky说过单层神经网络无法解决异或问题。但是当增加一个计算层以后,两层神经网络不仅可以解决异或问题,而且具有非常好的非线性分类效果。不过两层神经网络的计算是一个问题,没有一个较好的解法。

      1986年,Rumelhar和Hinton等人提出了反向传播(Backpropagation,BP)算法,解决了两层神经网络所需要的复杂计算量问题,从而带动了业界使用两层神经网络研究的热潮。目前,大量的教授神经网络的教材,都是重点介绍两层(带一个隐藏层)神经网络的内容。 

      这时候的Hinton还很年轻,30年以后,正是他重新定义了神经网络,带来了神经网络复苏的又一春。

            

    图19 David Rumelhart(左)以及 Geoffery Hinton(右)

     

      2.结构

      两层神经网络除了包含一个输入层,一个输出层以外,还增加了一个中间层。此时,中间层和输出层都是计算层。我们扩展上节的单层神经网络,在右边新加一个层次(只含有一个节点)。

      现在,我们的权值矩阵增加到了两个,我们用上标来区分不同层次之间的变量。

      例如ax(y)代表第y层的第x个节点。z1,z2变成了a1(2),a2(2)。下图给出了a1(2),a2(2)的计算公式。

    图20 两层神经网络(中间层计算)

     

      计算最终输出z的方式是利用了中间层的a1(2),a2(2)和第二个权值矩阵计算得到的,如下图。

    图21 两层神经网络(输出层计算)

     

      假设我们的预测目标是一个向量,那么与前面类似,只需要在“输出层”再增加节点即可。

      我们使用向量和矩阵来表示层次中的变量。a(1),a(2),z是网络中传输的向量数据。W(1)和W(2)是网络的矩阵参数。如下图。

    图22 两层神经网络(向量形式)

     

      使用矩阵运算来表达整个计算公式的话如下:

      g(W(1) * a(1)) = a(2); 

    g(W(2) * a(2)) = z;

     

      由此可见,使用矩阵运算来表达是很简洁的,而且也不会受到节点数增多的影响(无论有多少节点参与运算,乘法两端都只有一个变量)。因此神经网络的教程中大量使用矩阵运算来描述。

      需要说明的是,至今为止,我们对神经网络的结构图的讨论中都没有提到偏置节点(bias unit)。事实上,这些节点是默认存在的。它本质上是一个只含有存储功能,且存储值永远为1的单元。在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。正如线性回归模型与逻辑回归模型中的一样。

      偏置单元与后一层的所有节点都有连接,我们设这些参数值为向量b,称之为偏置。如下图。

    图23 两层神经网络(考虑偏置节点)

     

      可以看出,偏置节点很好认,因为其没有输入(前一层中没有箭头指向它)。有些神经网络的结构图中会把偏置节点明显画出来,有些不会。一般情况下,我们都不会明确画出偏置节点。 

      在考虑了偏置以后的一个神经网络的矩阵运算如下:

      g(W(1) * a(1) + b(1)) = a(2); 

    g(W(2) * a(2) + b(2)) = z;

     

      需要说明的是,在两层神经网络中,我们不再使用sgn函数作为函数g,而是使用平滑函数sigmoid作为函数g。我们把函数g也称作激活函数(active function)。

      事实上,神经网络的本质就是通过参数与激活函数来拟合特征与目标之间的真实函数关系。初学者可能认为画神经网络的结构图是为了在程序中实现这些圆圈与线,但在一个神经网络的程序中,既没有“线”这个对象,也没有“单元”这个对象。实现一个神经网络最需要的是线性代数库。

      3.效果

      与单层神经网络不同。理论证明,两层神经网络可以无限逼近任意连续函数。

      这是什么意思呢?也就是说,面对复杂的非线性分类任务,两层(带一个隐藏层)神经网络可以分类的很好。

      下面就是一个例子(此两图来自colah的博客),红色的线与蓝色的线代表数据。而红色区域和蓝色区域代表由神经网络划开的区域,两者的分界线就是决策分界。

    图24 两层神经网络(决策分界)

      

      可以看到,这个两层神经网络的决策分界是非常平滑的曲线,而且分类的很好。有趣的是,前面已经学到过,单层网络只能做线性分类任务。而两层神经网络中的后一层也是线性分类层,应该只能做线性分类任务。为什么两个线性分类任务结合就可以做非线性分类任务?

      我们可以把输出层的决策分界单独拿出来看一下。就是下图。

    图25 两层神经网络(空间变换)

     

      可以看到,输出层的决策分界仍然是直线。关键就是,从输入层到隐藏层时,数据发生了空间变换。也就是说,两层神经网络中,隐藏层对原始的数据进行了一个空间变换,使其可以被线性分类,然后输出层的决策分界划出了一个线性分类分界线,对其进行分类。

      这样就导出了两层神经网络可以做非线性分类的关键--隐藏层。联想到我们一开始推导出的矩阵公式,我们知道,矩阵和向量相乘,本质上就是对向量的坐标空间进行一个变换。因此,隐藏层的参数矩阵的作用就是使得数据的原始坐标空间从线性不可分,转换成了线性可分。

      两层神经网络通过两层的线性模型模拟了数据内真实的非线性函数。因此,多层的神经网络的本质就是复杂函数拟合。

      下面来讨论一下隐藏层的节点数设计。在设计一个神经网络时,输入层的节点数需要与特征的维度匹配,输出层的节点数要与目标的维度匹配。而中间层的节点数,却是由设计者指定的。因此,“自由”把握在设计者的手中。但是,节点数设置的多少,却会影响到整个模型的效果。如何决定这个自由层的节点数呢?目前业界没有完善的理论来指导这个决策。一般是根据经验来设置。较好的方法就是预先设定几个可选值,通过切换这几个值来看整个模型的预测效果,选择效果最好的值作为最终选择。这种方法又叫做Grid Search(网格搜索)。

      了解了两层神经网络的结构以后,我们就可以看懂其它类似的结构图。例如EasyPR字符识别网络架构(下图)。

    图26 EasyPR字符识别网络

     

      EasyPR使用了字符的图像去进行字符文字的识别。输入是120维的向量。输出是要预测的文字类别,共有65类。根据实验,我们测试了一些隐藏层数目,发现当值为40时,整个网络在测试集上的效果较好,因此选择网络的最终结构就是120,40,65。

      4.训练

      下面简单介绍一下两层神经网络的训练。

      在Rosenblat提出的感知器模型中,模型中的参数可以被训练,但是使用的方法较为简单,并没有使用目前机器学习中通用的方法,这导致其扩展性与适用性非常有限。从两层神经网络开始,神经网络的研究人员开始使用机器学习相关的技术进行神经网络的训练。例如用大量的数据(1000-10000左右),使用算法进行优化等等,从而使得模型训练可以获得性能与数据利用上的双重优势。

      机器学习模型训练的目的,就是使得参数尽可能的与真实的模型逼近。具体做法是这样的。首先给所有参数赋上随机值。我们使用这些随机生成的参数值,来预测训练数据中的样本。样本的预测目标为yp,真实目标为y。那么,定义一个值loss,计算公式如下。

    loss = (yp - y)2

     

      这个值称之为损失(loss),我们的目标就是使对所有训练数据的损失和尽可能的小。

      如果将先前的神经网络预测的矩阵公式带入到yp中(因为有z=yp),那么我们可以把损失写为关于参数(parameter)的函数,这个函数称之为损失函数(loss function)。下面的问题就是求:如何优化参数,能够让损失函数的值最小。

      此时这个问题就被转化为一个优化问题。一个常用方法就是高等数学中的求导,但是这里的问题由于参数不止一个,求导后计算导数等于0的运算量很大,所以一般来说解决这个优化问题使用的是梯度下降算法。梯度下降算法每次计算参数在当前的梯度,然后让参数向着梯度的反方向前进一段距离,不断重复,直到梯度接近零时截止。一般这个时候,所有的参数恰好达到使损失函数达到一个最低值的状态。

      在神经网络模型中,由于结构复杂,每次计算梯度的代价很大。因此还需要使用反向传播算法。反向传播算法是利用了神经网络的结构进行的计算。不一次计算所有参数的梯度,而是从后往前。首先计算输出层的梯度,然后是第二个参数矩阵的梯度,接着是中间层的梯度,再然后是第一个参数矩阵的梯度,最后是输入层的梯度。计算结束以后,所要的两个参数矩阵的梯度就都有了。

      反向传播算法可以直观的理解为下图。梯度的计算从后往前,一层层反向传播。前缀E代表着相对导数的意思。

    图27 反向传播算法

     

      反向传播算法的启示是数学中的链式法则。在此需要说明的是,尽管早期神经网络的研究人员努力从生物学中得到启发,但从BP算法开始,研究者们更多地从数学上寻求问题的最优解。不再盲目模拟人脑网络是神经网络研究走向成熟的标志。正如科学家们可以从鸟类的飞行中得到启发,但没有必要一定要完全模拟鸟类的飞行方式,也能制造可以飞天的飞机。

      优化问题只是训练中的一个部分。机器学习问题之所以称为学习问题,而不是优化问题,就是因为它不仅要求数据在训练集上求得一个较小的误差,在测试集上也要表现好。因为模型最终是要部署到没有见过训练数据的真实场景。提升模型在测试集上的预测效果的主题叫做泛化(generalization),相关方法被称作正则化(regularization)。神经网络中常用的泛化技术有权重衰减等。

      5.影响

      两层神经网络在多个地方的应用说明了其效用与价值。10年前困扰神经网络界的异或问题被轻松解决。神经网络在这个时候,已经可以发力于语音识别,图像识别,自动驾驶等多个领域。

      历史总是惊人的相似,神经网络的学者们再次登上了《纽约时报》的专访。人们认为神经网络可以解决许多问题。就连娱乐界都开始受到了影响,当年的《终结者》电影中的阿诺都赶时髦地说一句:我的CPU是一个神经网络处理器,一个会学习的计算机。

      但是神经网络仍然存在若干的问题:尽管使用了BP算法,一次神经网络的训练仍然耗时太久,而且困扰训练优化的一个问题就是局部最优解问题,这使得神经网络的优化较为困难。同时,隐藏层的节点数需要调参,这使得使用不太方便,工程和研究人员对此多有抱怨。

      90年代中期,由Vapnik等人发明的SVM(Support Vector Machines,支持向量机)算法诞生,很快就在若干个方面体现出了对比神经网络的优势:无需调参;高效;全局最优解。基于以上种种理由,SVM迅速打败了神经网络算法成为主流。

    图28 Vladimir Vapnik

     

      神经网络的研究再次陷入了冰河期。当时,只要你的论文中包含神经网络相关的字眼,非常容易被会议和期刊拒收,研究界那时对神经网络的不待见可想而知。

     

    五. 多层神经网络(深度学习)

      1.引子  

      在被人摒弃的10年中,有几个学者仍然在坚持研究。这其中的棋手就是加拿大多伦多大学的Geoffery Hinton教授。

      2006年,Hinton在《Science》和相关期刊上发表了论文,首次提出了“深度信念网络”的概念。与传统的训练方式不同,“深度信念网络”有一个“预训练”(pre-training)的过程,这可以方便的让神经网络中的权值找到一个接近最优解的值,之后再使用“微调”(fine-tuning)技术来对整个网络进行优化训练。这两个技术的运用大幅度减少了训练多层神经网络的时间。他给多层神经网络相关的学习方法赋予了一个新名词--“深度学习”。

       很快,深度学习在语音识别领域暂露头角。接着,2012年,深度学习技术又在图像识别领域大展拳脚。Hinton与他的学生在ImageNet竞赛中,用多层的卷积神经网络成功地对包含一千类别的一百万张图片进行了训练,取得了分类错误率15%的好成绩,这个成绩比第二名高了近11个百分点,充分证明了多层神经网络识别效果的优越性。

      在这之后,关于深度神经网络的研究与应用不断涌现。

    图29 Geoffery Hinton 

     

      由于篇幅原因,本文不介绍CNN(Conventional Neural Network,卷积神经网络)与RNN(Recurrent Neural Network,递归神经网络)的架构,下面我们只讨论普通的多层神经网络。

      2.结构

      我们延续两层神经网络的方式来设计一个多层神经网络。

      在两层神经网络的输出层后面,继续添加层次。原来的输出层变成中间层,新加的层次成为新的输出层。所以可以得到下图。

    图30 多层神经网络

     

      依照这样的方式不断添加,我们可以得到更多层的多层神经网络。公式推导的话其实跟两层神经网络类似,使用矩阵运算的话就仅仅是加一个公式而已。

      在已知输入a(1),参数W(1),W(2),W(3)的情况下,输出z的推导公式如下:

         g(W(1) * a(1)) = a(2); 

        g(W(2) * a(2)) = a(3);

    g(W(3) * a(3)) = z;

     

      多层神经网络中,输出也是按照一层一层的方式来计算。从最外面的层开始,算出所有单元的值以后,再继续计算更深一层。只有当前层所有单元的值都计算完毕以后,才会算下一层。有点像计算向前不断推进的感觉。所以这个过程叫做“正向传播”。

      下面讨论一下多层神经网络中的参数。

      首先我们看第一张图,可以看出W(1)中有6个参数,W(2)中有4个参数,W(3)中有6个参数,所以整个神经网络中的参数有16个(这里我们不考虑偏置节点,下同)。

    图31 多层神经网络(较少参数)

     

      假设我们将中间层的节点数做一下调整。第一个中间层改为3个单元,第二个中间层改为4个单元。

      经过调整以后,整个网络的参数变成了33个。

    图32 多层神经网络(较多参数)

     

      虽然层数保持不变,但是第二个神经网络的参数数量却是第一个神经网络的接近两倍之多,从而带来了更好的表示(represention)能力。表示能力是多层神经网络的一个重要性质,下面会做介绍。

      在参数一致的情况下,我们也可以获得一个“更深”的网络。

    图33 多层神经网络(更深的层次)

     

      上图的网络中,虽然参数数量仍然是33,但却有4个中间层,是原来层数的接近两倍。这意味着一样的参数数量,可以用更深的层次去表达。

      3.效果

      与两层层神经网络不同。多层神经网络中的层数增加了很多。

      增加更多的层次有什么好处?更深入的表示特征,以及更强的函数模拟能力。

      更深入的表示特征可以这样理解,随着网络的层数增加,每一层对于前一层次的抽象表示更深入。在神经网络中,每一层神经元学习到的是前一层神经元值的更抽象的表示。例如第一个隐藏层学习到的是“边缘”的特征,第二个隐藏层学习到的是由“边缘”组成的“形状”的特征,第三个隐藏层学习到的是由“形状”组成的“图案”的特征,最后的隐藏层学习到的是由“图案”组成的“目标”的特征。通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。

      关于逐层特征学习的例子,可以参考下图。

    图34 多层神经网络(特征学习)

     

      更强的函数模拟能力是由于随着层数的增加,整个网络的参数就越多。而神经网络其实本质就是模拟特征与目标之间的真实关系函数的方法,更多的参数意味着其模拟的函数可以更加的复杂,可以有更多的容量(capcity)去拟合真正的关系。

      通过研究发现,在参数数量一样的情况下,更深的网络往往具有比浅层的网络更好的识别效率。这点也在ImageNet的多次大赛中得到了证实。从2012年起,每年获得ImageNet冠军的深度神经网络的层数逐年增加,2015年最好的方法GoogleNet是一个多达22层的神经网络。

      在最新一届的ImageNet大赛上,目前拿到最好成绩的MSRA团队的方法使用的更是一个深达152层的网络!关于这个方法更多的信息有兴趣的可以查阅ImageNet网站。

      4.训练

      在单层神经网络时,我们使用的激活函数是sgn函数。到了两层神经网络时,我们使用的最多的是sigmoid函数。而到了多层神经网络时,通过一系列的研究发现,ReLU函数在训练多层神经网络时,更容易收敛,并且预测性能更好。因此,目前在深度学习中,最流行的非线性函数是ReLU函数。ReLU函数不是传统的非线性函数,而是分段线性函数。其表达式非常简单,就是y=max(x,0)。简而言之,在x大于0,输出就是输入,而在x小于0时,输出就保持为0。这种函数的设计启发来自于生物神经元对于激励的线性响应,以及当低于某个阈值后就不再响应的模拟。

      在多层神经网络中,训练的主题仍然是优化和泛化。当使用足够强的计算芯片(例如GPU图形加速卡)时,梯度下降算法以及反向传播算法在多层神经网络中的训练中仍然工作的很好。目前学术界主要的研究既在于开发新的算法,也在于对这两个算法进行不断的优化,例如,增加了一种带动量因子(momentum)的梯度下降算法。 

      在深度学习中,泛化技术变的比以往更加的重要。这主要是因为神经网络的层数增加了,参数也增加了,表示能力大幅度增强,很容易出现过拟合现象。因此正则化技术就显得十分重要。目前,Dropout技术,以及数据扩容(Data-Augmentation)技术是目前使用的最多的正则化技术。

      5.影响

      目前,深度神经网络在人工智能界占据统治地位。但凡有关人工智能的产业报道,必然离不开深度学习。神经网络界当下的四位引领者除了前文所说的Ng,Hinton以外,还有CNN的发明人Yann Lecun,以及《Deep Learning》的作者Bengio。

      前段时间一直对人工智能持谨慎态度的马斯克,搞了一个OpenAI项目,邀请Bengio作为高级顾问。马斯克认为,人工智能技术不应该掌握在大公司如Google,Facebook的手里,更应该作为一种开放技术,让所有人都可以参与研究。马斯克的这种精神值得让人敬佩。

       

    图35 Yann LeCun(左)和 Yoshua Bengio(右)

     

      多层神经网络的研究仍在进行中。现在最为火热的研究技术包括RNN,LSTM等,研究方向则是图像理解方面。图像理解技术是给计算机一幅图片,让它用语言来表达这幅图片的意思。ImageNet竞赛也在不断召开,有更多的方法涌现出来,刷新以往的正确率。

     

    六. 回顾

      1.影响  

      我们回顾一下神经网络发展的历程。神经网络的发展历史曲折荡漾,既有被人捧上天的时刻,也有摔落在街头无人问津的时段,中间经历了数次大起大落。

      从单层神经网络(感知器)开始,到包含一个隐藏层的两层神经网络,再到多层的深度神经网络,一共有三次兴起过程。详见下图。

    图36 三起三落的神经网络

     

      上图中的顶点与谷底可以看作神经网络发展的高峰与低谷。图中的横轴是时间,以年为单位。纵轴是一个神经网络影响力的示意表示。如果把1949年Hebb模型提出到1958年的感知机诞生这个10年视为落下(没有兴起)的话,那么神经网络算是经历了“三起三落”这样一个过程,跟“小平”同志类似。俗话说,天将降大任于斯人也,必先苦其心志,劳其筋骨。经历过如此多波折的神经网络能够在现阶段取得成功也可以被看做是磨砺的积累吧。

      历史最大的好处是可以给现在做参考。科学的研究呈现螺旋形上升的过程,不可能一帆风顺。同时,这也给现在过分热衷深度学习与人工智能的人敲响警钟,因为这不是第一次人们因为神经网络而疯狂了。1958年到1969年,以及1985年到1995,这两个十年间人们对于神经网络以及人工智能的期待并不现在低,可结果如何大家也能看的很清楚。

      因此,冷静才是对待目前深度学习热潮的最好办法。如果因为深度学习火热,或者可以有“钱景”就一窝蜂的涌入,那么最终的受害人只能是自己。神经网络界已经两次有被人们捧上天了的境况,相信也对于捧得越高,摔得越惨这句话深有体会。因此,神经网络界的学者也必须给这股热潮浇上一盆水,不要让媒体以及投资家们过分的高看这门技术。很有可能,三十年河东,三十年河西,在几年后,神经网络就再次陷入谷底。根据上图的历史曲线图,这是很有可能的。

      2.效果  

      下面说一下神经网络为什么能这么火热?简而言之,就是其学习效果的强大。随着神经网络的发展,其表示性能越来越强。

      从单层神经网络,到两层神经网络,再到多层神经网络,下图说明了,随着网络层数的增加,以及激活函数的调整,神经网络所能拟合的决策分界平面的能力。

    图37 表示能力不断增强

     

      可以看出,随着层数增加,其非线性分界拟合能力不断增强。图中的分界线并不代表真实训练出的效果,更多的是示意效果。

      神经网络的研究与应用之所以能够不断地火热发展下去,与其强大的函数拟合能力是分不开关系的。

      3.外因  

      当然,光有强大的内在能力,并不一定能成功。一个成功的技术与方法,不仅需要内因的作用,还需要时势与环境的配合。神经网络的发展背后的外在原因可以被总结为:更强的计算性能,更多的数据,以及更好的训练方法。只有满足这些条件时,神经网络的函数拟合能力才能得已体现,见下图。

    图38 发展的外在原因

     

      之所以在单层神经网络年代,Rosenblat无法制作一个双层分类器,就在于当时的计算性能不足,Minsky也以此来打压神经网络。但是Minsky没有料到,仅仅10年以后,计算机CPU的快速发展已经使得我们可以做两层神经网络的训练,并且还有快速的学习算法BP。

      但是在两层神经网络快速流行的年代。更高层的神经网络由于计算性能的问题,以及一些计算方法的问题,其优势无法得到体现。直到2012年,研究人员发现,用于高性能计算的图形加速卡(GPU)可以极佳地匹配神经网络训练所需要的要求:高并行性,高存储,没有太多的控制需求,配合预训练等算法,神经网络才得以大放光彩。

      互联网时代,大量的数据被收集整理,更好的训练方法不断被发现。所有这一切都满足了多层神经网络发挥能力的条件。

      “时势造英雄”,正如Hinton在2006年的论文里说道的

      “... provided that computers were fast enough, data sets were big enough, and the initial weights were close enough to a good solution. All three conditions are now satisfied.”,

     

      外在条件的满足也是神经网络从神经元得以发展到目前的深度神经网络的重要因素。

      除此以外,一门技术的发扬没有“伯乐”也是不行的。在神经网络漫长的历史中,正是由于许多研究人员的锲而不舍,不断钻研,才能有了现在的成就。前期的Rosenblat,Rumelhart没有见证到神经网络如今的流行与地位。但是在那个时代,他们为神经网络的发展所打下的基础,却会永远流传下去,不会退色。

     

    七. 展望

      1.量子计算

      回到我们对神经网络历史的讨论,根据历史趋势图来看,神经网络以及深度学习会不会像以往一样再次陷入谷底?作者认为,这个过程可能取决于量子计算机的发展。

      根据一些最近的研究发现,人脑内部进行的计算可能是类似于量子计算形态的东西。而且目前已知的最大神经网络跟人脑的神经元数量相比,仍然显得非常小,仅不及1%左右。所以未来真正想实现人脑神经网络的模拟,可能需要借助量子计算的强大计算能力。

      各大研究组也已经认识到了量子计算的重要性。谷歌就在开展量子计算机D-wave的研究,希望用量子计算来进行机器学习,并且在前段时间有了突破性的进展。国内方面,阿里和中科院合作成立了量子计算实验室,意图进行量子计算的研究。

      如果量子计算发展不力,仍然需要数十年才能使我们的计算能力得以突飞猛进的发展,那么缺少了强大计算能力的神经网络可能会无法一帆风顺的发展下去。这种情况可以类比为80-90年时期神经网络因为计算能力的限制而被低估与忽视。假设量子计算机真的能够与神经网络结合,并且助力真正的人工智能技术的诞生,而且量子计算机发展需要10年的话,那么神经网络可能还有10年的发展期。直到那时期以后,神经网络才能真正接近实现AI这一目标。

    图39 量子计算

     

      2.人工智能

      最后,作者想简单地谈谈对目前人工智能的看法。虽然现在人工智能非常火热,但是距离真正的人工智能还有很大的距离。就拿计算机视觉方向来说,面对稍微复杂一些的场景,以及易于混淆的图像,计算机就可能难以识别。因此,这个方向还有很多的工作要做。

      就普通人看来,这么辛苦的做各种实验,以及投入大量的人力就是为了实现一些不及孩童能力的视觉能力,未免有些不值。但是这只是第一步。虽然计算机需要很大的运算量才能完成一个普通人简单能完成的识图工作,但计算机最大的优势在于并行化与批量推广能力。使用计算机以后,我们可以很轻易地将以前需要人眼去判断的工作交给计算机做,而且几乎没有任何的推广成本。这就具有很大的价值。正如火车刚诞生的时候,有人嘲笑它又笨又重,速度还没有马快。但是很快规模化推广的火车就替代了马车的使用。人工智能也是如此。这也是为什么目前世界上各著名公司以及政府都对此热衷的原因。

      目前看来,神经网络要想实现人工智能还有很多的路要走,但方向至少是正确的,下面就要看后来者的不断努力了。

    图40 人工智能

     

    八 总结

      本文回顾了神经网络的发展历史,从神经元开始,历经单层神经网络,两层神经网络,直到多层神经网络。在历史介绍中穿插讲解神经网络的结构,分类效果以及训练方法等。本文说明了神经网络内部实际上就是矩阵计算,在程序中的实现没有“点”和“线”的对象。本文说明了神经网络强大预测能力的根本,就是多层的神经网络可以无限逼近真实的对应函数,从而模拟数据之间的真实关系。除此之外,本文回顾了神经网络发展的历程,分析了神经网络发展的外在原因,包括计算能力的增强,数据的增多,以及方法的创新等。最后,本文对神经网络的未来进行了展望,包括量子计算与神经网络结合的可能性,以及探讨未来人工智能发展的前景与价值。

     

    九. 后记

      本篇文章可以视为作者一年来对神经网络的理解与总结,包括实验的体会,书籍的阅读,以及思考的火花等。神经网络虽然重要,但学习并不容易。这主要是由于其结构图较为难懂,以及历史发展的原因,导致概念容易混淆,一些介绍的博客与网站内容新旧不齐。本篇文章着眼于这些问题,没有太多的数学推导,意图以一种简单的,直观的方式对神经网络进行讲解。在2015年最后一天终于写完。希望本文可以对各位有所帮助。

     

     

      作者很感谢能够阅读到这里的读者。如果看完觉得好的话,还请轻轻点一下赞,你们的鼓励就是作者继续行文的动力。本文的备注部分是一些对神经网络学习的建议,供补充阅读与参考。

      

      目前为止,EasyPR的1.4版已经将神经网络(ANN)训练的模块加以开放,开发者们可以使用这个模块来进行自己的字符模型的训练。有兴趣的可以下载

     

    十. 备注

      神经网络虽然很重要,但是对于神经网络的学习,却并不容易。这些学习困难主要来自以下三个方面:概念,类别,教程。下面简单说明这三点。

      1.概念

      对于一门技术的学习而言,首先最重要的是弄清概念。只有将概念理解清楚,才能顺畅的进行后面的学习。由于神经网络漫长的发展历史,经常会有一些概念容易混淆,让人学习中产生困惑。这里面包括历史的术语,不一致的说法,以及被遗忘的研究等。 

      历史的术语

      这个的代表就是多层感知器(MLP)这个术语。起初看文献时很难理解的一个问题就是,为什么神经网络又有另一个名称:MLP。其实MLP(Multi-Layer Perceptron)的名称起源于50-60年代的感知器(Perceptron)。由于我们在感知器之上又增加了一个计算层,因此称为多层感知器。值得注意的是,虽然叫“多层”,MLP一般都指的是两层(带一个隐藏层的)神经网络。

      MLP这个术语属于历史遗留的产物。现在我们一般就说神经网络,以及深度神经网络。前者代表带一个隐藏层的两层神经网络,也是EasyPR目前使用的识别网络,后者指深度学习的网络。

      不一致的说法

      这个最明显的代表就是损失函数loss function,这个还有两个说法是跟它完全一致的意思,分别是残差函数error function,以及代价函数cost function。loss function是目前深度学习里用的较多的一种说法,caffe里也是这么叫的。cost function则是Ng在coursera教学视频里用到的统一说法。这三者都是同一个意思,都是优化问题所需要求解的方程。虽然在使用的时候不做规定,但是在听到各种讲解时要心里明白。

      再来就是权重weight和参数parameter的说法,神经网络界由于以前的惯例,一般会将训练得到的参数称之为权重,而不像其他机器学习方法就称之为参数。这个需要记住就好。不过在目前的使用惯例中,也有这样一种规定。那就是非偏置节点连接上的值称之为权重,而偏置节点上的值称之为偏置,两者统一起来称之为参数。

      另外一个同义词就是激活函数active function和转移函数transfer function了。同样,他们代表一个意思,都是叠加的非线性函数的说法。

      被遗忘的研究

      由于神经网络发展历史已经有70年的漫长历史,因此在研究过程中,必然有一些研究分支属于被遗忘阶段。这里面包括各种不同的网络,例如SOM(Self-Organizing Map,自组织特征映射网络),SNN(Synergetic Neural Network,协同神经网络),ART(Adaptive Resonance Theory,自适应共振理论网络)等等。所以看历史文献时会看到许多没见过的概念与名词。

      有些历史网络甚至会重新成为新的研究热点,例如RNN与LSTM就是80年代左右开始的研究,目前已经是深度学习研究中的重要一门技术,在语音与文字识别中有很好的效果。 

      对于这些易于混淆以及弄错的概念,务必需要多方参考文献,理清上下文,这样才不会在学习与阅读过程中迷糊。

      2.类别

      下面谈一下关于神经网络中的不同类别。

      其实本文的名字“神经网络浅讲”并不合适,因为本文并不是讲的是“神经网络”的内容,而是其中的一个子类,也是目前最常说的前馈神经网络。根据下图的分类可以看出。

    图41 神经网络的类别

     

      神经网络其实是一个非常宽泛的称呼,它包括两类,一类是用计算机的方式去模拟人脑,这就是我们常说的ANN(人工神经网络),另一类是研究生物学上的神经网络,又叫生物神经网络。对于我们计算机人士而言,肯定是研究前者。

      在人工神经网络之中,又分为前馈神经网络和反馈神经网络这两种。那么它们两者的区别是什么呢?这个其实在于它们的结构图。我们可以把结构图看作是一个有向图。其中神经元代表顶点,连接代表有向边。对于前馈神经网络中,这个有向图是没有回路的。你可以仔细观察本文中出现的所有神经网络的结构图,确认一下。而对于反馈神经网络中,结构图的有向图是有回路的。反馈神经网络也是一类重要的神经网络。其中Hopfield网络就是反馈神经网络。深度学习中的RNN也属于一种反馈神经网络。

      具体到前馈神经网络中,就有了本文中所分别描述的三个网络:单层神经网络,双层神经网络,以及多层神经网络。深度学习中的CNN属于一种特殊的多层神经网络。另外,在一些Blog中和文献中看到的BP神经网络是什么?其实它们就是使用了反向传播BP算法的两层前馈神经网络。也是最普遍的一种两层神经网络。

      通过以上分析可以看出,神经网络这种说法其实是非常广义的,具体在文章中说的是什么网络,需要根据文中的内容加以区分。

      3.教程

      如何更好的学习神经网络,认真的学习一门课程或者看一本著作都是很有必要的。

      说到网络教程的话,这里必须说一下Ng的机器学习课程。对于一个初学者而言,Ng的课程视频是非常有帮助的。Ng一共开设过两门机器学习公开课程:一个是2003年在Standford开设的,面向全球的学生,这个视频现在可以在网易公开课上找到;另一个是2010年专门为Coursera上的用户开设的,需要登陆Coursera上才能学习。

      但是,需要注意点是,这两个课程对待神经网络的态度有点不同。早些的课程一共有20节课,Ng花了若干节课去专门讲SVM以及SVM的推导,而当时的神经网络,仅仅放了几段视频,花了大概不到20分钟(一节课60分钟左右)。而到了后来的课程时,总共10节的课程中,Ng给了完整的两节给神经网络,详细介绍了神经网络的反向传播算法。同时给SVM只有一节课,并且没有再讲SVM的推导过程。下面两张图分别是Ng介绍神经网络的开篇,可以大致看出一些端倪。

    图42 Ng与神经网络

     

      为什么Ng对待神经网络的反应前后相差那么大?事实上就是深度学习的原因。Ng实践了深度学习的效果,认识到深度学习的基础--神经网络的重要性。这就是他在后面重点介绍神经网络的原因。总之,对于神经网络的学习而言,我更推荐Coursera上的。因为在那个时候,Ng才是真正的把神经网络作为一门重要的机器学习方法去传授。你可以从他上课的态度中感受到他的重视,以及他希望你能学好的期望。

     

    版权说明:

      本文中的所有文字,图片,代码的版权都是属于作者和博客园共同所有。欢迎转载,但是务必注明作者与出处。任何未经允许的剽窃以及爬虫抓取都属于侵权,作者和博客园保留所有权利。

      

    参考文献:

      1.Neural Networks

      2.Andrew Ng Neural Networks 

      3.神经网络简史

      4.中科院 史忠植 神经网络 讲义

      5.深度学习 胡晓林

     

     

     这是转发博客园的一篇文章,博主:计算机的潜意识,目前是南大的人工智能方向的在读博士。博客里写了一些机器学习入门的内容,以及分享了他在github上的一个开源项目EasyPR,车牌识别系统。能为初学者提供非常大的帮助,有兴趣的朋友请务必移步前往,一看究竟。

    原文链接:https://www.cnblogs.com/subconscious/p/5058741.html

    展开全文
  • 本文主要是学习BP神经网络的一个总结,其本身也是机器学习中比较基础、适合入门的模型。 目前本人对于机器学习也还只是入门状态,对于很多名词仍然是一知半解(感觉机器学习中的很多术语本身也是模棱两可的),对于很...

    前言

    本文主要是学习BP神经网络的一个总结,其本身也是机器学习中比较基础、适合入门的模型。

    目前本人对于机器学习也还只是入门状态,对于很多名词仍然是一知半解(感觉机器学习中的很多术语本身也是模棱两可的),对于很多公式也是不求甚解,因此这篇文章是尝试用自己的语言和理解来复述所学习到的知识,如果有错误之处还望大牛们不吝斧正。

    霍金说过每多一个数学公式,就会少一半的读者,因此这里也会尽量少用公式,要用也只用简单易懂的公式。而且个人觉得神经网络中的很多公式是可以感性地去认识的,能完全明白推导过程自然最好,但在不求甚解的状态下能达到感性的认知也未必不是一个快速掌握的好方法。

    另外本文中用到了不少矩阵相关的知识,忘记了的同学可以看附录中的整理。

    神经元与激励函数

    神经元

    神经元是神经网络的基本组成,如果把它画出来,大概就长成下面这样:

    图中神经元左边的x表示对神经元的多个输入,w表示每个输入对应的权重,神经元右边的箭头表示它仅有一个输出。

    当然神经元也有很多种,下面介绍两种比较基础的。

    神经元1:感知器

    神经网络技术起源于上世纪五、六十年代,当时叫感知机(perceptron),其中的单个神经元我们可以叫作感知器。感知器的特点具有浓厚的时代气息:其输入输出都是二进制形式的(据说由于计算技术的落后,当时感知器传输函数是用线拉动变阻器改变电阻的方法机械实现的)。

    如上图所示,感知器有多个二进制输入(值只能是0或1)X1、X2..Xn,每个输入有对应的权值W1、W2..Wn(图中没画出来),将每个输入值乘以对应的权值再求和( ∑XjWj ),然后与一个阈值(threshold) 比较,大于阈值则输出1、小于阈值则输出0。  写成公式的话如下:

    如果把公式写成矩阵形式,再用b来表示负数的阈值(即b=-threshold),那就得到了如下公式:

    举个栗子

    例如你所在的城市将有一个你的偶像的演唱会,你正决定是否观看,你可能会通过以下三个方面来权衡你的决定:

    1. 天气好吗?
    2. 你的好基友是否愿意陪你去?
    3. 是否这个活动距离公共交通很近?(你自己没车)

    我们将这三个因素用对应的二进制变量x1,x2和x3表示。比如,当天气还不错时,我们有x1=1,天气不好时x1=0;相似的,如果好基友愿意去,x2=1,否则x2=0;对于公共交通x3同理赋值。

    然后根据你的意愿,比如让天气权重 w1=6,其他条件权重分别为w2=2,w3=2。权重w1值越大表示天气影响最大,比起好基友加入或者交通距离的影响都大。最后,假设你选择5做为感知器阈值(即b为-5),按照这种选择,这个感知器就能实现这个决策模型:当天气好时候输出1,天气不好时候输出0,无论你的好基友是否愿意去,或者交通是否比较近。

    神经元2:Sigmoid神经元

    先来认识一个函数:Sigmoid函数,这个单词在某些工具上直译是“乙状结肠”、也还真有某些资料把Sigmoid神经元叫作乙状结肠神经元的。 其实它是一个常用的“S”型函数,可以把变量映射到(0,1)区间内,其公式如下:

    它的函数图像是如下图如示的“S”型:

    那么Sigmoid神经元是什么呢?与感知器有什么区别?

    首先,在Sigmoid神经元中,输入的值不再是二进制,而是0到1之间的任意值。即Xi取值是0到1之间的任意实数。

    其次,而Sigmoid神经元的输出也不再是0或1,而是 σ(wx+b)。 注意"wx+b"是简写(矩阵)形式,请对照上面的感知器的公式。

    因此我们可以得出Sigmoid神经元的公式:

    可以发现当z=w⋅x+b是一个大的正数时,那么σ(z)≈1,而当z=w⋅x+b是一个很小的负数(“绝对值很大的负数”比较好理解)时,σ(z)≈0。处于这两种情况时,Sigmoid神经元的输出跟感知器是很接近的。只有当w⋅x+b在一个适度的值,sigmoid神经元和感知器偏差才较大。

    激励函数

    神经元的输入和输出之间具有函数关系,这个函数就称为激励函数。所以上面提到的Sigmoid函数就是激励函数的一种,感知器的那个函数也可以称为阈值(或阶跃)激励函数。

    激励函数也叫点火规则,这使它与人脑的工作联系起来。当一个神经元的输入足够大时,就会点火,也就是从它的轴突(输出连接)发送电信号。同样,在人工神经网络中,只要输入超过一定标准时才会产生输出,这就是点火规则的思想。

    神经网络的结构

    神经网络简单地说就是将多个神经元连接起来、组成一个网络。 本文介绍的是最简单、历史悠久的一种:“多层感知机”(但我们讲的这个它里面的神经元并不是感知器、而是Sigmoid神经元,名词混乱+1),或称之为“多层向前神经网络(Multilayer Feed-Forward Neural Network)”,它的特点是有多层(废话),且神经元之间是全连接的,即后一层的神经元会连接到前一层的每个神经元(这里定义下从输入层到输出层为从“后”向“前”)。

    一个多层感知机的示意图如下,网络的最左边一层被称为输入层,其中的神经元被称为输入神经元。最右边及输出层包含输出神经元,在这个例子中,只有一个单一的输出神经元,但一般情况下输出层也会有多个神经元。中间层被称为隐含层,因为里面的神经元既不是输入也不是输出。

    训练神经网络的意义

    现在神经元有了,神经网络的结构也有了,现在回到核心的问题上来:我们拿神经网络干什么? 要怎样使它做到?

    训练的目标

    按照常识、用人话来说,神经网络的作用就是我们预先给它大量的数据(包含输入和输出)来进行训练,训练完成后,我们希望它对于将来的真实环境的输入也能给出一个令我们满意的输出。

    损失函数/代价函数(Loss函数)

    那么怎样用数学的方式来表示一个输出有多么令我们满意呢? 这里我们引入损失函数(或称代价函数、Loss函数)的概念。

    现假设有n组包含了输入和真实结果(或称期望结果、期望输出)的样本数据,对于每组输入,我们的神经网络输出的结果记为fi,真实结果(期望结果)记为yi。

    使用数学工具中的MAE(Mean Absolute Error,平均绝对误差),可以非常直观地表达出输出结果和真实结果的偏差,因此我们可以用MAE来写出一个下面这样的Loss函数,Loss值越大、说明神经网络的输出结果越远离我们的期望

    也可以用MSE(Mean Squared Error,均方误差)作为损失函数,MSE能更好地评价数据的变化程度,简单地说因为平方了一下、偏差是会被放大的。

    将Sigmoid神经元的表达式f(x)=σ(wx+b)代入上面的损失函数中,可以发现x(输入)是固定的,yi(期望结果)也是固定的,让我们感性地想象一下:实际上影响Loss的只有w和b,而最重要的任务也就是寻找w和b使得Loss最小

    再具象一点,其实对神经网络进行训练的目的就是为每个神经元找到最适合它的w和b的值,从而使得整个神经网络的输出最接近我们的期望(说“最”其实有点违反广告法,神经网络最终达到的很难说是问题的最优解)。

    注:下面将真正用到的损失函数

    在实际中,为了方便求导,一般使用如下的Loss函数:

    梯度下降

    根据上面的结论,可以把损失(Loss)记作C,而C又只与w和b有关,那么可以看成C是一个关于w和b的函数,如下图所示。注意由于神经网络中其实有大量的“w”和“b”(回忆一下、每个神经元都有多个权重和一个阈值),因此这里也需要感性的认知。

    如果把图画出来,它可能是下面这样的:

    我们的目标是找到w和b使C最小,当然上面这张图很容易看出来合适的w和b在哪,但当面对更复杂的情况时、比如下图这样的,应该如何快速地找到C最小的点呢?

    这里我们引入梯度下降算法,原理很简单:把上图看作是一个丘陵地带,想象我们有一个球放在某个位置,让它“自然地向低处滚”,滚得越低,C就越小,我们就越高兴。

    那么怎样使得它往低处滚呢?  (注意这里要搬出全文中第一个比较烧脑的概念了)  微分法则告诉我们,当w移动Δw、b移动Δb时,有:

    由于C表示的是损失,我们想让球往低处滚,当然是希望C不断变小,那ΔC应该恒为负,那么Δw、Δb应该如何取值呢? 梯度下降法是这么设计的:

    可以看出如此取值可以使ΔC恒为负,其中的η称为学习率。

    那么现在问题变成了∂C/∂w、∂C/∂b,即 C对w 和 C对b 的偏导,这两个鬼东西要怎么求?

    反向传播

    反向传播(back propagation)是在这种场景下快速求解∂C/∂w、∂C/∂b的算法,用了这个算法的多层感知机--也就是这篇文章讲的神经网络--也就叫作BP神经网络(名词混乱+1)。

    这一章包含了比较复杂的公式推导过程,个人认为不了解其细节也没有关系、可以跳过这一章(只看“正向传播”一节就行),只要知道有个经典的反向传播算法可以快速求解∂C/∂w、∂C/∂b,从而算出Δw和Δb,使得ΔC恒为负、即使得Loss越来越小即可

    正向传播

    正向传播也可以叫作前馈(所以又有个前馈神经网络的词...),正向传播就是指给神经网络的输入,然后一层一层向前计算输出,最终得到一个输出,这就是正向传播了。

    推导前的基本定义

    w、a、b的定义

    我们使用 wljk 表示从 (l−1)th 层的 kth 个神经元到 (l)th 层的 jth 个神经元的链接上的权重。例如,下图给出了第二隐藏层的第四个神经元到第三隐藏层的第二个神经元的链接上的权重:

    我们使用 blj 表示在 lth 层 jth 个神经元的偏差,使用 alj 表示 lth 层 jth 个神经元的激活值。下面的图清楚地解释了这样表示的含义:

    基于上面的定义,可以写出关于单个神经元激活值alj的公式,其中sum(l-1)表示(l−1)th 层的神经元数量:

    上面w的表示方法或许很奇怪,但我们把它写成矩阵形式或许就能发现它的妙处了。用wl矩阵来表示第(l)th 层的w的值,用j作为行,k行为列,那么上面的神经网络中的w3就可以写成:

    那么也可以用al矩阵来表示第(l)th 层的a的值,用j作为行,但只有一列,那么al其实是一个列向量。那么上面的a2可以写成下面非常形象的列向量形式:

    同理,b3可以也可以写成一个列向量:

    那么由上面的单个神经元激活值alj的公式,可以得出al矩阵的公式:

    单个神经元的带权输入zlj

    从上面的公式中可以提取出一个中间量zlj:

    当然也可以简写成矩阵形式:

    zlj其实就是第 l 层第 j 个神经元的激活函数带权输入

    单组数据的损失

    前面介绍了损失函数,那么对于某一组输入,其损失(大写的“L”表示输出层)可以写作如下公式(这里比上面的Loss公式少了个n,因为这里只考虑一组输入,而上面的Loss设定是考虑n组数据)。

    这个公式同样可以写成矩阵的形式,这里用到了矩阵的模(可以看附录),模的平方即为向量各元素的平方和。

    单个神经元的误差δlj测试

    定义 l 层的第 jth 个神经元上的误差 δlj 为:

    然后可以再推演两步:

    推导

    输出层的误差矩阵

    由上面的单个神经元误差公式,可以得出输出层误差矩阵公式(注意这里使用大写的“L”表示输出层,圆圈表示的Hadamard乘积可以看附录):

    而由于我们采用的损失函数非常容易求出C对aL的导,所以公式可以进一步简化成:

    某一层的误差矩阵

    首先推导下单个神经元误差δlj与下一层(l+1层)的关系:

    上面推导中比较难理解的可能是累加k的由来,这是因为第lth层第jth个神经元会影响到第(l+1)th层的所有神经元,所以在反向计算偏导时需要考虑第(l+1)th层的所有神经元。

    然后可以得出第lth层的误差矩阵(向量)δl的公式:

    这次变换出现了矩阵转置,可能也比较难以理解其由来。仔细观察上面wkj会发现其中的j与k的顺序与w的原始定义中的顺序发生了对调,这可以理解成转置的原因。自己拿一个示例演算一下也能发现从单个神经元误差到某层神经元的误差矩阵变换时的规律。

    误差与权重w的关系

    在得到了单个神经元的误差之后,再来看看误差与w的关系:

    和上节的推演一样,若写成矩阵,则是如下形式:

    误差与偏差b的关系

    与上面w的推导过程一致,容易得到误差与b的关系:

    这个的矩阵形式就很简单了:

    总结

    通过上面惨无人道的推导,可以发现在经过一次正向传播之后,可以通过输出层的误差、快速求解出C对每个w和b的偏导,即∂C/∂w、∂C/∂b,再对每个w和b加上Δw、Δb,从而使得“球往下滚”,C、即Loss越来越小,神经网络在朝着我们期望的方向进行调整。

    BP神经网络的训练流程

    基于上面的知识,我们现在可以总结出训练一个神经网络的全流程:

    1. 初始化神经网络,对每个神经元的w和b赋予随机值;
    2. 输入训练样本集合,对于每个样本,将输入给到神经网络的输入层,进行一次正向传播得到输出层各个神经元的输出值;
    3. 求出输出层的误差,再通过反向传播算法,向后求出每一层(的每个神经元)的误差;
    4. 通过误差可以得出每个神经元的∂C/∂w、∂C/∂b,再乘上负的学习率(-η),就得到了Δw、Δb,将每个神经元的w和b更新为 w+Δw、b+Δb;

    完成训练之后,一般情况下我们都能得到一个损失比较小的神经网络。

    附录

    矩阵

    矩阵加法、减法

    要求两个矩阵大小(行数、列数)相同,然后相同位置的元素相加/相减。

    矩阵乘法

    这个应该都还记得,即左边矩阵的一行乘上右边矩阵的一列,因此矩阵相乘要求左边矩阵的列数等于右边矩阵的行数。

    转置

    把矩阵A的行和列互相交换所产生的矩阵称为A的转置矩阵(即第m行第n列元素转为第n行第m列元素),用符号T表示:

    向量

    只有一行的矩阵称为行向量,只有一列的矩阵称为列向量。
    行向量例如:

    列向量例如:

    PS:向量只是一种特殊的矩阵,矩阵乘法和转置都是可以用在向量上的。

    Hadamard乘积:⨀

    假设S和T是两个同样维度的向量,使用S⨀T来表示按元素的乘积。所以 S⨀T 的元素就是(S⨀T)j=SjTj。

    向量的模(长度或大小)

    在线性代数中,向量的大小用向量两边加双竖线表示,向量的大小就是向量各分量平方和的平方根。
    如有向量S:

    则其模为:

    参考资料

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

    http://www.tensorfly.cn/home/?p=80

    展开全文
  • 由于新的神经网络架构无时无刻不在涌现,想要记录所有的神经网络是很困难的事情。要把所有这些缩略语指代的网络(DCIGN,IiLSTM,DCGAN等)都弄清,一开始估计还无从下手。 下表包含了大部分常用的模型(大部分是神经...

    由于新的神经网络架构无时无刻不在涌现,想要记录所有的神经网络是很困难的事情。要把所有这些缩略语指代的网络(DCIGN,IiLSTM,DCGAN等)都弄清,一开始估计还无从下手。

    下表包含了大部分常用的模型(大部分是神经网络还有一些其他的模型)。虽然这些架构都是新奇独特的,但当我开始把它们的结果画下来的时候,每种架构的底层关系就会清晰。

    显然这些节点图并不能显示各个模型的内部工作过程。例如变分自动编码器(VAE)和自动编码器(AE)节点图看起来一样,但是二者的训练过程实际上是完全不同的,训练后模型的使用场景更加不同。VAE是生成器,用于在样本中插入噪声。而 AE 则仅仅是将它们得到的输入映射到它们“记忆”中最近的训练样本!本文不详细介绍每个不同构架内部如何工作。

    虽然大多数缩写已经被普遍接受,但也会出现一些冲突。例如RNN通常指复发神经网络,有时也指递归神经网络,甚至在许多地方只是泛指各种复发架构(包括LSTM,GRU甚至双向变体)。AE也一样,VAE和DAE等都被简单的称为AE。此外,同一个模型的缩写也会出现后缀N的个数不同的问题。同一个模型可以将其称为卷积神经网络也可称作卷积网络,对应的缩写就成了CNN或CN

    将本文作为完整的神经网络列表几乎是不可能的,因为新的架构一直被发明,即使新架构发布了,想要找到他们也是困难的。因此本文可能会为您提供一些对AI世界的见解,但绝对不是所有; 特别是您在这篇文章发表很久之后才看到。

    对于上图中描绘的每个架构,本文做了非常简短的描述。如果您对某些架构非常熟悉,您可能会发现其中一些有用。

    感知器(P左图)和前馈神经网络(FF或FFNN右图)非常直观,它们将信息从前端输入,再从后端输出。神经网络通常被描述为具有层(输入,隐藏或输出层),其中每层由并行的单元组成。通常同一层不具有连接、两个相邻层完全连接(每一层的每一个神经元到另一层的每个神经元)。最简单的实用网络有两个输入单元和一个输出单元,可用于建立逻辑模型( 用做判断是否)。通常通过反向传播方法来训练FFNN,数据集由配对的输入和输出结果组成(这被称为监督学习)。我们只给它输入,让网络填充输出。反向传播的误差通常是填充输出和实际输出之间差异的一些变化(如MSE或仅仅线性差异)。鉴于网络具有足够的隐藏神经元,理论上可以总是对输入和输出之间的关系建模。实际上它们的应用是很有限的,通常将它们与其他网络结合形成新的网络。

    径向基函数(RBF)网络就是以径向基函数作为激活函数的FFNN网络。但是RBFNN有其区别于FFNN的使用场景(由于发明时间问题大多数具有其他激活功能的FFNN都没有自己的名字)。

    Hopfield网络(HN)的每个神经元被连接到其他神经元; 它的结构像一盘完全纠缠的意大利面板。每个节点在训练前输入,然后在训练期间隐藏并输出。通过将神经元的值设置为期望的模式来训练网络,此后权重不变。一旦训练了一个或多个模式,网络将总是会收敛到其中一个学习模式,因为网络在这个状态中是稳定的。需要注意的是,HN 不会总是与理想的状态保持一致。网络稳定的部分原因在于总的“能量”或“温度”在训练过程中逐渐缩小。每个神经元都有一个被激活的阈值,随温度发生变化,一旦超过输入的总合,就会导致神经元变成两个状态中的一个(通常是 -1 或 1,有时候是 0 或 1)。更新网络可以同步进行,也可以依次轮流进行,后者更为常见。当轮流更新网络时,一个公平的随机序列会被生成,每个单元会按照规定的次序进行更新。因此,当每个单元都经过更新而且不再发生变化时,你就能判断出网络是稳定的(不再收敛)。这些网络也被称为联存储器,因为它们会收敛到与输入最相似的状态;当人类看到半张桌子的时候,我们会想象出桌子的另一半,如果输入一半噪音、一半桌子,HN 将收敛成一张桌子。

    马可夫链(MC或离散时间马尔可夫链,DTMC)是BM和HN的前身。它可以这样理解:从我现在的这个节点,我去任何一个邻居节点的几率是无记,这意味着你最终选择的节点完全取决于当前的所处的节点,l与过去所处的节点无关。这虽然不是真正的神经网络,但类似于神经网络,并且构成了BM和HNs的理论基础。就像BM、RBM和HN一样,MC并不总是被认为是神经网络。此外,马尔科夫链也并不总是完全连接。

    波尔兹曼机(BM)很像HN,区别在于只有一些神经元被标记为输入神经元,而其他神经元保持“隐藏”。输入神经元在完整的网络更新结束时成为输出神经元。它以随机权重开始,并通过反向传播学习或通过对比分歧(一种马尔科夫链用于确定两个信息增益之间的梯度)训练模型。与HN相比,BM的神经元大多具有二元激活模式。由于被MC训练,BM是随机网络。BM的训练和运行过程与HN非常相似:将输入神经元设置为某些钳位值,从而释放网络。虽然释放节点可以获得任何值,但这样导致在输入和隐藏层之间多次反复。激活由全局阈值控制。这种全局误差逐渐降的过程导致网络最终达到平衡。

    限制玻尔兹曼机(RBM)与BM非常相似,也与HN类似。BM和RBM之间的最大区别是,RBM有更好的可用性,因为它受到更多的限制。RBM不会将每个神经元连接到每个其他神经元,但只将每个神经元组连接到每个其他组,因此没有输入神经元直接连接到其他输入神经元,也不会有隐藏层直接连接到隐藏层。RBM可以像FFNN一样进行训练,而不是将数据向前传播然后反向传播。

    自编码器(Autoencoders, AE)与前馈神经网络(FFNN)有点相似。与其说它是一个完全不同的网络结构,不如说它是前馈神经网络的不同应用。自编码器的基本思想是:自动编码信息(如压缩,而非加密)。由此,而得名。整个网络在形状上像一个漏斗:它的隐藏层单元总是比输入层和输出层少。自编码器总是关于中央层对称(中央层是一个还是两个取决于网络的层数:如果是奇数,关于最中间一层对称;如果是偶数,关于最中间的两层对称)。最小的隐藏层总是处在中央层,这也是信息最压缩的地方(被称为网络的阻塞点)。从输入层到中央层叫做编码部分,从中央层到输出层叫做解码部分,中央层叫做编码(code)。可以使用反向传播算法来训练自编码器,将数据输入网络,将误差设置为输入数据与网络输出数据之间的差异。自编码器的权重也是对称的,即编码权重和解码权重是一样的。

    稀疏自编码器(Sparse autoencoders, SAE)在某种程度上与自编码器相反。不同于我们训练一个网络在更低维的空间和结点上去表征一堆信息,在这里我们尝试着在更高维的空间上编码信息。所以在中央层,网络不是收敛的,而是扩张的。这种类型的网络可以用于提取数据集的特征。如果我们用训练自编码器的方法来训练稀疏自编码,几乎在所有的情况下,会得到一个完全无用的恒等网络(即,输入什么,网络就会输出什么,没有任何转换或者分解)。为了避免这种情况,在反馈输入的过程中会加上一个稀疏驱动。这个稀疏驱动可以采用阈值过滤的形式,即只有特定的误差可以逆传播并被训练,其他误差被视为训练无关的并被设置为零。某种程度上,这和脉冲神经网络相似:并非所有的神经元在每个时刻都会被激活(这在生物学上有一定的合理性)

    变分自编码器(Variational autoencoders, VAE)和自编码器有相同的网络结构,但是模型学到的一些其他的东西:输入样本的近似概率分布。这一点和玻尔兹曼机(BM)、受限玻尔兹曼机(RBM)更相似。然而,他们依赖于贝叶斯数学,这涉及到概率推断和独立性,以及再参数化(reparametrisation)技巧以获得不同的表征。概率推断和独立性部分有直观的意义,但是他们依赖于复杂的数学知识。基本原理如下:将影响考虑进去。如果一件事在一个地方发生,而另一件事在其他地方发生,那么它们未必是相关的。如果它们不相关,那么误差逆传播的过程中应该考虑这个。这种方法是有用的,因为神经网络是大型图(在某种程度上),所以当进入更深的网络层时,你可以排除一些结点对于其他结点的影响。

    去噪自编码器(Denoising autoencoders, DAE)是一种自编码器。在去噪自编码器中,我们不是输入原始数据,而是输入带噪声的数据(好比让图像更加的颗粒化)。但是我们用和之前一样的方法计算误差。所以网络的输出是和没有噪音的原始输入数据相比较的。这鼓励网络不仅仅学习细节,而且学习到更广的特征。因为特征可能随着噪音而不断变化,所以一般网络学习到的特征通常地错误的。

    深度信念网络(Deep belief networks, DBN)是受限玻尔兹曼机或者变分自编码器的堆叠结构。这些网络已经被证明是可有效训练的。其中,每个自编码器或者玻尔兹曼机只需要学习对之前的网络进行编码。这种技术也被称为贪婪训练。贪婪是指在下降的过程中只求解局部最优解,这个局部最优解可能并非全局最优解。深度信念网络能够通过对比散度(contrastive divergence)或者反向传播来训练,并像常规的受限玻尔兹曼机或变分自编码器那样,学习将数据表示成概率模型。一旦模型通过无监督学习被训练或收敛到一个(更)稳定的状态,它可以被用作生成新数据。如果使用对比散度训练,它甚至可以对现有数据进行分类,因为神经元被教导寻找不同的特征。

    卷积神经网络(Convolutional neural networks, CNN, or Deep convolutional neural networks, DCNN)和大多数其他网络完全不同。它们主要用于图像处理,但也可用于其他类型的输入,如音频。卷积神经网络的一个典型应用是:将图片输入网络,网络将对图片进行分类。例如,如果你输入一张猫的图片,它将输出“猫”;如果你输入一张狗的图片,它将输出“狗”。卷积神经网络倾向于使用一个输入“扫描仪”,而不是一次性解析所有的训练数据。举个例子,为了输入一张200 x 200像素的图片,你不需要使用一个有40000个结点的输入层。相反,你只要创建一个扫描层,这个输入层只有20 x 20个结点,你可以输入图片最开始的20 x 20像素(通常从图片的左上角开始)。一旦你传递了这20 x 20像素数据(可能使用它进行了训练),你又可以输入下一个20 x 20像素:将“扫描仪”向右移动一个像素。注意,不要移动超过20个像素(或者其他“扫描仪”宽度)。你不是将图像解剖为20 x 20的块,而是在一点点移动“扫描仪“。然后,这些输入数据前馈到卷积层而非普通层。卷积层的结点并不是全连接的。每个结点只和它邻近的节点(cell)相关联(多靠近取决于应用实现,但是通常不会超过几个)。这些卷积层随着网络的加深会逐渐收缩,通常卷积层数是输入的因子。(所以,如果输入是20,可能接下来的卷积层是10,再接下来是5)。2的幂是经常被使用的,因为它们能够被整除:32,16,8,4,2,1。除了卷积层,还有特征池化层。池化是一种过滤细节的方法:最常用的池化技术是最大池化(max pooling)。比如,使用2 x 2像素,取这四个像素中数值最大的那个。为了将卷积神经网络应用到音频,逐段输入剪辑长度的输入音频波。卷积神经网络在真实世界的应用通常会在最后加入一个前馈神经网络(FFNN)以进一步处理数据,这允许了高度非线性特征映射。这些网络被称为DCNN,但是这些名字和缩写通常是可以交换使用的。

    反卷积神经网络(Deconvolutional networks, DN),也叫做逆向图网络(inverse graphics networks, IGN)。它是反向卷积神经网络。想象一下,将一个单词”猫“输入神经网络,并通过比较网络输出和真实猫的图片之间的差异来训练网络模型,最终产生一个看上去像猫的图片。反卷积神经网络可以像常规的卷积神经网络一样结合前馈神经网络使用,但是这可能涉及到新的名字缩写。它们可能是深度反卷积神经网络,但是你可能倾向于:当你在反卷积神经网络前面或者后面加上前馈神经网络,它们可能是新的网络结构而应该取新的名字。值得注意的事,在真实的应用中,你不可能直接把文本输入网络,而应该输入一个二分类向量。如,<0,1>是猫,<1,0>是狗,而<1,1>是猫和狗。在卷积神经网络中有池化层,在这里通常被相似的反向操作替代,通常是有偏的插补或者外推(比如,如果池化层使用最大池化,当反向操作时,可以产生其他更低的新数据来填充)

    深度卷积逆向图网络(Deep convolutional inverse graphics networks , DCIGN),这个名字具有一定的误导性,因为事实上它们是变分自编码器(VAE),只是在编码器和解码器中分别有卷积神经网络(CNN)和反卷积神经网络(DNN)。这些网络尝试在编码的过程中对“特征“进行概率建模,这样一来,你只要用猫和狗的独照,就能让网络学会生成一张猫和狗的合照。同样的,你可以输入一张猫的照片,如果猫的旁边有一只恼人的邻居家的狗,你可以让网络将狗去掉。实验显示,这些网络也可以用来学习对图像进行复杂转换,比如,改变3D物体的光源或者对物体进行旋转操作。这些网络通常用反向传播进行训练。

    生成式对抗网络(Generative adversarial networks , GAN)是一种新的网络。网络是成对出现的:两个网络一起工作。生成式对抗网络可以由任何两个网络构成(尽管通常情况下是前馈神经网络和卷积神经网络配对),其中一个网络负责生成内容,另外一个负责对内容进行判别。判别网络同时接收训练数据和生成网络生成的数据。判别网络能够正确地预测数据源,然后被用作生成网络的误差部分。这形成了一种对抗:判别器在辨识真实数据和生成数据方面做得越来越好,而生成器努力地生成判别器难以辨识的数据。这种网络取得了比较好的效果,部分原因是:即使是很复杂的噪音模式最终也是可以预测的,但生成与输入数据相似的特征的内容更难辨别。生成式对抗网络很难训练,因为你不仅仅要训练两个网络(它们中的任意一个都有自己的问题),而且还要考虑两个网络的动态平衡。如果预测或者生成部分变得比另一个好,那么网络最终不会收敛。

    循环神经网络(Recurrent neural networks , RNN)是考虑时间的前馈神经网络:它们并不是无状态的;通道与通道之间通过时间存在这一定联系。神经元不仅接收来上一层神经网络的信息,还接收上一通道的信息。这就意味着你输入神经网络以及用来训练网络的数据的顺序很重要:输入”牛奶“、”饼干“和输入”饼干“、”牛奶“会产生不一样的结果。循环神经网络最大的问题是梯度消失(或者梯度爆炸),这取决于使用的激活函数。在这种情况下,随着时间信息会快速消失,正如随着前馈神经网络的深度增加,信息会丢失。直观上,这并不是一个大问题,因为它们只是权重而非神经元状态。但是随着时间,权重已经存储了过去的信息。如果权重达到了0或者1000000,先前的状态就变得没有信息价值了。卷积神经网络可以应用到很多领域,大部分形式的数据并没有真正的时间轴(不像声音、视频),但是可以表示为序列形式。对于一张图片或者是一段文本的字符串,可以在每个时间点一次输入一个像素或者一个字符。所以,依赖于时间的权重能够用于表示序列前一秒的信息,而不是几秒前的信息。通常,对于预测未来信息或者补全信息,循环神经网络是一个好的选择,比如自动补全功能。

    长短时记忆网络(Long / short term memory , LSTM)通过引入门结构(gate)和一个明确定义的记忆单元(memory cell)来尝试克服梯度消失或者梯度爆炸的问题。这一思想大部分是从电路学中获得的启发,而不是从生物学。每个神经元有一个记忆单元和是三个门结构:输入、输出和忘记。这些门结构的功能是通过禁止或允许信息的流动来保护信息。输入门结构决定了有多少来自上一层的信息被存储当前记忆单元。输出门结构承担了另一端的工作,决定下一层可以了解到多少这一层的信息。忘记门结构初看很奇怪,但是有时候忘记是必要的:

    如果网络正在学习一本书,并开始了新的章节,那么忘记前一章的一些人物角色是有必要的。

    长短时记忆网络被证明能够学习复杂的序列,比如:像莎士比亚一样写作,或者合成简单的音乐。值得注意的是,这些门结构中的每一个都对前一个神经元中的记忆单元赋有权重,所以一般需要更多的资源来运行。

    门控循环单元(Gated recurrent units , GRU)是长短时记忆网络的一种变体。不同之处在于,没有输入门、输出门、忘记门,它只有一个更新门。该更新门确定了从上一个状态保留多少信息以及有多少来自上一层的信息得以保留。 这个复位门的功能很像LSTM的忘记门,但它的位置略有不同。 它总是发出全部状态,但是没有输出门。 在大多数情况下,它们与LSTM的功能非常相似,最大的区别在于GRU稍快,运行容易(但表达能力更差)。 在实践中,这些往往会相互抵消,因为当你需要一个更大的网络来获得更强的表现力时,往往会抵消性能优势。在不需要额外表现力的情况下,GRU可能优于LSTM。

    神经图灵机(Neural Turing machines , NTM)可以被理解为LSTM的抽象,它试图去黑箱化(使我们能够洞察到发生了什么)。神经图灵机并非直接编码记忆单元到神经元中,它的记忆单元是分离的。它试图将常规数字存储的效率和永久性以及神经网络的效率和表达力结合起来。这种想法基于有一个内容寻址的记忆库,神经网络可以从中读写。神经图灵机中的”图灵“(Turing)来自于图灵完备(Turing complete):基于它所读取的内容读、写和改变状态的能力,这意味着它能表达一个通用图灵机可表达的一切事情。

    双向循环神经网络、双向长短时记忆网络、双向门控循环单元(Bidirectional recurrent neural networks, BiRNN; bidirectional long / short term memory networks, BiLSTM; bidirectional gated recurrent units, BiGRU)在表中没有展示出来,因为它们看起来和相应的单向网络是一样的。不同之处在于这些网络不仅联系过去,还与未来相关联。比如,单向长短时记忆网络被用来预测单词”fish“的训练过程是这样的:逐个字母地输入单词“fish”, 在这里循环连接随时间记住最后的值。而双向长短时记忆网络为了提供未来的信息,会在反向通道中会输入下一个字母。这种方法训练网络以填补空白而非预测未来信息,比如,在图像处理中,它并非扩展图像的边界,而是可以填补一张图片中的缺失。

    深度残差网络(Deep residual networks , DRN)是具有非常深度的前馈神经网络,除了邻近层之间有连接,它可以将输入从一层传到后面几层(通常是2到5层)。深度残差网络并非将一些输入(比如通过一个5层网络)映射到输出,而是学习将一些输入映射到一些输出+输入上。基本上,它增加了一个恒等函数,将旧的输入作为后面层的新输入。结果显示,当达到150 层,这些网络对于模式学习是非常有效的,这要比常规的2到5层多得多。然而,有结果证明这些网络本质上是没有基于具体时间建造的循环神经网络(RNN),它们总是与没有门结构的长短时记忆网络(LSTM)作比较。

    回声状态网络(Echo state networks , ESN)是另外一种不同类型的(循环)网络。它的不同之处在于:神经元之间随机地连接(即,层与层之间没有统一的连接形式),而它们的训练方式也不一样。不同于输入数据,然后反向传播误差,回声状态网络先输入数据,前馈,然后暂时更新神经元。它的输入层和输出层在这里扮演了稍微不同于常规的角色:输入层用来主导网络,输出层作为随时间展开的激活模式的观测。在训练过程中,只有观测和隐藏单元之间连接会被改变。

    极限学习机(Extreme learning machines , ELM)本质上是有随机连接的前馈神经网络。他看上去和液体状态机(LSM)和回声状态网络(ESN)很相似,但是它即没有脉冲,也没有循环。它们并不使用反向传播。相反,它们随机初始化权重,并通过最小二乘拟合一步训练权重(所有函数中的最小误差)。这使得模型具有稍弱的表现力,但是在速度上比反向传播快很多。

    液体状态机(Liquid state machines ,LSM)看上去和回声状态网络(ESN)很像。真正的不同之处在于,液体状态机是一种脉冲神经网络:sigmoid激活函数被阈值函数所取代,每个神经元是一个累积记忆单元(memory cell)。所以当更新神经元的时候,其值不是邻近神经元的累加,而是它自身的累加。一旦达到阈值,它会将其能量传递到其他神经元。这就产生一种类似脉冲的模式:在突然达到阈值之前什么也不会发生。

    支持向量机(Support vector machines , SVM)发现了分类问题的最佳解决方式。传统的SVM一般是处理线性可分数据。比如,发现哪张图片是加菲猫,哪张图片是史努比,而不可能是其他结果。在训练过程中,支持向量机可以想象成在(二维)图上画出所有的数据点(加菲猫和史努比),然后找出如何画一条直线将这些数据点区分开来。这条直线将数据分成两部分,所有加菲猫在直线的一边,而史努比在另一边。最佳的分割直线是,两边的点和直线之间的间隔最大化。当需要将新的数据分类时,我们将在图上画出这个新数据点,然后简单地看它属于直线的那一边。使用核技巧,它们可以被训练用来分类n维数据。这需要在3D图上画出点,然后可以区分史努比、加菲猫和西蒙猫,甚至更多的卡通形象。支持向量机并不总是被视为神经网络。

    Kohonen网络(Kohonen networks , KN; 也被称为自组织(特征)映射, SOM, SOFM))利用竞争性学习对数据进行分类,无需监督。 将数据输入网络,之后网络评估其中哪个神经元最匹配那个输入。 然后调整这些神经元以使更好地匹配输入。在该过程中移动相邻神经元。 相邻神经元被移动多少取决于它们到最佳匹配单位的距离。 有时候,Kohonen网络也不被认为是神经网络。

    展开全文
  • 猜一猜,下图中是什么动物?图1 看图猜动物尽管图中的动物胖得出奇,你也应该能够猜到它是一只长颈鹿。人类的大脑拥有强大的辨识能力,它是一个由差不多800亿个神经元组成的...
  • 这是看到的一篇对神经网络的讲解的文章,我觉得写得很好,也仔细学习了学习,最近我可能也得用这个东西,现在确实是很火啊,也很实用。   神经网络和深度学习 神经网络:一种可以通过观测数据使计算机学习的仿生...
  • BP神经网络(BPNN)

    2018-05-29 10:50:51
    本文简要介绍BP神经网络(BPNN, Back Propagation Neural Network)的思想。BP神经网络是最基础的神经网络,结果采用前向传播,误差反向(Back Propagation)传播方式进行。BP神经网络是有监督学习,不妨想象这么一...
  • amp;see_lz=1# 先从回归(Regression)问题说起。我在本吧已经看到不少人提到如果想实现强AI,就必须让机器学会观察并总结规律的言论。具体地说,要让机器观察什么是圆的,什么是方的,区分各种颜色和形状,然后根据...
  • Fill you up with petrol概述人工神经网络(artificial neural network,ANN),简称神经网络(neural network,NN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结...
  • 一篇关于图神经网络的综述文章,着重介绍了图卷积神经网络(GCN),回顾了近些年的几个主要的图神经网络的的体系:图注意力网络、图自编码机、图生成网络、图时空网络。 1、介绍 传统的机器学习所用到的数据是欧氏...
  • 神经网络的基本概念

    2018-09-07 16:47:38
    小亮最近开始重新学习神经网络,发现之前好多概念名词什么的自己都不清晰,今天特意整理了一下这些基本概念以及在神经网络中为什么要引入这些名词?详情请见下文! 这里是小亮的blog地址:...
  • 一、卷积神经网络的基本概念 受Hubel和Wiesel对猫视觉皮层电生理研究启发,有人提出卷积神经网络(CNN),Yann Lecun 最早将CNN用于手写数字识别并一直保持了其在该问题的霸主地位。近年来卷积神经网络在多个方向...
  • 1. 引言在深度学习十分火热的今天,不时会涌现出各种新型的人工神经网络,想要实时了解这些新型神经网络的架构还真是不容易。光是知道各式各样的神经网络模型缩写(如:DCIGN、BiLSTM、DCGAN……还有哪些?),就已经...
  • 坑一定是现在的神经网络本质就是无法指数级别优化的 所以谷歌填坑这么多年仍然没有填好,但是走向正确的道理之前一定是经过错误,才能避免错误的 如果谷歌得到了什么启示,目前的神经网络会得到很大的改进,或者是颠覆的...
  • 神经网络和深度学习 神经网络:一种可以通过观测数据使计算机学习的仿生语言范例 深度学习:一组强大的神经网络学习技术神经网络和深度学习目前提供了针对图像识别,语音识别和自然语言处理领域诸多问题的最佳解决...
  • 利用MATLAB 进行BP神经网络的预测(含有神经网络工具箱) 最近一段时间在研究如何利用预测其销量个数,在网上搜索了一下,发现了很多模型来预测,比如利用回归模型、时间序列模型,GM(1,1)模型,可是自己在结合...
  • 上一次我们讲了M-P模型,它实际上就是对单个神经元的一种建模,...本文具体来介绍一下一种非常常见的神经网络模型——反向传播(Back Propagation)神经网络。概述BP(Back Propagation)神经网络是1986年由Rumelhart和Mc
  • 最近一段时间在研究如何利用...发现神经网络模型可以来预测,并且有很多是结合时间序列或者SVM(支持向量机)等组合模型来进行预测,本文结合实际数据,选取了常用的BP神经网络算法,其算法原理,因网上一大堆,所以...
  • 最近在研究全卷积神经网络在图像分割方面的应用,因为自己是做医学图像处理方面的工作,所以就把一个基于FCN(全卷积神经网络)的神经网络用 keras 实现了,并且用了一个医学图像的数据集进行了图像分割。全卷积神经...
1 2 3 4 5 ... 20
收藏数 310,063
精华内容 124,025
关键字:

神经网络