手撕神经网络:从零开始实现一个简单的神经网络
1. 前言
现在有很多深度学习平台可以用,甚至我们根本不需要知道网络背后是怎么运行的,就可以训练出我们想要的模型,但是从学习的角度,从零开始写一个简单的神经网络是有必要的,它将有助于理解神经网络的工作原理。
之前有写过基于 TF 的全连接神经网络的实现,可以参考深度学习笔记——全连接神经网络样例程序及详细注释。但是这里将不借助任何深度学习平台来实现一个全连接神经网络,并用这个网络来实现分类任务。
本篇文章主要参考 Implementing a Neural Network from Scratch in Python – An Introduction。
另外如果你想实现一个卷积神经网络,可以参考 CNN-from-Scratch。
2. 网络结构
网络的结构很简单,如下图所示,两层全连接神经网络,激活函数为 t a n h tanh tanh。优化算法为 full batch SGD,没有加 momentum,关于优化算法可以参考 深度学习中常用的优化算法(SGD, Nesterov,Adagrad,RMSProp,Adam)总结。参数初始化方式选用最简单的随机初始化。
用这个网络解决一个二分类问题,数据直接借助 sklearn 生成,借助 matplotlib 来可视化分类的结果。整个代码用 python(ipython)实现。
整个网络的前向传播过程如下:
z 1 = x W 1 + b 1 a 1 = tanh ( z 1 ) = e z 1 − e − z 1 e z 1 + e − z 1 z 2 = a 1 W 2 + b 2 y ^ = a 2 = s o f t m a x ( z 2 ) \begin{aligned} z_1 & = xW_1 + b_1 \\ a_1 & = \tanh(z_1) = \frac{e^{z_1} - e^{-{z_1}}}{e^{z_1} + e^{-{z_1}}} \\ z_2 & = a_1W_2 + b_2 \\ \hat{y} & = a_2 = \mathrm{softmax}(z_2) \end{aligned} z1a1z2y^=xW1+b1=tanh(z