第 3 章

深度学习

在前一章中,我们了解了机器学习的基本框架。而今天,当你听到"AI"这个词时,它背后最核心的技术引擎几乎都是深度学习。从GPT到Claude,从Midjourney到Sora——深度学习的威力正在重塑整个世界。

深度学习的定义

深度学习是机器学习的一个分支,也是当今人工智能领域最具革命性的技术。它的核心思想是:通过构建多层的神经网络,让机器能够自动学习数据的层次化特征表示。如果说传统机器学习需要人工设计特征,那么深度学习则让机器自己发现特征——这就是它被称为"特征学习""表示学习"的原因。

深度学习的力量在于它的层次化表示能力。每一层都从前一层学习更抽象的特征,这种层层递进的学习方式,让深度网络能够理解复杂的世界。

—— 杨立昆(Yann LeCun),图灵奖得主,Meta首席AI科学家

🔧 传统机器学习

需要人工设计特征(Feature Engineering)。例如识别猫:人工定义"尖耳朵"、"长胡须"等特征,再交给SVM、随机森林等算法分类。深度依赖领域专家的经验和知识。

🧠 深度学习

从原始数据中自动学习特征。输入图片像素,网络自己学会第一层检测边缘、第二层检测纹理、第三层检测形状、更高层检测语义部件。这就是"深度"的含义——层层抽象。

人工神经元与激活函数

人工神经元是神经网络的基本单元,它模拟了生物神经元的基本功能:接收信号、加权求和、通过激活函数产生输出。

\(y = f(w_1 x_1 + w_2 x_2 + \cdots + w_n x_n + b) = f(\sum w_i x_i + b)\)

其中 \(x_1 \sim x_n\) 是输入,\(w_1 \sim w_n\) 是权重,\(b\) 是偏置,\(f\) 是激活函数。

🧠 激活函数的作用

如果没有激活函数,无论网络有多少层,都等价于一个线性变换。激活函数引入非线性,让网络可以拟合任意复杂的函数。常见激活函数包括:

Sigmoid
将输入映射到 (0,1) 区间,常用于二分类输出层。
Tanh
将输入映射到 (-1,1) 区间,零均值,收敛比 Sigmoid 更快。
ReLU
f(x) = max(0, x),最简单也最常用,有效缓解了梯度消失问题。
GELU / SwiGLU
GELU是Transformer常用激活函数;SwiGLU是LLM主流激活函数,比Swish性能更优。

激活函数是神经网络中不可或缺的组成部分。它们为网络引入非线性变换,使得多层神经网络能够学习复杂的模式。本节将详细介绍最常用的激活函数,包括它们的数学表达式、图像特征、优缺点以及适用场景。

💡 演进的视角 — 激活函数的发展史,是一部不断"解决老问题,引入新问题"的迭代史。每种激活函数都是在特定历史背景下为了解决前人的痛点而诞生的。理解这条演进脉络,比记住每个函数的数学公式更重要。
① Sigmoid
~1986
✅ 引入非线性,输出可解释为概率
❌ 梯度饱和(梯度消失)、非零中心、计算慢
② Tanh
~1990
✅ 零中心输出,梯度更强
❌ 梯度饱和问题依然存在
③ ReLU
~2011
✅ 解决梯度消失、计算极快、稀疏激活
❌ Dying ReLU(神经元坏死)、无界输出
④ GELU
~2016
✅ 平滑可微、概率门控、Transformer 标配
❌ 计算代价略高于 ReLU
⑤ SwiGLU
~2020
✅ 门控机制 + LLM 首选(LLaMA、PaLM)
❌ 参数倍增,计算开销更大

规律:早期的 Sigmoid/Tanh 追求平滑非线性 → ReLU 追求高效训练 → GELU 追求概率建模 → SwiGLU 追求门控表达能力。每一步都牺牲了一些计算效率,换来了更强的表达力或更好的训练特性。

📈 Sigmoid 函数 — "温柔的挤压器"

Sigmoid 函数将任意实数映射到 (0, 1) 区间,形状像一条平滑的 S 曲线。它的输出可以解释为"概率",因此在二分类任务中非常有用。

