基础不牢,地动山摇。
我在上一篇博客中详细介绍了感知机模型的原理和推导过程,在学习的过程中,我们发现单层感知机模型存在着许多不足,包括:① 模型仅在特征空间线性可分时才能收敛;② 对同样的数据集,感知机模型存在无穷多个解;③ 模型结构简单,并不能表达复杂的函数。这些缺点的存在,使得单层感知机模型“不堪大用”。在实际任务中,我们在更多情况下使用的是如下图所示的多层感知机模型,多层感知机在输入层和输出层之间加入了一个或多个隐藏层,并且每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接,这样的结构也被称为“多层前馈神经网络”。其中输入层负责接收外界输入,但并不对输入进行加工,输入层的神经元没有激活函数;隐藏层和输出层的神经元带有激活函数,它们负责对输入进行加工,最终结果由输出层神经元输出。神经网络的学习过程,就是根据训练集来调整神经元之间相互连接的权值和偏置,换言之,神经网络“学”到的东西,就蕴含在这些权值和偏置中。
1. BP神经网络
多层网络的学习能力比单层感知机强得多,欲训练多层网络,简单感知机学习规则显然不够了,需要更强大的学习算法。误差逆传播(error BackPropagation,简称BP)算法就是其中最杰出的代表,它是迄今为止最成功的神经网络学习算法。我们通常所说的BP神经网络,一般就是指用BP算法训练的多层前馈神经网络。让我们以下图中简单的三层神经网络为例,看看BP算法是如何更新参数的。假设所给的训练集中有
个样本,每个样本有
维特征和
个标签,那么训练集
可以表示为:
样本的特征空间和样本的标签空间分别表示为:
,
让我们从训练集中任取一个样本,其中
,
,以这个样本为例进行推导。推导过程中需要用到的一些符号表示已经在下图中标出(如果看不懂的话,今晚复习到两点!!!)。另设隐藏层和输出层的激活函数为
函数,损失函数使用均方误差,学习率为
,其他相关细节会在推导过程中进行说明。
前向传播过程:
① 输入层:共有个神经元,与样本特征数相同,可接收
个输入
② 隐藏层第个神经元的输入:
③ 隐藏层第个神经元的输出:
④ 输出层第个神经元的输入:
⑤ 输出层第个神经元的输出:
⑥ 网络在这个样本上的均方误差:
反向传播过程:
BP算法是一个迭代学习算法,在迭代过程中采用广义的感知机学习规则对参数进行更新,任意参数的更新公式为:
。此外,BP算法基于梯度下降策略,以误差函数的负梯度方向对参数进行调整(学习率为
),所以参数
的更新公式可以进一步写成:
① 让我们以图中隐藏层到输出层的连接权重为例来进行推导,
的更新公式为:
注意到先影响到输出层第
个神经元的输入值
,再影响到这个神经元的输出值
,最后影响到均方误差
,根据链式求导法则:
根据前向传播过程中的计算式,显然有:
由于函数有一个很好的性质:
,根据前向传播过程中
的计算式,可以得到:
根据前向传播过程中均方误差的计算式,可以得到:
将这些式子代入链式求导法则式,可以得到:
所以,参数的更新公式为:
② 再以输入层到隐藏层的连接权重为例进行推导:
的更新公式为:
注意到,参数先影响到隐藏层第
个神经元的输入值
,再影响到隐藏层第
个神经元的输出值
,再影响到输出层所有的输入值
,再影响到各输入值对应的输出值
,最后影响到均方误差
,根据链式求导法则:
根据前向传播过程中的计算式和
函数的求导性质,可以得到:
根据前向传播过程中的计算式,显然可得:
根据前向传播过程中的计算式,可以得到:
将这些式子代入链式求导法则式,可以得到:
所以,参数的更新公式为:
2. BP神经网络的工作流程
输入:训练集
学习率:
① 在范围内随机初始化网络中所有的参数(连接权重和偏置);
② 选取一个样本,计算网络前向传播过程的输出,用反向传播过程来更新网络参数;
③ 重复②,直至将训练集中所有样本遍历一遍;
④ 重复②③,直至达到停止条件:训练集上的累积误差降低到可接受范围之内;
输出:参数确定的BP神经网络。
3. 一些必要的说明
① 上面介绍并推导的BP算法也被称为“标准BP算法”,它每次更新只针对单个样例,所以参数更新得非常频繁。
② 还有一种“累积BP算法”,它在遍历整个数据集一遍后,才会根据所有训练样本的累积误差对参数进行一次更新。
③ 为了达到同样的累积误差极小点,标准BP算法往往需要比累积BP算法进行更多次数的迭代,但是在数据集非常大时,标准BP算法往往能够更快获得较好的解。
④ 隐藏层的层数并不是多多益善,已有学者证明,只需一个包含足够多神经元的隐藏层,多层前馈神经网络就能以任意精度逼近任意复杂度的连续函数。所以我们在设计BP神经网络时,往往优先考虑增加神经元的数目,而不是增加隐藏层的层数。
参考:
《机器学习》周志华 著