一、起点:感知机(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$,权重向正确方向调整
- 几何解释:调整超平面位置,使误分类样本被正确分类
▸感性理解
可以把感知机看成只有一步的“决策器”,它做的事情本质是:
- 先算一个线性打分(score):
$$s(\mathbf{x})=\mathbf{w}^\top \mathbf{x}+b.$$ - 再把这个打分变成类别(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 | (0,1) ● ● (1,1) |
数学证明:
假设存在 $\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 | 第一层(隐藏层): |
逻辑等价: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 | 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 | Forward: x → z₁ → a₁ → z₂ → a₂ → 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 | 可视化: |
动量方法:
$$\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,诺贝尔生理学奖):
- 猫视觉皮层存在简单细胞和复杂细胞
- 简单细胞:对特定位置、方向的边缘响应(局部感受野)
- 复杂细胞:对位置变化有一定容忍性(平移不变性)
卷积神经网络的设计原则:
- 局部连接:每个神经元只连接局部区域(感受野)
- 权重共享:同一卷积核在整个图像滑动使用
- 平移等变性:目标移动,特征响应随之移动
▸感性理解:卷积的归纳偏置让模型“天然会看局部”
- 权值共享+局部连接等于告诉模型:同一种“形状/纹理证据”在不同位置出现时应该用同样的方式识别。
- 感受野随着层数扩大:低层更像捕捉边缘纹理,高层逐步聚合成更大范围的部件/语义。
- 这也是为什么 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 | 输入图像 (5×5) 卷积核 (3×3) 输出特征图 (3×3) |
卷积的核心超参数
| 参数 | 作用 | 典型值 |
|---|---|---|
| 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)
为什么需要池化?
问题:卷积输出尺寸大,且对微小位置变化过于敏感
目标:
- 降维:减少计算量
- 平移不变性:微小位置变化不影响输出
- 扩大感受野:后续层看到更大区域
最大池化 vs 平均池化
Max Pooling(2×2, stride=2):
1 | ┌───┬───┐ ┌───┐ |
Average Pooling:
- 取平均值,保留背景信息
- 现在较少使用,通常用Stride卷积替代
CNN架构演进详解
LeNet-5(1998)—— 奠基者
1 | 输入 (32×32) |
创新点:
- 首次完整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 | Conv3-64 → Conv3-64 → MaxPool |
为什么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 | 训练误差: |
原因分析:
- 不是过拟合(训练误差也高)
- 不是梯度消失(BN已缓解)
- 优化困难:深层网络难以学习恒等映射
残差学习(Residual Learning):
传统:学习 $H(x)$(目标映射)
残差:学习 $F(x) = H(x) - x$,即残差
残差块结构:
$$\mathbf{y} = \mathcal{F}(\mathbf{x}, {\mathbf{W}_i}) + \mathbf{x}$$
为什么残差更容易优化?
- 恒等映射容易:令 $\mathcal{F}(\mathbf{x}) = \mathbf{0}$ 即可,比学习完整映射简单
- 梯度高速公路:反向传播时梯度可以直接通过跳跃连接回传
▸感性理解:残差让网络“只学修正”
- 如果真实映射本来就接近恒等(或只是小改动),那么目标就等价于让残差 $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的副作用与优势
主要优势:
- 允许更大学习率:梯度不爆炸/消失
- 减少对初始化敏感:即使随机初始化也能训练
- 正则化效果: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 | 输入嵌入 + 位置编码 |
编码器层(Encoder Layer):
1 | 输入 → [多头自注意力] → [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 | ┌─────────────────────────────────────────────────────────────────┐ |
关键技术详解补充
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 | ┌─────────────────────────────────────────────────────────────────────────┐ |
九、核心洞见总结
贯穿始终的三条主线
| 主线 | 核心矛盾 | 演进脉络 |
|---|---|---|
| 表达能力 | 如何近似复杂函数 | 感知机→MLP(万能近似)→深度网络→注意力全局交互 |
| 可训练性 | 如何有效找到好的参数 | 反向传播→优化算法→初始化→归一化→残差连接 |
| 效率 | 如何在有限资源下实现 | 权重共享→小卷积堆叠→瓶颈设计→注意力→状态空间模型 |
每个突破的”为什么”
| 技术 | 解决的核心问题 | 如果不解决会怎样 |
|---|---|---|
| 反向传播 | 多层网络如何更新参数 | 只能训练单层,无法非线性分类 |
| ReLU | Sigmoid梯度消失 | 深层网络无法训练(>5层就困难) |
| Dropout | 大模型过拟合 | 模型记忆噪声,泛化差 |
| BatchNorm | 内部协变量偏移 | 每层需小心调学习率,训练慢 |
| 残差连接 | 网络退化(深层比浅层差) | 无法训练>30层网络 |
| Attention | 长距离依赖捕获困难 | 远距离信息需多层传递,易丢失 |
| 预训练+微调 | 标注数据不足 | 只能在小数据集上训练,效果差 |


