一、起点:感知机(Perceptron, 1958)

历史背景:为什么需要感知机?

1950年代的AI困境

  • 符号主义AI(逻辑推理)无法处理噪声数据
  • 需要一种能从数据中自动学习的模型

生物启发

McCulloch-Pitts神经元模型(1943)+ Hebb学习规则(1949)→ Rosenblatt感知机

感知机的数学本质

模型定义
$$f(\mathbf{x}) = \text{sign}(\mathbf{w}^\top \mathbf{x} + b) = \begin{cases} +1 & \text{if } \mathbf{w}^\top \mathbf{x} + b \geq 0 \ -1 & \text{if } \mathbf{w}^\top \mathbf{x} + b < 0 \end{cases}$$

学习规则(Perceptron Learning Rule)
$$\mathbf{w}_{t+1} = \mathbf{w}_t + \eta \cdot (y_i - \hat{y}_i) \cdot \mathbf{x}_i$$

为什么这样更新?

  • 预测错误时 $(y_i - \hat{y}_i) \neq 0$,权重向正确方向调整
  • 几何解释:调整超平面位置,使误分类样本被正确分类
感性理解

可以把感知机看成只有一步的“决策器”,它做的事情本质是:

  1. 先算一个线性打分(score):
    $$s(\mathbf{x})=\mathbf{w}^\top \mathbf{x}+b.$$
  2. 再把这个打分变成类别(decision):
    $$f(\mathbf{x})=\text{sign}(s(\mathbf{x}))\in{+1,-1}.$$

所以感知机不是在输出一个连续数值(那更像回归),而是在输出“属于哪一侧”的离散标签

1)公式 sign(w^T x + b) 到底什么意思?

当且仅当 $s(\mathbf{x}) \ge 0$,输出 $+1$;否则输出 $-1$。对应几何就是:所有满足
$$\mathbf{w}^\top \mathbf{x}+b=0$$
的点组成一条(二维时)或一个(高维时)超平面,它把空间切成两半:

  • $s(\mathbf{x})\ge 0$ 的一半给 $+1$
  • $s(\mathbf{x})<0$ 的一半给 $-1$

直觉上:感知机先画一条“分割线/分割面”,再看样本点落在哪一边。

2)感知机本质是个分类器吗?

是的。更准确地说:单层感知机就是一个线性二分类器(linear binary classifier)。
它只依赖 $\mathbf{w}^\top \mathbf{x}+b$ 这一个线性表达式,再用阈值(这里是 0)把输出离散化。

3)学习规则在“什么时候改哪里”?

当预测正确时,$y_i=\hat{y}_i$,于是 $(y_i-\hat{y}_i)=0$,权重更新为 0;
当预测错误时,$(y_i-\hat{y}_i)\neq 0$,权重会沿 $\pm \mathbf{x}_i$ 的方向移动,从而改变超平面位置,让未来这类样本更可能被分到正确一侧。


致命局限:XOR问题与线性可分性

什么是线性可分?

存在一条直线(或超平面)能将两类数据完全分开。

XOR问题的几何可视化

1
2
3
4
5
6
7
(0,1) ●        ● (1,1)
类别1 类别1

(0,0) ● ● (1,0)
类别0 类别0

无法画一条直线将两个类别1和两个类别0分开

数学证明
假设存在 $\mathbf{w}, b$ 使得:

  • $(0,0) \rightarrow -1$:$b < 0$
  • $(0,1) \rightarrow +1$:$w_2 + b > 0$
  • $(1,0) \rightarrow +1$:$w_1 + b > 0$
  • $(1,1) \rightarrow -1$:$w_1 + w_2 + b < 0$

前三个不等式相加:$w_1 + w_2 + 2b > 0$,但第四个要求 $w_1 + w_2 + b < 0$,矛盾!

历史影响

  • 1969年Minsky & Papert《Perceptrons》出版
  • 直接导致第一次AI寒冬(1970s-1980s早期)
  • 研究资金枯竭,神经网络被弃用近20年

二、突破:多层感知机与反向传播(1986)

为什么需要多层?—— 非线性变换的堆叠

核心洞察:单层感知机 = 线性分类器,多层堆叠 = 非线性分类器

XOR问题的多层解决方案

1
2
3
4
5
6
第一层(隐藏层):
h₁ = σ(w₁₁x₁ + w₁₂x₂ + b₁) = NAND门 ≈ NOT(x₁ AND x₂)
h₂ = σ(w₂₁x₁ + w₂₂x₂ + b₂) = OR门

第二层(输出层):
y = σ(v₁h₁ + v₂h₂ + c) = AND门(作用于h₁, h₂)

逻辑等价:XOR = (x₁ OR x₂) AND NOT(x₁ AND x₂)

万能近似定理(Universal Approximation Theorem, 1989)

Cybenko定理(数学保证):

设 $\sigma$ 是非常数、有界、连续的激活函数(如sigmoid),$K \subset \mathbb{R}^n$ 是紧致集,$f: K \rightarrow \mathbb{R}$ 是连续函数。则对任意 $\epsilon > 0$,存在一个具有有限隐藏层神经元的单隐藏层神经网络,使得:
$$\sup_{\mathbf{x} \in K} |f(\mathbf{x}) - N(\mathbf{x})| < \epsilon$$

关键理解

  • 存在性定理:保证MLP有能力近似任何函数
  • 不保证可学习:没说梯度下降能找到这些参数
  • 不说明效率:可能需要指数级数量的神经元
