精华内容
下载资源
问答
  • 基于BP神经网络优势通道定量计算方法.pdf
  • 本文综合整理常用的神经网络,包括生物神经网络、人工神经网络、卷积神经网络、循环神经网络、生成对抗网络;参考了许多高校的课程、论文、博客和视频等。文章的结构是先进行概念了解,然后结合图片、结构图、一步...

    前言

    本文综合整理常用的神经网络,包括生物神经网络、人工神经网络、卷积神经网络、循环神经网络、生成对抗网络;参考了许多高校的课程、论文、博客和视频等。文章的结构是先进行概念了解,然后结合图片、结构图、一步一步详细讲解;大家要不看看? ( •̀ ω •́ )y

    一、人工神经网络

    简介:人工神经网络 (Artificial Neural Network, ANN),由人工神经元构成的网络,模拟人类的大脑;它模拟生物过程以反映人脑某些特征的计算结构。

    联系人工神经元模拟生物神经元人工神经网络模拟人类的大脑,模拟生物神经网络

    特点:人工神经网络是一个并行、分布处理结构,具有学习能力、泛化能力。

    功能:联想记忆功能、非线性映射功能、分类与识别功能、知识处理功能。

    详细介绍一篇文章“简单”认识《人工神经网络》(更新版)

    目录大纲

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

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

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

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

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

      展开全文
    • CNN笔记:通俗理解卷积神经网络

      万次阅读 多人点赞 2016-07-02 22:14:50
      通俗理解卷积神经网络(cs231n与5月dl班课程笔记) 1 前言 2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有...

                     通俗理解卷积神经网络(cs231n与5月dl班课程笔记)

      1 前言

          2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有一个词似乎比“机器学习”更火,那就是“深度学习”。

          本博客内写过一些机器学习相关的文章,但上一篇技术文章“LDA主题模型”还是写于2014年11月份,毕竟自2015年开始创业做在线教育后,太多的杂事、琐碎事,让我一直想再写点技术性文章但每每恨时间抽不开。然由于公司在不断开机器学习、深度学习等相关的在线课程,耳濡目染中,总会顺带着学习学习。

          我虽不参与讲任何课程(我所在公司“七月在线”的所有在线课程都是由目前讲师团队的数百位讲师讲),但依然可以用最最小白的方式 把一些初看复杂的东西抽丝剥茧的通俗写出来。这算重写技术博客的价值所在。

          在dl中,有一个很重要的概念,就是卷积神经网络CNN,基本是入门dl必须搞懂的东西。本文基本根据斯坦福的机器学习公开课、cs231n、与七月在线寒老师讲的5月dl班所写,是一篇课程笔记。

          一开始本文只是想重点讲下CNN中的卷积操作具体是怎么计算怎么操作的,但后面不断补充,包括增加不少自己的理解,故写成了关于卷积神经网络的通俗导论性的文章。有何问题,欢迎不吝指正。

      2 人工神经网络

      2.1 神经元

          神经网络由大量的神经元相互连接而成。每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出。每两个神经元之间的连接代表加权值,称之为权重(weight)。不同的权重和激活函数,则会导致神经网络不同的输出。

          举个手写识别的例子,给定一个未知数字,让神经网络识别是什么数字。此时的神经网络的输入由一组被输入图像的像素所激活的输入神经元所定义。在通过非线性激活函数进行非线性变换后,神经元被激活然后被传递到其他神经元。重复这一过程,直到最后一个输出神经元被激活。从而识别当前数字是什么字。

          神经网络的每个神经元如下

          基本wx + b的形式,其中

      • 表示输入向量
      • 为权重,几个输入则意味着有几个权重,即每个输入都被赋予一个权重
      • b为偏置bias
      • g(z) 为激活函数
      • a 为输出

          如果只是上面这样一说,估计以前没接触过的十有八九又必定迷糊了。事实上,上述简单模型可以追溯到20世纪50/60年代的感知器,可以把感知器理解为一个根据不同因素、以及各个因素的重要性程度而做决策的模型。

          举个例子,这周末北京有一草莓音乐节,那去不去呢?决定你是否去有二个因素,这二个因素可以对应二个输入,分别用x1、x2表示。此外,这二个因素对做决策的影响程度不一样,各自的影响程度用权重w1、w2表示。一般来说,音乐节的演唱嘉宾会非常影响你去不去,唱得好的前提下 即便没人陪同都可忍受,但如果唱得不好还不如你上台唱呢。所以,我们可以如下表示:

      • :是否有喜欢的演唱嘉宾。 = 1 你喜欢这些嘉宾, = 0 你不喜欢这些嘉宾。嘉宾因素的权重 = 7
      • :是否有人陪你同去。 = 1 有人陪你同去, = 0 没人陪你同去。是否有人陪同的权重 = 3。

          这样,咱们的决策模型便建立起来了:g(z) = g( * + * + b ),g表示激活函数,这里的b可以理解成 为更好达到目标而做调整的偏置项。

          一开始为了简单,人们把激活函数定义成一个线性函数,即对于结果做一个线性变化,比如一个简单的线性激活函数是g(z) = z,输出都是输入的线性变换。后来实际应用中发现,线性激活函数太过局限,于是人们引入了非线性激活函数。

      2.2 激活函数

          常用的非线性激活函数有sigmoid、tanhrelu等等,前两者sigmoid/tanh比较常见于全连接层,后者relu常见于卷积层。这里先简要介绍下最基础的sigmoid函数(btw,在本博客中SVM那篇文章开头有提过)。

          sigmoid的函数表达式如下

          其中z是一个线性组合,比如z可以等于:b + * + *通过代入很大的正数或很小的负数到g(z)函数中可知,其结果趋近于0或1

          因此,sigmoid函数g(z)的图形表示如下( 横轴表示定义域z,纵轴表示值域g(z) ):

          也就是说,sigmoid函数的功能是相当于把一个实数压缩至0到1之间。当z是非常大的正数时,g(z)会趋近于1,而z是非常小的负数时,则g(z)会趋近于0

          压缩至0到1有何用处呢?用处是这样一来便可以把激活函数看作一种“分类的概率”,比如激活函数的输出为0.9的话便可以解释为90%的概率为正样本。

          举个例子,如下图(图引自Stanford机器学习公开课

          z = b + * + *,其中b为偏置项 假定取-30,都取为20

      • 如果 = 0  = 0,则z = -30,g(z) = 1/( 1 + e^-z )趋近于0。此外,从上图sigmoid函数的图形上也可以看出,当z=-30的时候,g(z)的值趋近于0
      • 如果 = 0 = 1,或 =1 = 0,则z = b + * + * = -30 + 20 = -10,同样,g(z)的值趋近于0
      • 如果 = 1 = 1,则z = b + * + * = -30 + 20*1 + 20*1 = 10,此时,g(z)趋近于1。

          换言之,只有都取1的时候,g(z)→1,判定为正样本;取0的时候,g(z)→0,判定为负样本如此达到分类的目的。

      2.3 神经网络

          将下图的这种单个神经元

          组织在一起,便形成了神经网络。下图便是一个三层神经网络结构

          上图中最左边的原始输入信息称之为输入层,最右边的神经元称之为输出层(上图中输出层只有一个神经元),中间的叫隐藏层。

          啥叫输入层、输出层、隐藏层呢?

      • 输入层(Input layer),众多神经元(Neuron)接受大量非线形输入讯息。输入的讯息称为输入向量。
      • 输出层(Output layer),讯息在神经元链接中传输、分析、权衡,形成输出结果。输出的讯息称为输出向量。
      • 隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。如果有多个隐藏层,则意味着多个激活函数。

          同时,每一层都可能由单个或多个神经元组成,每一层的输出将会作为下一层的输入数据。比如下图中间隐藏层来说,隐藏层的3个神经元a1、a2、a3皆各自接受来自多个不同权重的输入(因为有x1、x2、x3这三个输入,所以a1 a2 a3都会接受x1 x2 x3各自分别赋予的权重,即几个输入则几个权重),接着,a1、a2、a3又在自身各自不同权重的影响下 成为的输出层的输入,最终由输出层输出最终结果。

          上图(图引自Stanford机器学习公开课)中

      • 表示第j层第i个单元的激活函数/神经元
      • 表示从第j层映射到第j+1层的控制函数的权重矩阵 

          此外,输入层和隐藏层都存在一个偏置(bias unit),所以上图中也增加了偏置项:x0、a0。针对上图,有如下公式

          此外,上文中讲的都是一层隐藏层,但实际中也有多层隐藏层的,即输入层和输出层中间夹着数层隐藏层,层和层之间是全连接的结构,同一层的神经元之间没有连接。

      3 卷积神经网络之层级结构

         cs231n课程里给出了卷积神经网络各个层级结构,如下图

          上图中CNN要做的事情是:给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:如果是车 那是什么车

          所以

      • 最左边是数据输入层,对数据做一些处理,比如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等。CNN只对训练集做“去均值”这一步。

          中间是

      • CONV:卷积计算层,线性乘积 求和。
      • RELU:激励层,上文2.2节中有提到:ReLU是激活函数的一种。
      • POOL:池化层,简言之,即取区域平均或最大。

          最右边是

      • FC:全连接层

          这几个部分中,卷积计算层是CNN的核心,下文将重点阐述。


      4 CNN之卷积计算层

      4.1 CNN怎么进行识别
         简言之,当我们给定一个"X"的图案,计算机怎么识别这个图案就是“X”呢?一个可能的办法就是计算机存储一张标准的“X”图案,然后把需要识别的未知图案跟标准"X"图案进行比对,如果二者一致,则判定未知图案即是一个"X"图案。

         而且即便未知图案可能有一些平移或稍稍变形,依然能辨别出它是一个X图案。如此,CNN是把未知图案和标准X图案一个局部一个局部的对比,如下图所示 [图来自参考文案25]

      而未知图案的局部和标准X图案的局部一个一个比对时的计算过程,便是卷积操作。卷积计算结果为1表示匹配,否则不匹配。

      具体而言,为了确定一幅图像是包含有"X"还是"O",相当于我们需要判断它是否含有"X"或者"O",并且假设必须两者选其一,不是"X"就是"O"。

       理想的情况就像下面这个样子:

      标准的"X"和"O",字母位于图像的正中央,并且比例合适,无变形

      对于计算机来说,只要图像稍稍有一点变化,不是标准的,那么要解决这个问题还是不是那么容易的:

      计算机要解决上面这个问题,一个比较天真的做法就是先保存一张"X"和"O"的标准图像(就像前面给出的例子),然后将其他的新给出的图像来和这两张标准图像进行对比,看看到底和哪一张图更匹配,就判断为哪个字母。

      但是这么做的话,其实是非常不可靠的,因为计算机还是比较死板的。在计算机的“视觉”中,一幅图看起来就像是一个二维的像素数组(可以想象成一个棋盘),每一个位置对应一个数字。在我们这个例子当中,像素值"1"代表白色,像素值"-1"代表黑色。

      当比较两幅图的时候,如果有任何一个像素值不匹配,那么这两幅图就不匹配,至少对于计算机来说是这样的。

      对于这个例子,计算机认为上述两幅图中的白色像素除了中间的3*3的小方格里面是相同的,其他四个角上都不同:

      因此,从表面上看,计算机判别右边那幅图不是"X",两幅图不同,得出结论:

      但是这么做,显得太不合理了。理想的情况下,我们希望,对于那些仅仅只是做了一些像平移,缩放,旋转,微变形等简单变换的图像,计算机仍然能够识别出图中的"X"和"O"。就像下面这些情况,我们希望计算机依然能够很快并且很准的识别出来:

      这也就是CNN出现所要解决的问题。

      Features

      对于CNN来说,它是一块一块地来进行比对。它拿来比对的这个“小块”我们称之为Features(特征)。在两幅图中大致相同的位置找到一些粗糙的特征进行匹配,CNN能够更好的看到两幅图的相似性,相比起传统的整幅图逐一比对的方法。

      每一个feature就像是一个小图(就是一个比较小的有值的二维数组)。不同的Feature匹配图像中不同的特征。在字母"X"的例子中,那些由对角线和交叉线组成的features基本上能够识别出大多数"X"所具有的重要特征。

      这些features很有可能就是匹配任何含有字母"X"的图中字母X的四个角和它的中心。那么具体到底是怎么匹配的呢?如下:

      看到这里是不是有了一点头目呢。但其实这只是第一步,你知道了这些Features是怎么在原图上面进行匹配的。但是你还不知道在这里面究竟进行的是怎样的数学计算,比如这个下面3*3的小块到底干了什么?

      这里面的数学操作,就是我们常说的“卷积”操作。接下来,我们来了解下什么是卷积操作。

      4.2 什么是卷积

          对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。

          非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。

          OK,举个具体的例子。比如下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。

          分解下上图

      对应位置上是数字先相乘后相加 =

          中间滤波器filter与数据窗口做内积,其具体计算过程则是:4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0 + 0*1 + -4*2 = -8

      4.3 图像上的卷积

          在下图对应的计算过程中,输入是一定区域大小(width*height)的数据,和滤波器filter(带着一组固定权重的神经元)做内积后等到新的二维数据。

          具体来说,左边是图像输入,中间部分就是滤波器filter(带着一组固定权重的神经元),不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。

          如下图所示

        

      4.4 GIF动态卷积图

          在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。这个过程中,有这么几个参数: 
        a. 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
        b. 步长stride:决定滑动多少步可以到边缘。

        c. 填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。 

        这里写图片描述 

          cs231n课程中有一张卷积动图,貌似是用d3js 和一个util 画的,我根据cs231n的卷积动图依次截取了18张图,然后用一gif 制图工具制作了一gif 动态卷积图。如下gif 图所示

          可以看到:

      • 两个神经元,即depth=2,意味着有两个滤波器。
      • 数据窗口每次移动两个步长取3*3的局部数据,即stride=2。
      • zero-padding=1。

          然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。

          如果初看上图,可能不一定能立马理解啥意思,但结合上文的内容后,理解这个动图已经不是很困难的事情:

      • 左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)
      • 中间部分是两个不同的滤波器Filter w0、Filter w1
      • 最右边则是两个不同的输出

          随着左边数据窗口的平移滑动,滤波器Filter w0 / Filter w1对不同的局部数据进行卷积计算。

          值得一提的是:左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。

      • 打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。如果一眼就看到全世界,你会累死,而且一下子接受全世界所有信息,你大脑接收不过来。当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。比如看美女,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。

      与此同时,数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。

      • 再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。btw,不同人的双眼 看同一个局部信息 所感受到的不同,即一千个读者有一千个哈姆雷特,所以不同的滤波器 就像不同的双眼,不同的人有着不同的反馈结果。

          我第一次看到上面这个动态图的时候,只觉得很炫,另外就是据说计算过程是“相乘后相加”,但到底具体是个怎么相乘后相加的计算过程 则无法一眼看出,网上也没有一目了然的计算过程。本文来细究下。

          首先,我们来分解下上述动图,如下图

          接着,我们细究下上图的具体计算过程。即上图中的输出结果1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果1,如下过程所示:

      1* 0 + 1*0 + -1*

      +

      -1*0 + 0*0 + 1*1

      +

      -1*0 + -1*0 + 0*1

      +

      -1*0 + 0*0 + -1*0

      +

      0*0 + 0*1 + -1*1

      +

      1*0 + -1*0 + 0*2

      +

      0*0 + 1*0 + 0*0

      +

      1*0 + 0*2 + 1*0

      +

      0*0 + -1*0 + 1*0

      +

      1

      =

      1

          然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果

          最后,换做另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。

      5 CNN之激励层与池化层

      5.1 ReLU激励层

          2.2节介绍了激活函数sigmoid,但实际梯度下降中,sigmoid容易饱和、造成终止梯度传递,且没有0中心化。咋办呢,可以尝试另外一个激活函数:ReLU,其图形表示如下

          ReLU的优点是收敛快,求梯度简单。

      5.2 池化pool层

          前头说了,池化,简言之,即取区域平均或最大,如下图所示(图引自cs231n)

          上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。很简单不是?


      6 参考文献及推荐阅读

      1. 人工神经网络wikipedia
      2. 斯坦福机器学习公开课
      3. Neural networks and deep learning
      4. 雨石 卷积神经网络:卷积神经网络_雨石-CSDN博客_卷积神经网络
      5. cs231n 神经网络结构与神经元激励函数:CS231n Convolutional Neural Networks for Visual Recognition中译版
      6. cs231n 卷积神经网络:CS231n Convolutional Neural Networks for Visual Recognition
      7. 七月在线寒老师讲的5月dl班第4次课CNN与常用框架视频,已经剪切部分放在七月在线官网:julyedu.com
      8. 七月在线5月深度学习班第5课CNN训练注意事项部分视频:视频播放
      9. 七月在线5月深度学习班:5 月深度学习班 [国内第1个DL商业课程] - 七月在线
      10. 七月在线5月深度学习班课程笔记——No.4《CNN与常用框架》:CNN与常用框架_会思考的蜗牛-CSDN博客_cnn框架
      11. 七月在线6月数据数据挖掘班第7课视频:数据分类与排序
      12. 手把手入门神经网络系列(1)_从初等数学的角度初探神经网络:手把手入门神经网络系列(1)_从初等数学的角度初探神经网络
      13. 深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数:深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数
      14. 深度学习与计算机视觉系列(10)_细说卷积神经网络:深度学习与计算机视觉系列(10)_细说卷积神经网络
      15. zxy 图像卷积与滤波的一些知识点:图像卷积与滤波的一些知识点_zouxy09的专栏-CSDN博客_图像卷积
      16. zxy 深度学习CNN笔记:Deep Learning(深度学习)学习笔记整理系列之(七)_zouxy09的专栏-CSDN博客_深度学习 笔记
      17. Understanding Convolutional Neural Networks for NLP – WildML中译版
      18. 《神经网络与深度学习》中文讲义:Sina Visitor System
      19. ReLU与sigmoid/tanh的区别:请问人工神经网络中的activation function的作用具体是什么?为什么ReLu要好过于tanh和sigmoid function? - 知乎
      20. CNN、RNN、DNN内部网络结构区别:CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别? - 知乎
      21. 理解卷积:如何通俗易懂地解释卷积? - 知乎
      22. 神经网络与深度学习简史:1 感知机和BP算法4 深度学习的伟大复兴
      23. 在线制作gif 动图:在线Photoshop 在线ps
      24. 支持向量机通俗导论(理解SVM的三层境界)
      25. CNN究竟是怎样一步一步工作的? 本博客把卷积操作具体怎么个计算过程写清楚了,但这篇把为何要卷积操作也写清楚了,而且配偶图非常形象,甚赞。

      7 后记

          本文基本上边看5月dl班寒讲的CNN视频边做笔记,之前断断续续看过不少CNN相关的资料(包括cs231n),但看过视频之后,才系统了解CNN到底是个什么东西,作为听众 寒讲的真心赞、清晰。然后在写CNN相关的东西时,发现一些前置知识(比如神经元、多层神经网络等也需要介绍下),包括CNN的其它层次机构(比如激励层),所以本文本只想简要介绍下卷积操作的,但考虑到知识之间的前后关联,所以越写越长,便成本文了。

          此外,在写作本文的过程中,请教了我们讲师团队里的寒、冯两位,感谢他两。同时,感谢爱可可老师的微博转发,感谢七月在线所有同事。

      以下是修改日志:

      • 2016年7月5日,修正了一些笔误、错误,以让全文更通俗、更精准。有任何问题或槽点,欢迎随时指出。
      • 2016年7月7日,第二轮修改完毕。且根据cs231n的卷积动图依次截取了18张图,然后用制图工具制作了一gif 动态卷积图,放在文中4.3节。
      • 2016年7月16日,完成第三轮修改。本轮修改主要体现在sigmoid函数的说明上,通过举例和统一相关符号让其含义更一目了然、更清晰。
      • 2016年8月15日,完成第四轮修改,增补相关细节。比如补充4.3节GIF动态卷积图中输入部分的解释,即7*7*3的含义(其中7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)。不断更易懂。
      • 2016年8月22日,完成第五轮修改。本轮修改主要加强滤波器的解释,及引入CNN中滤波器的通俗比喻。

          July、最后修改于二零一六年八月二十二日中午于七月在线办公室。

      展开全文
    • 深度神经网络 一、神经网络原理 1.传统机器学习算法的局限性 越简单的关系越容易过拟合。 对于特征的变换、升阶,以及多个特征相互组合形成新特征的过程,就是机器学习过程中既耗时又耗力...2.神经网络优势 当用神经网

      深度神经网络

      一、神经网络原理

      1.传统机器学习算法的局限性

      越简单的关系越容易过拟合。
      对于特征的变换、升阶,以及多个特征相互组合形成新特征的过程,就是机器学习过程中既耗时又耗力的特征工程。

      特征空间是数据特征所形成的空间,特征维度越高,特征空间越复杂。而假设空间则是假设函数形成的空间,特征越多,特征和标签之间的对应的关系越难拟合,假设空间也就越复杂。

      维度灾难:高维度带来了超高的复杂度和超巨大的特征空间。比如,尾气特征维度是19x19,但是它的有效状态数量超过了10170

      2.神经网络优势

      当用神经网络去识别猫的时候,不需要手工去编写猫的定义,他的定义只存在于网络中的大量“分道器”中。这些分道器负责控制在网络的每一个分岔口把图片往目的地输送。而神经网络 就像一张无比旁大、带有大量分岔路的铁轨网。

      在这密密麻麻的铁轨的一边是输入的图片,另一边则是对应的输出结果,也是道路的终点。网络会通过调整其中的每一个分道器来确保输入映射到正确的输出。训练数据越多,这个网络中的轨道越多,分岔路口越多,网络也就是越复杂。一旦训练好了,我们就有了大量的预定轨道,对新图片也能做出可靠的预测,这就是神经网络的自我学习原理

      数据越多,投票者越多,就能获得越多的模式。

      那些机械化的定义在神经网络面前变得不再有任何用处。

      深度学习的机理:他是用一串一串的函数,也就是层,堆叠起来,作用域输入数据,进行从原始数据到分类结果的过滤于提纯。这些层通过权重来参数化 ,通过损失函数来判断当前网络的效能,然后通过优化器来调整权重,寻找从输入到输出的最佳函数。

      注意以下两点:

      • 学习:就是为了神经网络的每个层中的每个神经元寻找最佳的权重。
      • 知识:就是学到的权重。

      二、从感知层到单隐层网络

      神经网络由神经元组成,最简单的神经网络只有一个神经元,叫感知器

      Sigmiod函数,在逻辑回归中叫做逻辑函数,在神经网络中则被称作激活函数,用以类比人类神经系统中神经元的“激活”过程。

      根据不同的数据输入,感知器适当的调整权重,在不同的功能之间切换(也就是拟合),形成了一个简单的自适应系统,人们就说它有了“感知"事物的能力。

      单神经元,也就是感知器,通过训练可以用作逻辑回归分类器。

      • 输入空间:x,输入值的集合。
      • 输出空间:y,输出值的耳机和,通常,输出空间会小于输入空间。
      • 特征空间:每一个样本被称作一个实例,通常由特征向量表示,所有特征向量存在的空间称为特征空间,特征空间有时候与输入空间相同,有时候不同。因为有时候经过特征工程之后,输入空间可通过某种映射生成新的特征空间。
      • 假设空间:假设空间一般是对于学习到的模型而言的。模型表达了输入到输出的一种映射集合,这个集合就是假设空间,假设空间代表着模型学习过程中能够覆盖的最大范围。

      基本的原则:模型的假设空间,一定要大到覆盖特征空间,否则模型就不可能精准地完成任务。

      无论我们如何调整感知器的权重和偏置,都无法拟合”同或“数据集从特征到标签的逻辑。感知器是有局限性的。

      神经网络隐层的出现把手工的特征工程丢给了神经网络,网络第一层权重和偏置自己去学,网络的第二层的权重和偏置自己去学,网络其他层的权重和偏置也是自己去学。我们除了提供数据以及一些网络的初始参数之外,剩下的事情都让网络自己完成。
      哪怕特征数量再大,特征空间在复杂,神经网络通过多层框架也可以将其搞定。

      注意神经网络的上下标符号。

      三、用Keras单隐层网络预测客户流失率

      前面的许多,都是为了了解神经网络的”分层
      层,是神经网络的基本元素。 在实际应用中,神经网络是通过不同类型的”层“来构建的,而这个构建过程并不需要,具体到每层内部的神经元。

      1.数据的准备于分析

      标签含义
      Name姓名
      Gender性别
      Age年龄
      City城市
      Tenure已经成为客户的年头
      ProductsNo拥有的产品数量
      HasCard是否有信用卡
      ActiveMember是否为活跃用户
      Credit信用等级
      AccountBal银行存款余额
      Salary薪水
      Exited客户是否已经流失

      这些信息对于客户是否流失是具有指向性的。

      读取文件
      数据下载地址:https://download.csdn.net/download/sjjsaaaa/18176777

      import numpy as np
      import pandas as pd
      df_bank = pd.read_csv(r'E:\Users\lenovo\Desktop\银行客户流失\数据集\BankCustomer.csv')
      

      在这里插入图片描述
      显示数据分布情况

      import matplotlib.pyplot as plt
      import seaborn as sns 
      features = {'City','Gender','Age','Tenure','ProductsNo','HasCard','ActiveMember','Exited'}
      fig = plt.subplots(figsize=(15,15))
      for i,j in enumerate(features):
          plt.subplot(4,2,i+1)
          plt.subplots_adjust(hspace = 1.0)
          sns.countplot(x=j, data = df_bank)
          plt.title("No, of cnstumers")
      plt.show()
      

      在这里插入图片描述
      从图中可以看出:北京的客户最多,男女客户比例大概一致,年龄和客户,数量呈正态分布。

      数据预处理

      1. 性别。这是一个二元类别的特征,需要转为0/1代码格式进行读取处理。
      2. 城市。这是一个多元类别的特征,应把它转换为多个二元类别的哑变量。
      3. 姓名。这个字段对于客户流失与否的预测应该是完全不相关的,可以在进一步处理之前忽略。
        原始数据集中标签也应移除,放置于标签集。
      #把二元类别文本数字化
      df_bank['Gender'].replace("Female",0,inplace = True)
      df_bank['Gender'].replace("Male",1,inplace = True)
      df_bank
      

      在这里插入图片描述

      #把多元类别转成多个二元类别哑变量,然后放回原始集
      a = pd.get_dummies(df_bank['City'],prefix='City')
      b = [df_bank,a]
      df_bank = pd.concat(b,axis=1)
      

      在这里插入图片描述

      df_bank = df_bank.drop(columns='City')
      
      #构建特征集和标签
      X = df_bank.drop(columns=['Name','Exited'])
      y = df_bank['Exited']
      
      #划分训练集和测试集
      from sklearn.model_selection import train_test_split
      X_train,X_test,y_train,y_test =  train_test_split(X,y,test_size=0.2,random_state=0)
      

      在这里插入图片描述

      2.先尝试使用逻辑回归算法

      from sklearn.linear_model import LogisticRegression # 导入Sklearn模型
      lr = LogisticRegression() # 逻辑回归模型
      history = lr.fit(X_train,y_train) # 训练机器
      print("逻辑回归测试集准确率 {:.2f}%".format(lr.score(X_test,y_test)*100))
      

      在这里插入图片描述

      3. 单隐层神经网络的Keras实现

      Keras构建出来的神经网络通过模块组装在一起,各个深度学习元件都是Keras模块,比如:神经网络层、损失函数、优化器、参数初始化、激活函数、模型正则化、都是可以组合起来构建新模型的模块。

      (1)用序贯模型构建网路

      去除警告模块:

      import os
      import warnings
      os.environ['PYTHONHASHSEED'] = '0'
      warnings.filterwarnings('ignore')
      

      首先导入Keras库

      import keras # 导入Keras库
      from keras.models import Sequential # 导入Keras序贯模型
      from keras.layers import Dense # 导入Keras密集连接层
      
      • 序贯模型,也可以叫做顺序模型,是最常用的深度网络层和层间的框架,也就是一个层接着一个层**,顺序地堆叠**。
      • 密集层,是最常用的深度网络层的类型,也称为全连接层,既当前层和其下一层的所有的神经元之间全有链接

      搭建网络模型

      #搭建神经网络
      ann = Sequential()
      ann.add(Dense(units=12, input_dim = 11,activation='relu'))  #添加输入层
      ann.add(Dense(units = 24, activation = 'relu')) #添加隐层
      ann.add(Dense(units = 1,activation = 'sigmoid'))  #添加输出层
      ann.summary()  #显示网络模型
      

      神经网络的结构信息。
      在这里插入图片描述
      每个层的类型,输出张量的形状,参数数量以及整个网络的参数数量。这个网络只有3层,493个参数(就是每个神经元的权重),对于神经网络来说,参数数量已经算是很少了。

      展示神经网络的型状结构代码:

      
      #输出神经网络的型状结构
      
      from IPython.display import SVG  #实现神经网络结构的图形化显示
      from keras.utils.vis_utils import model_to_dot
      SVG(model_to_dot(ann,show_shapes = True).create(prog = 'dot',format = 'svg'))
      

      解释上面的代码

      • 模型的创建:ann = Sequential() 创建了一个序贯神经网络模型
      • 输入层:通过add方法,可开始神经网络的堆叠,序贯模型们也就是一层一层的顺序堆叠。
        – Dense就是层的类型,代表密集层网络,是神经网络中最基本的层,也叫全连接层。
        – input_dim 是输入维度,输入维度必须与特征维度相同。这里指定的网络能接受的输入维度是11,如果和实际输入的网络的特征维度不匹配就会报错,见后面!
        – units 是输出维度,设置为12,也可以写成output_dim= 12,甚至忽略参数名。。
        – activation 是激活函数,这是每一层都需要设置参数。
      • 隐层:仍然通过add方法
      • 输出层:仍然是一个全连接层,指定的输出维度是1。对于二分类问题的输出层,Sigmoid是固定的选择,如果是用神经网络解决回归问题的化,那么输出层不用指定任何激活函数。

      编译搭建好 的网络:

      # 编译神经网络,指定优化器,损失函数,以及评估标准
      ann.compile(optimizer = 'adam',           #优化器
                  loss = 'binary_crossentropy', #损失函数  
                  metrics = ['acc'])       #评估指标
      

      用Sequential模型的compile方法对整个网络进行编译时,需要制定以下参数。

      • 优化器(optimizer):一般选用"adam”或者"rmsprop’,都是很好的优化器选项。
      • 损失函数(loss):对于二分类问题来说,基本上二元交叉熵函数(binary_crossentropy)是固定选项;如果使用神经网络解决线性分回归问题,那么均方误差哈傻女胡是合适的选择。
      • 评估指标(metrics):这采用acc作为评估网络性能的标准;对于回归问题,平均误差函数是合适的选择。准确率,也就是正确地预测占全部数据的比重,是最为常用的分类评估指标。

      (2)全连接层

      全连接层,是最常见的神经网络层,用于处理最普通的机器学习向量数据及,既2D张量数据集。
      可设置的参数:

      keras.layers.Dense(units=12,
                        activation = None,
                        use_bias = True,
                      #  kernel_initializer = 'glorot_unifrom',
                        bias_initializer='zeros',
                        kernel_regularizer = None,
                        bias_regularizer=None,
                        activity_regularizer=None,
                        kernel_constraint=None,
                        bias_constraint=None
                        )
      

      层内参数通常都是由机器学习通过梯度下降自动优化的。

      (3)神经网络中其他类型的层

      • 循环层:用于处理保存在形状维(样本,时戳,标签)的3D张量中的序列数据。
      • 二维卷积层:用于处理保存形状在(样本,帧数,图像高度,图像宽度,颜色深度)的4D张量中的图像数据。

      层就像是深度学习的乐高积木快,将相互兼容的,相同或者不同类型的多个层拼接在一起,建立起各种神经网络模型。

      4.训练单隐层神经网络

      神经网络的拟合过程也是通过fit方法实现,通过history变量把训练过程中的信息保存下来,留待以后分析。

      这里会出现一个错误,应该将:

      ann.add(Dense(units=12, input_dim = 11,activation='relu'))  #添加输入层
      

      改为:

      ann.add(Dense(units=12, input_dim = 12,activation='relu'))  #添加输入层
      

      在重新运行即可。

      import keras # 导入Keras库
      from keras.models import Sequential # 导入Keras序贯模型
      from keras.layers import Dense # 导入Keras密集连接层
      ann = Sequential() # 创建一个序贯ANN(Artifical Neural Network)模型
      ann.add(Dense(units=12, input_dim=12, activation = 'relu')) # 添加输入层
      ann.add(Dense(units=24, activation = 'relu')) # 添加隐层
      ann.add(Dense(units=1, activation = 'sigmoid')) # 添加输出层
      
      ann.compile(optimizer = 'adam',           #优化器
                  loss = 'binary_crossentropy', #损失函数  
                  metrics = ['acc'])       #评估指标
      
      history = ann.fit(X_train, y_train, # 指定训练集
                        epochs=30,        # 指定训练的轮次
                        batch_size=64,    # 指定数据批量
                        validation_data=(X_test, y_test)) #指定验证集,这里为了简化模型,直接用测试集数据进行验证
      

      在这里插入图片描述
      参数:

      • batch_size:用于指定数据批量,也就是每一次梯度下降更新参数时,所同时训练的样本数量。
      • validation_data:用于指定验证集。
      • epochs:训练的轮次。
      • 训练集

      5.训练过程的图形化显示

      训练过程中输出的信息包括每轮训练的损失值、准确率等,下面这个函数,显示基于训练集和验证集的损失函数,以及准确率随迭代次数变化的曲线。

      def show_history(history): # 显示训练过程中的学习曲线
          loss = history.history['loss']
          val_loss = history.history['val_loss']
          epochs = range(1, len(loss) + 1)
          plt.figure(figsize=(12,4))
          plt.subplot(1, 2, 1)
          plt.plot(epochs, loss, 'bo', label='Training loss')
          plt.plot(epochs, val_loss, 'b', label='Validation loss')
          plt.title('Training and validation loss')
          plt.xlabel('Epochs')
          plt.ylabel('Loss')
          plt.legend()
          acc = history.history['acc']
          val_acc = history.history['val_acc']
          plt.subplot(1, 2, 2)
          plt.plot(epochs, acc, 'bo', label='Training acc')
          plt.plot(epochs, val_acc, 'b', label='Validation acc')
          plt.title('Training and validation accuracy')
          plt.xlabel('Epochs')
          plt.ylabel('Accuracy')
          plt.legend()
          plt.show()
      show_history(history) # 调用这个函数,并将神经网络训练历史数据作为参数输入
      

      在这里插入图片描述

      四、分类数据不平衡问题:只看准确率够用嘛

      1.混淆矩阵、准确率、召回率和F1分数

      在机器学习中引入可视化评估工具,在监督学习中叫做混淆矩阵。

      • 一个标准是:准确率也叫查准率,其公式使用“被模型预测为证的正样本”除以“被模型预测为正的正样本”与被模型预测为负的正样本“的和。
      • 另一个标准:召回率,也叫查全率,就是不合格的产品过了之间的关,要召回,销毁掉。
      • 把精确率和召回率结合起来,就得到F1分数。这是一个可以同时体现上面两个评估效果的标准,数学上定义为精确率和召回率的调和均值。
      • 这3个标准的重要性在此时要远远高于准确率。

      2.数用分类报告和混淆矩阵

      用神经网络模型的predict方法预测测试集的分类标签,然后把真值和预测值作比较,并利用Sklearn中的分类报告功能来计算上面的这几类标准。

      from sklearn.metrics import classification_report # 导入分类报告
      def show_report(X_test, y_test, y_pred): # 定义一个函数显示分类报告
          if y_test.shape != (2000,1):
              y_test = y_test.values # 把Panda series转换成Numpy array
              y_test = y_test.reshape((len(y_test),1)) # 转换成与y_pred相同的形状 
          print(classification_report(y_test,y_pred,labels=[0, 1])) #调用分类报告   
      
      show_report(X_test,y_test,y_pred)
      

      在这里插入图片描述
      对于标签为1的类别而言,准确率、召回率、F1分数据然都是0.
      这时输出y_pred值,会是清一色的0.

      下面画出混淆矩阵

      from sklearn.metrics import confusion_matrix # 导入混淆矩阵
      def show_matrix(y_test, y_pred): # 定义一个函数显示混淆矩阵
          cm = confusion_matrix(y_test,y_pred) # 调用混淆矩阵
          plt.title("ANN Confusion Matrix") # 标题
          sns.heatmap(cm,annot=True,cmap="Blues",fmt="d",cbar=False) # 热力图设定
          plt.show() # 显示混淆矩阵
      
      show_matrix(y_test,y_pred)
      

      在这里插入图片描述
      混淆矩阵显示417个客户流失正样本竟然一列都没侧中。这样的神经网路尽管准确率为79%,但实际上是训练完全失败了。

      3.特征缩放的魔力

      **对于神经网络而言,特征缩放极为重要。**神经网络不喜欢大的取值范围,因此需要将输入神经网络的数据标准化,把数据约束在较小的区间,这样可消除离群样本对函数形状的影响。

      这里对数据进行标准化,其步骤是:对于输入数据的每个特征,减去特征平均值,再除以标准差,之后得到的特征平均值为0,标准差为1.
      代码如下:(按照公式来写:)

      mean = X_train.mean(axis=0) # 计算训练集均值
      X_train -= mean # 训练集减去训练集均值
      std = X_train.std(axis=0) # 计算训练集方差
      X_train /= std # 训练集除以训练集标准差
      X_test -= mean # 测试集减去训练集均值
      X_test /= std # 测试集减去训练集均值
      

      (使用sklearn库):

      from sklearn.preprocessing import StandardScaler # 导入特征缩放器
      sc = StandardScalear() # 特征缩放器
      X_train = sc.fit_transform(X_train) # 拟合并应用于训练集
      X_test = sc.transform (X_test) # 训练集结果应用于测试集
      

      无论使用哪种方法,特征缩放的代码必须要放在数据集拆分之后。

      均值和标准差都是 在训练数据上计算而得的,然后将同样的均值和标准差应用于训练集和测试集。

      将数据带入到逻辑回归模型中查看准确率:

      from sklearn.linear_model import LogisticRegression
      lr = LogisticRegression() # 逻辑回归模型
      history = lr.fit(X_train,y_train) # 训练机器
      print("逻辑回归测试集准确率 {:.2f}%".format(lr.score(X_test,y_test)*100))
      

      在这里插入图片描述

      重新训练单隐层神经网络:

      history = ann.fit(X_train, y_train, # 指定训练集
                        epochs=30,        # 指定训练的轮次
                        batch_size=64,    # 指定数据批量
                        validation_data=(X_test, y_test)) #指定验证集
      
      

      在这里插入图片描述
      达到了86.15%。

      查看损失曲线和准确率曲线:
      在这里插入图片描述
      准确率,和召回率和F1分数也大幅度提高:
      在这里插入图片描述

      4.阈值调整、欠拟合、过采样

      在面对数据极度不平衡的时候,实际还有以下一些方法。

      • 首先就是选择合适的评估指标。除了我们刚才选用的F1分数,还有ROC/AUC,以及G-mean等标准。
      • 还可以考虑调整分类阈值
      • 还由一种方法就是采样法,分为欠采样和过采样。
        – 过采样:认为地重复类别较少的数据,使数据集中各种类别的数据大致数目相同。
        – 欠采样:认为地丢弃大量类别较多的数据,使数据集中各种类别的数据大致数目相同。

      五、从单隐层神经网络到深度神经网络

      1.梯度下降:正向传播和反向传播

      神经网络也是通过损失函数来衡量该输出与预测值之间的差距,并以此作为反馈信号微调权重,以降低损失值。

      深度神经网络的梯度下降和参数优化过程是通过优化器实现的,其中包括正向传播算法和以及一个更为核心的深度学习算法反向传播

      • 正向传播,就是从数据的输入,一层一层进行输入和输出的传递,直到最后一层的预测结果,然后计算损失值的过程。
      • 反向传播,就是反向计算偏微分,信息会从神经网络的高层向底层反向传播,并在这个过程中根据输出来调整权重。就是参数优化的过程。

      反向传播从最终损失值,并从反向作用至输入层,是利用链式求导法则计算每个参数对损失值的贡献大小。

      2.深度神经网络中的一些可调超参数

      通过正向传播和反向传播,神经网络实现了内部参数的调整。

      • 优化器
      • 激活函数
      • 损失函数
      • 评估指标

      3.梯度下降优化器

      #编译神经网络
      ann.compile(optimizer= 'adam',
                 loss = 'binary_crossentropy',
                 metrics = ['acc'])
      
      1. 神经网络权重参数随机初始化
      2. 批量梯度下降(BGD)
      3. 随机梯度下降(SGD)
      4. 小批量随机梯度下降(MBGD)
      5. 动量SGD
      6. 上坡时减少动量NAG
      7. 各参数的不同学习速率——Adagrad
      8. 加权平均值计算二阶动量——RMSProp
      9. 多种优化思路的集大成者——Adam
      10. 涅斯捷罗夫Adam加速——Nadam

      adam是最常用的,目前也是口碑最好的优化器。

      4.激活函数:从Sigmoid和ReLU

      1. Sigmoid函数和梯度消失
      2. Tanh函数
      3. ReLU函数
      4. Leaky ReLU和PReLU
      5. eLU函数
      6. Sigmoid和Softmax函数用于分类输出

      5.损失函数的选择

      对于连续值向量的回归问题,使用均方误差损失函数:

      #编译神经网络
      ann.compile(optimizer= 'adam',#均方误差损失函数
                 loss = 'mse')
      

      对于二分类问题,使用同样熟悉的二元交叉熵损失函数:

      #编译神经网络
      ann.compile(optimizer= 'adam',
                 loss = 'binary_crossentropy',#二元交叉熵损失函数
                 metrics = ['acc'])
      

      对于多分类问题,如果是输出one-hot编码,则用分类交叉熵函数:

      #编译神经网络
      ann.compile(optimizer= 'adam',
                 loss = 'categorical_crossentropy',#分类交叉熵函数
                 metrics = ['acc'])
      

      对于多分类问题,如果输出是证书数值,则使用稀疏分类交叉熵损失函数:

      #编译神经网络
      ann.compile(optimizer= 'adam',
                 loss = 'sparse_categorical_crossentropy',#稀疏分类交叉熵损失函数
                 metrics = ['acc'])
      

      6.评估指标的选择

      超参数是神经网络的评估指标,也就死评估网络模型好不好的标准,这个标准叫做目标函数。

      还可以自主开发评估标准,用代码自定义了一个目标函数:

      #自定义评估指标
      import keras.backend as K
      def mean_pred(y_true,y_pred):
          return K.mean(y_pred)
      ann.compile(optimizer='rmsprop',
                  loss = 'binary_crossentropy',
                 metrics = ['accuracy',mean_pred])
      
      

      六、用Keras深度神经网络预测客户流失率

      1.构建深度神经网络

      搭建多层的神经网络,还是使用序贯模型。

      from keras.models import Sequential
      ann = Sequential()
      
      ann.add(Dense(units=12,input_dim=12,activation = 'relu'))
      ann.add(Dense(units=24,activation = 'relu'))
      ann.add(Dense(units=48,activation = 'relu'))
      ann.add(Dense(units=96,activation = 'relu'))
      ann.add(Dense(units=192,activation='relu'))
      ann.add(Dense(units=1,activation='sigmoid'))
      ann.summary()
      
      # 编译神经网络,指定优化器,损失函数,以及评估标准
      ann.compile(optimizer = 'adam',           #优化器
                  loss = 'binary_crossentropy', #损失函数  
                  metrics = ['acc'])       #评估指标
      history = ann.fit(X_train, y_train, # 指定训练集
                        epochs=30,        # 指定训练的轮次
                        batch_size=64,    # 指定数据批量
                        validation_data=(X_test, y_test)) #指定验证集,这里为了简化模型,直接用测试集数据进行验证
      

      在这里插入图片描述

      2.神经网络正则化:添加Dropout层

      from keras.models import Sequential
      from keras.layers import Dropout
      ann = Sequential()
      
      ann.add(Dense(units=12,input_dim=12,activation = 'relu'))
      ann.add(Dense(units=24,activation = 'relu'))
      ann.add(Dropout(0.5))
      ann.add(Dense(units=48,activation = 'relu'))
      ann.add(Dropout(0.5))
      ann.add(Dense(units=96,activation = 'relu'))
      ann.add(Dropout(0.5))
      ann.add(Dense(units=192,activation='relu'))
      ann.add(Dropout(0.5))
      ann.add(Dense(units=1,activation='sigmoid'))
      ann.summary()
      

      在这里插入图片描述
      训练:

      ann.compile(optimizer='adam',
                 loss = 'binary_crossentropy',
                 metrics = ['acc'])
      
      history = ann.fit(X_train,y_train,
                       epochs = 30,
                       batch_size = 64,
                       validation_data=(X_test,y_test))
      

      在这里插入图片描述

      # 这段代码参考《Python深度学习》一书中的学习曲线的实现
      def show_history(history): # 显示训练过程中的学习曲线
          loss = history.history['loss']
          val_loss = history.history['val_loss']
          epochs = range(1, len(loss) + 1)
          plt.figure(figsize=(12,4))
          plt.subplot(1, 2, 1)
          plt.plot(epochs, loss, 'bo', label='Training loss')
          plt.plot(epochs, val_loss, 'b', label='Validation loss')
          plt.title('Training and validation loss')
          plt.xlabel('Epochs')
          plt.ylabel('Loss')
          plt.legend()
          acc = history.history['acc']
          val_acc = history.history['val_acc']
          plt.subplot(1, 2, 2)
          plt.plot(epochs, acc, 'bo', label='Training acc')
          plt.plot(epochs, val_acc, 'b', label='Validation acc')
          plt.title('Training and validation accuracy')
          plt.xlabel('Epochs')
          plt.ylabel('Accuracy')
          plt.legend()
          plt.show()
      show_history(history) # 调用这个函数,并将神经网络训练历史数据作为参数输入
      

      在这里插入图片描述

      在这里插入图片描述

      七、深度神经网络的调试及性能优化

      1.使用回调功能

      在训练过程中,根据一些预设的指示对训练进行控制。

      • ModelCheckpoint:在训练过程中的不同时间点保存模型,也急速和i保存当前网络的所有权重。
      • EaylyStopping:如果验证损失不再改善,则中断巡礼那。保存最佳模型。
      • ReduceLROnPlateau:在训练过程中动态调节某些参数值。
      • TensorBoard:将模型训练过程可视化。
      #回调功能
      
      from keras.callbacks import ModelCheckpoint
      from keras.callbacks import EarlyStopping
      from keras.callbacks import ReduceLROnPlateau
      
      earlystop = EarlyStopping(monitor = 'val_acc',
                                patience = 20,
                                verbose =1)
                            #    restore_best_weights = True)
      
      reducelr = ReduceLROnPlateau(monitor = 'val_acc',
                                   factor = 0.5, 
                                   patience = 3,verbose = 1,
                                   min_lr = 1e-7)
      
      modelckpt = ModelCheckpoint(filepath = 'ann.h5', 
                                  monitor = 'val_acc',
                                  verbose = 1,
                                  save_best_only =True,
                                  mode='max')
      
      callbacks = [earlystop,reducelr,modelckpt]  #设定回调
      
      history = ann.fit(X_train,y_train,  #指定训练集
                       batch_size = 128,  #指定批量大小
                       validation_data = (X_test,y_test),  #指定验证集
                       epochs = 100, #指定轮次
                       callbacks = callbacks) #指定回调功能
      

      在这里插入图片描述

      2.使用TensorBoard

      包括以下功能:

      • 在训练过程中监控指标
      • 建模型的架构可视化。
      • 显示激活和梯度的直方图
      • 以三维的形式显示词嵌入。
      # 导入并激活TensorBoard
      %load_ext tensorboard
      %tensorboard --logdir logs
      
      # 创建机器学习模型
      import tensorflow as tf
      mnist = tf.keras.datasets.mnist
      ((x_train, y_train), (x_test, y_test)) = mnist.load_data()
      (x_train, x_test) = (x_train / 255.0, x_test / 255.0)
      model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(28, 28)),
        tf.keras.layers.Dense(512, activation=tf.nn.relu),
        tf.keras.layers.Dropout(0.2),
        tf.keras.layers.Dense(10, activation=tf.nn.softmax)
      ])
      model.compile(
        optimizer='adam',
        loss='sparse_categorical_crossentropy',
        metrics=['accuracy'],
      )
      
      # 回调Tensorboard
      tensorboard_callback = tf.keras.callbacks.TensorBoard("logs")
      model.fit(
        x_train,
        y_train,
        epochs=5,
        callbacks=[tensorboard_callback],
      )
      

      3.神经网络中的过拟合

      解决过拟合的思路主要有:

      1. 首先,根据奥卡姆剃刀定律,,网络越大,越容易过拟合,如果能用小型网络模型就不要用大型网络
      2. 在训练大型网络之前使用少量数据训练一个较小的模型,小模型的泛化好,再去训练更深更大的网络。
      3. 最常见且有效地降低神经网络过拟合的方法就是在全连接层之间添加Dropout层。
      4. 使用较低的学习速率配合神经元的权重正则化可能是解决过拟合问题的手段之一。

      4.梯度消失和梯度爆炸

      都是因为网络太深、网络权重更新不稳定造成的,本质上都是梯度反向传播中的连锁效应

      解决方案:

      1. 选择合适的激活函数
      2. 权重正则化
      3. 批标准化
      from keras.layers.normalization import BatchNormalization   #导入批标准化组件
      ann = Sequential() # 创建一个序贯ANN(Artifical Neural Network)模型
      ann.add(Dense(units=12, input_dim=12, activation = 'relu')) # 添加输入层
      ann.add(BatchNormalization())#添加批标准化层
      ann.add(Dense(units=24, activation = 'relu')) # 添加隐层
      
      1. 残差连接

      小结

      神经网络的优势:

      1. 利用现代计算机的强大算力,提高了机器学习的精度
      2. 使特征工程不再显得那么重要,非结构化数据的处理变得简单

      深度学习的应用:

      • 图像分类、人脸识别
      • 自然语言处理
      • 智能助手
      • 棋类游戏
      • 推荐系统

      尽管深度神经网络处理巨大数据集和复杂问题的优势以是毋庸置疑,但是不能直接得出结论认为网络越深越好。如果问题不复杂,我们还是应该先尝试较为简单的模型。

      展开全文
    • 利用股票市场的理论和神经网络的BP算法来预测股票价格.先对股票进行基本面的...运用技术分析的技术指标和神经网络优势,对股票进行大数据量的训练,使得模型可靠,再对股票进行测试.从实验的效果来看,取得令人满意的效果
    • 卷积神经网络超详细介绍

      万次阅读 多人点赞 2018-09-19 10:16:59
      1、卷积神经网络的概念 2、 发展过程 3、如何利用CNN实现图像识别的任务 4、CNN的特征 5、CNN的求解 6、卷积神经网络注意事项 7、CNN发展综合介绍 8、LeNet-5结构分析 9、AlexNet 10、ZFNet 10.1 意义 ...
    • 介绍BP神经网络的基本原理,提出合理的提升机制动系统故障诊断训练,分析神经网络存在的局部最优解和收敛...分别对原始的BP神经网络和改进后的神经网络进行仿真分析,结果显示基于遗传算法优化后的BP神经网络优势明显。
    • matlab神经网络案例(bp神经网络

      千次阅读 多人点赞 2020-08-10 21:33:06
      这几天没有写博客,主要是在看matlab的神经网络,通过对机器学习的学习,学习了感知器,径向基,bp等神经网络。接下来就学习一个运用最广泛的bp神经网络案例! 例: bp神经网络预测汽油浓度案例。 首先数据集...
    • 线性代数在神经网络中的应用和优势 我们的主要研究是在将线性代数用于神经网络时将神经网络的概念应用于线性代数,对此进行调查非常重要,这对于我们证明线性代数用于神经网络非常重要,为此,我们将项目分为两个...
    • 神经网络和深度学习(一)——初识神经网络

      万次阅读 多人点赞 2017-08-15 19:18:17
      神经网络和深度学习 神经网络:一种可以通过观测数据使计算机学习的仿生语言范例 深度学习:一组强大的神经网络学习技术神经网络和深度学习目前提供了针对图像识别,语音识别和自然语言处理领域诸多问题的最佳解决...
    • 人工神经网络基本原理

      万次阅读 多人点赞 2017-01-06 09:53:41
      最近谷歌升级版AlphaGo打败众多国内外围棋高手,那狗又火了一把,再次引起...因此,本文先介绍神经网络基本原理,后面系列文章将详细介绍神经网络的成熟算法及网络结构(比如:BP神经网络、RBF、CNN等)并编程实现之。
    • 神经网络算法详解 01:人工神经网络基础

      千次阅读 多人点赞 2020-03-25 20:18:17
      本文介绍了人工智能的发展历史,基本概念,应用领域;神经元模型,神经元的学习规则以及神经网络工作原理。本系列文章来自阿里云大学人工智能学习路线中的《神经网络概览及神经网络算法详解》课程。
    • 卷积神经网络综述

      千次阅读 2019-02-25 14:51:38
      下面来简单介绍和归纳总结一下国内外卷积神经网络的结构,分析一下卷积神经网络的基本原理,阐述一下卷积神经网络在图像识别中的相关应用及取得的最新研究成果。 卷积神经网络是人工神经网络与深度学习相结合,通过...
    • 卷积神经网络概述

      2021-01-06 19:57:01
      卷积神经网络在输入图像时,优势表现的更为明显,其可以使图像直接作为网络的输入, 避免了传统识别算法中复杂的特征提取及数据重建的过程,在二维图像的处理过程中有很 大的优势,如网络能够自行抽取图像的特征...
    • 利用多层卷积神经网络(CNN)特征的互补优势 进行图像检索 本文原网址为:http://www.sciencedirect.com/science/article/pii/S0925231216314734 翻译不当之处请多多指正 摘要:深度卷积神经网络已经证明了图像分类...
    • 上一节我们讲了神经网络的结构以及网络的工作原理,本节将讲述一些优秀的卷积神经网络结构以及一些常用的网络改进方法。 2012年到2015年是深度学习快速发展的四年,先后出现了以AlexNet、VGGNet、Google Inception...
    • 神经网络模型

      千次阅读 2015-07-30 17:25:48
      什么是神经网络 神经网络(Neural Networks,NN)是由大量的、简单的处理单元(称为神经元)广泛地互相连接而形成的复杂网络系统,它反映了人脑功能的许多基本特征,是一个高度复杂的非线性动力学习系统。神经网络...
    • 神经网络学习笔记(二)GRNN广义回归神经网络

      万次阅读 多人点赞 2018-08-06 14:22:40
      广义回归神经网络是径向基神经网络的一种,GRNN具有很强的非线性映射能力和学习速度,比RBF具有更强的优势,网络最后普收敛于样本量集聚较多的优化回归,样本数据少时,预测效果很好,还可以处理不稳定数据。...
    • ELMAN神经网络

      千次阅读 2020-07-08 19:45:22
      ELMAN神经网络 By:Yang Liu 1.什么是ELMAN神经网络 Elman神经网络是一种典型的局部回归网络( global feed forward local recurrent)。Elman网络可以看作是一个具有局部记忆单元和局部反馈连接的递归神经网络。Elman...
    • 神经网络

      千次阅读 2017-08-23 16:42:44
      神经网络(neural networks, NN)是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交叉反应。   2 感知机与多层网络 感知机(Perceptron)是由两层神经元...
    • GPU 和神经网络加速器芯片如何为汽车应用提供智能优势 汽车行业是推动人工智能(AI)发展的重要行业之一这是因为该行业致力于自动驾驶汽车和高级驾驶员 辅助系统(ADAS)的泛在利益 汽车正在变得越来越智能但是如果汽车...
    • 一文看懂25个神经网络模型

      万次阅读 多人点赞 2017-06-17 10:26:08
      1. 引言在深度学习十分火热的今天,不时会涌现出各种新型的人工神经网络,想要实时了解这些新型神经网络的架构还真是不容易。光是知道各式各样的神经网络模型缩写(如:DCIGN、BiLSTM、DCGAN……还有哪些?),就已经...
    • 在机器学习和认知科学领域,人工神经网络(英文:artificial neural network,缩写ANN),简称神经网络(英文:neural network,缩写NN)或类神经网络,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)...
    • 各位老师你们好,请问量子神经网络可以做预测吗?他与传统神经网络有什么区别 呢,训练方法一样吗?希望前辈们有时间可以指点一二。
    • 人工神经网络简介

      万次阅读 多人点赞 2015-12-12 14:20:37
      人工神经网络简介
    • 神经网络详解(基本完成)

      万次阅读 多人点赞 2018-01-21 22:46:59
      Fill you up with petrol概述人工神经网络(artificial neural network,ANN),简称神经网络(neural network,NN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结...
    • 神经网络到卷积神经网络的了解

      万次阅读 2016-12-08 13:12:52
      date: 2016-09-14 11:02 老师提供的阅读材,上周就应该看完,但还是没看,这周需要看完然后看两篇FNN的论文并做一个report。 提供的材料是CS231n PS:才发现有翻译,...神经网络神经网络是一种模仿生物神经网络

    空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 59,757
    精华内容 23,902
    关键字:

    神经网络优势