神经网络中的反向传播

反向传播推导。

1. 前言

首先要明确反向传播(Backpropagation)是计算梯度的方法,训练模型用的是优化算法(如SGD,Adam,Adagrad,RMSprop),而大部分优化算法是需要计算梯度的,所以会用到反向传播算法,所以反向传播是深度学习优化算法的基石。换句话说,反向传播用来计算梯度,优化算法用来决定参数如何根据梯度来更新。

2.数学基础:链式法则求导

3.反向传播推导

先举一个例子

推导过程如下(忽略了矩阵的转置和前后顺序):

我们再举一个例子进行推导,下图是一个两层的感知机的正向传播的计算图: 其中网络输入为xx​,输出为oo​ϕ\phi​为激活函数,损失JJ​L=l(o,y)L = l(o,y)​和正则化项ss​组成,

s=λ2(W(1)2F+W(2)2F)s = \frac{λ}{2} ({∥W^{(1)}∥}^{2}{F}+{∥W^{(2)}∥}^{2}{F})

4. 梯度消失/爆炸

本质原因:梯度反向传播过程中的连乘效应

误差从输出层反向传播的时候,在每一层都要乘激活函数 f(x)f(x) 的导数,常见的 sigmoid 和 tanh 激活函数记为 σ(x)\sigma(x)tanh(x)tanh(x),其导数为:

σ(x)=σ(x)(1σ(x))[0,0.25]tanh(x)=1(tanh(x))2[0,1]\sigma^{’}(x) = \sigma(x)(1 - \sigma(x)) \in [0, 0.25]\\ \tanh^{’}(x) = 1 - (\tanh(x) )^2 \in[0, 1] \\

其值域都小于1,因此误差经过每一层的时候会不断递减。当网络层数比较深的时候,梯度不断递减甚至可能消失,这使整个网络很难训练。这被称为梯度消失。

同理,梯度爆炸发生在网络的激活函数的导数大于1的时候。

如何避免两类情况的出现:

  1. 使用浅层网络
  2. 使用 ReLU 函数 或者 Leaky ReLU
  3. LSTM 的结构设计可以改善 RNN 中的梯度消失问题

6. 代码实现

https://github.com/mattm/simple-neural-network/blob/master/neural-network.py

有时间再来填坑复现一次。

7. 参考文献

  1. ML Lecture 7: Backpropagation [video]
  2. ML Lecture 7: Backpropagation [ppt]
  3. 动手学深度学习:正向传播、反向传播和计算图
  4. 用好维度分析,不要直接求导
  5. 活学活用:实现一个简单的神经网络
  6. 反向传播算法入门资源索引