感性理解:万能近似在讲“能表达”,不在保证“能学到”
  • 它说明:模型类里一定存在接近目标函数的解(表达能力层面)。
  • 训练(梯度下降)还取决于优化路径、初始化、数据与正则化,所以“存在”不等于“一定能找到”。

为什么这很重要?

  • 理论上证明了神经网络的表达能力不是问题
  • 问题转化为:如何有效训练找到这些参数

反向传播算法详解

为什么需要反向传播?

前向传播的问题

  • 给定输入 $\mathbf{x}$,可以计算输出 $\hat{y}$ 和损失 $L$
  • 但如何知道每个参数对损失的贡献?

梯度下降的需求
$$\mathbf{w}^{(t+1)} = \mathbf{w}^{(t)} - \eta \nabla_{\mathbf{w}} L$$

需要计算 $\frac{\partial L}{\partial w_{ij}^{(l)}}$ 对所有层 $l$ 的所有参数。

链式法则的神经网络应用

计算图视角

1
2
3
x → [线性: z=Wx+b] → [激活: a=σ(z)] → ... → [输出: ŷ] → [损失: L(ŷ,y)]
↑________________________|________________________|
反向传播路径

具体推导(以两层网络为例)

网络结构

  • 输入层:$\mathbf{x} \in \mathbb{R}^d$
  • 隐藏层:$\mathbf{z}^{(1)} = \mathbf{W}^{(1)}\mathbf{x} + \mathbf{b}^{(1)}$,$\mathbf{a}^{(1)} = \sigma(\mathbf{z}^{(1)})$
  • 输出层:$\mathbf{z}^{(2)} = \mathbf{W}^{(2)}\mathbf{a}^{(1)} + \mathbf{b}^{(2)}$,$\hat{y} = \sigma(\mathbf{z}^{(2)})$
  • 损失:$L = \frac{1}{2}(y - \hat{y})^2$

反向传播步骤

第1步:输出层梯度
$$\frac{\partial L}{\partial \hat{y}} = -(y - \hat{y})$$
$$\frac{\partial L}{\partial \mathbf{z}^{(2)}} = \frac{\partial L}{\partial \hat{y}} \cdot \sigma’(\mathbf{z}^{(2)}) \equiv \boldsymbol{\delta}^{(2)}$$

第2步:参数梯度(输出层)
$$\frac{\partial L}{\partial \mathbf{W}^{(2)}} = \boldsymbol{\delta}^{(2)} (\mathbf{a}^{(1)})^\top$$
$$\frac{\partial L}{\partial \mathbf{b}^{(2)}} = \boldsymbol{\delta}^{(2)}$$

第3步:误差反向传播到隐藏层
$$\boldsymbol{\delta}^{(1)} = (\mathbf{W}^{(2)})^\top \boldsymbol{\delta}^{(2)} \odot \sigma’(\mathbf{z}^{(1)})$$

关键:$(\mathbf{W}^{(2)})^\top$ 将误差从输出层”传播”回隐藏层,$\odot$ 表示逐元素乘。

第4步:参数梯度(隐藏层)
$$\frac{\partial L}{\partial \mathbf{W}^{(1)}} = \boldsymbol{\delta}^{(1)} \mathbf{x}^\top$$
$$\frac{\partial L}{\partial \mathbf{b}^{(1)}} = \boldsymbol{\delta}^{(1)}$$

为什么叫”反向”?

前向:数据从输入流向输出(计算预测)
反向:梯度从输出流向输入(计算参数更新)

1
2
Forward:  x → z₁ → a₁ → z₂ → a₂ → L
Backward: ∇L ← δ₂ ← δ₁ ← ... (通过链式法则反向计算)
感性理解:反向传播是在“分摊损失账单”
  • 输出对损失的影响要经过多层变换,所以梯度告诉你:每一层参数应该朝哪个方向微调,才能让未来损失更小。
  • 你可以把它理解成从输出错误一路回传到参数的“责任分配”(credit assignment)。

计算效率

  • 前向计算所有节点值,存储中间结果
  • 反向复用这些结果,避免重复计算
  • 时间复杂度:O(网络连接数),与前向相同

三、训练体系的完善(1990s-2000s)

损失函数的演进逻辑

为什么需要损失函数?

优化目标:找到使模型预测”好”的参数
数学化:定义”好”的度量 → 损失函数

理想损失:0-1损失(分类错误次数)
$$L_{0-1} = \mathbb{I}[\hat{y} \neq y]$$

问题:不可微分,无法梯度下降!

凸代理损失(Surrogate Loss)

核心思想:用可微分的凸函数近似0-1损失

回归任务:均方误差(MSE)
$$L_{\text{MSE}} = \frac{1}{n}\sum_{i=1}^n (y_i - \hat{y}_i)^2$$

性质

  • 凸函数,全局最优
  • 对异常值敏感(平方放大误差)
  • 假设噪声高斯分布

分类任务:交叉熵(Cross-Entropy)

信息论背景

  • 熵:$H(p) = -\sum p(x)\log p(x)$,衡量不确定性
  • KL散度:$D_{KL}(p|q) = \sum p(x)\log\frac{p(x)}{q(x)}$,衡量分布差异

推导
$$\text{CrossEntropy} = H(p, q) = -\sum_x p(x)\log q(x) = H(p) + D_{KL}(p|q)$$

