为什么要使用Back Propagation?
上模型,直接走到 Forward Propagation 的部分:
j 表示当前层的神经元数量, k 表示上一层神经元的数量,
大括号是激活函数,
下一步,我们要训练神经网络,
对每个神经元对参数w、b进行微调,让预测结果更接近真实值,
怎么对w和b进行微调?
如果是简单的线性模型,
先找到cost function, 根据cost相对于权重W的导数,
然后让W向导数相反的方向,乘以某个学习率,每次改变一点点,
线性模型:
,
可问题是,我们的神经元这么多,
具体到某一个w要怎么调整就成了问题,
求微分也不知道如何下手,
如果我们能知道 总误差cost 相对于某个具体的w的的变化率(微分),
那么我们就知道该如何微调了,
是最后结果的误差,
是某个神经元的权重
变化率(微分)越大,说明这个w(jk)对cost的影响越大,
我们只要让这个微分降到接近0, 就说明它对总体误差已经几乎没有影响了,
换句话说就是,
这个权重w已经调整到位了,它造成的误差很小了
如何求得这个微分呢?
这就是Back Propagation能做到事了
---------------------------
现在开始说Back Propagation
(很多解释都要引入概念 Delta,这里不使用)
上一部分说到总误差cost 相对于某个具体的w的的变化率(微分),
直接求是求不出来的,中间有很多层,让我们一层一层的剥离开来,
最核心关系就是,
是未激活的神经元,l是层数,j是第j个神经元,
我们可以看出,与
的关系就是靠 w 连接的
有什么启示呢,
启示就是,我们可以从最后那个神经元出发, 求出C相对于网络中任意层次的 z 的微分:
是可以求出来的,因为
, (1)
然后 任意相邻两层的z的微分, 根据上面的'核心关系'式,也可以求出来, (2)
,把(1)和(2)两个关系式相乘,你就得到了倒数第二层的z的微分,
根据这个原理,你可以求出倒数第三层,倒数第四层......任意一层的z的微分,
在我们已经能求得 cost相对与任意一个神经元z的微分
再然后,最后一个关系式,, 明显
很容易求出, 因为
所以现在我们就能求出一开始我们想要的
//为了偷懒,后面我省略了下标jk