主旨和本系列目录
《Python实现神经网络》是一个文章系列,目的在于:通过实际编写程序,加深对神经网络所涉及的各类算法的理解。动机描述详见“本系列动机”部分。
截止目前本系列已完成部分目录如下
- Python实现神经网络Part 1: 实现forward和BP算法的神经元 (本文)
- Python实现神经网络Part 2: 训练单个神经元找到最优解
- Python实现神经网络Part 3: 多层全连接神经网络
- 实现神经网络番外:利用Excel实现神经网络和BP算法
本系列文章对应的代码在我的GitHub上SimpleNeuralNetwork项目中
本系列动机
在学习深度学习理论过程中,由神经元(节点)组成的多层全连接神经网络是最基础的概念,如下图所示[1]。
这样一个神经网络要发挥作用,必须有算法支持,这其中包括前向(forward)结果计算,也包括误差反向传播(Backward Propagation, BP),还有基于梯度的参数训练等。
在我自己在学习和应用这些算法的过程中,面临这样一种状况:一方面,理论教材(例如周志华教授的西瓜书以及网络上浩如烟海的资料)从单个神经元开始详细讲解了上述算法的数学原理;另一方面,在目前流行的深度学习框架,例如TensorFlow中,这些功能已经被良好封装,只要调用正确的API就可以实现。这样,学到的数学原理在框架调用中并不能直观的感觉到,虽然已经能用神经网络解决一些问题,但是对于算法基础原理的理解仍然不够深入。
源于此,我开始尝试用代码实现神经网络,希望通过这样的方式加深对神经网络原理性的理解,在今后的工作中更清楚框架(例如TensorFlow)中API的特性与局限。
源代码位置
我的GitHub上SimpleNeuralNetwork项目中NeuralNode.py
神经元的软件设计
在设计中,存在以下假设
- 神经元与前一级iDims个节点有连接,iDims >=0且iDims为整数
- 神经元的输入为1*iDims的向量,记为x
- 神经元的激活函数为Sigmoid Funcrion
从软件的角度,神经元可以抽象为一个对象,此对象包含以下成员
- 权重向量 weight→ : shape =1*iDims,用于保存与前一级iDims个连接中每个连接的权重
- 偏置量 bias :这是一个标量,用于记录偏置值
- 输入向量 x⃗
- 激活函数的输入值