对于分类,真实分布 $p$ 是one-hot(如 $[0,1,0]$),则:
$$L_{CE} = -\log q(y_{\text{true}}) = -\log \hat{y}_{\text{correct class}}$$

为什么比MSE好?

梯度对比(Sigmoid输出)

情况 MSE梯度 CE梯度
预测正确且置信度高 梯度小(好) 梯度小(好)
预测错误但置信度高 梯度极小(坏) 梯度大(好)
预测错误且置信度低 梯度中等 梯度中等

MSE的问题:当Sigmoid输出接近0或1时,导数 $\sigma’(z) = \sigma(z)(1-\sigma(z)) \approx 0$,导致梯度消失

CE的梯度
$$\frac{\partial L_{CE}}{\partial z} = \hat{y} - y$$

与Sigmoid的导数无关!避免梯度消失。

感性理解:交叉熵=“对置信度的校准器”
  • MSE 在 Sigmoid 饱和区会把梯度压得很小,导致模型在“自信地错”时也学不动。
  • 交叉熵的梯度更直接,能持续推动概率向正确类别移动(直觉上就是在校准“你到底有多确定”)。
  • 所以它更像是在训练“概率分配越来越合理”,而不只是让输出数值看起来更接近标签。

参数更新的演进逻辑

梯度下降的三种形式

批量梯度下降(BGD)
$$\mathbf{w}_{t+1} = \mathbf{w}t - \eta \nabla{\mathbf{w}} L(\mathbf{w}; \mathcal{D})$$

  • 使用全部训练数据计算梯度
  • 梯度准确,但每步计算量大
  • 内存需求高

随机梯度下降(SGD)
$$\mathbf{w}_{t+1} = \mathbf{w}t - \eta \nabla{\mathbf{w}} L(\mathbf{w}; (\mathbf{x}_i, y_i))$$

  • 使用单个样本计算梯度
  • 计算快,但梯度噪声大
  • 噪声可能帮助逃离局部极小值

小批量梯度下降(Mini-batch GD)
$$\mathbf{w}_{t+1} = \mathbf{w}t - \eta \nabla{\mathbf{w}} L(\mathbf{w}; \mathcal{B}), \quad |\mathcal{B}| = m$$

  • 折中方案,$m$ 通常32-512
  • 梯度估计较准确,计算效率可接受
  • 现代深度学习标准做法

为什么需要动量(Momentum)?

SGD的问题:在”峡谷”地形中震荡

感性理解:动量=“沿坡积累惯性”
  • SGD 每次只看当前梯度,窄方向容易反复抖动(来回“刹车-加速”)。
  • 动量把历史梯度叠加起来,相当于只要某个方向的“趋势”一直存在,就持续用力;反方向就会被抵消。
  • 因而训练曲线更平滑、收敛更快。

1
2
3
4
5
可视化:
损失函数等高线呈椭圆形(某些方向曲率大,某些小)
SGD:在短轴方向震荡,长轴方向缓慢前进

理想:积累速度,减少震荡,加速一致方向

动量方法
$$\mathbf{v}t = \gamma \mathbf{v}_{t-1} + \eta \nabla{\mathbf{w}} L(\mathbf{w}_t)$$
$$\mathbf{w}_{t+1} = \mathbf{w}_t - \mathbf{v}_t$$

物理类比

  • $\mathbf{v}$:速度(积累历史梯度)
  • $\gamma$:摩擦系数(通常0.9)
  • 小球在损失地形中滚动,惯性帮助越过局部极小值

自适应学习率方法

核心问题:不同参数需要不同学习率

  • 稀疏特征(罕见词):需要大更新
  • 频繁特征(常见词):需要小更新

AdaGrad
$$\mathbf{g}t = \nabla{\mathbf{w}} L(\mathbf{w}_t)$$
$$\mathbf{r}_t = \mathbf{r}_{t-1} + \mathbf{g}_t \odot \mathbf{g}_t \quad \text{(累积梯度平方)}$$
$$\Delta \mathbf{w}_t = -\frac{\eta}{\sqrt{\mathbf{r}_t + \epsilon}} \odot \mathbf{g}_t$$

问题:$\mathbf{r}_t$ 单调递增 → 学习率单调递减 → 过早停止

RMSprop(解决AdaGrad问题):
$$\mathbf{r}_t = \rho \mathbf{r}_{t-1} + (1-\rho) \mathbf{g}_t \odot \mathbf{g}_t \quad \text{(指数移动平均)}$$

Adam(Adaptive Moment Estimation,2014):
$$\mathbf{m}_t = \beta_1 \mathbf{m}_{t-1} + (1-\beta_1)\mathbf{g}_t \quad \text{(一阶矩:动量)}$$
$$\mathbf{v}_t = \beta_2 \mathbf{v}_{t-1} + (1-\beta_2)\mathbf{g}_t^2 \quad \text{(二阶矩:自适应学习率)}$$

偏差修正(关键):
$$\hat{\mathbf{m}}_t = \frac{\mathbf{m}_t}{1-\beta_1^t}, \quad \hat{\mathbf{v}}_t = \frac{\mathbf{v}_t}{1-\beta_2^t}$$

为什么需要偏差修正?

  • 初始时 $\mathbf{m}_0 = \mathbf{v}_0 = \mathbf{0}$
  • 前几步估计偏向0,需要放大修正

Adam的优势

  • 结合动量(一阶矩)和自适应学习率(二阶矩)
  • 对超参数不敏感($\beta_1=0.9, \beta_2=0.999, \eta=0.001$ 通用)
  • 成为2015-2020年默认优化器

