第 01 课 · 10 神经元 · 约 80% 准确率

构建一个大脑:服装图像分类网络

本课以 Fashion-MNIST 服装图像分类为完整示例,依次建立数据表示、单层全连接网络、损失函数、梯度优化与泛化评估。学完可复述网络结构、参数量来源、训练动态含义,并复现约 80% 的验证准确率。

10人工神经元
7,850可训练参数 · 约 30 KB
60,000 / 10,000训练 / 验证样本
5 epochCPU 数分钟
~80%验证准确率
0 总览与预备1 数据表示2 监督目标3 网络结构4 损失函数5 优化与训练6 泛化评估7 容量扩展8 练习与术语
0

总览与预备知识

学习目标 · 符号约定 · 运行环境

学习目标(完成本课后能够):① 说明 28×28 灰度图如何编码为输入向量;② 写出单层全连接网络的前向公式并计算参数量;③ 解释稀疏类别交叉熵与准确率的分工;④ 通过训练曲线判断拟合状态;⑤ 用验证集与错例分析网络的局限。

符号约定:输入向量 x ∈ [0,1]^784,标签 y ∈ {0,…,9},权重矩阵 W ∈ R^{10×784},偏置向量 b ∈ R^{10},输出 ŷ = Wx+b ∈ R^{10} 称为 logits。

运行环境:TensorFlow(含 Keras)、Matplotlib。GPU 可加速但非必需;本课单层网络在 CPU 上约 1–2 分钟完成 5 个 epoch。固定随机种子以保证结果可比(约 80%,浮动 ±2% 属正常)。代码细节与排错见代码工程版。

核心结论:神经网络的学习是参数搜索 —— 在假设空间 {Wx+b} 中寻找使训练损失最小、且在未见样本上仍成立的一组 (W,b),共 7850 个浮点数。
1

数据表示:从光强到输入向量

像素 · 张量 · 归一化

定义 1.1(像素):对连续光强场的离散采样点。本课每个像素以 8 位无符号整数记录,0 表示无反射(黑),255 表示全反射(白),1–254 为灰阶。

Fashion-MNIST 含 70,000 张 28×28 灰度图。单张样本为二阶张量,形状 (28,28),展平后为 784 维向量。5×5 缩略示意如下(实际为 28×28),边缘 0 对应背景:

原始取值范围 0–255。若直接输入网络,在常用初始化(权重约 0.1 量级)下,线性输出可达数十量级,导致 softmax 饱和、初始损失过大(可达十几,而正常初值约 2.3)、梯度范数过大,在默认学习率(约 1e-3)下更新震荡、收敛困难。因此作如下重标度:

x′ = x / 255.0,x′ ∈ [0, 1]保序仿射变换:0 映射为 0,255 映射为 1,中间灰阶等比压缩;仅改变动态范围,不改变亮暗顺序。训练集与验证集须使用同一系数,否则引入分布偏移。
# 形状:(60000,28,28) 与 (10000,28,28);uint8 → float32,值域 [0,1]
(train_images, train_labels), (valid_images, valid_labels) = tf.keras.datasets.fashion_mnist.load_data()
train_images = train_images / 255.0
valid_images = valid_images / 255.0

检验标准:单个样本形状为 (28,28),最小值 0.0、最大值 ≤1.0;首行前 8 个值多为 0(边缘背景)。满足即表示编码正确,可进入下一节。

小结:网络的输入是 x ∈ [0,1]^784。归一化的作用是使前向输出、损失初值与梯度范数落在优化器稳定的工作区间。
2

监督目标:类别的整数编码与数据划分

标签 · 训练集 · 验证集

定义 2.1(标签 label):人类赋予样本的监督目标。本课标签为整数 0–9,“稀疏”指直接存储编号而非独热(one-hot)向量。
标签类别(中/英)分类难度说明
0 / 2 / 4 / 6T恤 / 套头毛衣 / 外套 / 衬衫上装四类,外形接近,类间距离小,线性模型最易混淆
1 / 3 / 8裤子 / 连衣裙 / 包轮廓差异大,相对易分
5 / 7 / 9凉鞋 / 运动鞋 / 短靴足部三类,形状接近,难度中等
定义 2.2(训练集 / 验证集):训练集(60,000)仅用于拟合参数(产生梯度);验证集(10,000)仅用于估计泛化误差(只做前向,不产生梯度)。两者样本互不相交。若验证样本参与训练,验证准确率将系统性高估真实性能。

该划分对应学习方法论的基本要求:拟合能力须在未见分布上检验。后续各课的“换新题考查”均为同一原则的应用。

3

网络结构:人工神经元与全连接层

神经元 · Flatten · Dense · 参数量

定义 3.1(人工神经元):仿射变换单元 y = w·x + b。其中 w 为权重向量(各输入分量的影响强度),x 为输入向量,b 为偏置(与输入无关的基线)。生物神经元输出脉冲序列,人工神经元输出标量,可视为前者的发放率近似。