-6 -4 -2 0 2 4 6 0.5 1.0 (0, 0.5) x σ(x)
\(\sigma(x) = \frac{1}{1 + e^{-x}}\)
特点与优势
✓ 输出范围 (0, 1),可解释为概率
✓ 平滑可导,梯度处处存在
✓ 单调递增,函数连续
缺点
梯度消失:当 |x| 很大时,梯度趋近于 0,导致深层网络难以训练
非零均值:输出总是正数,导致梯度更新呈"之"字形,收敛慢
计算开销:涉及指数运算,计算较慢
适用场景
• 二分类任务的输出层
• 需要概率输出的场景
• 早期的神经网络和逻辑回归

📈 Tanh 函数 — "零均值的 Sigmoid"

Tanh 函数将输入映射到 (-1, 1) 区间,是 Sigmoid 的"升级版"。它的输出是零均值的,这使得梯度更新更加高效,收敛速度更快。

-6 -4 -2 0 2 4 6 -1 0 1 (0, 0) x tanh(x)
\(\tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} = 2\sigma(2x) - 1\)
特点与优势
✓ 输出范围 (-1, 1),零均值,梯度更新更高效
✓ 平滑可导,梯度处处存在
✓ 比 Sigmoid 收敛更快
缺点
✗ 依然存在梯度消失问题(当 |x| 很大时)
✗ 计算开销较大(涉及指数运算)
适用场景
• 需要零均值输出的场景
• RNN/LSTM 的隐藏层
• 早期的神经网络隐藏层

📈 ReLU 函数 — "深度学习的主流选择"

ReLU (Rectified Linear Unit) 是目前最常用的激活函数。它的计算非常简单:当输入为正时输出输入值,当输入为负时输出0。这个简单的形式却非常有效!

-6 -4 -2 0 2 4 6 0 2 4 (0, 0) x ReLU(x)
\(\text{ReLU}(x) = \max(0, x) = \begin{cases} x, & x > 0 \\ 0, & x \le 0 \end{cases}\)
特点与优势
计算极快:只需判断正负,无需复杂运算
缓解梯度消失:正区间梯度恒为1,不会消失
稀疏激活:负值输出为0,网络更稀疏,减少过拟合
收敛快:比 Sigmoid/Tanh 训练速度快得多
缺点
Dead ReLU 问题:如果输入总是负数,神经元"死亡",梯度为0,永远无法恢复
✗ 输出不是零均值
✗ 无上界,可能导致激活值过大
适用场景
大多数深度神经网络的隐藏层(CNN、MLP 等)
• 需要快速训练的场景
• 对计算效率要求高的场景

📈 Leaky ReLU 函数 — "解决 Dead ReLU"

Leaky ReLU 是 ReLU 的改进版,在负区间引入一个很小的斜率(通常 α=0.01),避免神经元"死亡"。

-6 -4 -2 0 2 4 6 0 2 4 (0, 0) x LeakyReLU(x)
\(\text{LeakyReLU}(x) = \begin{cases} x, & x > 0 \\ \alpha x, & x \le 0 \end{cases}\)(通常 \(\alpha = 0.01\))
特点与优势
✓ 解决 Dead ReLU 问题
✓ 保留 ReLU 的所有优点
✓ 负区间梯度不为0,神经元不会"死亡"
缺点
✗ 需要手动选择超参数 α
✗ 负区间的选择可能影响性能
适用场景
• 担心 Dead ReLU 问题的深层网络
• GAN 的生成器
• 需要所有神经元都活跃的场景

📈 GELU 函数 — "Transformer 的选择"

GELU (Gaussian Error Linear Unit) 是 Transformer 架构中常用的激活函数。它通过概率分布来"平滑"地激活神经元,比 ReLU 更平滑,性能更好。

-6 -4 -2 0 2 4 6 0 2 4 (0, 0) x GELU(x)
\(\text{GELU}(x) = x \cdot \Phi(x) = 0.5x\left[1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right]\)

其中 \(\Phi(x)\) 是标准正态分布的累积分布函数 (CDF)

特点与优势
平滑可导:比 ReLU 更平滑,梯度更稳定
概率解释:基于高斯分布,有理论依据
性能优异:在 Transformer 中表现最好
✓ 负区间不完全为0,避免信息丢失
缺点
✗ 计算开销较大(涉及误差函数)
✗ 实现比 ReLU 复杂
适用场景
Transformer 架构(BERT、GPT 等)
• 大语言模型 (LLM)
• 需要平滑激活的场景