四、革命:卷积神经网络(CNN)

从全连接到卷积:为什么需要结构先验?

全连接处理图像的问题

参数爆炸

  • 1000×1000 RGB图像 = 3,000,000输入维度
  • 隐藏层1000神经元 → 30亿参数(仅第一层!)
  • 内存:30亿 × 4字节 ≈ 12GB

结构破坏

  • 全连接将图像展平为向量,丢失空间信息
  • 像素(1,1)与(1,2)的相邻关系被忽略

卷积的生物学启发

Hubel & Wiesel实验(1962,诺贝尔生理学奖)

  • 猫视觉皮层存在简单细胞复杂细胞
  • 简单细胞:对特定位置、方向的边缘响应(局部感受野)
  • 复杂细胞:对位置变化有一定容忍性(平移不变性)

卷积神经网络的设计原则

  1. 局部连接:每个神经元只连接局部区域(感受野)
  2. 权重共享:同一卷积核在整个图像滑动使用
  3. 平移等变性:目标移动,特征响应随之移动
感性理解:卷积的归纳偏置让模型“天然会看局部”
  • 权值共享+局部连接等于告诉模型:同一种“形状/纹理证据”在不同位置出现时应该用同样的方式识别。
  • 感受野随着层数扩大:低层更像捕捉边缘纹理,高层逐步聚合成更大范围的部件/语义。
  • 这也是为什么 CNN 在视觉任务里通常比纯全连接更省数据、更好泛化。

卷积操作详解

一维卷积(理解基础)

$$(f * g)(t) = \int_{-\infty}^{\infty} f(\tau)g(t-\tau)d\tau$$

离散形式(信号处理)
$$(f * g)[n] = \sum_{m=-\infty}^{\infty} f[m]g[n-m]$$

神经网络中的卷积(互相关,Cross-correlation):
$$(I * K)(i,j) = \sum_{m=0}^{k-1}\sum_{n=0}^{k-1} I(i+m, j+n) \cdot K(m,n)$$

注意:深度学习中的”卷积”实际是互相关(不翻转核),但习惯仍称卷积。

二维卷积可视化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
输入图像 (5×5)          卷积核 (3×3)         输出特征图 (3×3)
┌───┬───┬───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐
│ 1 │ 1 │ 1 │ 0 │ 0 │ │ 1 │ 0 │ 1 │ │ 4 │ 3 │ 4 │
├───┼───┼───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤
│ 0 │ 1 │ 1 │ 1 │ 0 │ │ 0 │ 1 │ 0 │ │ 2 │ 4 │ 3 │
├───┼───┼───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤
│ 0 │ 0 │ 1 │ 1 │ 1 │ │ 1 │ 0 │ 1 │ │ 2 │ 3 │ 4 │
├───┼───┼───┼───┼───┤ └───┴───┴───┘ └───┴───┴───┘
│ 0 │ 0 │ 0 │ 1 │ 1 │
├───┼───┼───┼───┼───┤
│ 0 │ 0 │ 0 │ 0 │ 1 │
└───┴───┴───┴───┴───┘

计算过程(以左上角为例):
1×1 + 1×0 + 1×1 + 0×0 + 1×1 + 1×0 + 0×1 + 0×0 + 1×1 = 1+0+1+0+1+0+0+0+1 = 4

卷积的核心超参数

参数 作用 典型值
Kernel Size ($k$) 感受野大小 3×3, 5×5, 7×7
Stride ($s$) 滑动步长 1(精细),2(下采样)
Padding ($p$) 边缘填充 0(Valid),$k//2$(Same)
Channels ($C$) 卷积核数量 32, 64, 128, 256

输出尺寸公式
$$H_{out} = \left\lfloor \frac{H_{in} + 2p - k}{s} \right\rfloor + 1$$

为什么3×3卷积成为标准?

  • 两个3×3卷积的感受野 = 一个5×5卷积($2\times(3-1)+1=5$)
  • 参数:$2 \times 3^2 = 18$ vs $5^2 = 25$,更少参数
  • 更多非线性(中间多一个激活函数)

池化层(Pooling)

为什么需要池化?

问题:卷积输出尺寸大,且对微小位置变化过于敏感

目标

  1. 降维:减少计算量
  2. 平移不变性:微小位置变化不影响输出
  3. 扩大感受野:后续层看到更大区域

最大池化 vs 平均池化

Max Pooling(2×2, stride=2)

1
2
3
4
5
┌───┬───┐      ┌───┐
│ 1 │ 3 │ │ 3 │ (取最大值,保留最强特征)
├───┼───┤ → └───┘
│ 2 │ 4 │
└───┴───┘

Average Pooling

  • 取平均值,保留背景信息
  • 现在较少使用,通常用Stride卷积替代

CNN架构演进详解

LeNet-5(1998)—— 奠基者

1
2
3
4
5
6
输入 (32×32) 
→ Conv1: 6@28×28 (5×5)
→ AvgPool: 6@14×14 (2×2)
→ Conv2: 16@10×10 (5×5)
→ AvgPool: 16@5×5 (2×2)
→ FC: 120 → 84 → 10 (类别)

创新点

  • 首次完整CNN架构
  • 卷积+池化+全连接的经典范式
  • 权重共享大幅减少参数

局限:在MNIST上成功,但ImageNet上表现不佳(数据、算力不足)

AlexNet(2012)—— 引爆深度学习

