在现代神经网络中, 使用最多的算法当是反向传播(BP). 虽然BP有着收敛慢, 容易陷入局部最小等缺陷, 但其易用性, 准确度却是其他算法无可比拟的.
在本文中, wji 为连接前一层 uniti 和后一层 unitj 的权值.
在MLP中, 对于输出层神经元 unitj , 它的输入 xj 按下式进行计算(忽略偏置):
xj=∑iyiwji
可以看到它的输入等于前一层所有神经元的输出 yi 和对应连接的加权和, 如上图
而 unitj 的输出按下式计算:
yj=11+e−xj . 这就是一个非线性变换sigmoid,
对于有监督训练, 期望输出 d 和实际输出 y 现在都是已知的, 定义误差为:
E=12∑c∑j(yj,c−dj,c)2
其中的 c 是输入-输出样本对的标号, j 是输出层神经元的标号.
为求出 ∂E/∂wji ,
我们先求 ∂E/∂yj (之后就知道为何如此):
∂E/∂yj=yj−dj , 此为误差 E 对神经元 unitj 输出的偏导.
由链式法则:
∂E/∂xj=∂E/∂yj∗dyj/dxj , 及上面的输入输出的关系式
dyj/dxj=(11+e−xj)′=e−xj(1+e−xj)2=yj∗(1−yj)
我们可以求出误差 E 对 unitj 的输入 xj 的偏导:
∂E/∂xj=∂E/∂yj∗yj∗(1−yj)
至此, 我们得到了误差 E 对于 unitj 输入 xj 的偏导, 但网络训练的是权值(偏置), 所以我们必须知道 E 对于 wji 的偏导表达式.
同样由链式法则:
∂E/∂wji=∂E/∂xj∗∂xj/∂wji , 及本层输入和权值的关系式:
xj=∑iyiwji , 可得 ∂xj/∂wji=yi , 即:
∂E/∂wji=∂E/∂xj∗yi ,
其中 yi 为前一层神经元 uniti 的输出, yj 为后一层神经元 unitj 的输出.
为了处理中间层, 我们同样是按照链式法则, 对于第i个神经元, 我们可以求得误差 E 对其输出 yi 的梯度(注意这里是 yi , 不是 yj ):
∂E/∂yi=∂E/∂xj∗∂xj/∂yi=∂E/∂xj∗wji ,
考虑到第i个神经元的所有连接, 可以得到:
∂E/∂yi=∑j∂E/∂xj∗wji (1)
这里的 ∂E/∂xj 为误差对于后一层的神经元 unitj 输入 xj 的偏导.
我们梳理一下:
对于连接神经元 i 和神经元 j 的权值 wji , 主要有3个偏导分子, 输入 xj , 输出 yj 和权值 wji , 他们的关系如下:
∂E/∂xj=∂E/∂yj∗yj∗(1−yj) (2)[基于 yj 和 xj 的非线性转换关系式];
∂E/∂wji=∂E/∂xj∗yi (3)[基于 xj 和 yi 的加权求和公式].
为求得上面的式(3), 我们需要求得 ∂E/∂xj , 而为求得 ∂E/∂xj , 需要求得 ∂E/∂yj .
对于输出层(最后一层), ∂E/∂yj=yj−dj ;
对于中间层, ∂E/∂yi 按式(1)进行计算, 而式(1)中的 ∂E/∂xj 是由 ∂E/∂yj=yj−dj 算出来的. 当我们算出中间层的 ∂E/∂yi 之后, 把式(2)中的 yj 全部替换成 yi 就可以计算出 ∂E/∂xi 从而计算出式(3), 注意此时的式(3)中的 yi 应该变为第i个神经元的前一层的对应神经元.
如此迭代, 我们就可以更新所有的权值啦.
权值调整的公式如下:
δw=−ϵ∂E/∂w
总结:
BP的精髓: 如何通过链式法则求出
∂E/∂wji
求法:
注意, 以下推导, 统一使用 i 作为当前层前一层的神经元下标, j 作为当前层的神经元下标, k 作为后一层神经元下标.
对于最后一层:
∂E/∂wji=∂E/∂xj∗∂xj/∂wji (1)
其中,
∂E/∂xj=∂E/∂yj∗∂yj/∂xj (2)
∂xj/∂wji=yi (3, 已求出, 谢谢背锅侠指正)
式(2)中,
∂E/∂yj=yj−dj (已求出)
∂yj/∂xj=yj∗(1−yj) (已求出)
从而计算出误差对[最后一层到倒数第二层的权值]的梯度.
∂E/∂wji=(yj−dj)∗yj∗(1−yj)∗yi
对于倒数第二层:
唯一变化的只有 ∂E/∂yj 的求法. 同样适用链式法则展开:
∂E/∂yj=∂E/∂yk∗∂yk/∂yj
, 其中
yk
为后一层(最后一层)的第
个神经元输出.
由于 ∂E/∂yk=yk−dk (非固定, 每层表达式取前一层计算结果),
而 ∂yk/∂yj=∂yk/∂xk∗∂xk/∂yj ,
其中 ∂yk/∂xk=yk∗(1−yk) (固定的, 每层表达式都一样)
∂xk/∂yj=wkj (固定的, 每层表达式都一样)
故 ∂yk/∂yj=yk∗(1−yk)∗wkj (固定的, 每层表达式都一样)
从而有 ∂E/∂yj=∂E/∂yk∗yk∗(1−yk)∗wkj (非固定, 用于下一层的误差梯度计算)
最终:
∂E/∂wji=∂E/∂yj∗yj∗(1−yj)∗yi
倒数第三层
可将倒数第二层求出的的 ∂E/∂yj 作为本层的 ∂E/∂yk , 可计算出 ∂E/∂yj , 从而计算出 ∂E/∂wji .
相关文章:点击打开链接