反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。其主要思想是:
(1)将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果,这是ANN的前向传播过程;
(2)由于ANN的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;
(3)在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。
反向传播算法的思想比较容易理解,但具体的公式则要一步步推导,因此本文着重介绍公式的推导过程。
1. 变量定义
![](https://i-blog.csdnimg.cn/blog_migrate/ee6d7867caea9a3856db158577d42197.png)
上图是一个三层人工神经网络,layer1至layer3分别是输入层、隐藏层和输出层。如图,先定义一些变量:
![](https://i-blog.csdnimg.cn/blog_migrate/d4fa0b2b0d7467a92c055fadfadf2d52.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/ad837ecf5c22700180ec9529b82094c8.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/458ee0d6aecc668921c65bf2ef3ea92c.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/91af607c59dcd3d12de8a1336974df23.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/f451028b8f4ce710d010c93467978030.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/88ad71fd356f9c4194caca4c5f2a418c.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/91af607c59dcd3d12de8a1336974df23.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/f451028b8f4ce710d010c93467978030.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/38c18da773c84b1e8b6414edddaa4fc6.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/91af607c59dcd3d12de8a1336974df23.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/f451028b8f4ce710d010c93467978030.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/a215b0a50634831605d42ce563258987.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/3630e863b687022b4838a07786b8a899.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/91af607c59dcd3d12de8a1336974df23.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/f451028b8f4ce710d010c93467978030.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/6319e38717b6627f88969f51c966fecd.jpeg)
其中
表示激活函数。
![](https://i-blog.csdnimg.cn/blog_migrate/8ba46eb0f46cab6a79da576ecf8397b5.jpeg)
如果你觉得这篇文章看起来稍微还有些吃力,或者想要系统地学习人工智能,那么推荐你去看床长人工智能教程。非常棒的大神之作,教程不仅通俗易懂,而且很风趣幽默。点击这里可以查看教程。
2. 代价函数
代价函数被用来计算ANN输出值与实际值之间的误差。常用的代价函数是二次代价函数(Quadratic cost function):
![](https://i-blog.csdnimg.cn/blog_migrate/a0b2f1af5dcc0bb5d92d437a306853b2.jpeg)
其中,
表示输入的样本,
表示实际的分类,
表示预测的输出,
表示神经网络的最大层数。
![](https://i-blog.csdnimg.cn/blog_migrate/f40b6ee14c8182509e258c635eea6b23.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/2d9f3ee9f91ae5a31e159362fb623db0.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/606b52a14d0309458add6ec75ef8c437.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/868e364ca25c1394bcc62f114fa4fe33.jpeg)
3. 公式及其推导
本节将介绍反向传播算法用到的4个公式,并进行推导。如果不想了解公式推导过程,请直接看第4节的算法步骤。
首先,将第
层第
个神经元中产生的错误(即实际值与预测值之间的误差)定义为:
![](https://i-blog.csdnimg.cn/blog_migrate/91af607c59dcd3d12de8a1336974df23.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/f451028b8f4ce710d010c93467978030.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/30e095ce200bea57f6a54ba5b2154fbe.jpeg)
本文将以一个输入样本为例进行说明,此时代价函数表示为:
![](https://i-blog.csdnimg.cn/blog_migrate/5998318f624fb33d46fc5a7ec21542be.jpeg)
公式1(计算最后一层神经网络产生的错误):
![](https://i-blog.csdnimg.cn/blog_migrate/d4f5ee3bf149898f194a02987e2ac257.png)
其中,
表示Hadamard乘积,用于矩阵或向量之间点对点的乘法运算。
公式1的推导过程如下:
![](https://i-blog.csdnimg.cn/blog_migrate/7a0ea7d756935c9b0834e59eb5fc62b0.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/90801388b87394f01ad7bc2d32f0ad56.png)
公式2(由后往前,计算每一层神经网络产生的错误):
![](https://i-blog.csdnimg.cn/blog_migrate/b188e7c3c4dc2a6c089aa4a7e8e5bef0.png)
推导过程:
![](https://i-blog.csdnimg.cn/blog_migrate/b2c241bd0a2b7c2e031428ff668d8d75.png)
公式3(计算权重的梯度):
![](https://i-blog.csdnimg.cn/blog_migrate/17381608546a80aeb15329d9e2ed9a73.png)
推导过程:
![](https://i-blog.csdnimg.cn/blog_migrate/90293154c3881fb236fe8e060aeb0b10.png)
公式4(计算偏置的梯度):
![](https://i-blog.csdnimg.cn/blog_migrate/62f0790965f0abc9022c1852c15c0929.png)
推导过程:
![](https://i-blog.csdnimg.cn/blog_migrate/4cbf56e3e72bfb33b079720648b5c7f3.png)
4. 反向传播算法伪代码
- 输入训练集
- 对于训练集中的每个样本x,设置输入层(Input layer)对应的激活值
:
- 前向传播:
![](https://i-blog.csdnimg.cn/blog_migrate/61e15490da0a25fb11f6f7738b7ef714.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d1c340653d2228cc332d8a66e78ee6be.png)
-
- 计算输出层产生的错误:
![](https://i-blog.csdnimg.cn/blog_migrate/dc21a452fc0346627db526c7d5621a7a.png)
-
- 反向传播错误:
![](https://i-blog.csdnimg.cn/blog_migrate/a822d2de331fd12423d209dfa0fb91af.png)
- 使用梯度下降(gradient descent),训练参数:
![](https://i-blog.csdnimg.cn/blog_migrate/221d6d44b66cb6cf8bf79cbee17ede79.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f7e643ac6dfd45590ec899bbeef32adf.png)