神经网络与深度学习机器学习实验室共 4113字,需浏览 9分钟 ·2020-10-01 20:48 深度学习Author:louwillFrom:深度学习笔记深度学习作为当前机器学习一个最热门的发展方向,仍然保持着传统机器学习方法的理念与特征,从监督学习的角度看,深度学习与机器学习并无本质上的差异。隐藏层使得感知机能够发展为拟合万物的神经网络模型,而反向传播算法则是整个神经网络训练的核心要义。 机器学习与深度学习的关系要学习深度学习,恐怕不得不先温习一下机器学习,搞清楚二者之间的关系。简单来说,机器学习就是从历史数据中探索和训练出数据的普遍规律,将其归纳为相应的数学模型,并对未知的数据进行预测的过程。至于在这个过程中我们碰到的各种各样的问题,比如数据质量、模型评价标准、训练优化方法、过拟合等一系列关乎机器学习模型生死的问题,在这里不做具体展开,大家可以去补习相关的机器学习知识。在机器学习中,有很多相当成熟的模型和算法。其中有一种很厉害的模型,那就是人工神经网络。这种模型从早期的感知机发展而来,对任何函数都有较好的拟合性,但自上个世纪90年代一直到2012年深度学习集中爆发前夕,神经网络受制于计算资源的限制和较差的可解释性,一直处于发展的低谷阶段。之后大数据兴起,计算资源也迅速跟上,加之2012年ImageNet竞赛冠军采用的AlexNet卷积神经网络一举将图像分类的Top5错误率降至16.4%,震惊了当时的学界和业界。从此之后,原本处于研究边缘状态的神经网络又迅速火热了起来,深度学习也逐渐占据了计算机视觉的主导地位。注意:这里有必要解释一下模型和算法的概念,通常我们所说的像支持向量机(Support Vector Machine,以下简称SVM)之类的所谓机器学习十大算法其实不应该称之为算法,更应该称之为模型。机器学习算法应该是在给定模型和训练策略的情况下采取的优化算法,比如梯度下降、牛顿法等。当然,一般情况下将机器学习中的模型和算法概念混在一起并没有十分不妥之处,毕竟模型中本身就包含着计算规则的意思。讲了这么多,无非就是想让大家知道,以神经网络为核心的深度学习是机器学习的一个领域分支,所以深度学习在其本质上也必须遵循机器学习的基本要义和法则。在传统的机器学习中,我们需要训练的是结构化的数值数据,比如预测销售量、预测某人是否按时还款,等等。但在深度学习中,其训练输入就不再是常规的数值数据了,它可能是一张图片、一段语言、一段对话语音或一段视频。深度学习要做的就是输入一张狗的图片到神经网络里,它的输出是狗或者dog这样的标签,输入一段语音,它输出的是比如“你好”这样的文本。综上所述可以看出,机器学习(深度学习)的核心任务就是找(训练)一个模型,它能够将输入转化为正确的输出。 感知机与神经网络深度学习看起来就像是一个黑箱机制,输入各种非结构化的数据之后出来预测结果,比如输入一段语音,输出为“Hello, World!”这样的文本;输入一张狗的图像,输出为“狗”这样的标签;输入一副棋盘和当前的局势,输出为下一步的走棋方式;输入“你好!”这样一句中文,输出为“Hi!”这样一句英文,等等。我们很难对输入与输出之间的模型转化过程给出一个合理的解释。在实际工作中,调用像 TensorFlow 这样优秀的深度学习框架能够帮助我们快速搭建起一个深度学习项目,但在学习深度学习的时候,不建议大家一开始就上手各种深度学习框架,希望大家能和我们一道,在把基本原理搞清楚之后利用Python自己手动去编写模型和实现算法细节。为了学习深度学习和各种结构的神经网络,我们需要从头开始。感知机作为神经网络和支持向量机的理论基础,一定要清楚其中的模型细节。简单来说,感知机就是一个旨在建立一个线性超平面对线性可分的数据集进行分类的线性模型。其基本结构如图1所示。图1 感知机模型 图1从左到右为感知机模型的计算执行方向,模型接受了三个输入,将输入与权值参数进行加权求和并经过Sigmoid函数进行激活,将激活结果作为输出。这便是感知机执行前向计算的基本过程。这样就行了吗?当然不行。刚刚我们只解释了模型,对策略和算法并未解释。当我们执行完前向计算得到输出之后,模型需要根据你的输出和实际的输出按照损失函数计算当前损失,计算损失函数关于权值和偏置的梯度,然后根据梯度下降法更新权值和偏置,经过不断的迭代调整权值和偏置使得损失最小,这便是完整的单层感知机的训练过程。图2所示是输入为图像的感知机计算过程。 图2 基于感知机的图像识别过程 前面讲的是单层感知机,单层感知机包含两层神经元,即输入与输出神经元,可以非常容易地实现逻辑与、逻辑或和逻辑非等线性可分情形,但是单层感知机的学习能力是非常有限的,对于像异或问题这样的线性不可分情形,单层感知机就搞不定了(所谓线性不可分,即对于输入训练数据,不存在一个线性超平面能够将其进行线性分类)。其学习过程会出现一定程度的振荡,权值参数难以稳定下来,最终不能求得合适的解,异或问题如图3 c图所示。 图3 异或问题 对于线性不可分的情况,在感知机基础上一般有两个解决方向,一个是著名的SVM,旨在通过核函数映射来处理非线性的情况,而另一种就是神经网络模型。这里的神经网络模型也叫作多层感知机(Muti-Layer Perception,以下简称MLP),与单层的感知机在结构上的区别主要在于MLP多了若干隐藏层,这使得神经网络能够处理非线性问题。一个单隐层的神经网络的结构,如图4所示。 图4 多层感知机 可以看到,相较于两层神经元的单层感知机,多层感知机中间多了一个隐藏层。何为隐藏层?就是在神经网络的训练过程中我们只能观察到输入和输出层的数据,对于中间的隐藏层的数据变化我们是看不见的,因而在深度神经网络(Deep Neural Networks,以下简称DNN)中,对于中间看不见又难以对其效果进行合理解释的隐藏层称之为“黑箱子”。含隐藏层的神经网络是如何训练的呢?与感知机一样,神经网络的训练依然包含前向计算和反向传播两个主要过程。当然,单层感知机没有反向传播这个概念,而是直接建立损失函数对权值和偏置参数进行梯度优化。前向计算简单来说,就是权值偏置与输入的线性加权和激活操作,在隐藏层上有个嵌套的过程。这里我们重点讲反向传播算法(Error Back Propagation,也叫误差逆传播),作为神经网络的训练算法,反向传播算法可谓是目前最成功的神经网络学习算法。我们通常说的BP神经网络就是指应用反向传播算法进行训练的神经网络模型。那么,反向传播算法的工作机制究竟是怎样的呢?这里需要大家复习一下在大学课本阶段学习的微积分知识。下面以一个两层(即单隐层)网络为例,也就是图5中的网络结构,给大家详细推导一下反向传播的基本过程。假设输入层为x,输入层与隐藏层之间的权值和偏置分别为w1和b1,线性加权计算结果为z1=w1x+b1,采用sigmoid激活函数,激活输出为a1=σ(z1)。而隐藏层到输出层的权值和偏置分别为w2和b2,线性加权计算结果为z2=w2x+b2,激活输出为a2=σ(z2)。所以这个两层网络的前向计算过程为x-z1-a1-z2-a2。可以看出,反向传播的直观理解就是将前向计算过程反过来,但必须是梯度计算的方向反过来,假设我们这里采用如下的交叉熵损失函数。 反向传播是基于梯度下降策略的,主要是以目标参数的负梯度方向对参数进行更新,所以基于损失函数对前向计算过程中各个变量进行梯度计算就非常必要了。将前向计算过程反过来,那基于损失函数的梯度计算顺序就是da2-dz2-dw2-db2-da1-dw1-db1。我们从输出a2开始进行反向推导,输出层激活输出为a2,那首先计算损失函数L(y,a)关于a2的微分da2,影响a2输出的是谁呢?由前向传播可知a2是由z2经激活函数激活计算而来的,所以计算损失函数关于z2的导数dz2必须经由a2进行复合函数求导,即微积分上常说的链式求导法则。然后继续往前推,影响z2的又是哪些变量呢?由前向计算可知影响的有w2、a1和b2,继续按照链式求导法则进行求导即可。最终以交叉熵损失函数为代表的两层神经网络的反向传播向量化求导计算公式如下所示。注意:链式求导法则对复合函数进行求导的一种计算方法,复合函数的导数将是构成复合这有限个函数在相应点的导数的乘积,就像链子一样一环套一环,故称链式法则。在有了梯度计算结果之后,我们便可根据权值更新公式对权值和偏置参数进行更新了,具体计算公式如下,其中为学习率,是个超参数,需要我们在训练时手动指定,当然也可以对其进行调参以取得最优超参数。 以上便是BP神经网络模型和算法的基本工作流程,如图5所示。总结起来就是前向计算得到输出,反向传播调整参数,最后以得到损失最小时的参数为最优学习参数。 图5 前向计算与反向传播 经过近十几年的发展,神经网络的结构已经从普通的全连接网络发展到卷积神经网络、循环神经网络、自编码器、生成式对抗网络和图神经网络等各种各样的结构,但BP算法一直是神经网络一个经典和高效的寻优工具。通过本节内容来看,训练一个BP神经网络并非难事,我们有足够优秀的深度学习计算框架,读者通过几行代码就可以搭建起一个全连接网络。但是,为了掌握神经网络的基本思维范式和锻炼实际的编码能力,希望读者朋友们能够利用Python在不调用任何算法包的情况下根据算法原理手动实现一遍神经网络模型。往期精彩:【原创首发】机器学习公式推导与代码实现30讲.pdf【原创首发】深度学习语义分割理论与实战指南.pdf喜欢您就点个在看! 浏览 51点赞 评论 收藏 分享 手机扫一扫分享分享 举报 评论图片表情视频评价全部评论推荐 基础 | 深度学习与神经网络-介绍小白学视觉0深度学习 AI 解释:神经网络数据派THU0【深度学习】图解深度神经网络的架构!机器学习初学者0SpikingJelly脉冲神经网络深度学习框架SpikingJelly是一个基于PyTorch,使用脉冲神经网络(SpikingNetwork,SNN)进行深度学习的框架。SpikingJelly非常易于使用。使用SpikingJelly搭建SN【深度学习】卷积神经网络(CNN)详解机器学习初学者0【深度学习】收藏|神经网络调试Checklist机器学习初学者0【深度学习基础】经典卷积神经网络机器学习初学者0深度学习-卷积神经网络-算法比较DotNet程序园0【深度学习基础】经典卷积神经网络小白学视觉0SpikingJelly脉冲神经网络深度学习框架SpikingJelly 是一个基于 PyTorch,使用脉冲神经网络 (Spiking Netwo点赞 评论 收藏 分享 手机扫一扫分享分享 举报