神经网络_神经网络算法 - CSDN
神经网络 订阅
人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connection Model),它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。 [1] 展开全文
人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connection Model),它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。 [1]
信息
简    称
神经网络(NNs)
应用学科
通信
中文名
神经网络
外文名
neural networks
神经网络定义
生物神经网络主要是指人脑的神经网络,它是人工神经网络的技术原型。人脑是人类思维的物质基础,思维的功能定位在大脑皮层,后者含有大约10^11个神经元,每个神经元又通过神经突触与大约103个其它神经元相连,形成一个高度复杂高度灵活的动态网络。作为一门学科,生物神经网络主要研究人脑神经网络的结构、功能及其工作机制,意在探索人脑思维和智能活动的规律。人工神经网络是生物神经网络在某种简化意义下的技术复现,作为一门学科,它的主要任务是根据生物神经网络的原理和实际应用的需要建造实用的人工神经网络模型,设计相应的学习算法,模拟人脑的某种智能活动,然后在技术上实现出来用以解决实际问题。因此,生物神经网络主要研究智能的机理;人工神经网络主要研究智能机理的实现,两者相辅相成。 [2] 
收起全文
  • 卷积神经网络特征的应用

    千人学习 2018-11-14 16:09:02
    卷积神经网络特征、模型视频入门教程,该课程内容包含神经网络的起源、发展、计算和训练,卷积神经网络基础,生成对抗网络、卷积神经网络的实战应用、GAN实例、人工智能案例分享及行业趋势分析。通过本次课程的学习...
  • 一文浅谈神经网络(非常适合初学者)

    万次阅读 多人点赞 2018-04-19 15:12:02
    一、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.反向传播调节权重和偏置




    展开全文
  • 神经网络——最易懂最清晰的一篇文章

    万次阅读 多人点赞 2020-05-09 18:11:14
    神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向--深度学习的基础。学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助你理解深度学习技术。  本文以一种简单的,循序的...

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

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

      神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。人脑中的神经网络是一个非常复杂的组织。成人的大脑中估计有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

    展开全文
  • 神经网络(深度学习)从入门到精通(放弃)

    万次阅读 多人点赞 2018-07-24 11:10:34
    本文主要是学习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

    展开全文
  • 神经网络(入门最详细)

    万次阅读 多人点赞 2018-10-23 09:32:34
    amp;see_lz=1# 先从回归(Regression)问题说起。我在本吧已经看到不少人提到如果想实现强AI,就必须让机器学会观察并总结规律的言论。具体地说,要让机器观察什么是圆的,什么是方的,区分各种颜色和形状,然后根据...

    form:http://tieba.baidu.com/p/3013551686?pid=49703036815&see_lz=1#

    先从回归(Regression)问题说起。我在本吧已经看到不少人提到如果想实现强AI,就必须让机器学会观察并总结规律的言论。具体地说,要让机器观察什么是圆的,什么是方的,区分各种颜色和形状,然后根据这些特征对某种事物进行分类或预测。其实这就是回归问题。

    如何解决回归问题?我们用眼睛看到某样东西,可以一下子看出它的一些基本特征。可是计算机呢?它看到的只是一堆数字而已,因此要让机器从事物的特征中找到规律,其实是一个如何在数字中找规律的问题。

    这里写图片描述

    例:假如有一串数字,已知前六个是1、3、5、7,9,11,请问第七个是几? 
    你一眼能看出来,是13。对,这串数字之间有明显的数学规律,都是奇数,而且是按顺序排列的。 
    那么这个呢?前六个是0.14、0.57、1.29、2.29、3.57、5.14,请问第七个是几? 
    这个就不那么容易看出来了吧!我们把这几个数字在坐标轴上标识一下,可以看到如下图形:

    这里写图片描述

    用曲线连接这几个点,延着曲线的走势,可以推算出第七个数字——7。 
    由此可见,回归问题其实是个曲线拟合(Curve Fitting)问题。那么究竟该如何拟合?机器不可能像你一样,凭感觉随手画一下就拟合了,它必须要通过某种算法才行。
    假设有一堆按一定规律分布的样本点,下面我以拟合直线为例,说说这种算法的原理。

    其实很简单,先随意画一条直线,然后不断旋转它。每转一下,就分别计算一下每个样本点和直线上对应点的距离(误差),求出所有点的误差之和。这样不断旋转,当误差之和达到最小时,停止旋转。说得再复杂点,在旋转的过程中,还要不断平移这条直线,这样不断调整,直到误差最小时为止。这种方法就是著名的梯度下降法(Gradient Descent)。为什么是梯度下降呢?在旋转的过程中,当误差越来越小时,旋转或移动的量也跟着逐渐变小,当误差小于某个很小的数,例如0.0001时,我们就可以收工(收敛, Converge)了。啰嗦一句,如果随便转,转过头了再往回转,那就不是梯度下降法。

    这里写图片描述
    我们知道,直线的公式是y=kx+b,k代表斜率,b代表偏移值(y轴上的截距)。也就是说,k可以控制直线的旋转角度,b可以控制直线的移动。强调一下,梯度下降法的实质是不断的修改k、b这两个参数值,使最终的误差达到最小。
    求误差时使用 累加(直线点-样本点)^2,这样比直接求差距 累加(直线点-样本点) 的效果要好。这种利用最小化误差的平方和来解决回归问题的方法叫最小二乘法(Least Square Method)。

    这里写图片描述

    问题到此使似乎就已经解决了,可是我们需要一种适应于各种曲线拟合的方法,所以还需要继续深入研究。 
    我们根据拟合直线不断旋转的角度(斜率)和拟合的误差画一条函数曲线,如图: 
    这里写图片描述
    从图中可以看出,误差的函数曲线是个二次曲线,凸函数(下凸, Convex),像个碗的形状,最小值位于碗的最下端。如果在曲线的最底端画一条切线,那么这条切线一定是水平的,在图中可以把横坐标轴看成是这条切线。如果能求出曲线上每个点的切线,就能得到切线位于水平状态时,即切线斜率等于0时的坐标值,这个坐标值就是我们要求的误差最小值和最终的拟合直线的最终斜率。
    这样,梯度下降的问题集中到了切线的旋转上。切线旋转至水平时,切线斜率=0,误差降至最小值。

    这里写图片描述

    切线每次旋转的幅度叫做学习率(Learning Rate),加大学习率会加快拟合速度,但是如果调得太大会导致切线旋转过度而无法收敛。 [学习率其实是个预先设置好的参数,不会每次变化,不过可以影响每次变化的幅度。]

    注意:对于凹凸不平的误差函数曲线,梯度下降时有可能陷入局部最优解。下图的曲线中有两个坑,切线有可能在第一个坑的最底部趋于水平。

    这里写图片描述
    微分就是专门求曲线切线的工具,求出的切线斜率叫做导数(Derivative),用dy/dx或f’(x)表示。扩展到多变量的应用,如果要同时求多个曲线的切线,那么其中某个切线的斜率就叫偏导数(Partial Derivative),用∂y/∂x表示,∂读“偏(partial)”。由于实际应用中,我们一般都是对多变量进行处理,我在后面提到的导数也都是指偏导数。

    以上是线性回归(Linear Regression)的基本内容,以此方法为基础,把直线公式改为曲线公式,还可以扩展出二次回归、三次回归、多项式回归等多种曲线回归。下图是Excel的回归分析功能。
    这里写图片描述
    在多数情况下,曲线回归会比直线回归更精确,但它也增加了拟合的复杂程度。 
    这里写图片描述

    直线方程y=kx+b改为二次曲线方程y=ax^2+bx+c时,参数(Parameter)由2个(分别是k、b)变为3个(分别是a、b、c),特征(Feature)由1个(x)变为2个(x^2和x)。三次曲线和复杂的多项式回归会增加更多的参数和特征。

    前面讲的是总结一串数字的规律,现实生活中我们往往要根据多个特征(多串数字)来分析一件事情,每个原始特征我们都看作是一个维度(Dimension)。例如一个学生的学习成绩好坏要根据语文、数学、英语等多门课程的分数来综合判断,这里每门课程都是一个维度。当使用二次曲线和多变量(多维)拟合的情况下,特征的数量会剧增,特征数=维度^2/2 这个公式可以大概计算出特征增加的情况,例如一个100维的数据,二次多项式拟合后,特征会增加到100*100/2=5000个。

    下面是一张50*50像素的灰度图片,如果用二次多项式拟合的话,它有多少个特征呢?——大约有3百万! 
    这里写图片描述

    它的维度是50*50=2500,特征数=2500*2500/2=3,125,000。如果是彩色图片,维度会增加到原来的3倍,那么特征数将增加到接近3千万了!
    这里写图片描述

    这么小的一张图片,就有这么巨大的特征量,可以想像一下我们的数码相机拍下来的照片会有多大的特征量!而我们要做的是从十万乃至亿万张这样的图片中找规律,这可能吗?
    很显然,前面的那些回归方法已经不够用了,我们急需找到一种数学模型,能够在此基础上不断减少特征,降低维度。

    于是,“人工神经网络(ANN, Artificial Neural Network)”就在这样苛刻的条件下粉墨登场了,神经科学的研究成果为机器学习领域开辟了广阔的道路。

    神经元

    有一种假说:“智能来源于单一的算法(One Learning Algorithm)”。如果这一假说成立,那么利用单一的算法(神经网络)处理世界上千变万化的问题就成为可能。我们不必对万事万物进行编程,只需采用以不变应万变的策略即可。有越来越多的证据证明这种假说,例如人类大脑发育初期,每一部分的职责分工是不确定的,也就是说,人脑中负责处理声音的部分其实也可以处理视觉影像

    下图是单个神经元(Neuron),或者说一个脑细胞的生理结构:

    这里写图片描述
    下面是单个神经元的数学模型,可以看出它是生理结构的简化版,模仿的还挺像: 
    这里写图片描述
    解释一下:+1代表偏移值(偏置项, Bias Units);X1,X2,X2代表初始特征;w0,w1,w2,w3代表权重(Weight),即参数,是特征的缩放倍数;特征经过缩放和偏移后全部累加起来,此后还要经过一次激活运算然后再输出。激活函数有很多种,后面将会详细说明。

    举例说明:这里写图片描述

    X1*w1+X2*w2+…+Xn*wn这种计算方法称为加权求和(Weighted Sum)法,此方法在线性代数里极为常用。加权求和的标准数学符号是,不过为了简化,我在教程里使用女巫布莱尔的符号表示,
    刚好是一个加号和一个乘号的组合。

    这个数学模型有什么意义呢?下面我对照前面那个 y=kx+b 直线拟合的例子来说明一下。

    这里写图片描述
    这时我们把激活函数改为Purelin(45度直线),Purelin就是y=x,代表保持原来的值不变。 
    这样输出值就成了 Y直线点 = b + X直线点*k,即y=kx+b。看到了吧,只是换了个马甲而已,还认的出来吗?下一步,对于每个点都进行这种运算,利用Y直线点和Y样本点计算误差,把误差累加起来,不断地更新b、k的值,由此不断地移动和旋转直线,直到误差变得很小时停住(收敛)。这个过程完全就是前面讲过的梯度下降的线性回归。

    一般直线拟合的精确度要比曲线差很多,那么使用神经网络我们将如何使用曲线拟合?答案是使用非线性的激活函数即可,最常见的激活函数是Sigmoid(S形曲线),Sigmoid有时也称为逻辑回归(Logistic Regression),简称logsig。logsig曲线的公式如下:
    这里写图片描述
    还有一种S形曲线也很常见到,叫双曲正切函数(tanh),或称tansig,可以替代logsig。 
    这里写图片描述
    下面是它们的函数图形,从图中可以看出logsig的数值范围是0~1,而tansig的数值范围是-1~1。

    这里写图片描述
    自然常数e

    公式中的e叫自然常数,也叫欧拉数,e=2.71828…。e是个很神秘的数字,它是“自然律”的精髓,其中暗藏着自然增长的奥秘,它的图形表达是旋涡形的螺线。

    这里写图片描述
    融入了e的螺旋线,在不断循环缩放的过程中,可以完全保持它原有的弯曲度不变,就像一个无底的黑洞,吸进再多的东西也可以保持原来的形状。这一点至关重要!它可以让我们的数据在经历了多重的Sigmoid变换后仍维持原先的比例关系。

    e是怎么来的?e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + 1/5! + 1/6! + 1/7! + … = 1 + 1 + 1/2 + 1/6 + 1/24 + 1/120+ … ≈ 2.71828 (!代表阶乘,3!=1*2*3=6)

    再举个通俗点的例子:从前有个财主,他特别贪财,喜欢放债。放出去的债年利率为100%,也就是说借1块钱,一年后要还给他2块钱。有一天,他想了个坏主意,要一年算两次利息,上半年50%,下半年50%,这样上半年就有1块5了,下半年按1块5的50%来算,就有1.5/2=0.75元,加起来一年是:上半年1.5+下半年0.75=2.25元。用公式描述,就是(1+50%)(1+50%)=(1+1/2)^2=2.25元。可是他又想,如果按季度算,一年算4次,那岂不是更赚?那就是(1+1/4)^4=2.44141,果然更多了。他很高兴,于是又想,那干脆每天都算吧,这样一年下来就是(1+1/365)^365=2.71457。然后他还想每秒都算,结果他的管家把他拉住了,说要再算下去别人都会疯掉了。不过财主还是不死心,算了很多年终于算出来了,当x趋于无限大的时候,e=(1+1/x)^x≈ 2.71828,结果他成了数学家。

    e在微积分领域非常重要,e^x的导数依然是e^x,自己的导数恰好是它自己,这种巧合在实数范围内绝无仅有。 
    这里写图片描述
    一些不同的称呼: 
    这里写图片描述

    e^x和e^-x的图形是对称的;ln(x)是e^x的逆函数,它们呈45度对称。 
    这里写图片描述

    神经网络

    好了,前面花了不少篇幅来介绍激活函数中那个暗藏玄机的e,下面可以正式介绍神经元的网络形式了。 
    下图是几种比较常见的网络形式: 
    这里写图片描述

    • 左边蓝色的圆圈叫“输入层”,中间橙色的不管有多少层都叫“隐藏层”,右边绿色的是“输出层”。
    • 每个圆圈,都代表一个神经元,也叫节点(Node)。
    • 输出层可以有多个节点,多节点输出常常用于分类问题。
    • 理论证明,任何多层网络可以用三层网络近似地表示。
    • 一般凭经验来确定隐藏层到底应该有多少个节点,在测试的过程中也可以不断调整节点数以取得最佳效果。

    计算方法: 
    这里写图片描述

    • 虽然图中未标识,但必须注意每一个箭头指向的连线上,都要有一个权重(缩放)值。
    • 输入层的每个节点,都要与的隐藏层每个节点做点对点的计算,计算的方法是加权求和+激活,前面已经介绍过了。(图中的红色箭头指示出某个节点的运算关系)
    • 利用隐藏层计算出的每个值,再用相同的方法,和输出层进行计算。
    • 隐藏层用都是用Sigmoid作激活函数,而输出层用的是Purelin。这是因为Purelin可以保持之前任意范围的数值缩放,便于和样本值作比较,而Sigmoid的数值范围只能在0~1之间。
    • 起初输入层的数值通过网络计算分别传播到隐藏层,再以相同的方式传播到输出层,最终的输出值和样本值作比较,计算出误差,这个过程叫前向传播(Forward Propagation)。

    前面讲过,使用梯度下降的方法,要不断的修改k、b两个参数值,使最终的误差达到最小。神经网络可不只k、b两个参数,事实上,网络的每条连接线上都有一个权重参数,如何有效的修改这些参数,使误差最小化,成为一个很棘手的问题。从人工神经网络诞生的60年代,人们就一直在不断尝试各种方法来解决这个问题。直到80年代,误差反向传播算法(BP算法)的提出,才提供了真正有效的解决方案,使神经网络的研究绝处逢生。

    这里写图片描述

    BP算法是一种计算偏导数的有效方法,它的基本原理是:利用前向传播最后输出的结果来计算误差的偏导数,再用这个偏导数和前面的隐藏层进行加权求和,如此一层一层的向后传下去,直到输入层(不计算输入层),最后利用每个节点求出的偏导数来更新权重。
    这里写图片描述
    为了便于理解,后面我一律用“残差(error term)”这个词来表示误差的偏导数。

    输出层→隐藏层:残差 = -(输出值-样本值) * 激活函数的导数 
    隐藏层→隐藏层:残差 = (右层每个节点的残差加权求和)* 激活函数的导数

    如果输出层用Purelin作激活函数,Purelin的导数是1,输出层→隐藏层:残差 = -(输出值-样本值)

    如果用Sigmoid(logsig)作激活函数,那么:Sigmoid导数 = Sigmoid*(1-Sigmoid) 
    输出层→隐藏层:残差 = -(Sigmoid输出值-样本值) * Sigmoid*(1-Sigmoid) = -(输出值-样本值)输出值(1-输出值)
    隐藏层→隐藏层:残差 = (右层每个节点的残差加权求和)* 当前节点的Sigmoid*(1-当前节点的Sigmoid)

    如果用tansig作激活函数,那么:tansig导数 = 1 - tansig^2

    这里写图片描述

    残差全部计算好后,就可以更新权重了: 
    输入层:权重增加 = 当前节点的Sigmoid * 右层对应节点的残差 * 学习率 
    隐藏层:权重增加 = 输入值 * 右层对应节点的残差 * 学习率 
    偏移值的权重增加 = 右层对应节点的残差 * 学习率 
    学习率前面介绍过,学习率是一个预先设置好的参数,用于控制每次更新的幅度。

    此后,对全部数据都反复进行这样的计算,直到输出的误差达到一个很小的值为止。 
    以上介绍的是目前最常见的神经网络类型,称为前馈神经网络(FeedForward Neural Network),由于它一般是要向后传递误差的,所以也叫BP神经网络(Back Propagation Neural Network)。

    BP神经网络的特点和局限: 
    - BP神经网络可以用作分类、聚类、预测等。需要有一定量的历史数据,通过历史数据的训练,网络可以学习到数据中隐含的知识。在你的问题中,首先要找到某些问题的一些特征,以及对应的评价数据,用这些数据来训练神经网络。
    - BP神经网络主要是在实践的基础上逐步完善起来的系统,并不完全是建立在仿生学上的。从这个角度讲,实用性 > 生理相似性。 
    - BP神经网络中的某些算法,例如如何选择初始值、如何确定隐藏层的节点个数、使用何种激活函数等问题,并没有确凿的理论依据,只有一些根据实践经验总结出的有效方法或经验公式。
    - BP神经网络虽然是一种非常有效的计算方法,但它也以计算超复杂、计算速度超慢、容易陷入局部最优解等多项弱点著称,因此人们提出了大量有效的改进方案,一些新的神经网络形式也层出不穷。

    文字的公式看上去有点绕,下面我发一个详细的计算过程图。 
    参考这个:http://www.myreaders.info/03_Back_Propagation_Network.pdf 我做了整理

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

    这里介绍的是计算完一条记录,就马上更新权重,以后每计算完一条都即时更新权重。实际上批量更新的效果会更好,方法是在不更新权重的情况下,把记录集的每条记录都算过一遍,把要更新的增值全部累加起来求平均值,然后利用这个平均值来更新一次权重,然后利用更新后的权重进行下一轮的计算,这种方法叫批量梯度下降(Batch Gradient Descent)。

    推荐的入门级学习资源:

    Andrew Ng的《机器学习》公开课: https://class.coursera.org/ml 
    Coursera公开课笔记中文版(神经网络的表示): http://52opencourse.com/139/coursera公开课笔记-斯坦福大学机器学习第八课-神经网络的表示-neural-networks-representation
    Coursera公开课视频(神经网络的学习): http://52opencourse.com/289/coursera公开课视频-斯坦福大学机器学习第九课-神经网络的学习-neural-networks-learning
    斯坦福深度学习中文版: http://deeplearning.stanford.edu/wiki/index.php/UFLDL教程

    谢谢大家的支持。 
    今天先发个实际编程操作教程,介绍一下Matlab神经网络工具箱的用法,后面有空再加些深入点的知识。

    关于Matlab的入门教程,参看这个帖子:http://tieba.baidu.com/p/2945924081

    例1:我们都知道,面积=长*宽,假如我们有一组数测量据如下: 
    这里写图片描述
    我们利用这组数据来训练神经网络。(在Matlab中输入以下的代码,按回车即可执行)

    p = [2 5; 3 6; 12 2; 1 6; 9 2; 8 12; 4 7; 7 9]’; % 特征数据X1,X2 
    t = [10 18 24 6 18 96 28 63]; % 样本值 
    net = newff(p, t, 20); % 创建一个BP神经网络 ff=FeedForward 
    net = train(net, p, t); % 用p,t数据来训练这个网络

    出现如下的信息,根据蓝线的显示,可以看出最后收敛时,误差已小于10^-20。 
    这里写图片描述

    你也许会问,计算机难道这样就能学会乘法规则吗?不用背乘法口诀表了?先随便选几个数字,试试看:

    s = [3 7; 6 9; 4 5; 5 7]’; % 准备一组新的数据用于测试 
    y = sim(net, s) % 模拟一下,看看效果 
    % 结果是:25.1029 61.5882 29.5848 37.5879

    看到了吧,预测结果和实际结果还是有差距的。不过从中也能看出,预测的数据不是瞎蒙的,至少还是有那么一点靠谱。如果训练集中的数据再多一些的话,预测的准确率还会大幅度提高。
    这里写图片描述

    你测试的结果也许和我的不同,这是因为初始化的权重参数是随机的,可能会陷入局部最优解,所以有时预测的结果会很不理想。

    例2:下面测试一下拟合正弦曲线,这次我们随机生成一些点来做样本。

    p = rand(1,50)*7 % 生成1行50个0~7之间的随机数 
    t = sin(p) % 计算正弦曲线 
    s = [0:0.1:7]; % 生成0~7的一组数据,间隔0.1,用于模拟测试 
    plot(p, t, ‘x’) % 画散点图

    这里写图片描述

    net = newff(p, t, 20); % 创建神经网络 
    net = train(net, p, t); % 开始训练

    y = sim(net, s); % 模拟 
    plot(s, y, ‘x’) % 画散点图

    从图中看出,这次的预测结果显然是不理想的,我们需要设置一些参数来调整。 
    这里写图片描述

    下面的设置是一种标准的批量梯度下降法的配置。

    % 创建3层神经网络 [隐藏层10个节点->logsig, 输出层1个节点->purelin] traingd代表梯度下降法 
    net = newff(p, t, 10, {‘logsig’ ‘purelin’}, ‘traingd’); % 10不能写成[10 1]

    % 设置训练参数 
    net.trainparam.show = 50; % 显示训练结果(训练50次显示一次) 
    net.trainparam.epochs = 500; % 总训练次数 
    net.trainparam.goal = 0.01; % 训练目标:误差<0.01 
    net.trainParam.lr = 0.01; % 学习率(learning rate)

    net = train(net, p, t); % 开始训练

    注意:newff的第三个参数10不能写成[10 1],否则就是4层网络,两个隐藏层,分别是10个和1个节点。这个很容易弄错。(输出层的节点数程序会自动根据t的维度自动判断,所以不用指定)

    这里写图片描述

    y = sim(net, s); % 模拟 
    plot(s, y, ‘x’) % 画散点图

    这时的效果显然更差了。

    这里写图片描述

    把精度调高一点看看。训练次数加到9999,误差<0.001;学习率调到0.06,希望能加快点速度。

    % 创建2层神经网络 [隐藏层10个节点->logsig, 输出层1个节点->purelin] traingd代表梯度下降法 
    net = newff(p, t, 10, {‘logsig’ ‘purelin’}, ‘traingd’);

    % 设置训练参数 
    net.trainparam.show = 50; % 每间隔50次显示一次训练结果 
    net.trainparam.epochs = 9999; % 总训练次数 
    net.trainparam.goal = 0.001; % 训练目标:误差<0.001 
    net.trainParam.lr = 0.06; % 学习率(learning rate)

    net = train(net, p, t); % 开始训练

    标准的批量梯度下降法的速度确实够慢,这次计算花了一分多钟。

    这里写图片描述

    y = sim(net, s); % 模拟 
    plot(s, y, ‘x’) % 画散点图

    效果比上次稍好一点。不过这条曲线显得坑坑洼洼的很难看,这是一种过拟合(Overfitting)现象,与之相反的是欠拟合(Underfitting)。

    这里写图片描述
    先来解决速度问题,把traingd改为trainlm即可。trainlm使用LM算法,是介于牛顿法和梯度下降法之间的一种非线性优化方法,不但会加快训练速度,还会减小陷入局部最小值的可能性,是Matlab的默认值。

    net = newff(p, t, 10, {‘logsig’ ‘purelin’}, ‘trainlm’); 
    … 后面的代码不变

    这里写图片描述
    这个速度比较惊叹了,1秒钟之内完成,只做了6轮计算,效果也好了一些。不过,LM算法也有弱点,它占用的内存非常大,所以没把其它算法给淘汰掉。 
    这里写图片描述

    下面解决过拟合问题,把隐藏层的节点数目设少一点就行了。

    net = newff(p, t, 3, {‘logsig’ ‘purelin’}, ‘trainlm’); 
    … 后面的代码不变

    这回终于达到满意的效果了。(有时会出现局部最优解,可以多试几次) 
    这里写图片描述
    如果节点数目太少,会出现欠拟合的情况。

    这里写图片描述

    关于隐藏层的节点个数,一般是要凭感觉去调的。如果训练集的维数比较多,调节起来比较耗时间,这时可以根据经验公式上下浮动地去调整。 
    下面给出几个经验公式供参考: 
    这里写图片描述
    如果把输出层改为logsig激活会是什么样子呢?

    net = newff(p, t, 3, {‘logsig’ ‘logsig’}); % 创建神经网络 
    net = train(net, p, t); % 开始训练 
    y = sim(net, s); % 模拟 
    plot(s, y, ‘x’) % 画散点图

    可以看出,-1~0范围之间的点都变为0了。使用logsig输出时要想得到完整数值范围的效果,必须先对数据进行归一化才行。

    这里写图片描述

    归一化(Normalization),也叫标准化,就是把一堆数字按比例缩放到0~1或-1~1的范围。 
    虽然用Purelin输出可以不必归一化,但归一化能在一定程度上加快收敛速度,因此被许多教程定为训练前的必须步骤。

    公式为:归一值 = (当前值x-最小值min)/(最大值max-最小值min) 
    如果限定了范围,公式为:y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin; 
    0.1~0.9的范围:(0.9-0.1)(x-min)/(max-min)(0.9-0.1)+0.1 
    把5, 2, 6, 3这四个数归一化: 
    这里写图片描述

    Matlab的归一化命令为:mapminmax 
    注:网上的不少教程里用premnmx命令来归一化,要注意Matlab版本R2007b和R2008b,premnmx在处理单列数据时有bug,Matlab已给出了警告,R2009a版才修正。因此推荐使用mapminmax。mapminmax的输入输出值和premnmx是行列颠倒的,使用时要注意代码中是否添加转置符号。

    a = [5, 2, 6, 3];

    b = mapminmax(a, 0, 1) % 归一化到0~1之间 
    % b = 0.7500 0 1.0000 0.2500

    c = mapminmax(a) % 归一化到-1~1之间 
    % c = 0.5000 -1.0000 1.0000 -0.5000

    反归一化(Denormalization)就是按归一化时的比例还原数值。

    a = [5, 2, 6, 3]; 
    [c,PS] = mapminmax(a); % PS记录归一化时的比例 
    mapminmax(‘reverse’, c, PS) % 利用PS反归一化 
    % ans = 5 2 6 3

    神经网络的归一化(0~1范围)代码:

    p = rand(1,50)*7; % 特征数据 
    t = sin(p); % 样本值 
    s = [0:0.1:7]; % 测试数据

    [pn, ps] = mapminmax(p, 0, 1); % 特征数据归一化 
    [tn, ts] = mapminmax(t, 0, 1); % 样本值归一化 
    sn = mapminmax(‘apply’, s, ps); % 测试数据,按ps比例缩放

    net = newff(pn, tn, [5 1], {‘logsig’ ‘logsig’}); % 创建神经网络 
    net = train(net, pn, tn); % 开始训练

    yn = sim(net, sn); % 模拟 
    y = mapminmax(‘reverse’, yn, ts); % 按ps的比例还原 
    plot(s, y, ‘x’) % 画散点图

    这里写图片描述
    神经网络工具箱还有一个UI图形操作界面,执行nntool就可以打开。我觉得不如写代码方便,所以不怎么用。我提供一个相关的教程链接,有兴趣的可以看一下:matlab神经网络工具箱创建神经网络 -http://blog.新浪.com.cn/s/blog_8684880b0100vxtv.html (新浪替换成sina)
    这里写图片描述

    关于Sigmoid的由来,中文的网站上很少有提及的。下面简单讲一下,希望能给大家拓展一下思路。

    PS: 这里的公式我都给出了求解过程,但如今这个年头,用手工解题的人越来越少了,一般的方程用软件来解就行了。 
    例如解Sigmoid微分方程,可以用Matlab去解:

    dsolve(‘Dx=x*(1-x)’) 
    % ans = 1/(1+exp(-t)*C1)

    如果想得到求解的步骤或更详细的信息,推荐使用Wolfram:http://www.wolframalpha.com
    在Wolfram的搜索框输入 x’=x(1-x) 即可。

    logsig

    Sigmoid函数(S形函数,Logistic Function)是受统计学模型的启发而产生的激活函数。 
    基于生物学的神经元激活函数是这样的:

    这里写图片描述

    这里写图片描述

    参看:http://eprints.pascal-network.org/archive/00008596/01/glorot11a.pdf

    实践证明了基于统计学的Sigmoid函数激活效果要比基于生物学的模型好,而且计算起来很方便,所以说不能以机器和人的相似度为标准来判断AI算法的好坏。 
    Sigmoid函数原先是个描述人口增长的数学模型,1838提出,给出的是导数形式(概率密度)。人口增长规律:起初阶段大致是指数增长;然后逐渐开始变得饱和,增长变慢;达到成熟时几乎停止增长;整个过程形如一条S型曲线。
    这里写图片描述

    导数的形式知道了,那么它的原函数是什么样子呢?已知导数求原函数,用统计学的话来讲,即根据概率密度函数(PDF)求累积分布函数(CDF),不定积分(Indefinite Integral)就是专门用来做这个的工具。
    根据不定积分的知识可知,由于常数项是可变的,所以存在无数个原函数的可能。让我们先用图解法看一下:既然导数是函数曲线的斜率,那么可以把一定数值范围内的斜率,都画成一根根的短斜线,组成斜率场(Slope Fields, Direction Fields),然后根据这些斜线的走势,画出积分曲线。
    Matlab可以用quiver命令来画斜率场。

    这里写图片描述

    从上图中可以看出,在y轴的0~1之间是个分水岭,0和1处的方向趋于水平。下面放大0~1的范围看看是什么样子的。

    看到了吧,我们要的Logistic Sigmoid就在这里呢。 
    这里写图片描述

    下面给出符号求解的过程:

    这里写图片描述
    tansig

    双曲正切函数(双极S形函数, tanh, Hyperbolic Tangent),读tanch,18世纪就已经出现了。它的定义是:tanh(x)=sinh(x)/cosh(x),可以由著名的欧拉公式(Euler’s formula)推导出来。
    用tanh作激活函数,收敛比较快,效果比Logistic函数还要好。 
    欧拉公式: i是虚数(Imaginary Number)单位,它的定义是: (即i^2 = -1) 
    题外话:根据上面的公式变换,可以得出史上最美的数学公式: 这里写图片描述,数学中最神秘的5个符号e、i、π、1和0,全包含在里面了。

    这里写图片描述

    这里写图片描述

    求tanh的导数:

    这里写图片描述

    logsig和tansig的关系: 
    这里写图片描述

    展开全文
  • 一、深度学习 机器学习算法理论在上个世纪90年代发展成熟,在许多领域都取得了成功应用。但平静的日子只延续到2010年左右,随着大数据的涌现和计算机算力提升,深度学习模型异军突起,极大改变了机器学习的应用格局...
  • 对构建波士顿房价预测任务的神经网络模型的学习(笔记) ** 数据集划分 将数据集划分成训练集和测试集,其中训练集用于确定模型的参数,测试集用于评判模型的效果。为什么要对数据集进行拆分,这与学生时代的授课...
  • 文章目录构建波士顿房价预测任务的神经网络模型一、数据处理1.1 读入数据1.2 数据形状变换1.3 数据集划分1.4 数据归一化处理1.5 封装成load data函数二、模型设计三、训练配置四、训练过程4.1、梯度下降法4.2、 计算...
  • 神经网络&波士顿房价预测

    千次阅读 2020-02-25 19:08:40
    使用Numpy构建神经网络 百度免费课程学习笔记 本节将使用Python语言和Numpy库来构建神经网络模型,向读者展示神经网络的基本概念和工作过程。 构建神经网络/深度学习模型的基本步骤 如之前的介绍,应用于不同场景的...
  • 基于tensorflow_gpu 1.9.0实现的第三个神经网络:对波士顿的房价预测(回归问题),代码如下: #!/usr/bin/env python import tensorflow as tf from tensorflow import keras import numpy as np import ...
  • 神经网络的基本概念

    万次阅读 2018-09-07 16:47:38
    小亮最近开始重新学习神经网络,发现之前好多概念名词什么的自己都不清晰,今天特意整理了一下这些基本概念以及在神经网络中为什么要引入这些名词?详情请见下文! 这里是小亮的blog地址:...
  • 神经网络(Graph Neural Networks)概述

    万次阅读 多人点赞 2019-06-04 20:22:07
    一篇关于图神经网络的综述文章,着重介绍了图卷积神经网络(GCN),回顾了近些年的几个主要的图神经网络的的体系:图注意力网络、图自编码机、图生成网络、图时空网络。 1、介绍 传统的机器学习所用到的数据是欧氏...
  • 神经网络和深度学习基本原理

    万次阅读 多人点赞 2018-11-12 16:58:19
    这是看到的一篇对神经网络的讲解的文章,我觉得写得很好,也仔细学习了学习,最近我可能也得用这个东西,现在确实是很火啊,也很实用。   神经网络和深度学习 神经网络:一种可以通过观测数据使计算机学习的仿生...
  • 神经网络详解(基本完成)

    万次阅读 多人点赞 2019-01-11 05:05:33
    Fill you up with petrol概述人工神经网络(artificial neural network,ANN),简称神经网络(neural network,NN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结...
  • 一文看懂25个神经网络模型

    万次阅读 多人点赞 2017-06-17 10:26:08
    1. 引言在深度学习十分火热的今天,不时会涌现出各种新型的人工神经网络,想要实时了解这些新型神经网络的架构还真是不容易。光是知道各式各样的神经网络模型缩写(如:DCIGN、BiLSTM、DCGAN……还有哪些?),就已经...
  • 卷积神经网络概念与原理

    万次阅读 多人点赞 2020-08-03 09:09:36
    一、卷积神经网络的基本概念 受Hubel和Wiesel对猫视觉皮层电生理研究启发,有人提出卷积神经网络(CNN),Yann Lecun 最早将CNN用于手写数字识别并一直保持了其在该问题的霸主地位。近年来卷积神经网络在多个方向...
  • 神经网络学习 之 BP神经网络

    万次阅读 多人点赞 2015-11-30 22:57:16
    上一次我们讲了M-P模型,它实际上就是对单个神经元的一种建模,...本文具体来介绍一下一种非常常见的神经网络模型——反向传播(Back Propagation)神经网络。概述BP(Back Propagation)神经网络是1986年由Rumelhart和Mc
  • 神经网络设计神经网络

    万次阅读 2020-03-30 12:30:27
    坑一定是现在的神经网络本质就是无法指数级别优化的 所以谷歌填坑这么多年仍然没有填好,但是走向正确的道理之前一定是经过错误,才能避免错误的 如果谷歌得到了什么启示,目前的神经网络会得到很大的改进,或者是颠覆的...
  • 利用MATLAB 进行BP神经网络的预测(含有神经网络工具箱) 最近一段时间在研究如何利用预测其销量个数,在网上搜索了一下,发现了很多模型来预测,比如利用回归模型、时间序列模型,GM(1,1)模型,可是自己在结合...
  • 最近一段时间在研究如何利用...发现神经网络模型可以来预测,并且有很多是结合时间序列或者SVM(支持向量机)等组合模型来进行预测,本文结合实际数据,选取了常用的BP神经网络算法,其算法原理,因网上一大堆,所以...
1 2 3 4 5 ... 20
收藏数 317,379
精华内容 126,951
关键字:

神经网络