📈 SwiGLU 函数 — "LLM 的主流选择"

SwiGLU 是 Swish 激活函数的变体,结合了门控机制,是现代大语言模型(如 LLaMA、PaLM)的首选激活函数。

-6 -4 -2 0 2 4 6 0 2 4 (0, 0) x SwiGLU(x)
\(\text{SwiGLU}(x) = \text{SiLU}(x_g) \odot x_v\)(输入沿最后一维劈成门 \(x_g\) 与值 \(x_v\),门经 SiLU 激活后与值逐元素相乘)

SwiGLU 属于门控线性单元(GLU)家族:用一半输入经 Swish/SiLU 激活当“门”,控制另一半“值”的通过——与下方代码 gate, value = x.chunk(2); F.silu(gate) * value 一致。LLaMA、PaLM 等主流 LLM 普遍采用。

特点与优势
门控机制:自适应地控制信息通过
性能最优:在 LLM 中表现最好
✓ 结合了 ReLU 和 Sigmoid 的优点
✓ 梯度流动更顺畅
缺点
✗ 计算开销较大(需要计算 Sigmoid)
✗ 实现复杂度较高
适用场景
大语言模型 (LLM):LLaMA、PaLM、GPT-3+ 等
• Transformer 的 FFN 层
• 需要高性能的场景

📊 激活函数对比总览

下表总结了各种激活函数的关键特性,帮助你快速选择合适的激活函数。

激活函数 输出范围 计算速度 梯度消失 适用场景
Sigmoid (0, 1) 严重 二分类输出层
Tanh (-1, 1) 严重 RNN 隐藏层
ReLU [0, +∞) 极快 正区间无 通用隐藏层首选
Leaky ReLU (-∞, +∞) 避免 Dead ReLU
GELU (-0.17, +∞) 中等 Transformer
SwiGLU (-∞, +∞) 中等 LLM 首选

🧠 激活函数速查表

实战中不需要记住每种激活函数的数学公式,只需要根据任务场景快速锁定目标。下表按推荐优先级排列:

🥇 首选
ReLU
通用神经网络隐藏层
计算极快,收敛迅速。绝大多数场景下都够用。
🔄 替代
Leaky ReLU
遇到 Dead ReLU 时
神经元大量死亡时换用它,负区间给个小斜率即可。
🤖 Transformer
GELU / SwiGLU
LLM、BERT、GPT 等
平滑激活,性能最优。SwiGLU 是当前 LLM 的事实标准。
🔢 输出层
Sigmoid
二分类输出概率
只在输出层用,隐藏层千万别用——梯度消失严重。
🔄 RNN
Tanh
RNN / LSTM 隐藏层
零均值输出,适合循环网络结构。
⚡ 一句话实战口诀

隐藏层:不确定?闭眼选 ReLU。训练不动?换 Leaky ReLU。做 LLM?上 GELU / SwiGLU
输出层:二分类用 Sigmoid,多分类用 Softmax,回归不加激活函数。

在深入更复杂的内容之前,我们需要掌握一种"读图"的能力。神经网络看起来像一团乱麻——密密麻麻的点和线。但实际上,它像一张地图,每一层都对应着一种抽象层次。掌握了读图方法,你就能在任何神经网络图中看懂信息是如何流动的。

如果你不会读化学分子式,你就永远不懂化学。同样,如果你看不懂神经网络的图,你就永远无法真正理解深度学习。这张图,就是你进入深度学习世界的门票。

—— 每一个深度学习者的感悟

单个神经元长什么样?

想象一个小型的"投票站"。有多个选民(输入)投票决定一个议题,每个选民的票数权重不同。最后通过一个计票规则(激活函数)产生一个结果(0 或 1)。这就是神经元的本质。

🧠 神经元节点解剖图

从左到右,信号依次经过:输入 → 加权求和 → 激活函数 → 输出。每个输入有一个对应的权重,权重越大,那个输入对结果的"话语权"就越大。

x₁ x₂ x₃ x₄ w₁ w₂ w₃ w₄ Σ 加权求和 b σ(·) 激活函数 y 输入层 神经元内部 输出 y = σ(w₁x₁ + w₂x₂ + w₃x₃ + w₄x₄ + b)

