神经网络是权重与偏置的线性变换叠加非线性激活函数的数学模型,基本结构含输入层、隐藏层(可选)、输出层;前向传播计算z=Wx+b后经ReLU/Sigmoid激活;反向传播通过链式法则更新参数;可用NumPy从零实现单层感知机及多层全连接网络,并辅以归一化、Mini-batch、学习率衰减和早停等技巧提升训练稳定性。

理解神经网络的基本结构
神经网络本质是一系列数学运算的组合,核心是权重(weight)和偏置(bias)的线性变换,叠加非线性激活函数。一个最简前馈网络包含输入层、隐藏层(可选)、输出层。每层神经元接收上一层输出,做 z = Wx + b 计算,再经 ReLU 或 Sigmoid 等函数得到激活值。
用NumPy从零搭建单层感知机
不依赖PyTorch或TensorFlow,纯Python+NumPy即可实现训练逻辑:
- 初始化权重矩阵 W 和偏置向量 b(如用随机小数)
- 前向传播:计算 z = X @ W.T + b,再用 sigmoid(z) 得预测概率
- 损失计算:对二分类常用二元交叉熵 loss = -y*log(y_pred) - (1-y)*log(1-y_pred)
- 反向传播:推导梯度 dW = (y_pred - y) @ X,db = sum(y_pred - y)
- 参数更新:用学习率 lr 执行 W -= lr * dW,b -= lr * db
扩展为多层全连接网络
增加隐藏层时,关键在链式求导。假设两层网络:输入→隐藏→输出,需分别计算输出层和隐藏层的误差项(delta):
- 输出层 delta: δ₂ = (y_pred - y) * sigmoid_derivative(z₂)
- 隐藏层 delta: δ₁ = δ₂ @ W₂ * relu_derivative(z₁)
- 对应梯度: dW₂ = a₁.T @ δ₂,dW₁ = X.T @ δ₁
- 建议用列表存储各层 W 和 b,用循环统一前向/反向流程
加入实用训练技巧
纯手写模型容易发散或收敛慢,几个轻量但有效的改进:
立即学习“Python免费学习笔记(深入)”;
- 数据归一化:输入特征缩放到 [0,1] 或标准化(减均值除标准差)
- Mini-batch:每次只取32或64个样本计算梯度,比全量更快更稳
- 学习率衰减:训练中逐步缩小 lr,例如 lr = lr₀ / (1 + decay * epoch)
- 简单早停:监控验证集损失,连续5轮不下降就终止训练
验证与调试建议
手写模型难定位bug,推荐三步检查:
- 用全零或全一输入测试前向传播,确认输出维度和数值范围合理
- 关闭随机性(np.random.seed(42)),固定数据和初始化,确保每次运行结果一致
- 梯度检验:用有限差分法(如 (loss(w+ε) - loss(w-ε)) / (2ε))对比解析梯度,误差应小于1e-5










