首页 > 代码库 > [NN] 对于BackPropagation(BP, 误差反向传播)的一些理解
[NN] 对于BackPropagation(BP, 误差反向传播)的一些理解
本文大量参照 David E. Rumelhart, Geoffrey E. Hinton and Ronald J. Williams, Learning representation by back-propagating errors, Nature, 323(9): p533-536, 1986.
在现代神经网络中, 使用最多的算法当是反向传播(BP). 虽然BP有着收敛慢, 容易陷入局部最小等缺陷, 但其易用性, 准确度却是其他算法无可比拟的.
在本文中, $w_{ji}$为连接前一层$unit_{i}$和后一层$unit_{j}$的权值.
在MLP中, 对于后一层神经元$unit_{j}$, 它的输入$x_{j}$按下式进行计算(忽略偏置):
$x_{j} = \sum_{i} y_{i} w_{ji}$
可以看到它的输入等于前一层所有神经元的输出$y_{i}$和对应连接的加权和.
而$unit_{j}$的输出按下式计算:
$y_{j} = \frac{1}{1+e^{-x_{j}}}$.
对于有监督训练, 有期望输出$d$和实际输出$y$, 可以定义误差为:
$E=\frac{1}{2}\sum_{c} \sum_{j}(y_{j,c}-d_{j,c})^2$
为求出$\partial E/\partial w_{ji}$, 我们先求$\partial E/\partial y_{j}$(之后就知道为何如此):
$\partial E/\partial y_{j} = y_{j} - d_{j}$
由链式法则:
$\partial E/\partial x_{j} = \partial E/\partial y_{j} * d y_{j}/d x_{j}$, 及上面的输入输出的关系式
$d y_{j}/d x_{j} = (\frac{1}{1+e^{-x_{j}}})‘ = \frac{e^{-x_{j}}}{(1+e^{-x_{j}})^{2}} = y_{j} * (1-y_{j})$可得:
$\partial E/\partial x_{j} = \partial E/\partial y_{j} * y_{j} * (1-y_{j})$
至此, 我们得到了$Layer_{j}$的误差$E$对于输入$x_{j}$的偏导, 但网络训练的是权值(偏置), 所以我们必须知道$E$对于$w_{ji}$的偏导表达式.
同样由链式法则:
$\partial E/\partial w_{ji} = \partial E/\partial x_{j} * \partial x_{j}/\partial w_{ji}$, 及本层输入和权值的关系式:
$x_{j} = \sum_{i} y_{i} w_{ji}$, 可得 $\partial x_{j}/\partial w_{ji} = y_{i}$, 即:
$\partial E/\partial w_{ji} = \partial E/\partial x_{j} * y_{i}$, 整理一下,
$\partial E/\partial w_{ji} = (y_{j} - d_{j}) * y_{j} * (1-y_{j}) * y_{i}$
其中$y_{i}$为$unit_{i}$的输出(经过了非线性变换), $y_{j}$为$Layer_{j}$的输出.
同样是按照链式法则, 对于第i个神经元, 我们可以求得误差对其输出的梯度:
$\partial E/\partial y_{i} = \partial E/\partial x_{j} * \partial x_{j}/\partial y_{i} = \partial E/\partial x_{j} * w_{ji}$, 考虑到第
到此为止, 使用上式, 只要知道已知的期望输出$d_{j}$和每层的输出$y_{i}$, 我们就可以倒推出误差相对于每层的权值的梯度, 从而对权值进行调整, 调整的公式如下:
$\delta w = -\epsilon \partial E/\partial w$
[NN] 对于BackPropagation(BP, 误差反向传播)的一些理解