▲ 单个神经元的完整解剖图:它接收多个输入,对每个输入乘以权重后求和,加上偏置,再通过一个非线性激活函数,最后输出一个值。

💡 关键理解

输入 (x)
原始数据,比如图片的像素值、文本的词向量。它们是你知道的"事实"。
权重 (w)
模型学到的"知识"。权重决定了这个输入有多重要。比如识别猫时,"尖耳朵"的权重可能很高。
激活函数 (σ)
非线性"开关"。没有它,多层网络就等价于单层。它让模型可以学习复杂的模式。常用 ReLU、GELU 等。
输出 (y)
神经元对这个输入的"判断结果"。这个输出又会成为下一层神经元的输入。

多层网络长什么样?

把上百个神经元连在一起,就是神经网络。每层负责不同层次的抽象——输入层读取原始数据,中间层(隐藏层)学习各种特征,输出层做出最终判断。

🕸️ 三层神经网络 — 识别手写数字"7"

这是一个极其简化的网络示意图(实际网络每层有数百到数千个神经元)。信号从左到右流动,每一层提取更抽象的特征。

输入层 第一隐藏层 第二隐藏层 输出层 0.5 0.8 0.3 0.9 0.2 h₁ h₂ h₃ h₄ h₅ d₁ d₂ d₃ 7 输入层读取像素 → 隐藏层1 检测边缘和笔画 → 隐藏层2 组合成笔画模式 → 输出层识别出"7" (实际网络每层有数百至数千个节点,连接数以百万计。上图是高度简化的示意)

▲ 信号从左向右流动:输入层的 5 个像素值经过两层隐藏层的层层变换,最终输出层给出了答案"7"。每条线的粗细代表权重大小。

🗺️ 读网络图的三要素

要素一

层(Layer)

层 = 抽象层次。输入层读取原始数据,浅层隐藏节点检测简单特征(如边缘、线条),深层隐藏节点检测复杂特征(如眼睛、车轮),输出层给出最终判断。层越深,特征越"抽象"。
要素二

节点(Node)

节点 = 特征检测器。每个神经元是一个小"探测器"。比如某个隐藏层节点专门检测"圆形",另一个检测"尖角"。深度网络的神奇之处在于:这些检测器是自动学出来的,不是人工设计的。
要素三

边(Edge)

边 = 权重(连接强度)。线的粗细/颜色深浅通常表示权重大小。粗线=强连接(重要),细线=弱连接(不太重要)。训练的过程就是不断调整所有边的粗细。

🔑 总结:一张图读懂神经网络

输入层是"眼睛",读取原始数据;隐藏层是"大脑",一层层学习越来越抽象的特征;输出层是"嘴巴",说出最终判断。节点之间的连线是"神经连接",线的粗细就是权重——代表这个连接有多重要。训练模型就是调整所有连接粗细的过程。理解了这张图,你就理解了深度学习最核心的架构。

深度学习之所以能够爆炸式发展,离不开几种核心架构的突破。它们各自擅长处理不同类型的数据,共同构成了现代AI的基石。

🔗 全连接神经网络(MLP)

多层感知机(Multi-Layer Perceptron)是最基础的深度学习架构。每一层的神经元与上一层的所有神经元相连。虽然结构简单,但通用定理(Universal Approximation Theorem)证明:只要隐层神经元足够多,MLP可以逼近任何连续函数。

🖼️ 卷积神经网络(CNN)

CNN是处理图像数据的首选架构。核心思想是利用卷积核在图像上滑动,提取局部特征(边缘、纹理、形状)。再通过池化操作降低维度。经典架构包括:

  • LeNet-5 (1998) — 最早的CNN之一,用于手写数字识别
  • AlexNet (2012) — 用ReLU+Dropout一举夺得ImageNet冠军,开启深度学习时代
  • VGGNet (2014) — 证明小卷积核(3×3)堆叠更有效
  • ResNet (2015) — 引入残差连接(Skip Connection),让网络可以训练上千层,斩获ImageNet冠军
  • EfficientNet (2019) — 通过复合缩放同时优化深度、宽度和分辨率

🔁 循环神经网络(RNN)及其变体