历史背景

  • ImageNet 2012竞赛:错误率从26%降至15.3%,第二名26.2%
  • 使用2块GTX 580 GPU训练5-6天

关键创新

创新 解决的问题 原理
ReLU激活 Sigmoid梯度消失 $f(x)=\max(0,x)$,梯度恒为1(正区间)
GPU并行 训练速度 将网络分成两部分放在2个GPU
Local Response Normalization 增强泛化 侧向抑制(后续被BN取代)
Dropout (0.5) 过拟合 随机丢弃50%神经元,强制冗余学习
Data Augmentation 数据不足 随机裁剪、翻转、PCA颜色扰动

ReLU的数学优势
$$\text{Sigmoid}: \sigma’(x) = \sigma(x)(1-\sigma(x)) \in (0, 0.25]$$
$$\text{ReLU}: f’(x) = \mathbb{I}[x > 0] \in {0, 1}$$

  • Sigmoid在饱和区($|x|>5$)梯度几乎为0
  • ReLU在正区间梯度恒为1,缓解梯度消失

ReLU的问题:Dead ReLU(神经元永久失活)

  • 负输入梯度为0,不再更新
  • 解决方案:Leaky ReLU, PReLU, ELU

VGGNet(2014)—— 深度的力量

核心思想:用小卷积核(3×3)堆叠替代大卷积核

VGG-16配置

1
2
3
4
5
Conv3-64 → Conv3-64 → MaxPool
→ Conv3-128 → Conv3-128 → MaxPool
→ Conv3-256 ×3 → MaxPool
→ Conv3-512 ×3 → MaxPool ×2
→ FC-4096 ×2 → FC-1000

为什么3×3堆叠更好?

  • 感受野等价:3个3×3 = 1个7×7($3\times(3-1)+1=7$)
  • 参数对比:$3 \times 3^2 \times C^2 = 27C^2$ vs $7^2 \times C^2 = 49C^2$
  • 非线性增强:3层之间有3个ReLU vs 1个

教训:16-19层是极限,更深网络训练困难(退化问题)

ResNet(2015)—— 残差学习革命

核心问题:网络退化(Degradation)

现象:56层网络比20层训练误差更高(不是过拟合!)

1
2
3
训练误差:
20层: ████████░░░░░░░░░░░░ 低
56层: ████████████████░░░░ 更高(训练集上表现更差!)

原因分析

  • 不是过拟合(训练误差也高)
  • 不是梯度消失(BN已缓解)
  • 优化困难:深层网络难以学习恒等映射

残差学习(Residual Learning)

传统:学习 $H(x)$(目标映射)
残差:学习 $F(x) = H(x) - x$,即残差

残差块结构
$$\mathbf{y} = \mathcal{F}(\mathbf{x}, {\mathbf{W}_i}) + \mathbf{x}$$

为什么残差更容易优化?

  1. 恒等映射容易:令 $\mathcal{F}(\mathbf{x}) = \mathbf{0}$ 即可,比学习完整映射简单
  2. 梯度高速公路:反向传播时梯度可以直接通过跳跃连接回传
感性理解:残差让网络“只学修正”
  • 如果真实映射本来就接近恒等(或只是小改动),那么目标就等价于让残差 $F(x)$ 变小;优化目标一下就变轻了。
  • 跳连提供梯度的直接通路:深层不容易“断梯度”,因此更容易训练到有效表示。

梯度流分析
$$\frac{\partial L}{\partial \mathbf{x}} = \frac{\partial L}{\partial \mathbf{y}} \cdot \left(1 + \frac{\partial \mathcal{F}}{\partial \mathbf{x}}\right)$$

即使 $\frac{\partial \mathcal{F}}{\partial \mathbf{x}}$ 很小,梯度至少为1,避免消失。

ResNet架构

  • ResNet-18, 34, 50, 101, 152
  • Bottleneck设计(1×1降维→3×3卷积→1×1升维)减少计算

五、深度网络训练的关键技术

Dropout详解

为什么需要Dropout?

过拟合的表现

  • 训练误差持续下降,验证误差先降后升
  • 模型记忆了训练数据噪声,而非学习通用规律

Dropout机制

训练时

  • 以概率 $p$(通常0.5)随机将神经元输出置0
  • 存活神经元输出乘以 $1/(1-p)$ 保持期望一致

数学解释:模型集成

  • 每次Dropout相当于训练一个不同的”子网络”
  • $N$ 个神经元有 $2^N$ 种可能的子网络
  • 预测时相当于这些子网络的平均(模型集成)

测试时

  • 不使用Dropout,使用所有神经元
  • 自动实现集成效果
感性理解:Dropout 让网络学会“别只靠单一路径”
  • 训练时随机删掉一部分神经元,逼迫网络把信息冗余地分散到多条通路上。
  • 测试时使用全网络,相当于把很多“子网络”的预测做平均,所以更稳健。

Batch Normalization详解

内部协变量偏移(Internal Covariate Shift)

问题描述

  • 网络深层:第 $l$ 层输入 = 第 $l-1$ 层输出
  • 第 $l-1$ 层参数更新 → 第 $l$ 层输入分布改变
  • 第 $l$ 层需要不断适应新分布 → 训练缓慢

类比:猫追老鼠,老鼠也在随机移动

BN的解决方案

对每个mini-batch
$$\hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}$$
$$y_i = \gamma \hat{x}_i + \beta$$

