这是对前面自己建造深度学习库的继续版本
上回说道,我想自己建造深度学习库,用纯C++实现,并且只用C++接口,但是由于基础设施并不是非常完善,几乎要放弃了。但是好在在我即将放弃的时候,我发现还是有可能搭建出来的。今天的主题就是在seth中实现反响传播。
反向传播公式推导
现在很多人搞深度学习,人工智能,但是我感觉能够推导反向传播公式的没有几个人。其中也包括我,既然明知不足,那就去把这个坑填一下。接下来我会用手工的方式来推倒一下反向传播公式。
在这里不得不称赞一下牛逼的typora markdown编辑器,要不是它,我想我无法继续创作。好闲话不多说,让我们直接开始今天的推到,前方一大波公式预警。
所有的一切起源于下面四个公式,我称之为神经网络反向传播四大公示:
$$\delta^L=\Delta_aC\odot\sigma’(z^L)$$ (BP-1)
$$\delta^l = (W^{l+1}\delta^{l+1})\odot\sigma’(z^l)$$ (BP-2)
$$\frac{\partial C}{\partial b^l} = \delta ^l$$ (BP-3)
$$\frac{\partial C}{\partial W^l} = W^{l-1} \delta ^ l$$ (BP-4)
OK, 上述四个公式便是牛逼的反向传播四大公式了,有了它就可以进行反向传播。但是在这里我就不一一推导了。比较简单,其中第一个公式是计算最后一层的梯度。那么这个最后一层的梯度就可以一层一层向前传播,使用公式2.
编程实现反向传播
既然公式已经出来了,那么就编程实现它吧。在这里有个问题,那就是这个梯度的维度到底是多少啊???我们在进行前向传播的时候,最终的误差应该是