RNN是处理序列数据的经典架构。它的核心思想是保留"记忆"——当前输出不仅取决于当前输入,还取决于之前的输入序列。

  • RNN — 基本循环结构,但存在梯度消失问题,难以学习长距离依赖
  • LSTM (1997) — 引入门控机制(遗忘门、输入门、输出门),有效捕捉长距离依赖
  • GRU (2014) — LSTM的简化版,更新门和重置门,训练更快

⚡ Transformer —— 现代AI的基石

Transformer是2017年Google论文《Attention Is All You Need>中提出的革命性架构。它完全抛弃了循环和卷积结构,转而使用自注意力机制(Self-Attention)来处理序列数据。这一设计让模型可以同时关注序列中的所有位置,完美解决长距离依赖问题。

核心组件:

自注意力机制

每个词元(Token)都可以与序列中所有其他词元交互,计算"注意力分数",从而捕获全局依赖关系。

Attention(Q,K,V) = softmax(QK^T / √d)V

多头注意力(Multi-Head)

并行使用多组Q/K/V,让模型在不同的"注意力头"中学习不同类型的关联模式,最后拼接融合。

MultiHead = Concat(head₁...headₕ)W^O

前馈网络(FFN)

每个词元独立通过一个两层的全连接网络,引入非线性变换。现代LLM常用SwiGLU替代ReLU。

FFN(x) = W₂ · gelu(W₁x + b₁) + b₂

位置编码(PE)

Transformer本身没有顺序概念,需要加入位置编码让模型知道词元的位置。GPT使用旋转位置编码(RoPE)。

PE(pos, 2i) = sin(pos/10000^(2i/d))

Transformer有两个核心变体:Encoder-only(如BERT,适合理解类任务)和 Decoder-only(如GPT系列,适合生成类任务)。现代LLM几乎全部采用Decoder-only架构。

神经网络不是天生聪明的——它需要"学习"。而学习的核心过程只有两步:前向传播(做一遍题)和反向传播(对答案、改方法)。配合损失函数(评分标准),这三样构成了深度学习最核心的学习机制。

前向传播(Forward Propagation)—— "做一遍题"

前向传播就是数据从输入端到输出端的单向流动。就像做菜:先把菜切好(输入层),然后下锅翻炒(隐藏层1),再加盐加糖调味(隐藏层2),最后装盘出锅(输出层)。每一步都依赖上一步的结果,一气呵成。

🍳 前向传播:从输入到输出的完整旅程

以判断"一个水果是否是苹果"为例。输入是四个特征(颜色红度、圆形度、大小、光滑度),网络通过两层隐藏层的计算,最终给出判断。

输入层 隐藏层 1 (ReLU) 隐藏层 2 (ReLU) 输出层 红度 圆度 大小 光滑 x = [0.9, 0.8, 0.7, 0.85] 0.72 0.65 0.00 0.81 a = ReLU(w·x + b) 负数被切为零 0.55 0.42 a = ReLU(W·a₁ + b) 继续非线性变换 0.78 σ(W·a₂ + b) Sigmoid → [0,1] → 是苹果! (置信度 78%) 数据流动方向 →

▲ 数据从左边输入,经过加权求和 → ReLU 非线性变换 → 层层传递,最终在右边得到判断结果。每一步计算都是:先加权求和再加激活函数。

\[ \begin{aligned} \text{第一层:} & z_1 = W_1 x + b_1, \quad a_1 = \text{ReLU}(z_1) \\ \text{第二层:} & z_2 = W_2 a_1 + b_2, \quad a_2 = \text{ReLU}(z_2) \\ \text{输出层:} & y = \sigma(W_3 a_2 + b_3) \quad (\sigma \text{ 是 Sigmoid}) \end{aligned} \]

每一步都是先算 \(z = W \cdot \text{输入} + b\)(加权求和加偏置),再通过 激活函数得到输出。层层叠加,就完成了从输入到输出的完整计算。

损失函数(Loss Function)—— "对答案"

前向传播给出了一个预测结果,但这个结果对不对呢?多不少?损失函数就是用来量化的:它把"预测值"和"真实值"之间的差距算成一个数字——这个数字就是"损失"(Loss)。损失越大,说明模型错得越离谱。

📊 交叉熵损失(Cross-Entropy Loss)

适用场景:分类任务(比如判断是猫还是狗,或者从 10000 个类别中选一个)。