训练时

  • $\mu_B, \sigma_B$:当前batch的均值、方差
  • $\gamma, \beta$:可学习参数(缩放和平移)

为什么需要 $\gamma, \beta$?

  • 纯粹标准化可能破坏网络表达能力
  • 例如Sigmoid需要在非线性区,标准化后可能在线性区
  • $\gamma, \beta$ 允许网络”撤销”标准化 if needed

测试时

  • 使用训练时累积的滑动平均 $\mu_{running}, \sigma_{running}$
  • 不再依赖batch统计
感性理解:BN是在把每一层拉回“好工作区”
  • 你希望各层输入分布不要长期漂移,这样激活函数更可能处在有效非线性区,梯度就更稳定。
  • 所以 BN 既加速优化,也带来一定正则化效果。

BN的副作用与优势

主要优势

  1. 允许更大学习率:梯度不爆炸/消失
  2. 减少对初始化敏感:即使随机初始化也能训练
  3. 正则化效果:mini-batch噪声有正则化作用

副作用

  • 依赖batch size(太小估计不准)
  • 增加计算量(后续被Group Norm等替代)

权重初始化

为什么初始化很重要?

极端情况

  • 全0初始化:所有神经元输出相同,无法打破对称性
  • 过大初始化:激活饱和,梯度消失
  • 过小初始化:信号逐层衰减,梯度消失

Xavier/Glorot初始化

目标:保持前向传播和反向传播的方差一致

假设:线性激活,独立同分布输入

推导
$$\text{Var}(y) = n_{in} \cdot \text{Var}(w) \cdot \text{Var}(x)$$

为使 $\text{Var}(y) = \text{Var}(x)$:
$$\text{Var}(w) = \frac{1}{n_{in}}$$

考虑反向传播,取平均:
$$\text{Var}(w) = \frac{2}{n_{in} + n_{out}}$$

Xavier初始化
$$W \sim \mathcal{U}\left[-\sqrt{\frac{6}{n_{in}+n_{out}}}, \sqrt{\frac{6}{n_{in}+n_{out}}}\right]$$

He/Kaiming初始化

针对ReLU:ReLU将一半输入置0,方差减半

修正
$$\text{Var}(w) = \frac{2}{n_{in}}$$

He初始化
$$W \sim \mathcal{N}\left(0, \sqrt{\frac{2}{n_{in}}}\right)$$

现代默认:ReLU用He初始化,Sigmoid/Tanh用Xavier

六、从CNN到Transformer:注意力机制革命

CNN的局限

长距离依赖问题

感受野计算

  • 卷积层 $l$ 的感受野 = $k \times s^{l-1}$(近似)
  • 要覆盖整张图像需要很多层

问题

  • 远距离像素交互需要经过多层传播
  • 信息在传递中可能丢失或稀释

归纳偏置的双刃剑

CNN的归纳偏置

  • 局部性:邻近像素相关
  • 平移等变性:相同特征在不同位置用相同方式检测

局限

  • 对于非局部关系(如”狗”和”尾巴”可能相距很远)效率低
  • 对序列数据(文本)不自然
感性理解:注意力=让每个位置去全局找证据
  • 卷积要靠“层层扩大感受野”才能覆盖远处信息;注意力则直接在表示层做全局配对,一步就能把远处的相关内容拉回来。
  • 所以长距离依赖更自然:位置间交互不再被距离带来的“等待多层”限制。

注意力机制详解

为什么叫”注意力”?

人类视觉注意力

  • 不会同时处理整张图像的所有细节
  • 聚焦关键区域,忽略无关信息

神经网络注意力

  • 动态决定”看哪里”
  • 根据当前任务(Query)选择相关信息(Key-Value)

Scaled Dot-Product Attention

三个角色

  • Query (Q):当前要查询什么(如”翻译下一个词”)
  • Key (K):每个位置提供什么信息(如”每个源词的含义”)
  • Value (V):实际要获取的内容(如”源词的语义表示”)

计算步骤

Step 1:计算相似度(Query与Key匹配)
$$\text{Attention Scores} = QK^\top$$

Step 2:缩放(防止Softmax饱和)
$$\text{Scaled Scores} = \frac{QK^\top}{\sqrt{d_k}}$$

为什么除以 $\sqrt{d_k}$?

  • $d_k$ 较大时,点积值方差增大
  • Softmax在输入很大时梯度极小(饱和)
  • 缩放保持方差稳定,梯度健康

Step 3:Softmax归一化
$$\text{Attention Weights} = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)$$

Step 4:加权求和(获取Value)
$$\text{Output} = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V$$

自注意力(Self-Attention)

关键创新:Q, K, V来自同一序列

意义

  • 每个位置可以与序列中所有其他位置直接交互
  • 距离无关:第1个词和第100个词的交互复杂度相同(O(1))
  • 并行计算:不像RNN需要串行

与卷积对比

特性 卷积 自注意力
感受野 局部,需堆叠扩大 全局,直接交互
位置感知 通过滑动隐式编码 需显式位置编码
计算复杂度 $O(n \cdot k^2 \cdot d)$ $O(n^2 \cdot d)$
参数共享 卷积核共享 每对位置独立权重(通过投影)

Transformer架构

为什么取代RNN?

RNN的问题

  • 串行计算:第 $t$ 步依赖第 $t-1$ 步,无法并行
  • 长距离依赖:信息需经过多步传递,梯度易消失
  • 计算瓶颈:长序列训练极慢
