欢迎来到TB体育·(中国)手机客户端下载
YPE htmlhtmTB体育官网lheadtitle data-vue-meta=true深度学习基础:最通俗易懂的神经网络工作原理讲解学它! - 哔哩哔哩
栏目:行业动态 发布时间:2023-04-25 11:44:35

  当前是人工智能快速发展的阶段,各个领域无不在应用人工智能技术帮助其提升生产效率。作为交通人,我们也应该适当学习人工智能相关的知识,以帮助我们解决一些学习或实践中遇到的问题。

  本期则是通过学习书籍《Python神经网络编程》,对相关的知识点进行总结、梳理,帮助大家快速了解神经网络的相关概念、工作原理等。

  声明:本文是对书籍《Python神经网络编程》的学习总结,文中除了特别注明是书中原文外,其他观点与作者无关,均为个人看法,且仅供交流学习使用,详细的内容请阅读原版书籍学习。

  我们首先需要把以上概念梳理清楚了,自己在学习的过程中才不至于没有章法。也就是说,要想学习某个领域,首先需要大致了解一下它们的脉络。

  人工智能(Artificial Intelligence)这个概念最早在1956年被提出,简称 AI。重点是:人工智能是计算机科学的一个分支,你可以认为它是一门学科,包含了机器学习、深度学习等。换一种说法,人工智能侧重于使机器模拟人的意识和思维,让计算机具备人类拥有如推理、知识、规划、学习、交流、感知、移动和操作物体的能力等 [1]。

  机器学习(Machine Learning)是实现人工智能的方法之一,它是人工智能的核心方法。机器学习可以分为监督学习和无监督学习,又可分为:分类、回归、聚类。简单说就是,机器学习就是通过计算机分析处理数据,利用某种算法寻求其内在规律,然后对事件作出预测或决策的过程。

  深度学习(Deep Learning)是实现机器学习的一种技术手段。也就是说,深度学习是通过构建具有很多隐层的机器学习模型和海量的训练数据,来学习更有用的特征,从而最终提升分类或预测的准确性 [1]。也就是说,深度学习的基本构造是神经网络,而特点是网络的深度变深了(其实就是隐藏层多了),更加突出特征学习的重要性。

  神经网络(Neural Network)这个概念可能大家并不陌生,其实它的核心就是使计算机模拟人脑学习的过程。重点是它到底包含什么组成部分?如何工作?简单说就是,神经网络的结构包含了输入层、隐藏层(也称中间层)、输出层。其中又包含了两个重要概念:激励函数和学习规则。激励函数是触发计算的阈值函数,学习规则则是不断迭代降低误差的过程。

  通常,我们的大脑在思考一个问题时:首先要去给出一个问题,然后大脑开始思考,最终得到答案(可能是错误的)。如果答案正确,我们相当开心。

  如果答案错误呢?我们便会寻求他人帮助或者查阅资料等,这个过程就是在积累经验(也就是在调整误差);通过查阅资料,我们大脑又进行了思考,认为此时想出的答案是正确的,最终便得到调整后的答案。

  但是,实际生活或工程实践中,有很多问题不是我们的大脑能够处理的。比如我们很容易从100个人中找到自己的好朋友,但是对于多位数的混合运算我们的大脑可能会觉得吃力。

  因此,我们需要借助计算机来解决一些大脑难以处理的问题,而神经网络便是其中一种可以模拟人脑工作的有效方法。这其中,最复杂且最为核心的便是解决如何模拟大脑思考这个过程。

  比如,我们将上图中的问题换个形式(如图6):假如我们要计算 km 和 m 之间的转换,显然,结果是 5000m。但是,这个变换系数我们是事先已知的。而实际问题却是,输入和输出常常已知,中间的变换或转换规律未知,这就需要我们给出某种规则,可以找到其中的规律。

  如果我们不知道转换系数就是1000,此时我们可能会尝试去猜测。给定系数是500,结果是2500比正确结果小了。我们需要进一步调整系数。假设调整为1200,结果是6000比正确结果大了。那么,我们就需要不断缩小这个输出结果与正确结果之间的差距,也就是误差,最终得到正确的结果,或者使误差最小。这个过程,就可以称为简单的神经网络工作的过程。

  这一步,我们有必要将问题复杂化,从而来了解神经网络到底如何工作。首先,我们必须明白一些概念。神经网络最左边的一列习惯称为输入层,中间部分习惯称为中间层或隐藏层,最右边一层习惯称为输出层。不要纠结为什么这样称呼,它们只是一个名字而已。而这三层结构就是最简单的神经网络结构。

  另外,一个重要的概念是激活函数(activation function)。为什么需要了解这个函数呢?在《Python神经网络编程》一书中作者指出 [2]:“ 观察表明,神经元不会立即反应,而是会抑制输入,直到输入增强,强大到可以触发输出。你可以这样认为,在产生输出之前,输入必须到达一个阈值。”

  也就是说,神经元在接收一个输入时,不会立即输出。因此,我们需要寻找一种可以模拟该过程的激活函数来抑制输入。而在神经网络中,Sigmoid 函数(又称 S 函数,也称逻辑函数)常常被用作激活函数,当然也有其他的激活函数。下图是 S 函数的表达式和图像。

  可以看出,对于S函数无论输入在何区间,它的输出总是介于0~1之间。对于神经元来说就是,对于任意的输入,经过激活函数的调节后经被抑制。这个过程和真实的神经元更为相似,也有一种原因是S函数涉及的计算也较为简单 [2]。

  从上图我们可以清晰看出激活函数的作用:就是将多种输入以某种组合方式求和,作为激活函数的输入,然后得到输出。注意,这里的输入和输出不是神经网络的,而是一个神经元的输入输出(可以认为是三层神经网络的中间层)。

  为了进一步了解激活函数是如何工作的,我们来看一个典型的三层神经网络,如图10所示。正如前文所述,最左侧是输入层,中间是隐藏层,最右侧是输出层。可以看出输入层有两个输入节点,中间层也是两个节点(也可以认为是两个神经元)。

  同样以《Python神经网络编程》书中的案例来说明激活函数是如何工作的。在了解激活函数如何工作之前,我们又需要了解一个新的概念:权重。图中w 表示输入对中间层不同节点的权重,这个有点类似于每个输入对于最终结果的贡献度,大致是这个意思。正是因为权重的存在,我们才能不断的调整权重来优化网络最终的输出结果准确性。此外,可能有同学说层1中节点1对层2不同节点的权重之和不是1呢?我想这个我们先不用在意,因为你会发现层1节点2对层2不同节点的权重之和也不是1。

  让我们回到问题的核心。显然,输入层(层1)节点1的值就是1.0,节点2的值就是0.5,输入层不做任何变化。现在,假设我们要计算中间层(层2)的节点1的结果,此时就需要用到激活函数。结合图9可知,如果要计算层2节点1的输出,那么首先需要组合与层2节点1相关的所有输入。

  注意,这里存在权重。因此,层2节点1的输出就是:S(1.0*权重0.9+0.5*权重0.3),我们计算S函数值便得到0.7408,层2节点2的计算方法同理。通过这里,我们可以看到激活函数不用于输入层,而是作用于中间层。

  到这里,我们应该已经明白神经网络的基本构造、激活函数的概念、激活函数如何工作、权重是什么这些基本的概念了。我们不能止步于此,应该再接再厉,继续深入了解神经网络中权重如何调整、整个计算过程又是什么。

  在开始利用神经网络计算之前,我们先来看一个复杂一点的神经网络,如图11所示。

  从图11可以看出,这里包含了输入层、隐藏层和输出层,每层均包含两个节点。图中绿色带箭头的线表示不同节点的链接,也代表了不同节点之间的权重联系。而目标值是指我们给定的数据,实际值表示神经网络输出的值。

  这里我们还是以图10中的数据为例,假设输入层的节点1输入为1.0,节点2的输入为0.5;假设输入层与隐藏层之间的权重与图10中一致。由于我们已经了解激活函数是如何工作的,那么我们很容易计算出隐藏层节点1和节点2的值。也就是:

  TB体育官网app下载相同的思路,我们可以给定隐藏层与输出层之间的权重,然后再次利用激活函数,我们便很容易计算出输出层节点1和节点2的数值。假设通过神经网络计算出输出层节点1的输出值(实际值)是2.5,输出层节点2的输出值是1.6;而我们期待的节点1和节点2的目标值是3.0和2.0。于是,我们便得到了网络的正向输出值和输出层节点的误差。

  我们注意到,按照当前的计算过程,得到的输出值与目标值的误差非常大,这并不是我们所期待的。那么,我们便需要想法消除误差。此时,便需要用到我们之前提到的权重,通过调节权重来分配误差和调整输入。

  什么意思呢?首先,我们需要了解一个新的概念:误差反向传播。因为我们计算的过程是正向进行的,从而得到输出结果;那么,按照这个思路,我们则需要将误差反向传递回去,以调整每层的权重,从而使神经网络输出正确的数值。

  对于输出层,我们已经计算出了该层每个节点的误差,那么如何将误差反向传递给隐藏层呢?可能你已经想到了,就是利用权重来反向分配误差,示例如图12。比如对于输出层的节点1,假它的节点误差为0.8,由于它的结果来自于隐藏层节点1和节点2的组合,因此误差反向传播时也同样遵循这个原则。

  即按照权重反向分配误差。按照图12中的权重,输出层节点1来自隐藏层节点1的误差应该是:

  那么,按照输出层至隐藏层节点误差的反向传播原理,我们不难计算出隐藏层至输入层的节点误差。假设我们根据给定的输入层至隐藏层的权重,计算出输入层的节点误差分别为0.362和0.938。然后,我们就可以根据误差来更新权重,通过多次尝试,最终总会找到最合适的权重的。

  到这里,我们已经完全明白误差是如何从输出层反向传播至输入层的了,原理很简单,就是根据权重分配误差给每个节点,然后逐步向后传递。

  可能大家已经注意到了,现在对于三层简单的神经网络,我们可以通过手算很快得到结果,那么如果是10层网络,每层都有10个节点呢?是否有更好的办法去计算正向结果和反向的误差传播呢?

  答案是肯定的,解决以上计算的方法就是利用线性代数,或者叫做矩阵乘法。那么如何使用呢?提示大家一下,大家有没有注意到三层神经网络是不是本身就像极了2*3的矩阵(图11或图12),如果大家想了解,那么就去书中寻找吧,作者讲的有趣极了。

  在开始写神经网络的原理之前,我思考了最少有5分钟,怀疑是否可以写好且让大家能够大致明白。5分钟后,我觉得我应该试试,就算讲不清深奥的数学表达式,最起码可以通过一些简单的例子,让大家对神经网络有个大致的概念,然后大家可以通过阅读专业的书籍或学习相关的课程来深入学习。

  所以,以上的内容仅仅就是将神经网络工作的思路给大家大致说一下,让大家觉得神经网络没有那么复杂和神秘,如果能够静心学习,其实还是不难的。如果你读到这里了,我觉得你肯定对神经网络有一点兴趣了,那么我强烈建议你阅读以下开篇提到的书籍,再去读更难一点的书籍。

  每期一个知识点:你知道吗?Python可以拿来学习神经网络哦。如果你要学习Python,那么我首推你用Anaconda来学习,它是Python的发行版。简单说,Anaconda就是将Python包装了一下,可以非常方面的用于数据科学,因为它已经集成了常用包。