直觉理解:假设你要赌一把,你说"这只猫有 90% 的概率是橘猫",结果它是一只黑猫——那你的"损失"会非常大。如果你说"只有 10% 是橘猫"(其实它不是),那损失就小很多。模型越自信还越错,损失越大

📏 均方误差(MSE)

适用场景:回归任务(比如预测房价、气温——输出是一个连续的数字)。

直觉理解:你预测房价 300 万,实际是 500 万,误差 200 万。均方误差就是把所有样本的误差平方后求平均。平方使得大误差被惩罚得更重。

🏔️ 损失曲面:模型学习的"下山之旅"

想象一个山谷,山谷的最低点就是模型表现最好的状态(损失最小)。训练的过程,就是小球(模型参数)从山上滚到山谷最低点的过程。

高损失 最优参数(全局最低点) 随机初始化 梯度下降路径 图例 起点 下降路径 终点(最低点) 横轴 = 参数空间(简化为二维),纵轴 = 损失值

▲ 模型训练的过程 = 从随机参数(山顶)通过梯度下降(沿着最陡方向)不断滚动到最优参数(谷底)。每一轮迭代,小球都往低处滚一步。

反向传播(Backpropagation)—— "对答案,改方法"

做完题后对答案——发现错了 30 分。接下来要思考:"这 30 分里,有多少是切菜切的不好?有多少是火候不够?有多少是盐放少了?"反向传播就是用数学方法精确地回答这个问题。

反向传播的本质是链式法则(Chain Rule)——微积分中的"复合函数求导"。如果 y = f(g(x)),那么 dy/dx = dy/dg × dg/dx。就像一条多米诺骨牌,从最后一个开始推倒。

—— 理解反向传播的关键

🔄 反向传播:梯度如何从输出层回流

损失函数的梯度从输出层开始,沿着前向传播的"反向路径"逐层回传。每一步都会根据梯度更新权重。注意箭头的方向——与 forwards 传播相反!

输出层 隐藏层 2 隐藏层 1 输入层 Loss 损失函数 ŷ d₁ d₂ d₃ h₁ h₂ h₃ h₄ h₅ x Δw 更新 Δw 更新 ∂Loss/∂w = ∂Loss/∂ŷ × ∂ŷ/∂z × ∂z/∂w (链式法则) 梯度从右往左计算,每一步都比前一步多乘一个局部梯度 ← 梯度反向流动 (前向传播是反方向)

▲ 反向传播中,梯度沿着与前向传播相反的方向逐层回传。每一层的每个权重都得到自己的"梯度"——告诉它"你需要增加还是减少,增加/减少多少"。

⚙️ 梯度下降:用梯度来更新权重

有了梯度,接下来就是更新权重。更新规则很简单:

\(w_{\text{new}} = w_{\text{old}} - \eta \cdot \nabla L\)

梯度告诉我们损失函数"上升最快的方向"。权重沿着梯度的反方向更新,就能让损失变小。学习率(learning_rate)控制步长:太大了会" overshoot"(跨过了谷底),太小了训练太慢。

优化器(Optimizer)—— "怎么走下坡最快?"

最朴素的梯度下降(SGD)就像蒙着眼下山——只感受当前脚踩的地面倾斜方向。但更好的优化器有"智慧":

🚶 SGD

随机梯度下降。每一步只用一个样本计算梯度。速度快但有抖动,容易在谷底来回震荡。

🏀 Mini-batch SGD

每一步用一个小批量(如 32/64 个样本)计算梯度。是 SGD 的折中版本,最常用。

🛷 Momentum

加入"惯性"——如果一直在往一个方向走,就越走越快。帮助加速并减少震荡。

🧠 Adam

结合了 Momentum + RMSProp。自适应调整每个参数的学习率。是目前最流行的优化器,大多数模型默认使用它。

前面我们了解了神经网络的基本原理,现在让我们进入视觉领域的具体架构。CNN、ResNet、RNN、LSTM、GAN——这些名字你可能都听说过,但它们的内在逻辑到底是什么?这一节我们用直观的可视化方式逐一拆解。

卷积神经网络(CNN)—— "带着放大镜看图片"

CNN 的核心是"卷积"操作。想象你拿着一个放大镜(卷积核/Filter)在图片上从左到右、从上到下地扫描。每扫到一个位置,就计算放大镜覆盖区域和滤镜内部数据的相似度。这个相似度就是"特征图"(Feature Map)——它告诉你在图片的哪个位置有什么特征。