感性理解:Transformer 的关键是“全局并行交互”
  • RNN 把信息传递串成时间链条,长序列就等于要多次“搬运”;Transformer 则一次性建立任意位置之间的交互关系。
  • 因此长依赖不必等待多步传播,同时训练/推断更适合并行硬件。

Transformer的解决

  • 完全并行:一次处理整个序列
  • 全局依赖:任意位置直接交互
  • 可扩展:GPT-3/GPT-4基于此

Transformer完整架构

1
2
3
4
5
6
7
输入嵌入 + 位置编码

[编码器层] × N

[解码器层] × N(生成任务需要)

输出投影 + Softmax

编码器层(Encoder Layer)

1
2
输入 → [多头自注意力] → [Add & Norm] → [前馈网络] → [Add & Norm]
↓残差连接 ↓残差连接

多头注意力(Multi-Head Attention)

  • 将 $d_{model}$ 维分成 $h$ 个头,每个头 $d_k = d_{model}/h$
  • 每个头学习不同的注意力模式(语法、语义、指代等)
  • 拼接后线性投影

前馈网络(FFN)
$$\text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2$$

  • 两个线性变换夹ReLU
  • 独立作用于每个位置(无位置间交互)
  • 增加非线性表达能力

层归一化(Layer Norm)vs 批归一化(Batch Norm)

Batch Norm Layer Norm
归一化维度 跨batch,每个特征 跨特征,每个样本
公式 $\frac{x - \mu_B}{\sigma_B}$ $\frac{x - \mu_C}{\sigma_C}$(C=特征维度)
适合 CNN(batch内统计稳定) Transformer(序列长度变化)
优势 正则化效果 对batch size不敏感

为什么Transformer用Layer Norm?

  • 序列长度变化,batch统计不稳定
  • RNN/Transformer中更自然

位置编码(Positional Encoding)

问题:自注意力是置换不变的(打乱序列顺序,输出不变)

解决方案:注入位置信息

正弦位置编码(原始Transformer):
$$PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right)$$
$$PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right)$$

优势

  • 可处理任意长度(训练时未见过的长度)
  • 相对位置可学习:$PE_{pos+k}$ 是 $PE_{pos}$ 的线性函数

可学习位置编码(BERT/GPT等后续使用):

  • 将位置编码作为可训练参数
  • 限制最大长度,但更简单有效

视觉Transformer(ViT)

将图像视为序列

图像分块(Patch Embedding)

  • 224×224图像 → 16×16分块 → 196个patch(每个768维)
  • 每个patch线性投影到 $d_{model}$ 维
  • 加入类别token(类似BERT的[CLS])和位置编码

架构

1
图像 → Patch Embedding → [Transformer Encoder] × L → MLP Head → 类别

为什么ViT能成功?

关键大数据+大模型

  • ImageNet(1M图像):ViT不如ResNet(缺乏归纳偏置)
  • ImageNet-21k(14M图像):ViT匹敌ResNet
  • JFT-300M(300M图像):ViT超越ResNet

洞察:足够多的数据可以克服结构先验的缺失

七、现代深度学习技术栈全景

层级架构图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
┌─────────────────────────────────────────────────────────────────┐
│ 应用层 (Applications) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ 计算机视觉 │ │ 自然语言处理 │ │ 多模态/生成式 │ │
│ │ 分类/检测/分割 │ │ 理解/生成/对话 │ │ CLIP/DALL-E/Stable │ │
│ │ 视频理解 │ │ 代码生成 │ │ Diffusion/GPT-4V │ │
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ 架构层 (Architectures) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ CNN家族 │ │ Transformer │ │ 混合/新兴架构 │ │
│ │ ResNet/Dense│ │ ViT/Swin │ │ ConvNeXt, MaxViT, │ │
│ │ EfficientNet│ │ BERT/GPT │ │ Mamba, RetNet, RWKV │ │
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ 训练技术层 (Training Techniques) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ 优化算法 │ │ 正则化技术 │ │ 训练稳定性 │ │
│ │ AdamW/LAMB │ │ Dropout/Label│ │ Gradient Clipping, │ │
│ │ 学习率调度 │ │ Smoothing/Cut│ │ Mixed Precision, │ │
│ │ Warmup/Cosine│ │ Mix/Stochastic│ │ Gradient Checkpointing│ │
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ 基础组件层 (Building Blocks) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ 归一化 │ │ 激活函数 │ │ 连接机制 │ │
│ │ BN/LN/RMSNorm│ │ ReLU/GELU/ │ │ Residual, Dense, │ │
│ │ (RMSNorm用于│ │ Swish/Mish │ │ SE/ECA注意力, │ │
│ │ LLM稳定) │ │ (GELU用于 │ │ Skip Connections │ │
│ │ │ │ Transformer)│ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ 计算基础设施层 (Infrastructure) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ 自动微分 │ │ 并行计算 │ │ 模型压缩 │ │
│ │ Computation│ │ Data/Model │ │ Pruning/Quantization, │ │
│ │ Graph/ │ │ Parallelism│ │ Knowledge Distillation│ │
│ │ Autograd │ │ TP/PP/DP/ │ │ (DistilBERT, TinyBERT)│ │
│ │ │ │ ZeRO/ FSDP │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

关键技术详解补充

RMSNorm(Root Mean Square Normalization)

为什么替代Layer Norm?

  • LLM(如LLaMA)发现LN的mean centering不必要
  • 仅保留scaling即可稳定训练

