手写python神经网络

如果你已经读过了传统机器学习的书,相信你下一步就会对神经网络和深度学习产生兴趣,但却往往苦于不知道该从何入手。

在这里我推荐给大家一本神经网络的好书给大家,对于没有任何数学基础的同学可以完全看懂整个数学证明原理,并且能实现出神经网络模型,而且本书非常轻薄,读起来就像故事一样:

Python神经网络编程》。

推荐学习方法

先读附录,把其中的微积分知识学习一下,然后再开始从头学习。

对于书中所有的证明,务必争取看懂,不要跳过。

唯一绊住我的地方就是梯度下降的公式推导,其中有一处Σ求和公式略带误导性,其关键在于微分公式中唯一的变量只有Wij(特指某一个权重),而其他的权重都是已知量,因此可以消解。

实现关键

神经网络的训练分为3步:

  • 信号前馈:根据权重矩阵,从输入层开始,逐层传递信号到输出层。
  • 误差反向传播:先计算输出层的误差,然后根据权重矩阵,反向逐层传播误差到各个层的神经元。
  • 梯度下降调整权重:因为计算出了所有层的每个神经元的误差,因此根据误差与权重之间的微分公式,可以根据误差值和当前权重算出此时的斜率,进而对权重进行一定的下降调整,这就是学习权重的过程,其目的就是误差最小化,当然这里需要通过学习率调节学习的速度。

我的实践

我的神经网络代码在这里:https://github.com/owenliang/NeuralNetwork

对于官方测试集的识别率接近97%左右,但对我个人手写的识别率要差很多,相信只有更高级的卷积模型才能进一步改善这个问题。

我另外改造了一版支持多个隐藏层的神经网络模型,但是发现增加更多的隐层并没有带来性能上升,反而精度下降了,据说这是因为模型过于复杂,而数据量太小并且过于简单,而这个更多隐层的神经网络应该就叫做深度神经网络了吧。

总结

读完这本书的感受是,理解神经网络一定要理解其数学原理,而如何把复杂的数学原理讲简单,这就是这本书的价值,可见作者水平之高。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~