🔍 卷积操作:3×3 卷积核在 5×5 图像上滑动

卷积核就像一个小窗口,每次覆盖图像的一个小区域,做逐元素相乘再求和。不同的卷积核检测不同的特征——有的检测水平边缘,有的检测垂直边缘,有的检测角点。

输入图像 (5×5) 1 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 当前卷积窗口 3×3 卷积操作 3×3 卷积核 1 0 0 0 1 0 0 0 -1 逐元素相乘求和 输出特征图 (3×3) 0 2 -2 2 0 -1 -2 0 -1 卷积核在此例中检测"上白下黑"的垂直边缘。值越大,表示该区域与卷积核的匹配度越高。

▲ 卷积核(右上角)在输入图像上滑动,对覆盖区域逐元素相乘后求和,得到特征图中的一个值。这个卷积核就像一个"上白下黑边缘检测器"——它检测到的是一个"工"字形图案。

🧱 CNN 的特征层次化

CNN 的精妙之处在于:浅层卷积核检测简单特征(边缘、颜色、纹理),中层卷积核组合成中等复杂模式(圆形、条纹、角点),深层卷积核检测语义部件(眼睛、车轮、花瓣)。最终输出层将部件组合成完整的语义识别("这是一只猫")。这就是"深度"的意义——从局部到全局,从简单到复杂。

残差连接(Residual Connection)—— "学霸的笔记抄写技巧"

想象你要从一页笔记抄到另一页。传统做法是:把上一页看完,记住内容,然后在空白页上重新写一遍——很容易抄错或抄漏。而"学霸的笔记抄写技巧"是:直接在上一页上复印一份作为基底,然后在上面修改需要改的部分。这就是残差连接的核心思想。

❌ 普通层(没有残差连接)

y = f(Wx + b)
信息必须逐层"硬传"。网络越深时,梯度在经过多个 Sigmoid/ReLU 连乘后趋近于零——这就是著名的梯度消失问题。ResNet 之前,训练超过 20 层的网络几乎是不可能的。

✅ 残差块(Residual Block)

y = x + f(Wx + b)
输入 x 不仅经过卷积层 f(),还有一条"捷径"(Skip Connection)直接加到输出上。梯度可以沿着这条捷径畅通无阻地回传,让深层网络变得可训练。

🔄 残差连接:捷径(Skip Connection)让梯度"抄近道"

残差块有两路:主路经过卷积/激活,捷径路直接"跳过"。最终输出 = 捷径输入 + 主路输出。这允许梯度在网络深处也能畅通回传。

输入 x Conv1 BN + ReLU Conv2 BN + ReLU + + 输出 y = x + f(x) 捷径(Skip Connection):信息直通,梯度直达 主路:非线性变换 + 特征提取

▲ 残差块 = 主路(卷积+激活)+ 捷径(恒等映射)。输出是两路之和。ResNet 让网络轻松训练到 152 层,彻底改变了计算机视觉。

RNN & LSTM —— "带着记忆的读书人"

前面的网络都是"一次进一批数据,一次出结果"。但现实中有大量序列数据——一句话一个字一个字出现,一天一天有先后顺序,一首歌一段一段演奏。RNN(循环神经网络)的核心思想是:给网络装一个"记忆"——当前输出不仅取决于当前输入,还取决于之前看到的一切。

🔄 展开的 RNN:每个时刻共享同一组参数

RNN 就像一个复读机——每个时刻都用同样的方式处理输入和记忆。展开后可以看到:同一个神经元单元(矩形)在不同时刻被"复制"使用。

t=1 t=2 t=3 ... t=n RNN Cell x₁ h₁ RNN Cell x₂ h₂ RNN Cell x₃ h₃ ... RNN Cell xₙ hₙ h(t-1) h(t-1) 所有 RNN Cell 共享同一组参数 W → 模型可以处理任意长度的序列

▲ RNN 像一个复读机:每个时刻都用同一个"细胞"处理当前输入 x 和历史记忆 h,产生新的记忆 h。所有时刻共享同一组参数,所以可以处理任意长度的句子。

🚨 RNN 的问题:RNN 为什么不够用?

