购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2 感知机与神经网络

深度学习看起来就像是一个黑箱机制,输入各种非结构化的数据之后出来预测结果。例如,输入一段语音,输出为“Hello, World!”这样的文本;输入一张狗的图像,输出为“狗”这样的标签;输入一副棋盘和当前的局势,输出为下一步的走棋方式;输入“你好!”这样一句中文,输出为“Hi!”这样一句英文;等等。我们很难对输入与输出之间的模型转化过程给出一个合理的解释。在实际工作中,调用像TensorFlow这样优秀的深度学习框架能够快速搭建起一个深度学习项目,但在学习深度学习时,不建议大家一开始就上手各种深度学习框架,希望大家能和笔者一起,在把基本原理弄清楚之后利用Python自己手动去编写模型和实现算法细节。

为了学习深度学习和各种结构的神经网络,我们需要从头开始。感知机作为神经网络和支持向量机的理论基础,一定要清楚其中的模型细节。简单来说,感知机就是一个旨在建立一个线性超平面对线性可分的数据集进行分类的线性模型,其基本结构如图1.1所示。

图1.1 感知机的基本结构

图1.1从左到右为感知机模型的计算执行方向,模型接受了x 1、x 2、x 3三个输入,将输入与权值参数w进行加权求和并经过sigmoid函数进行激活,将激活结果y作为输出,这便是感知机执行前向计算的基本过程。这样就行了吗?当然不行。刚刚只是解释了模型,对策略和算法并未做出解释。当执行完前向计算得到输出之后,模型需要根据当前的输出和实际的输出按照损失函数计算当前损失,计算损失函数关于权值和偏置的梯度,然后根据梯度下降法更新权值和偏置,经过不断地迭代调整权值和偏置使损失最小,这便是完整的单层感知机的训练过程。图1.2所示是输入为图像的感知机计算过程。

前面介绍的是单层感知机,单层感知机包含两层神经元,即输入与输出神经元,可以非常容易地实现逻辑与、逻辑或和逻辑非等线性可分情形,但是单层感知机的学习能力是非常有限的,对于像异或问题这样的线性不可分情形,单层感知机就搞不定了(所谓线性不可分,即对于输入训练数据,不存在一个线性超平面能够将其进行线性分类)。其学习过程会出现一定程度的振荡,权值参数w难以稳定下来,最终不能求得合适的解,异或问题如图1.3(c)所示。

图1.2 输入为图像的感知机计算过程

图1.3 异或问题

对于线性不可分的情况,在感知机基础上一般有两个解决方向,一个是著名的支持向量机,旨在通过核函数映射来处理非线性的情况,而另一种就是神经网络模型。这里的神经网络模型也叫作多层感知机(MultiGLayer Perceptron, MLP),与单层感知机在结构上的区别主要在于MLP多了若干隐藏层,这使得神经网络能够处理非线性问题。

图1.4 单隐藏层的神经网络的结构

一个单隐藏层的神经网络的结构,如图1.4所示。

从图1.4中可以看出,相较于两层神经元的单层感知机,该多层感知机中间多了一个隐藏层。何为隐藏层?即在神经网络的训练过程中只能观察到输入层和输出层的数据,对于中间隐藏层的数据变化是看不见的,因而在深度神经网络(Deep Neural Networks, DNN)中,将中间看不见又难以对其效果进行合理解释的隐藏层称为“黑箱子”。

含隐藏层的神经网络是如何训练的呢?与感知机一样,神经网络的训练依然包含前向计算和反向传播(Back Propaggtion, BP)两个主要过程。当然,单层感知机没有反向传播这个概念,而是直接建立损失函数对权值和偏置参数进行梯度优化。简单来说,前向计算就是权值偏置与输入的线性加权和激活操作,在隐藏层上有个嵌套的过程。这里重点讲解反向传播算法(也称为误差逆传播算法),作为神经网络的训练算法,反向传播算法可谓是目前最成功的神经网络学习算法。通常所说的BP神经网络就是指应用反向传播算法进行训练的神经网络模型。

