1. 关键词

梯度下降反向传播

2. 导读

本文介绍了反向传播的数学基础,及其过程。

3. 数学基础

3.1 梯度下降

神经网络求解的目的,是使输出值更接近于真实值,这就转化成一个求最优解或最小值的过程,最常用的就是梯度下降法。从山顶沿负梯度方向(导数的反方向),一步步走到山底。
跟我学神经网络2-反向传播
上图也演示了梯度下降受到起点的影响,得到的是局部最优解,并不一定是全局最优解。

3.2 链式法则

求解梯度就是求导数,但复杂的函数,不能一次性求出。因此需要引入链式法则。
zx=zyyx(z+y)x=zx+yx \frac{\partial z}{\partial x}=\frac{\partial z}{\partial y}\frac{\partial y}{\partial x}\\ \frac{\partial(z+y)}{\partial x}=\frac{\partial z}{\partial x}+\frac{\partial y}{\partial x}

3.3 学习率

在得到梯度后,需要选择合适的步长,称作学习率。学习率不是越大,收敛的越快。如下图,左边的学习率大,反而不收敛;右边的学习率小,反而收敛。
跟我学神经网络2-反向传播
学习率一般取一个小的数,或者多尝试几个,选择结果最好的。

4. 代价函数

在机器学习中,寻找最优解的目标函数,通常成为代价函数,表示输出值和真实值的误差。神经网络代价函数很复杂,公式如下:
J(Θ)=1m[i=1mk=1Kyk(i)log(hΘ(x(i)))k+(1yk(i))log(1(hΘ(x(i)))k)]+λ2ml=1L1i=1slj=1sl+1(Θji(l))2 J(\Theta)=-\frac1{m}\left[\sum\limits_{i=1}^{m}\sum\limits_{k=1}^{K}y_k^{(i)}\log\left(h_{\Theta}(x^{(i)})\right)_k+(1-y_k^{(i)})\log\left(1-\left(h_{\Theta}(x^{(i)})\right)_k\right)\right]\\ +\frac\lambda{2m}\sum\limits_{l=1}^{L-1}\sum\limits_{i=1}^{s_l}\sum\limits_{j=1}^{s_{l+1}}(\Theta_{ji}^{(l)})^2
其中:

  • mm,输入数据的数量;
  • ii,第 ii 次输入,i[1,m]i\in[1,m]
  • kk,第 kk 个输出单元,k[1,K]k\in[1,K]
  • KK,输出单元数量;
  • λ\lambda
  • jj,第 L+1L+1 层第 jj 个神经元
  • ll,第 LL 层;
  • LL,总层数;
  • sls_l,第 ll 层神经元数量。

因为逻辑回归也使用了 sigmod 函数,所以代价函数有相似之处,注意区分:
J(θ)=1m[i=1my(i)log(hθ(x(i)))+(1y(i))log(1(hθ(x(i))))] J(\theta)=-\frac1{m}\left[\sum\limits_{i=1}^{m}y^{(i)}\log\left(h_{\theta}(x^{(i)})\right)+(1-y^{(i)})\log\left(1-\left(h_{\theta}(x^{(i)})\right)\right)\right]

跟我学神经网络2-反向传播
每个权重的迭代步骤:
Θji(l)=Θji(l)αΘji(l)J(Θ) {\Theta}_{ji}^{(l)}={\Theta}_{ji}^{(l)}-\alpha\frac{\partial}{\partial{\Theta}_{ji}^{(l)}}{J}(\Theta)
其中:

  • ll,第 ll 层;
  • iill 下一层第 ii 个神经元;
  • jjll 层第 jj 个神经元;
  • α\alpha,学习率。

对代价函数直接求导不现实,因此要用数值计算的方法。

5. 反向传播

算法步骤:

  1. 通过前向传播,得到对应的输出;
  2. 输出与真实值比较,得到误差;
  3. 将误差从输出层,反向传播到输入层,得到每个权重的梯度;
  4. 计算新的权重,使用下一组输入,继续迭代。

