讲解稿 · 第 06 章 第 03 节 · 深度学习¶
口播时长:约 18 分钟|建议语速:中速,公式处停两拍|字数:约 3900 字
承 Ch06 §02 梯度机器学习 → Ch06 §03 深度学习 → Ch06 §04 分布式深度学习
导语(约 80 秒)¶
先讲一个我自己的踩坑故事。
我第一次"读懂"深度学习,不是在读论文的时候,而是在调一个 MLP 死活训不出来的时候。教科书公式我一步步照着写,学习率 0.01 看似合理,损失死活不下降。排查一整晚才发现——权重初始化方差差了一个数量级,前向激活一路指数级放大,反向梯度直接爆 NaN。那一刻我才明白,教材里那些看似次要的技巧(He 初始化、LayerNorm、残差、梯度裁剪)才是把"堆很多层"从理论变成现实的关键。
这件事后来影响我读新架构的方式:每读到一个新模块(BatchNorm、ResNet、Attention、MoE、Mamba),我都先问一句"它到底在解决哪个具体的数值稳定性或计算瓶颈"。今天我们就照这个思路,把深度学习的主角(MLP、CNN、RNN、Transformer、MoE、SSM/Mamba、VAE)摆上桌,每个都配上"它出现的动机"。这样你下次遇到一个不认识的架构时,能先猜它治哪块疼,再读它的公式。
复习昨日 & 今日路线(约 50 秒)¶
§02 讲的梯度机器学习还在"浅层"——线性/逻辑回归、决策树、SVM、kNN、朴素贝叶斯。它们表示能力有限,遇到图像、语音、长文本就捉襟见肘。
今天我们把"浅"字拿掉,换成"深"字。路线是:为什么需要深 → 怎么建一个多层感知机 → 怎么让它稳定训练(激活、初始化、归一化、残差)→ 怎么针对图像做卷积 → 怎么针对序列做循环与注意力 → 当代两条延伸线 MoE 与 SSM → 生成方向的自编码器与 VAE。下一节 §04 分布式深度学习再回答"单卡装不下怎么办"。
核心概念一 · MLP 与非线性:为什么"深"才有意义(约 2 分钟)¶
直觉。 什么是"深"?浅层网络只有一个隐藏层,深层网络有很多层。深度让网络能建立分层表示:靠前的层学简单特征(边缘、色块),靠后的层把它们组合成复杂概念(人脸、句子)。这种可组合性是深度学习的威力源头。
定义。 最简单的深度网络是多层感知机(Multi-Layer Perceptron, MLP),也叫全连接网络。每一层做同一种运算:
\(W\) 是权重矩阵,\(b\) 是偏置向量,\(\sigma\) 是非线性激活函数。一层的输出会成为下一层的输入。如果没有非线性,堆再多层也没用——\(W_2(W_1 x)=(W_2W_1)x\) 不过是一个等价的线性变换,矩阵乘法会逐层坍缩,回到 Ch02 反复提醒的"线性映射可复合但不增表达力"。
例子。 一个二维输入、一个 8 神经元隐藏层、一个输出节点的小 MLP:输入 \((x_1,x_2)\),隐藏层 \(h_j=\text{ReLU}(w_{j1}x_1+w_{j2}x_2+b_j)\),输出 \(y=\sigma(\sum_j v_j h_j + c)\)。ReLU 选 \(\max(0,x)\),简单、快、稀疏,是当代隐藏层的默认。
反例。 用纯线性激活 \(\sigma(x)=x\) 堆 100 层等价于一个单层线性变换,连 XOR 都分不出来。Sigmoid 当隐藏层时要小心:输入一旦大于 4 或小于 -4,曲线几乎水平,梯度直接归零。
一句话总结。 深度提供组合结构,非线性提供表达能力;两者缺一,深度就是摆设。
核心概念二 · 梯度病理:消失与爆炸(约 1.8 分钟)¶
直觉。 网络深了,反向传播要把梯度沿链式法则从末层传回首层。中间每多一层就多乘一个 Jacobian。如果这些因子连乘的结果一直小于 1,梯度就指数级缩到零;一直大于 1,又指数级涨到溢出。两种极端都让训练失败。
定义。 设第 \(l\) 层的 Jacobian 范数为 \(\rho_l\),反向传播 \(L\) 层的积累因子约 \(\prod_{l=1}^{L}\rho_l\)。
- 梯度消失(vanishing gradients):\(\prod \rho_l\to 0\),靠前的层几乎学不到东西。Sigmoid、Tanh 饱和时 \(\rho_l<1\),问题最严重。
- 梯度爆炸(exploding gradients):\(\prod \rho_l\to\infty\),引发数值溢出、loss 跳成 NaN。RNN 沿时间步反传时同款剧情。
例子。 100 层 MLP 若用 Sigmoid 且权重标准差 0.8,\(\rho_l\approx 0.8\cdot 0.25=0.2\),积累因子约 \(0.2^{100}\approx 1.27\times 10^{-70}\),首层梯度直接归零——这就是教材反复警告"深 Sigmoid 网络训不动"的原因。
反例。 很多人以为"层数越深表达力越强",但若不解决梯度问题,训练误差反着上升。ResNet 论文里那张"56 层 train loss 高于 20 层"的图,正是退化问题(degradation)不是过拟合。
一句话总结。 深度带来梯度链乘病;后面的所有技巧(激活、初始化、归一化、残差、裁剪)都是这味药的不同成分。
核心概念三 · 初始化与归一化:把方差控在手里(约 2.5 分钟)¶
直觉。 既然梯度是逐层连乘的,最干脆的解法是让每层的 Jacobian 范数保持接近 1。前向激活和反向梯度同时稳定。两条最常用路线:精心初始化 让训练起点健康,归一化层 让训练过程中随时纠正。
定义。
- Xavier(Glorot)初始化:从方差 \(\frac{2}{d_{\text{in}}+d_{\text{out}}}\) 的分布中采样权重。Tanh/线性激活时能让各层激活方差大致守恒。
- He(Kaiming)初始化:方差取 \(\frac{2}{d_{\text{in}}}\),专治 ReLU。ReLU 把一半激活置零,要用双倍方差补偿。
- 符号表:\(d_{\text{in}}\) 是输入维度,\(d_{\text{out}}\) 是输出维度;这里的 \(\beta\) 是归一化层里的可学习平移参数,不是 Ch04 二类错误率,也不是 Ch05 Beta 分布参数;\(\gamma\) 是可学习缩放参数;\(\epsilon\)(本书用 \(\epsilon\)(数值稳定项))是一个极小的正数防止除零;\(\mu_B,\sigma_B^2\) 是当前批的均值与方差。
批归一化(BatchNorm):对每个特征,在小批上算 \(\mu_B,\sigma_B^2\),再仿射
推理时用运行均值与方差。
层归一化(LayerNorm):对每个样本独立地在特征维度上算。这就让 Transformer/RNN 不再依赖批大小。
例子。 假设 \(d_{\text{in}}=d_{\text{out}}=512\),Xavier 初始化方差是 \(4/1024=1/256\),标准差约 \(1/16=0.0625\)。一把尺子压住了激活的尺度。
反例。 BatchNorm 在批大小 1 时方差无法估;用小批训练时一定要意识到"训练-测试不一致",推理必须切到全局统计量。
一句话总结。 初始化决定出发点,归一化负责过程中纠偏;两者协同把梯度链乘从失控拉回稳定。
核心概念四 · 卷积神经网络:把空间结构塞进权重共享(约 2.5 分钟)¶
直觉。 图像中"这块边缘往上平移 10 像素"还是同一条边缘。稠密层不管这一套;卷积层共享同一个滤波器在整张图上滑动,天然带平移不变性,参数也从 \(d_{\text{in}}\cdot d_{\text{out}}\) 砍到 \(k^2 \cdot c_{\text{out}}\)。
定义。 大小 \(k\times k\) 的滤波器 \(K\) 与二维输入的卷积:
输出尺寸公式
其中 \(s\) 是步长,\(p\) 是填充(padding),"same" 填充保持空间尺寸。
池化 做下采样:最大池化取窗口最大值,平均池化取平均值。1×1 卷积 在每个空间位置做通道间混合,等价于逐像素的全连接。扩张(膨胀)卷积 在滤波器元素间插空隙,扩大感受野但不增参数。
例子。 28×28 输入配 3×3 滤波器、步长 1、same 填充,输出仍是 28×28;同样输入配 5×5 滤波器、步长 2、不填,输出是 \(\lfloor(28-5)/2\rfloor+1=13\),空间尺寸直接砍半。
反例。 别把卷积想成"局部全连接"。它真正的关键点是权重共享——同一个滤波器在所有位置用同一组权重,参数效率与平移等变性都来自这里。
一句话总结。 卷积=局部连接+权重共享+空间几何控制,这三件事一起把图像任务从"暴力全连接"降维成"高效结构化"。
核心概念五 · 残差连接:让"恒等"成为默认起点(约 1.5 分钟)¶
直觉。 当最优变换接近恒等映射时(这在深度网络里很常见),让一层学残差 \(F(x)=\text{output}-x\) 比学完整 output 容易得多。把 \(x\) 抄一条近道绕过这一层就行。
定义。 残差块写成
当 \(F(x)\) 趋近 0 时,输出近似等于输入,梯度沿着 \(x\) 那条"高速公路"无损传回。ResNet 正是靠这个技巧堆过百层。
例子。 一个 5 层小残差块,\(F(x)\) 就是两个 3×3 卷积加 ReLU 的小函数;如果这个块的最优解就是"什么都不做",\(F(x)\) 收敛到 0 简直毫无难度,相比直接学恒等映射要容易得多。
反例。 残差不是"加了就会更好"。如果任务本身就需要剧烈的非线性变换,残差路径反而把信号衰减;不过即便如此,梯度通道的存在也让训练稳定得多。
一句话总结。 残差把"恒等"降为默认值,让深度网络的损失曲面变得更容易优化。
核心概念六 · RNN/LSTM 与门控传送带(约 2.5 分钟)¶
直觉。 处理序列就要"记住上下文"。循环神经网络(RNN)每读一个 token 就更新一次隐藏状态 \(h_t\),相当于把历史压成一个向量继续传。问题是这条传送带会衰减——长序列后,前面的信息早就被冲淡。
定义。 原始 RNN 单元
\(L\) 步反传要连乘 \(L\) 次 \(W_h\),\(\|W_h\|<1\) 就指数级消失,\(\|W_h\|>1\) 又指数级爆炸。
LSTM 用一个细胞状态 \(c_t\) 几乎原速往前跑,再加三个门控制写入与擦除:
只要遗忘门 \(f_t\approx 1\),信息可跨越几百步不衰减地传下去。GRU 把细胞状态与隐藏状态合并,只保留更新门与重置门,参数少,能力常常与 LSTM 不相上下。
例子。 句子"The cat, which the dog that I met yesterday chased, finally … sat on the mat." LSTM 在"sat"出现时仍能记得主语是 cat,靠的就是细胞状态几乎原速流到第 30 个时间步。
反例。 RNN/LSTM 的根本局限是顺序处理:必须先算 \(t=1\),才能算 \(t=2\),并行训练困难;而且所有上下文都得挤进一个固定大小的 \(h_t\),是典型的"信息瓶颈"。
一句话总结。 RNN 把序列压成一条流,门控机制让长距离依赖不衰减;但顺序性本身成了并发化的高墙。
核心概念七 · 注意力与 Transformer:让每个 token 都能看全局(约 3 分钟)¶
直觉。 如果 RNN 是"我把所有历史念一遍再写下笔记",注意力就是"答题时回头翻整张卷子"。每个输出位置直接看所有输入位置,按相关性取回。RNN 的瓶颈一次性解决。
定义。 三个投影矩阵 \(W^Q,W^K,W^V\) 把输入映射成查询(queries,Q)、键(keys,K)、值(values,V)。缩放点积注意力:
\(QK^\top\) 的每个元素是 query 与 key 的点积,衡量相似度。除以 \(\sqrt{d_k}\) 是关键——\(d_k\) 大时点积数值大,softmax 会饱和成近似 one-hot,梯度又消失。\(\sqrt{d_k}\) 把方差归一化回 1。
多头注意力 跑 \(h\) 组独立投影,捕获不同子空间关系:
Transformer 块 把多头自注意力、加法与层归一化、前馈网络、残差连接依次拼起来。位置编码(正弦或可学习 RoPE/ALiBi)补回顺序信息,因为注意力本身是置换等变的。
例子。 句子有 4 个 token,\(d_k=8\)。\(Q,K\in\mathbb{R}^{4\times 8}\),\(QK^\top\in\mathbb{R}^{4\times 4}\),每一行可以做一次 softmax,权重沿最后一维和为 1。这正是 Ch05 §05 互信息与 KL 散度的"加权"思想在工程里的具体形态。
反例。 注意力是 \(O(n^2)\) 的,序列长度翻 10 倍,显存与计算都翻 100 倍。FlashAttention 用分块把 IO 从 HBM 搬到 SRAM;稀疏注意力、线性注意力、Mamba 都是为了让长上下文算得起。
一句话总结。 注意力让每个 token 直接看全局,缩放点积+多头+位置编码三件套构成 Transformer 的全部配方。
核心概念八 · MoE 与 SSM:当代两条延伸线(约 2.5 分钟)¶
直觉。 当 LLM 越来越大时,两件事同时变贵:参数要存,token 要算。MoE 走"参数大但算得少",SSM/Mamba 走"算得少且随序列线性增长"。两条路都在 2023~2025 年成为主流。
定义。 专家混合(Mixture of Experts, MoE):把 Transformer 的 FFN 换成若干专家子网络,路由器给每个 token 选 Top-\(k\) 个专家:
总参数可以做到上千亿,但每个 token 只激活一小部分。Switch Transformer 只用 Top-1;Mixtral 8x7B 用 Top-2;DeepSeek-V3 用 1 个共享专家 + 256 个路由专家激活约 37B。配合辅助损失保证专家负载均衡。
状态空间模型(SSM) 把序列建模写成连续时间微分方程
离散化后 \(h_t=\bar A h_{t-1}+\bar B x_t\)。结构化矩阵 \(\bar A\) 让 SSM 同时拥有卷积模式(并行训练)和递归模式(\(O(1)\) 推理)。Mamba 把 \(B,C,\Delta\) 做成输入相关,让模型学会"这个 token 重要多读一点、那个跳过"——本质是把注意力机制塞进状态空间。
例子。 DeepSeek-V3 总参 671B,每个 token 激活约 37B;推理 FLOPs 接近一个 13B 稠密模型,代价是训练时需要 278.8 万 H800 GPU 小时。
反例。 MoE 路由不稳定可能让某些专家"饿死",因此要加负载均衡损失;SSM 在需要精确跨位置交互的任务上仍弱于纯注意力,所以 Jamba、Zamba 2 走混合路线。
一句话总结。 MoE 用稀疏激活换参数量,SSM 用结构化递换取线性复杂度;它们共同把"更大模型"从堆参数变成堆架构。
核心概念九 · 自编码器与 VAE:把生成装进概率骨架(约 2 分钟)¶
直觉。 如果我只想学一个紧凑表示怎么办?让网络自己压缩自己——把输入映射到瓶颈 \(z\),再解码回去重建。自编码器是 PCA 的非线性版。
定义。 确定性自编码器:\(z=f_{\text{enc}}(x)\),\(\hat x=f_{\text{dec}}(z)\),损失 \(\mathcal{L}=\|x-\hat x\|^2\)。变分自编码器(VAE) 把 \(z\) 换成概率分布:编码器输出均值 \(\mu\) 与方差 \(\sigma^2\),采样 \(z=\mu+\sigma\odot\epsilon\),\(\epsilon\sim\mathcal{N}(0,I)\)(重参数化技巧让采样可微)。损失
其中 \(p(z)=\mathcal{N}(0,I)\),单位 bit(若用 \(\log_2\))或 nat(若用 \(\ln\))。KL 散度(Ch05 §05)把后验拉向先验,保证潜空间光滑。
例子。 训练完成后从 \(p(z)\) 采样再解码,就能生成新样本——这把"识别"扩展成了"生成"。这也是 Ch05 KL 散度在 Ch06 第一次正式登场。
反例。 VAE 生成图片往往偏模糊,想取高质量样本就要跨到扩散模型(详见 Ch08、Ch10);自编码器若瓶颈维度过大,模型会学成恒等映射,毫无意义。
一句话总结。 自编码器用瓶颈压特征,VAE 用 KL 正则把瓶颈变成可采样的概率空间——生成模型的最朴素也最经典起点。
一个走完全程的例子 · 残差 MLP + Adam 训练 MNIST 数字(约 2.5 分钟)¶
把今天学过的东西串成一条端到端流水线。任务:识别 28×28 灰度手写数字,类别 0~9。
第一步:架构。 输入 784 维 → 全连接 256 → ReLU → 残差块(256→256 + 跳连)→ 全连接 256 → ReLU → 输出 10。参数量约 \((784\cdot256+256)+(256\cdot256+256)+(256\cdot10+10)\approx 269{,}386\)。
第二步:损失与优化。 末层用 softmax 配交叉熵(BCE/CCE,Ch06 §02 已展开):
优化用 Adam:\(m_t=\beta_1 m_{t-1}+(1-\beta_1)g_t\),\(v_t=\beta_2 v_{t-1}+(1-\beta_2)g_t^2\),\(\hat m_t=m_t/(1-\beta_1^t)\),\(\hat v_t=v_t/(1-\beta_2^t)\),\(\theta_t=\theta_{t-1}-\eta\,\hat m_t/(\sqrt{\hat v_t}+\epsilon)\)。这里的 \(\beta_1,\beta_2\)(Adam 动量参数)不是 Ch04 二类错误率,也不是 Ch05 Beta 分布参数;\(\epsilon\)(数值稳定项)防止除零;\(\eta\)(学习率)就是 Ch02 数值梯度里的步长。
第三步:归一化与初始化。 权重用 He 初始化(方差 \(2/d_{\text{in}}\)),每层隐藏加 LayerNorm(不依赖批大小),梯度范数超 1.0 就裁剪。
第四步:训练与评估。 60,000 张训练图、批 128、5 个 epoch;测试 10,000 张。在标准 MNIST 上,5 epoch 内测试准确率通常到 98% 以上;如果做不到,第一件事看激活方差是否爆炸,第二件事看梯度范数是否爆 NaN,第三件事才怀疑学习率。
这一条流水线把 MLP、残差、LayerNorm、He 初始化、CrossEntropy、Adam、梯度裁剪全串了起来。今天讲的每一个模块都在这里有一席之地。
易错点回头看(约 80 秒)¶
第一条:很多人以为"激活函数越复杂越好",其实 ReLU 在隐藏层是默认首选。Sigmoid/Tanh 容易饱和;GELU/Swish 是 GPT/BERT 这类 Transformer 的平滑默认,但不是因为它们"更准",而是因为它们对正输入不饱和、对负输入平滑过渡,与 LayerNorm 的零中心化配合得更好。
第二条:很多人以为"BatchNorm 总是优于 LayerNorm",其实要分场景。CNN 视觉任务历史地偏爱 BatchNorm(批大小够大);Transformer 和 RNN 几乎一律用 LayerNorm,因为它不依赖批大小,推理时也省心。
第三条:很多人以为"MoE = 更大模型 = 更好性能",其实它解决的是参数效率与推理 FLOPs 的取舍。训练 FLOPs 不一定下降,路由稳定性反倒增加了工程复杂度。盲目切换 MoE 常常得不偿失。
与下节的钩子(约 30 秒)¶
今天我们学了"如何搭一个深度网络"——MLP、CNN、RNN、Transformer、MoE、SSM、VAE 全摆上桌。但当模型规模大到单张 GPU 装不下、训练数据大到单台机器吃不完时怎么办?
下一节 §04 分布式深度学习,我们回答"如何把一个 giant 模型拆给 1024 张 GPU 一起训"。数据并行、模型并行、流水线并行、AllReduce 通信——单卡视角的"前向-反向-更新"被切成多机协同的交响乐。