本文就 coursera 上斯坦福大学吴恩达教授的《机器学习》课程中的误差反向传播算法(Error Back Propagation)进行推导证明
明确一些记法
简单将神经网络的示意如下,有助于推导过程中理解,读者也可自己画出示意图:
本文沿用公开课中的符号记法:
- 用字母
和 分别表示每个神经元上的输入和输出;其上标 表示该神经元所在的层数, 表示神经网络的总层数;其下标 表示该神经元在该层的标号,并用 表示第 层神经元的总个数。 - 特别地,习惯用
下标表示输出层的神经元标号, 表示输出层神经元的总数,即 - 用希腊字母
表示系数矩阵,它应该是一个三维矩阵。 表示第 层的系数矩阵,它应该是一个 矩阵。 - 用
表示 S 型函数(Sigmoid function): - 且容易得:
表示训练样本,当有多个训练样本时,用上标进行标号。并字母 表示训练样本的总数。
需要注意,除了输出层外,每一层都应加入一个偏置项:
根据以上记法,有:
* 另外,文中一般使用粗体字母表示矩阵(或向量),如
目的
我们已经走得太远,以至于忘记了为什么而出发 ——纪伯伦
注
我们要时刻记得我们想要得到什么,以至于当我们在进行复杂的推导过程中仍能清楚的知道每一步的意义,和接下来的方向。
BP 算法是神经网络参数训练的重要算法,其关键在于得到代价函数
有了这些导数值我们就可以利用梯度下降或其他经典算法,很容易地(调用库)对代价函数
总而言之,我们的目的是得到一系列形如
代价函数
如何选取合适的代价函数呢?当我们观察神经网络的最后一层时,可以把它看作输入为
便得到了神经网络的代价函数:
其中
* 代价函数在不同的算法中可能有细微差别,在西瓜书的BP算法一节中使用了均方误差作为代价函数,其值约等于上述代价函数,并且反向传播的推导过程基本一致。
最后一层参数的偏导
为简化记法,我们先在只有一个样本
由
由
分别计算上式中的 3 项:
由
由
将上述三式带回
并且有,
记
称为第
至此,我们便得到代价函数对最后一层参数的偏导:
且有:
向前传播
下面求代价函数
由
因此由上述 3 式知对于任意一个
分别计算上式各导数项,得:
记
则有:
结合
找出通式
至此,我们求得了代价函数对
我们对前面两步得到的结果稍作整理,得到:
自然地,我们倾向于作出以下猜想:(如果你觉得这个猜想不够“自然”,可以继续求出
假设一:若记:
则对任意
若该假设正确,我们便得到了反向逐层求解代价函数对参数的偏导的方法。
接下来证明该假设是否正确。
归纳证明
显然,我们得到的
时,考察
由
将
结合
所以 假设一 对
矩阵表示法
以上 假设一 的内容就是 BP 算法的核心内容,在更多情况下还可以使用矩阵来表示:
若记:
多样本的情况
在矩阵表示法的基础下,容易写出在
根据多样本下的代价函数(
正则化
为了一定程度地防止过拟合的情况地发生,选取合适的
则:
*BP 算法的使用
至此,我们已经将 BP 算法的核心内容的数学原理推导并阐述完整了。
用伪代码表示使用 BP 算法来求解偏导的大致过程如下(其中
需要注意的是,在实际使用中,上述过程很多步骤可以转换为矩阵运算以提升性能。
[注1] 这句话网传出自黎巴嫩诗人纪伯伦,但我在网络上并未查到确切证据或出处,甚至浏览了网上传言出处得作品,并未得到印证。如果你知道这句话的出处,请指正!