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$$