那么,反向传播算法的工作机制究竟是怎样的呢?这里需要大家复习一下在大学本科阶段学习的微积分知识。下面以一个两层(单隐藏层)网络为例,即图1.4中的网络结构,给大家详细推导一下反向传播的基本过程。

假设输入层为x,输入层与隐藏层之间的权值和偏置分别为w 1 和b 1 ,线性加权计算结果为Z 1 =w 1 x+b 1 ,采用sigmoid激活函数,激活输出为a 1 =σ(Z 1 )。而隐藏层到输出层的权值和偏置分别为w 2 和b 2 ,线性加权计算结果为Z 2 =w 2 x+b 2 ,激活输出为a 2 =σ(Z 2 )。所以,这个两层网络的前向计算过程为x→Z 1 →a 1 →Z 2 →a 2

可以看出,反向传播的直观理解就是将前向计算过程反过来,但必须是梯度计算的方向反过来,假设这里采用如式(1.1)所示的交叉熵损失函数。

反向传播是基于梯度下降策略的,主要是以目标参数的负梯度方向对参数进行更新,所以基于损失函数对前向计算过程中各个变量进行梯度计算就非常必要了。将前向计算过程反过来,那么基于损失函数的梯度计算顺序就是da 2 →dZ 2 →dw 2 →db 2 →da 1 →dZ 1 →dw 1 →db 1 。下面从输出a 2 开始进行反向推导,输出层激活输出为a 2 ,那么首先计算损失函数L(y, a)关于a 2 的微分da 2 ,影响输出a 2 的是谁呢?由前向传播可知,a 2 是由Z 2 经激活函数激活计算而来的,所以计算损失函数关于Z 2 的导数dZ 2 必须经由a 2 进行复合函数求导,即微积分上常说的链式求导法则。然后继续往前推,影响Z 2 的又是哪些变量呢?由前向计算Z 2 =w 2 x+b 2 可知,影响Z 2 的有w 2 、a 1 和b 2 ,继续按照链式求导法则进行求导即可。最终以交叉熵损失函数为代表的两层神经网络的反向传播向量化求导计算公式如下。

注意:链式求导法则是对复合函数进行求导的一种计算方法,复合函数的导数是构成复合函数的这有限个函数在相应点的导数的乘积,就像锁链一样一环套一环,故称为链式法则。

有了梯度计算结果之后,便可根据权值更新公式对权值和偏置参数进行更新了,具体计算公式如式(1.10)所示,其中η为学习率,是一个超参数,需要在训练时手动指定,当然也可以对其进行调参以取得最优超参数。

w=w-ηdw

(1. 10)

以上便是BP神经网络模型和算法的基本工作流程,如图1.5所示。总结起来就是前向计算得到输出,反向传播调整参数,最后以得到损失最小时的参数为最优学习参数。

图1.5 BP神经网络模型和算法的基本工作流程

经过近十几年的发展,神经网络的结构已经从普通的全连接网络发展到卷积神经网络、循环神经网络、自编码器、生成式对抗网络和图神经网络等各种各样的结构,但BP算法一直是神经网络的一个经典和高效的寻优工具。

通过本节内容来看,训练一个BP神经网络并非难事,优秀的深度学习框架有很多,读者通过几行代码就可以搭建起一个全连接网络。但是,为了掌握神经网络的基本思维范式和锻炼实际的编码能力,希望读者能够利用Python在不调用任何算法包的情况下根据算法原理手动实现神经网络模型。

本讲习题

根据BP算法手动编写一个两层网络,并生成模拟数据测试该网络。 9sU5i13LbObBpKMcwWd4dIqr0e7pQc4W03SutqU/yMK4mG485BVIvOpz40bnNy29

点击中间区域
呼出菜单
上一章
目录
下一章
×