RNN 理论上可以"记住"之前的所有内容,但实际训练中,梯度在长序列上经过多次连乘后会趋近于零(梯度消失),导致模型"忘了"开头的内容。比如读一句话读到结尾,已经忘了开头的主语是什么。LSTM(长短期记忆网络)通过引入"门控机制"解决了这个问题。

🚪 LSTM 的三大门:遗忘门、输入门、输出门

LSTM 像一个有智能记忆的书桌——遗忘门决定扔掉什么信息,输入门决定添加什么新信息,输出门决定展示什么内容。三个门协同工作,让模型能记住数月前的上下文。

xₜ ← hₜ₋₁ ← → hₜ Cₜ × σ(Wf · [hₜ₋₁, xₜ] + bf) 遗忘门(0~1) 遗忘门 × σ(Wi · [hₜ₋₁, xₜ] + bi) 输入门(0~1) tanh(Wc · [hₜ₋₁, xₜ] + bc) 候选细胞状态 输入门 × σ(Wo · [hₜ₋₁, xₜ] + bo) 输出门(0~1) 输出门 tanh(Cₜ) 细胞状态 tanh σ = Sigmoid 函数(输出 0~1 的"门控值") | tanh = 输出 -1~1 | × = 逐元素相乘

▲ LSTM 的三大门:遗忘门决定"忘掉什么"(用 × 运算),输入门决定"记住什么新东西",输出门决定"暴露什么给下一时刻"。细胞状态 Cₜ 像一条"信息高速公路"贯穿整个序列。

生成对抗网络(GAN)—— "造假币 vs 验钞机"

GAN 有两个网络在"对打":生成器(Generator)负责造假,判别器(Discriminator)负责鉴真。两者互相竞争、互相进化——生成器造得越来越像真的,判别器也越来越会识别。最终生成器可以造出以假乱真的图像。

⚔️ GAN 的对抗循环

左边的"造假者"和右边的"验钞机"组成一个博弈系统。判别器的梯度指导生成器改进造假手法,生成器的输出又挑战判别器的鉴定能力。这个过程持续迭代,直到生成器达到"完美造假"——判别器完全无法分辨真假。

噪声 z 🎨 生成器 (造假者) G(z) 🖼️ 伪造图 真假混合 🔍 判别器 (验钞机) D(x) 真实/伪造 梯度回传 ← 告诉生成器"你的造假哪里露馅了" 同时输入真实图片供判别器学习 目标:伪造逼真 目标:识破伪造

▲ GAN 的核心是一个"猫鼠游戏":生成器试图造出以假乱真的假图欺骗判别器,判别器必须识别真假。两者的对抗推动彼此进化,最终生成器可以创造出全新的真实感图像。

经典

DCGAN

2015 年的里程碑,首次用卷积网络稳定训练 GAN。使用反卷积(Transposed Conv)生成图像,奠定了基于 CNN 的 GAN 基础架构。
明星

StyleGAN

NVIDIA 出品,可以生成照片级真实的人脸。生成的"不存在的人"完全以假乱真。支持从低分辨率到高分辨率的渐进式生成,控制细节到每根发丝。

Vision Transformer(ViT)—— " Transformer 进军视觉"

在 Transformer 横 NLP 界之后,研究人员问了一个问题:"如果不用 CNN,把图像直接丢给 Transformer 会怎样?"答案出乎意料——ViT 在大规模数据上甚至超过了同等规模的 CNN。它的基本思路很简单:把图像切成多个小 patch(像拼图),每个 patch 当做一个"词",然后交给 Transformer 处理。

🖼️ ViT 的核心思路

把一张 224×224 的图片切成 16×16 的小块 → 得到 196 个 patch → 每个 patch 拉平成一个向量 → 加上位置编码 → 交给 Transformer Encoder → 用 [CLS] token 的输出来分类。

关键点:Transformer 的自注意力机制天然适合捕捉图像中的全局依赖——CNN 的卷积核只能看到局部,而 Self-Attention 可以看到整张图。随着预训练数据量的增大,ViT 的优势越来越明显。

深度学习的版图远不止于此。当我们理解了神经网络如何学习之后,
下一章让我们进入大语言模型的世界——从 Token 到 Scaling Law,
一探 LLM 背后的核心原理与工程实践:大语言模型(LLM)