章节 01
导读 / 主楼:从零开始理解神经网络:纯NumPy实现深度学习基础
一个完全使用NumPy从零构建的动态神经网络项目,实现了前向传播、反向传播、小批量梯度下降等核心机制,帮助理解现代深度学习框架背后的数学原理。
正文
一个完全使用NumPy从零构建的动态神经网络项目,实现了前向传播、反向传播、小批量梯度下降等核心机制,帮助理解现代深度学习框架背后的数学原理。
章节 01
一个完全使用NumPy从零构建的动态神经网络项目,实现了前向传播、反向传播、小批量梯度下降等核心机制,帮助理解现代深度学习框架背后的数学原理。
章节 02
这个项目的起点看似简单——用多层感知机训练一个XOR逻辑门。然而,正是这个看似基础的问题引发了一系列更深入的思考:反向传播到底是如何工作的?损失函数在数学上真正在做什么?为什么要使用批量训练而非单样本更新?
一个问题引出下一个问题,最终导向了这个项目的诞生——一个完全使用NumPy从零构建的动态神经网络。没有PyTorch,没有Keras,没有TensorFlow,每一个运算都是手写实现。这种"从零开始"的方法虽然效率不高,却是理解深度学习本质的最佳途径。
章节 03
项目实现了一个功能完整的神经网络框架,具备以下核心特性:
章节 04
用户可以通过一行代码定义任意层结构,这种灵活性使得从浅层网络到深层网络的切换变得异常简单:
# 浅层网络示例
nn = model(structure=[784, 128, 10], base_address="path/")
# 深层网络示例
nn = model(structure=[784, 256, 128, 64, 10], base_address="path/")
这种设计体现了神经网络架构设计的核心思想:输入维度、隐藏层配置、输出类别数都可以自由组合,而框架会自动处理层间连接的权重矩阵初始化。
章节 05
项目采用了经典的双层激活策略:
隐藏层使用ReLU:选择ReLU(线性整流单元)作为隐藏层激活函数是经过深思熟虑的。相比传统的Sigmoid或Tanh,ReLU具有计算简单、梯度不会饱和的优势,有效缓解了深层网络中的梯度消失问题。
输出层使用Softmax:Softmax将原始输出分数转换为概率分布,使得所有输出节点的值介于0到1之间且总和为1,这对多分类任务至关重要。
章节 06
项目实现了He初始化策略,这是专门为ReLU网络设计的权重初始化方法。核心思想是根据输入维度调整初始权重的尺度,使得前向传播时各层的激活值保持合理的分布,避免梯度爆炸或梯度消失。数学上,He初始化从均值为0、方差为2/n的高斯分布中采样权重,其中n是输入节点数。
章节 07
反向传播是神经网络训练的基石,也是这个项目最具教育价值的部分。
章节 08
前向传播的过程直观明了:输入数据从输入层进入,经过每一层的线性变换(权重矩阵乘法加偏置)和激活函数处理,最终到达输出层。对于隐藏层,使用ReLU激活:
a = max(0, z) # ReLU: 保留正值,将负值置零
对于输出层,使用Softmax将logits转换为概率分布:
softmax(z_i) = exp(z_i) / sum(exp(z_j))