← 全部项目
进行中 / 2026.10 开始
用 NumPy 从零实现手写数字识别
不用 PyTorch。先把前向传播、损失、反向传播各手写一遍,再对照框架确认自己没写错。
要解决什么
用框架三行就能跑通 MNIST,但我不确定自己真的知道梯度是从哪来的。所以这个项目的目标不是「识别率多高」,而是「每一行代码我都能解释」。
怎么做
- 数据:MNIST 拉平成 784 维,归一化到 0–1。
- 网络:784 → 128(ReLU)→ 10,softmax + 交叉熵。
- 反向传播:先手推一遍,再用 NumPy 实现,然后跟数值梯度比对。
- 验证:最后用 PyTorch 写同一套结构,看两边参数更新是否一致。
现在的进度
前向传播和损失函数写完了。反向传播卡在 softmax 这一层——手推的结果和数值梯度差 10⁻² 量级,说明某处推导写错了,不是精度问题。
待解决
- 把 softmax + 交叉熵的梯度合并推导(合并之后形式会简单很多,也就更不容易错)。
- 加 mini-batch 和动量。
- 写个把权重矩阵可视化成图片的小工具,看看它到底学到了什么。