以 3 维为例:设 x=[0.9, 0, 0.5],w=[2.0, 1.0, −1.0],b=0.2,则 y=0.9×2.0+0×1.0+0.5×(−1.0)+0.2=1.5。其中取值为 0 的分量(背景)对输出无贡献。784 维情形完全类推:

y = Σi=0783 wixi + b = Wx + bwi:第 i 个像素对该类别的影响强度;b:该类别的先验基线。学习即调整 (W, b)。

10 个类别需要 10 个神经元并行,各持独立的 (w,b),输出 10 维向量,称为 logits(未归一化的类别得分,可正可负)。决策规则为 argmax(取最大分量下标)。Keras 实现如下:

model = tf.keras.Sequential([
    tf.keras.layers.Input(shape=(28, 28)),  # 声明输入形状
    tf.keras.layers.Flatten(),  # (28,28)→(784,):仅重塑形状,0 参数
    tf.keras.layers.Dense(10)   # 全连接:每个输出连接全部 784 个输入,y=Wx+b
])
model.summary()  # Dense 层 7,850 参数;Total 7,850(30.66 KB)

数据流:(batch,28,28) → Flatten → (batch,784) → Dense(10) → (batch,10)。Flatten 不含参数;Dense 的权重矩阵形状为 (784,10)(Keras 按输入×输出存储),偏置为 (10,)。

参数量 = 784×10(W)+ 10(b)= 7840 + 10 = 7850以 float32 存储约 30.66 KB。参数是网络记忆的全部载体;后续“70 亿参数”与此处为同一概念的不同量级。
参数量计算:像素 784 类别 10
总数 = 7850 ≈ 30.7KB(每参数 4 字节)

结构正确性以 summary 总数为准。进一步的直观验证:将某类别的权重向量重塑为 28×28 并可视化,可观察到近似该类服装平均轮廓 —— 表明权重编码了类别模板。

4

损失函数:将对错转化为可微信号

softmax · 稀疏类别交叉熵 · 准确率

logits 需转化为概率分布方可度量误差。设 logits 为 z ∈ R^10,则:

pi = exp(zi) / Σj exp(zj),Σ pi = 1softmax:指数保证非负,分母保证归一;保持排序(logits 最大者即概率最大者),故推理时可直接比较 logits。
定义 4.1(稀疏类别交叉熵):L = −log py,其中 y 为正确类别编号,py 为模型赋予该类的概率。“稀疏”指标签为整数;“from_logits=True”指输入为 logits,损失内部完成 softmax(数值稳定)。
模型赋予正确类的概率 p损失 L优化含义
0.9约 0.11接近正确,梯度幅值小
0.5约 0.69不确定,中等梯度
0.1约 2.3确信错误,大梯度强修正
→ 0→ +∞以全确信答错,惩罚无上界
损失演示:p = 0.50 → L = −log(p) = 0.69

梯度性质(严谨形式):交叉熵对 logits 的梯度为 p − y_true(预测分布减真实独热分布)。即分错的概率质量越多,回传的修正信号越大。概率总和为 1 决定了“给错类一分,即从正确类抢走一分”。

准确率(accuracy):猜对数 / 总数,约 80% 为本课典型值(人类约 83–85%)。它是人类可读的监控指标,不参与求导。若损失下降而准确率停滞,表明概率校准改善但决策边界未移动,需检查数据处理或模型假设。

5

优化与训练:参数的迭代修正

梯度 · Adam · epoch · fit

定义 5.1(梯度更新):W ← W − η·∇WL,b ← b − η·∇bL。其中 ∇L 为损失对参数的偏导向量(指明每个参数应向何方向调整),η 为学习率(步长)。本课优化器为 Adam(自适应矩估计),对各参数维持独立步长,默认约 1e-3。
model.compile(optimizer='adam',
  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['accuracy'])  # 绑定:优化器 + 损失 + 监控指标

# 前向打分 → 计算损失 → 反向求梯度 → 更新参数;训练集重复 5 个 epoch
# validation_data 仅做前向评估,不产生梯度
history = model.fit(train_images, train_labels, epochs=5, verbose=2,
  validation_data=(valid_images, valid_labels))

术语说明:epoch 指完整遍历训练集一次(60,000 样本);本课 epochs=5。固定随机种子(如 42)可固定参数初始化与样本顺序,使不同运行结果可比;不固定则期望相近、单次方差稍大。典型过程:训练准确率 0.79→0.85,验证准确率 0.82→0.84,验证损失 0.50→0.45。

归一化(第 1 节)在此显现作用:输入量级决定梯度量级;未归一化时梯度过大,默认步长下易震荡。优化器、损失、归一化三者须在同一量级下协同。