5.1 误差传递

假设一个4层网络,用 δ(l)\delta^{(l)} 表示第 ll 层误差,则输出层误差:
δ(4)=Ez(4)=Ea(4)a(4)z(4) \delta^{(4)}=\frac{\partial E}{\partial z^{(4)}}=\frac{\partial E}{\partial a^{(4)}}\frac{\partial a^{(4)}}{\partial z^{(4)}}
其中:
E=k=1K12(ykak(4))2Ea(4)=(ya(4)) E=\sum_{k=1}^{K}\frac{1}{2}(y_k-a_k^{(4)})^2\\ \frac{\partial E}{\partial a^{(4)}}=-(y-a^{(4)})
a(4)z(4)=(1+ez(4))1z(4)=ez(4)(1+ez(4))2=11+ez(4)(111+ez(4))=a(4)(1a(4)) \begin{aligned} \frac{\partial a^{(4)}}{\partial z^{(4)}}=&\frac{\partial (1+e^{-z^{(4)}})^{-1}}{\partial z^{(4)}}=\frac{e^{-z^{(4)}}}{(1+e^{-z^{(4)}})^2}\\ =&\frac{1}{1+e^{-z^{(4)}}}(1-\frac{1}{1+e^{-z^{(4)}}})=a^{(4)}(1-a^{(4)}) \end{aligned}
带入上式,得到:
δ(4)=(ya(4))a(4)(1a(4)) \delta^{(4)}=-(y-a^{(4)})a^{(4)}(1-a^{(4)})
基于此得到第3层权重梯度:
Θji(3)J(Θ)=Ewji(3)=δ(4)z(4)wji(3)=δ(4)ai(3) \frac{\partial}{\partial{\Theta}_{ji}^{(3)}}{J}(\Theta)=\frac{\partial E}{\partial w_{ji}^{(3)}}=\delta^{(4)}\frac{\partial z^{(4)}}{\partial w_{ji}^{(3)}}=\delta^{(4)}a_i^{(3)}
基于链式法则,推导第3层误差:
δ(3)=Ez(3)=Ez(4)z(4)a(3)a(3)z(3) \delta^{(3)}=\frac{\partial E}{\partial z^{(3)}}=\frac{\partial E}{\partial z^{(4)}}\frac{\partial z^{(4)}}{\partial a^{(3)}}\frac{\partial a^{(3)}}{\partial z^{(3)}}
因为 z(4)z^{(4)}a(3)a^{(3)} 是1对多的关系,因此还有求和的过程:
δji(2)=j(Ezj(4)zj(4)ai(3))ai(3)zi(3) \delta_{ji}^{(2)}=\sum_j(\frac{\partial E}{\partial z_j^{(4)}}\frac{\partial z_j^{(4)}}{\partial a_i^{(3)}})\frac{\partial a_i^{(3)}}{\partial z_i^{(3)}}
则:
Θji(2)J(Θ)=δji(2)ai(2) \frac{\partial}{\partial{\Theta}_{ji}^{(2)}}{J}(\Theta)=\delta_{ji}^{(2)}a_i^{(2)}
同理可以继续推导出上一层。

5.2 例子

A Step by Step Backpropagation Example》详细介绍了反向传播的计算过程,并用Python实现(公众号回复"反向传播"获取)。这篇文章被很多人引用和翻译过,我就不炒冷饭了,其中翻译较好的有:一文弄懂神经网络中的反向传播法

6. 附录

6.1 中英文对照表

英文 中文 缩写 数学符号
Backpropagation 反向传播 BP
Batch Gradient Descent 批量梯度下降
Chain Rule 链式法则 zx=zyyx\frac{\partial{z}}{\partial x}=\frac{\partial z}{\partial y}\frac{\partial y}{\partial x}
Cost Function 代价函数 J(Θ)J(\Theta)
Gradient Descent 梯度下降 Δ\Delta
Learning Rate 学习率 α\alpha

6.2 扩展阅读

相关文章: