神经网络 · 手写数字识别

三层全连接网络(MLP)从像素到预测的完整过程

模拟器简介

本模拟器展示了一个三层多层感知器(MLP)如何识别手写数字。用户可以在画布上书写数字 0-9,模拟器实时进行前向传播计算,并以可视化方式展示每一层神经元的激活状态,直观呈现神经网络"看到"了什么。

网络已经在 MNIST 手写数字数据集上完成训练(60,000 张训练图片,10,000 张测试图片),测试准确率约 97.6%。模拟器中运行的是训练完成后的推理过程(前向传播)。

网络架构

网络由四层神经元组成,相邻层之间全连接(每个神经元与下一层所有神经元相连):

784 个神经元
输入层
28×28 像素灰度值
128 个神经元
隐藏层 1
ReLU 激活
64 个神经元
隐藏层 2
ReLU 激活
10 个神经元
输出层
Softmax 激活

网络共有约 109,000 个参数(权重 + 偏置),全部通过 MNIST 数据集训练得到。

数学原理

前向传播

前向传播是网络从输入到输出逐层计算的过程。每一层执行相同的两步操作:

l 层的计算

z(l) = W(l) · a(l−1) + b(l)

a(l) = σ(z(l))

其中:

激活函数

ReLU — 整流线性单元

ReLU(x) = max(0, x)

用于隐藏层。将负值置零,正值保持不变。计算简单,有效缓解梯度消失问题。它是现代深度网络的默认选择。

Softmax — 归一化指数函数

Softmax(x)i = exi / Σj exj

用于输出层。将 10 个原始分数转换为概率分布(和为 1)。最大的概率值对应预测结果。

损失函数与训练

训练使用交叉熵损失(Cross-Entropy Loss)衡量预测与真实标签之间的差异:

L = − Σi yi · log(pi)

其中 yi 是真实标签的独热编码(正确类别为 1,其余为 0),pi 是预测概率。训练通过随机梯度下降(SGD)与动量反复调整权重,使损失函数逐步减小。

模拟器交互说明

书写与识别

在黑色画布上用鼠标或手指书写数字。每次笔画抬起后(可在侧边栏关闭自动识别),模拟器执行以下步骤:

  1. 将 280×280 画布下采样为 28×28 灰度图(与 MNIST 格式一致)
  2. 将 784 像素值输入网络,逐层计算
  3. 输出层给出 0-9 每个数字的预测置信度
  4. 可视化各层神经元激活状态

网络可视化

中间区域以热力图方式展示各层神经元的激活值:

为什么是三层网络

这个 784 → 128 → 64 → 10 的网络设计在模型容量与推理速度之间取得了平衡:

特性说明
参数量约 10.9 万,可在浏览器中瞬间完成推理
准确率约 97.6%,足以正确识别大多数清晰手写数字
可解释性两层隐藏层各有明确的中间表征可观察
教育意义完整展示了全连接、ReLU、Softmax、交叉熵等核心概念

拓展方向

这个模拟器是理解神经网络的起点。在此基础上可以进一步探索: