1. 关键词
梯度下降,反向传播
2. 导读
本文介绍了反向传播的数学基础,及其过程。
3. 数学基础
3.1 梯度下降
神经网络求解的目的,是使输出值更接近于真实值,这就转化成一个求最优解或最小值的过程,最常用的就是梯度下降法。从山顶沿负梯度方向(导数的反方向),一步步走到山底。

上图也演示了梯度下降受到起点的影响,得到的是局部最优解,并不一定是全局最优解。
3.2 链式法则
求解梯度就是求导数,但复杂的函数,不能一次性求出。因此需要引入链式法则。
∂x∂z=∂y∂z∂x∂y∂x∂(z+y)=∂x∂z+∂x∂y
3.3 学习率
在得到梯度后,需要选择合适的步长,称作学习率。学习率不是越大,收敛的越快。如下图,左边的学习率大,反而不收敛;右边的学习率小,反而收敛。

学习率一般取一个小的数,或者多尝试几个,选择结果最好的。
4. 代价函数
在机器学习中,寻找最优解的目标函数,通常成为代价函数,表示输出值和真实值的误差。神经网络代价函数很复杂,公式如下:
J(Θ)=−m1[i=1∑mk=1∑Kyk(i)log(hΘ(x(i)))k+(1−yk(i))log(1−(hΘ(x(i)))k)]+2mλl=1∑L−1i=1∑slj=1∑sl+1(Θji(l))2
其中:
-
m,输入数据的数量;
-
i,第 i 次输入,i∈[1,m];
-
k,第 k 个输出单元,k∈[1,K];
-
K,输出单元数量;
-
λ,
-
j,第 L+1 层第 j 个神经元
-
l,第 L 层;
-
L,总层数;
-
sl,第 l 层神经元数量。
因为逻辑回归也使用了 sigmod 函数,所以代价函数有相似之处,注意区分:
J(θ)=−m1[i=1∑my(i)log(hθ(x(i)))+(1−y(i))log(1−(hθ(x(i))))]

每个权重的迭代步骤:
Θji(l)=Θji(l)−α∂Θji(l)∂J(Θ)
其中:
-
l,第 l 层;
-
i,l 下一层第 i 个神经元;
-
j,l 层第 j 个神经元;
-
α,学习率。
对代价函数直接求导不现实,因此要用数值计算的方法。
5. 反向传播
算法步骤:
- 通过前向传播,得到对应的输出;
- 输出与真实值比较,得到误差;
- 将误差从输出层,反向传播到输入层,得到每个权重的梯度;
- 计算新的权重,使用下一组输入,继续迭代。
5.1 误差传递
假设一个4层网络,用 δ(l) 表示第 l 层误差,则输出层误差:
δ(4)=∂z(4)∂E=∂a(4)∂E∂z(4)∂a(4)
其中:
E=k=1∑K21(yk−ak(4))2∂a(4)∂E=−(y−a(4))
∂z(4)∂a(4)==∂z(4)∂(1+e−z(4))−1=(1+e−z(4))2e−z(4)1+e−z(4)1(1−1+e−z(4)1)=a(4)(1−a(4))
带入上式,得到:
δ(4)=−(y−a(4))a(4)(1−a(4))
基于此得到第3层权重梯度:
∂Θji(3)∂J(Θ)=∂wji(3)∂E=δ(4)∂wji(3)∂z(4)=δ(4)ai(3)
基于链式法则,推导第3层误差:
δ(3)=∂z(3)∂E=∂z(4)∂E∂a(3)∂z(4)∂z(3)∂a(3)
因为 z(4) 和 a(3) 是1对多的关系,因此还有求和的过程:
δji(2)=j∑(∂zj(4)∂E∂ai(3)∂zj(4))∂zi(3)∂ai(3)
则:
∂Θji(2)∂J(Θ)=δji(2)ai(2)
同理可以继续推导出上一层。
5.2 例子
《A Step by Step Backpropagation Example》详细介绍了反向传播的计算过程,并用Python实现(公众号回复"反向传播"获取)。这篇文章被很多人引用和翻译过,我就不炒冷饭了,其中翻译较好的有:一文弄懂神经网络中的反向传播法。
6. 附录
6.1 中英文对照表
| 英文 |
中文 |
缩写 |
数学符号 |
| Backpropagation |
反向传播 |
BP |
|
| Batch Gradient Descent |
批量梯度下降 |
|
|
| Chain Rule |
链式法则 |
|
∂x∂z=∂y∂z∂x∂y |
| Cost Function |
代价函数 |
|
J(Θ) |
| Gradient Descent |
梯度下降 |
|
Δ |
| Learning Rate |
学习率 |
|
α |
6.2 扩展阅读