公式
$$\text{RMSNorm}(x) = \frac{x}{\sqrt{\frac{1}{n}\sum_{i=1}^n x_i^2 + \epsilon}} \cdot \gamma$$

优势:计算更快,效果相当

GELU激活函数

Gaussian Error Linear Unit
$$\text{GELU}(x) = x \cdot \Phi(x) = x \cdot \frac{1}{2}\left[1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right]$$

近似
$$\text{GELU}(x) \approx 0.5x\left(1 + \tanh\left[\sqrt{\frac{2}{\pi}}\left(x + 0.044715x^3\right)\right]\right)$$

为什么Transformer用GELU?

  • 比ReLU更平滑(处处可微)
  • 随机正则化解释:以概率 $\Phi(x)$ 保留输入
  • BERT/GPT系列经验上更优

现代优化器:AdamW vs LAMB

AdamW(2017)

  • 将L2正则化与权重衰减解耦
  • 传统Adam:$g_t + \lambda w_t$(梯度处加惩罚)
  • AdamW:$w_{t+1} = w_t - \eta(\frac{\hat{m}_t}{\sqrt{\hat{v}_t}+\epsilon} + \lambda w_t)$
  • 权重衰减直接作用于参数,不与自适应学习率耦合

LAMB(Layer-wise Adaptive Moments, 2019)

  • 解决大批量训练(32k+)的稳定性
  • 分层自适应:不同层不同学习率缩放
  • $\frac{|w|}{|r|}$ 比率控制更新幅度

八、完整发展脉络逻辑图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
┌─────────────────────────────────────────────────────────────────────────┐
│ 第一阶段:奠基(1943-1986) │
│ McCulloch-Pitts神经元 → 感知机(1958) → MLP(1960s) → 反向传播(1986) │
│ 生物启发 线性分类器 非线性扩展 有效训练算法 │
│ ↓ 局限:XOR不可解 │
│ 第一次AI寒冬 │
├─────────────────────────────────────────────────────────────────────────┤
│ 第二阶段:蛰伏与积累(1986-2012) │
│ 万能近似定理确立表达能力 → 损失函数体系(MSE/CE) → 优化算法演进 │
│ ↓ ↓ ↓ │
│ 理论保证MLP能做任何事 定义学习目标可微分 SGD→Momentum→Adam │
│ 但训练困难(梯度消失) 分类用CE而非MSE 自适应学习率+动量结合 │
├─────────────────────────────────────────────────────────────────────────┤
│ 第三阶段:卷积革命(1998-2015) │
│ LeNet(1998) → AlexNet(2012) → VGG(2014) → ResNet(2015) │
│ 证明CNN可行 GPU+ReLU+Dropout 深度重要性 残差解决退化 │
│ ↓ ↓ ↓ ↓ │
│ 局部连接+权重共享 解决训练稳定性 3×3小卷积堆叠 跳跃连接保梯度 │
│ 参数效率+结构先验 大数据+大算力 感受野等价 可训练152+层 │
├─────────────────────────────────────────────────────────────────────────┤
│ 第四阶段:训练技术完善(2015-2017) │
│ BatchNorm(2015) → 更好的初始化 → 正则化技术 → LayerNorm │
│ 解决内部协变量偏移 He/Xavier Dropout等 序列模型稳定 │
│ ↓ ↓ ↓ ↓ │
│ 允许更大学习率 前向/反向方差一致 防止过拟合 替代BN用于RNN/Trans│
│ 加速收敛5-10× 避免梯度消失爆炸 模型集成解释 不依赖batch size │
├─────────────────────────────────────────────────────────────────────────┤
│ 第五阶段:注意力革命(2017-2020) │
│ Attention is All You Need(2017) → BERT/GPT → ViT(2020) │
│ ↓ ↓ ↓ │
│ 自注意力替代RNN/CNN 预训练+微调范式 Transformer用于视觉 │
│ 全局依赖+并行计算 无监督预训练威力 大数据克服归纳偏置 │
│ 为LLM奠定基础 NLP任务全面超越 统一NLP和CV架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ 第六阶段:规模与效率(2020-至今) │
│ GPT-3(175B) → 高效架构(EfficientNet) → 状态空间模型(Mamba) │
│ ↓ ↓ ↓ │
│ 涌现能力/上下文学习 复合缩放原则 线性复杂度替代Attention │
│ 大模型范式确立 移动端部署 长序列可扩展 │
└─────────────────────────────────────────────────────────────────────────┘

九、核心洞见总结

贯穿始终的三条主线

主线 核心矛盾 演进脉络
表达能力 如何近似复杂函数 感知机→MLP(万能近似)→深度网络→注意力全局交互
可训练性 如何有效找到好的参数 反向传播→优化算法→初始化→归一化→残差连接
效率 如何在有限资源下实现 权重共享→小卷积堆叠→瓶颈设计→注意力→状态空间模型

每个突破的”为什么”

技术 解决的核心问题 如果不解决会怎样
反向传播 多层网络如何更新参数 只能训练单层,无法非线性分类
ReLU Sigmoid梯度消失 深层网络无法训练(>5层就困难)
Dropout 大模型过拟合 模型记忆噪声,泛化差
BatchNorm 内部协变量偏移 每层需小心调学习率,训练慢
残差连接 网络退化(深层比浅层差) 无法训练>30层网络
Attention 长距离依赖捕获困难 远距离信息需多层传递,易丢失
预训练+微调 标注数据不足 只能在小数据集上训练,效果差