BP反向传播算法

http://blog.csdn.net/u014313009/article/details/51039334


公式推导

  • layer1:输入层
  • layer2:隐藏层
  • layer3:输出层

    * 符号

  • $$W_{jk}^l$$:第$$(l-1)$$层的第$$k$$个神经元连接到第 $$l$$ 层第$$ j $$个神经元的权重

  • $$b_j^l$$:表示第$$(l-1)$$层的第$$l$$个神经元的偏置

  • $$zj^l$$:表示第$$l$$层的第$$j$$个神经元的输入,即:$$z_j^l=\sum\limits{k} w{jk}^l a{k}^{l-1} + b_j^l$$

  • $$a_j^l$$:表示第$$l$$层第$$j$$个神经元的输出

    $$aj^l=\sigma(z_j^l)=\sigma(\sum\limits{k} w_{jk}^l a_k^{l-1}+b_j^l)$$

  • $$\sigma$$: 表示激活函数

* 代价函数

* 二次代价函数

$$C=\frac{1}{2}\sum\limits_{x}||y(x)-a^L(x)||^2$$

  • x: 输入样本
  • y: 实际分类
  • $$a^L$$: 预测的输出
  • $$L$$:神经网络的最大层数

* 公式推导

* 定义

  • 第$$l$$层第$$j$$个神经元中产生的错误(实际值和预测值的误差)定义为

    $$\delta_j^l = \frac{\partial C}{\partial z_j^l}$$

* 最后一层神经网络产生的误差

$$\delta^L=\nabla_a C \odot \sigma^{'}(z^L)$$

  • 证明

$$\delta^L=\frac{\partial C}{\partial z_j^L}=\frac{\partial C}{\partial a_j^L} \frac{\partial a_j^L}{\partial z_j^L}==\frac{\partial C}{\partial a_j^L} \sigma^{'}(z^L)=\nabla_a C\odot \sigma^{'}(z^L)$$

* 由后往前,计算每一层神经网络产生的误差

$$\delta^l=((w^{l+1})^T\delta^{l+1})\odot\sigma^{'}(z^l)$$

  • 证明

$$\delta_j^l=\frac{\partial C}{\partial z_j^l}=\sum\limits_k \frac{\partial C}{\partial z_k^{l+1}}\frac{\partial z_k^{l+1}}{\partial a_j^l}\frac{\partial a_j^l}{\partial z_j^l}$$

$$=\sum\limitsk \delta_k^{l+1} \frac{\partial(w{kj}^{l+1}a_j^l+b_k^{l+1})}{\partial a_j^l}\sigma^{'}(z_j^l)$$

$$=\sum\limitsk \delta_k^{l+1} w{kl}^{l+1}\sigma^{'}(z_j^l)$$

$$=((w^{l+1})^T\delta^{l+1})\odot\sigma^{'}(z^l)$$

* 权重的计算

$$\frac{\partial C}{\partial w{jk}^l}=a{k}^{l-1}\delta_j^l$$

  • 证明

$$\frac{\partial C}{\partial w{jk}^l}=\frac{\partial C}{\partial z_j^l}\frac{\partial z_j^l}{\partial w{jk}^l}$$ $$=\deltaj^l\frac{\partial(w{jk}^lak^{l-1}+b_j^l)}{\partial w{jk}^l}=a_{k}^{l-1}\delta_j^l$$

* 偏置计算

$$\frac{\partial C}{\partial b_j^l}=\delta_j^l$$

  • 证明

$$\frac{\partial C}{\partial bj^l}=\frac{\partial C}{\partial z_j^l}\frac{\partial z_j^l}{\partial b_j^l}=\delta_j^l\frac{\partial (w{jk}^la_k^{l-1}+b_j^l)}{\partial b_j^l}=\delta_j^l$$


* 反向传播算法

* 输入x:

为输入层设置对应的激活值$$a^1$$

* 前向传播:

对于每个$$l=2,3,...,L$$计算相应的$$z^l=w^la^{l-1}+b^l 和 a^l=\sigma(z^l)$$

* 输出层误差:$$\delta^L$$

计算向量$$\delta^L=\nabla_a C \odot\sigma^{'}(z^L)$$

* 反向误差传播:

对于每个$$l=L-1,L-2,...,2$$,计算$$\delta^l=((w^{l+1})^T\delta^{l+1})\odot\sigma^{'}(z^l)$$

* 输出

代价函数的梯度由$$\frac{\partial C}{\partial w_{jk}^l}=a_k^{l-1}\delta_j^l$$和$$\frac{\partial C}{\partial b_j^l}=\delta_j^l$$

results matching ""

    No results matching ""