看了网上的帖子,写的很好,不过我还是想自己整理下,有的地方原来的博主还是有点散了,不过建议先看原博,然后在按照如下思路展开,不然可能有点跳跃。
自己认为下面的思路还是很清晰的,编辑公式就花了我好长时间啊。。。
正向传播是为了计算net out的值
反向传播
首先说一下sigmoid函数的一个比较好的特点:
f′(x)=f(x)∗(1−f(x))
(1)隐含层—->输出层
∂Etotal∂W5=∂Etotal∂outo1∗∂outo1∂neto1∗∂neto1∂w5=δo1∗∂neto1∂w5=δo1∗outh1
在这里δo1=∂Etotal∂outo1∗∂outo1∂neto1表示输出层的误差含义如下
∂Etotal∂outo1∗∂outo1∂neto1=δo1=∂Etotal∂neto1=(∂Eo1∂outo1+∂Eo2∂outo1)∗∂outo1∂neto1=(∂Eo1∂outo1+0)∗∂outo1∂neto1=[−(targeto1−outo1)]∗[outo1(1−outo1)]
因此原式带入后:
∂Etotal∂W5=∂Etotal∂outo1∗∂outo1∂neto1∗∂neto1∂w5=δo1∗outh1=[−(targeto1−outo1)∗outo1(1−outo1)]∗[outh1]
(2)隐含层—->隐含层
∂Etotal∂W1=∂Etotal∂outh1∗∂outh1∂neth1∗∂neth1∂w1
这里的∂Etotal∂outh1可推导如下:
∂Etotal∂outh1=∂Eo1∂outh1+∂Eo2∂outh1=(∂Eo1∂neto1∗∂neto1∂outh1)+(∂Eo2∂neto2∗∂neto2∂outh1)=[(∂Eo1∂outo1∗∂outo1∂neto1)∗∂neto1∂outh1]+[(∂Eo2∂outo2∗∂Eo2∂outo2)∗∂neto2∂outh1]=[−(targeto1−outo1)∗outo1(1−outo1)∗w5]+[−(targeto2−outo2)∗outo2(1−outo2)∗w6]
为了简化公式记δ(h1)表示隐含层单元h1的误差为
∂Etotal∂w1=∑i=12[(∂Etotal∂outoi∗∂outoi∂netoi)∗∂netoi∂outh1]∗∂outh1∂neth1∗∂neth1∂w1=∑i[δoi∗wh?]∗[outh1∗(1−outh1)]∗[i1]=δh1∗i1
这里的δ和链接顶部的公式是同一个公式,所以为什么偏导是这样的也就解释清楚了,当然在链接也给出了形式化的证明
对比这上面两个,可以发现两个后面的红色字体部分是一样的,只不过针对两个层需要稍微改动点,并且两个偏导数的形式是一样的