6

泛化评估:学习曲线与错例分析

泛化 · 过拟合 · logits 可视化

定义 6.1(泛化 / 过拟合):泛化指在未见样本上的性能;过拟合指模型记忆训练噪声、验证误差回升的状态。判据为训练与验证曲线的联合走向。
观测判定
训练与验证同步向好(损失降、准确率升)有效泛化
训练损失降、验证损失升过拟合
两者停滞欠拟合:检查归一化、学习率或结构容量
# history.history 含 loss / val_loss / accuracy / val_accuracy 四条序列
# 左图损失越低越好,右图准确率越高越好;须对照训练与验证两条线
plt.plot(history.history['loss'], label='训练'); plt.plot(history.history['val_loss'], label='验证')

单样本决策:model.predict 要求 batch 维度,单张形状 (28,28) 须扩展为 (1,28,28)。输出 10 维 logits,argmax 为预测类别。下图为一组示意 logits 的柱状表示:衬衫(6)与 T恤(0)双高,表明两类后验接近 —— 此类混淆与人类标注的不一致性一致,是线性假设空间容量不足的预期表现:

示意值。切换不同样本索引(0–59999)可观察不同样本的 10 维输出;验证集前 500 样本中约 15–20% 为错例,多集中于 6↔0(衬衫/T恤)、4↔3(外套/连衣裙)。

7

容量扩展:隐藏层与规模对比

ReLU · 参数量 50,890 · 与大模型的定量关系

单层网络的决策边界为线性。在同一数据与同一学习规则下,插入非线性隐藏层可扩大假设空间:

# 64 单元 ReLU 隐藏层:relu(x)=max(0,x),负值截零、正值保留,引入分段线性
# 前层为非线性特征提取,后层仍为线性读出;学习闭环不变
model2 = tf.keras.Sequential([tf.keras.layers.Input(shape=(28,28)),
  tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation='relu'),
  tf.keras.layers.Dense(10)])
# 参数量 (784×64+64)+(64×10+10)=50240+650=50890;准确率约 80%→87%

参数量增长约 6.5 倍,仍不足 1 MB,CPU 仍可在数分钟内完成训练。提升完全来自容量扩大。进一步提升需卷积结构(利用平移不变性),此处不展开。

本课网络(可完整训练)第 02 课大模型(本地部署)
参数量7,850约 70 亿(约 90 万倍)
训练数据60,000 图像万亿级文本 token
训练代价笔记本数分钟数千 GPU 数周
获取方式从随机初始化训练得到经量化后约 4.7 GB,通过 ollama pull 获取预训练权重

两者的学习方程形式一致(仿射变换堆叠、交叉熵、大规模梯度优化),差异在量级与数据模态。第 02 课将权重获取、推理引擎与对话接口三部分分解为可部署流程。

去代码工程版动手去文科叙事版数学全解
✓

练习与术语表

5 道核验 · 12 个术语 · 参考来源

1 · 验证集为何使用与训练集相同的归一化系数?
不同系数即不同量纲,输入分布发生偏移,前向输出与梯度不可比,验证指标失效。
2 · 7850 个参数中哪 10 个是偏置?
每个神经元 1 个,共 10 个;其余 7840 为权重(784×10)。Flatten 层 0 参数。
3 · 损失下降而准确率不变说明什么?
概率校准改善但决策边界未移动;优化目标(损失)与报告指标(准确率)未同步,需检查数据或结构。
4 · logits 与概率的关系?
经 softmax 归一化为概率,和为 1;排序一致,故推理可直接比较 logits。
5 · 如何从曲线判定过拟合?
训练损失下降而验证损失上升,即模型开始记忆训练噪声。
术语定义
张量多维数组;本课输入为 (28,28) 二阶张量
像素 / 特征采样光强 / 输入变量(784 维)
标签监督目标的整数编码 0–9
训练集 / 验证集拟合参数 / 估计泛化,互不相交
人工神经元y=w·x+b 的仿射单元
Flatten / Dense重塑形状 / 全连接 y=Wx+b
logits / argmax未归一化得分 / 取最大下标即预测
softmax / 交叉熵得分归一化为分布 / L=−log py
准确率猜对比例,监控指标,不参与求导
梯度 / Adam / epoch偏导向量 / 自适应优化器 / 遍历一遍训练集
泛化 / 过拟合未见样本性能 / 记忆训练噪声
ReLUmax(0,x),引入非线性

参考:NVIDIA DLI《Building a Brain in 10 Minutes》;Fashion-MNIST(Zalando Research);TensorFlow / Keras 文档(Sequential、Input、Flatten、Dense、SparseCategoricalCrossentropy、fit、predict、summary)。配图 BruceBlaus, CC BY 3.0。口径:7850 / ~80% / 50890。

输入课堂口令

本页为课后材料,需课堂口令进入