智能计算系统复习第三章
摘要
第三章 深度学习应用
卷积神经网络(CNN)
网络结构
不是所有像素之间都有联系→没必要用全连接

卷积层
卷积核(Filter/Kernel):一个小尺寸的权重矩阵,在输入图像上滑动进行局部连接和权值共享。
局部连接(Local Connectivity):每个神经元只与输入的一个局部区域(感受野)连接,而非全连接。
权值共享(Weight Sharing):同一个卷积核在整个图像上共享权重,大幅减少参数量。
可有效减少权重参数,避免过拟合,为增加卷积层数提供可能


卷积运算可转换为矩阵相乘:
- 卷积的相乘再相加过程可转换为向量内积
- 多输入输出通道卷积可转换为矩阵相乘
卷积层如何检测特征
卷积核的选择

参数
| 参数 | 含义 |
|---|---|
| 卷积核大小(Kernel Size) | 通常为3x3、5x5等 |
| 步长(Stride) | 卷积核滑动的步长 |
| 填充(Padding) | 在输入边缘填充像素(如零填充) |
输入尺寸:$H \times W$,卷积核尺寸:$K \times K$,填充:$P$,步长:$S$
$$
output = \left( \left\lfloor \frac{H + 2p - K}{s} \right\rfloor + 1 \right) \times \left( \left\lfloor \frac{W + 2p - K}{s} \right\rfloor + 1 \right)
$$
池化层(Pooling Layer)
- 降维:减少图片尺寸,降低计算量
- 减少参数量和计算量,防止过拟合
- 提供平移不变性
- 不引入额外参数
最大池化(Max Pooling):取池化窗口内的最大值,可保留特征最大值,提高特征鲁棒性。
平均池化(Average Pooling):取池化窗口内的平均值。
全连接层
卷积层和池化层构成特征提取器,全连接层则为分类器
将特征提取得到的高维特征图映射成一维特征向量,该特征向量包含所有特征信息,可转化为各个类别的概率
Softmax
通常作为网络的最后一层,对输出进行归一化,输出分类概率:
$$\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=0}^{K} e^{x_j}}$$
凸显其中最大的值并抑制远低于最大值的其他分量。Softmax层的输入、输出数据规模相同。
卷积神经网络结构(CNN)结构
为什么选择”深”而非”广”的结构:
即使只有一层隐层,只要有足够的神经元,神经网络理论上可以拟合任意连续函数。但深层网络更好,因为:
- 深度网络可从局部到整体”理解图像”:浅层卷积层感受野小,学习局部特征;深层卷积层感受野大,学习整体特征
- 深度网络可减少权重数量:以宽度换深度,用多个小卷积替代一个大卷积,获得更多样特征的同时所需权重数量也更少
初始化
随机初始化
均匀分布初始化:从均匀分布 U(-a, a) 中随机抽取值来初始化参数值。
正态分布初始化:通常使用均值为0、标准差为σ的正态分布 N(0, σ²) 生成参数值。
Xavier初始化
Glorot条件:为保证神经网络模型的稳定性和有效性,避免梯度消失或梯度爆炸,需满足两个条件:
- 前向传播时,每一层的输入的方差保持一致
- 反向传播时,每一层的梯度的方差保持一致
第 i 层权重 W_i 的方差需满足:
$$Var[W_i] = \frac{2}{n_i + n_{i+1}}$$
- 满足均匀分布的权重初值:$$W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_i + n_{i+1}}}, \frac{\sqrt{6}}{\sqrt{n_i + n_{i+1}}}\right]$$
- 满足正态分布的权重初值:$$W \sim N\left(0, \frac{2}{n_i + n_{i+1}}\right)$$
其中 n_i 表示第 i 层中包含的神经元个数。Xavier方法适用于关于0对称、在原点处具有单位导数的激活函数(如tanh)。
Kaiming初始化
对于ReLU、PReLU这种非对称的激活函数,Xavier方法效果并不好。Kaiming初始化在满足Glorot条件的基础上,考虑使用ReLU激活函数情况:
第 i 层权重 W_i 的方差需满足:
$$Var[W_i] = \frac{2}{n_i}$$
- 均匀分布:$$W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_i}}, \frac{\sqrt{6}}{\sqrt{n_i}}\right]$$
- 正态分布:$$W \sim N\left(0, \frac{2}{n_i}\right)$$
适用于具有ReLU激活函数的神经网络,在计算机视觉任务上应用较多
梯度下降
| 方法 | 更新梯度 | 计算梯度的样本 | 特点 |
|---|---|---|---|
| GD | theta <- theta - alpha * grad_theta L | 全部训练样本 | 计算复杂度高 |
| SGD | theta <- theta - alpha * grad_theta L_i | 随机抽取一个样本 | 随机性过大,优化效率低 |
| Mini-batch SGD | theta <- theta - alpha * (1/B)sum(grad_theta L_i) | 随机抽取的mini-batch样本 | 计算复杂度低,优化效率高 |
梯度下降法GD
原理:损失函数关于参数𝐀的负梯度方向是损失函数下降最快的方向,因此用负梯度方向对参数进行更新
Mini-batch SGD
- 目前深度学习领域的SGD通常指mini-batch随机梯度下降法
- SGD的缺点:选择合适的学习率十分困难;容易收敛到局部最优点,可能困在鞍点
动量Momentum
- 目的:通过积累历史梯度,减小梯度方向的改变,抑制梯度的震荡,加快收敛速度

Nesterov Accelerated Gradient (NAG)
- 添加矫正因子的Momentum
- 原理:先用当前速度更新一遍参数,再用更新的临时参数计算梯度
- 相比Momentum梯度方向更加稳定,进一步减少震荡
学习率
AdaGrad
使每个参数获得不同的学习率
原理:全局学习率除以历史梯度平方和的平方根,使得每个参数学习率不同
- 对更新频率高的参数使用小学习率,更新频率低的参数使用大学习率
- 优势:对稀疏梯度效果好,稳定性高
- 局限性:训练后期学习率快速缩小,导致参数更新提前停止
AdaDelta
- AdaGrad的改进:不是累积所有过去的梯度,而是将累积窗口限制在固定大小
- 使用最近梯度的局部估计,缓解学习率快速衰减的问题
RMSProp
- AdaGrad的改进:增加衰减系数控制历史梯度的积累量,对梯度计算指数衰减的移动平均
- 优势:缓解AdaGrad训练后期学习率快速减小的问题,善于处理非平稳目标
- 目前常用在训练RNN相关的深度学习模型中
Adam
带有动量项的RMSProp
利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率
- 结合了AdaGrad善于处理稀疏梯度和RMSProp善于处理非平稳目标的优点
- 适用于大多非凸优化、大数据集和高维空间,训练稳定,收敛速度快
AdamW
- 改进版Adam:权重衰减与梯度更新步骤解耦
- 解耦了权重衰减与优化器的更新过程(把权重衰减从梯度更新中拆出来单独做,权重衰减不再受自适应学习率缩放的影响),防止过拟合
图像分类的卷积神经网络
概览
| 网络 | 年份 | 层数 | 参数量 | Top-5 错误率 | 主要贡献 | 存在的问题 |
|---|---|---|---|---|---|---|
| LeNet-5 | 1998 | 5 | — | — | 首个手写字体识别 CNN | — |
| AlexNet | 2012 | 8 | 60M | 15.3% | 使用 ReLU 激活函数(收敛速度快);LRN 局部归一化;MaxPool;Dropout 防止过拟合;数据增强 | LRN 后来被研究者发现无明显效果,现很少使用 |
| VGG16 | 2014 | 16 | 138M | 7.5% (VGG) | 规整的卷积-池化结构(kernel=3×3, stride=1, pad=SAME);多层小卷积替代大卷积减少参数,且相同感受野下决策区分能力更强;由浅网络预初始化深网络加速收敛 | 参数量大(138M),计算开销高 |
| VGG19 | 2014 | 19 | 143M | — | 同上,层数更深 | 参数量更大 |
| GoogLeNet (Inception-v1) | 2014 | 22 | 7M | 6.67% | 提出 Inception 结构叠加多种卷积/池化获得多尺度特征;1×1 卷积降维(瓶颈层)大幅减少参数量;Softmax 辅助分类器防止梯度消失 | 结构较复杂 |
| BN-Inception | 2015 | — | — | 4.82% | 提出 Batch Normalization 替代 LRN/Dropout/L2;用两个 3×3 替代 5×5 卷积;提高收敛速度和训练速度,可用更高学习率 | — |
| Inception-v3 | 2015 | 42 | 23.9M | 3.5% | Factorization 思想:将 3×3 卷积拆分为 1×3 和 3×1,减少参数并增加特征多样性;辅助分类器全连接层做 BN | — |
| Inception-v4 | 2016 | — | — | 3.08% | Inception 模块化,结合 ResNet 的跳转结构 | — |
| ResNet-18 | 2015 | 18 | 11.7M | — | 提出残差学习(Residual Learning),跳转连接解决深层网络退化问题;残差块:CNN 拟合差值 output−input,对数据波动更灵敏 | — |
| ResNet-152 | 2015 | 152 | 60.2M | 3.57% | 同上,极深网络也能有效训练 | 层数过多,推理延迟高 |
任务对比
| 分类 | 定位+分类 | 目标检测 | |
|---|---|---|---|
| 输入 | single and big object | single and big object | multi and small object |
| 输出 | label | label & bounding box | multi label & bounding box |
| 评价 | accuracy (top1/top5) | IoU (交并比) | mAP (平均精度均值) |
目标检测
评测指标
IoU(交并比):衡量定位准确度,一般 IoU >= 0.5 可认为定位成功。
$$\text{IoU} = \frac{\text{Area of Overlap}}{\text{Area of Union}}$$
mAP(平均精度均值):
- 召回率/查全率 (Recall) = TP / (TP + FN) = k / M
- 精度/查准率 (Precision) = TP / (TP + FP) = k / N
- 选择的样本数越多,召回率越高,查准率越低
AP:对每个 recall 值,取最大的 precision 求平均
mAP:所有类别的 AP 取均值
基于CNN的目标检测算法分类
- 两阶段(Two-Stage)算法:基于候选区域方法,先产生边界框,再做 CNN 分类(R-CNN 系列)
- 一阶段(One-Stage)算法:对输入图像直接处理,同时输出定位及其类别(YOLO 系列、SSD)
R-CNN
R-CNN 主要步骤:
- 候选区域提取:Selective Search 从输入图片提取约2000个候选区域
- 特征提取:所有候选区域裁切缩放为固定大小后,用 AlexNet 提取图像特征
- 线性分类:特定类别的线性 SVM 对每个候选区域做分类
- BBox 回归:线性回归修正边界框位置与大小
R-CNN 缺点:重复计算(2000个候选框各自做 CNN);SVM 在数据充足时非最优选择;多个步骤分散,中间数据需保存;检测速度慢(GPU 13秒/帧,CPU 53秒/帧)。
非极大值抑制(NMS):
R-CNN问题:同一目标的位置可能产生多个候选框,而这些候选框之间可能会有重叠
按检测得分排序 → 选最高分框 $M$ 加入输出 → 计算 $M$ 与其余框的 IoU → 删除 IoU > 阈值的框 → 重复直至候选框列表为空。
Fast R-CNN 改进:
- 直接对整张图像做卷积,不再对每个候选区域分别做卷积,减少大量重复计算
- 用 ROI Pooling 对不同候选框的特征进行尺寸归一化
- 将边界框回归器放进网络一起训练,每个类别对应一个回归器
- 用 Softmax 代替 SVM 分类器
ROI Pooling:将不同尺寸的 ROI 对应的卷积特征图转换为固定大小的特征图。输出尺寸与输入尺寸无关。
Faster R-CNN = 候选区域生成网络RPN + Fast R-CNN。引入 RPN 直接在特征图上生成候选区域。(选框也改成卷积)
- Anchor机制:feature map 每个位置输出 9 个可能的候选框(3种面积 128x128/256x256/512x512 × 3种长宽比 2:1/1:2/1:1)
- 每个位置输出 2k 个得分(前景/背景概率)和 4k 个框位置参数 [x, y, w, h]
- RPN 步骤:3x3 卷积 → 分两路(softmax 二分类前景/背景 + bbox regression)→ NMS 去除冗余 → 输出候选区域
FPN(Feature Pyramid Networks):
- 问题:卷积操作拥有固定感受野,难以稳健地面对尺度多变的目标
- 方法:Backbone 自下而上生成多尺度特征图 → 自上而下融合高层语义特征与低层特征
- 显著提升了 Faster R-CNN 在小目标和中目标上的性能
One-Stage:YOLO
YOLO(You Only Look Once):将目标检测问题转换为直接从图像中提取 bbox 和类别概率的单一回归问题。YOLO 开创了 one-stage 检测的先河,实现了端到端的目标检测,速度达到 45 帧/秒。
统一检测具体实现:
- 将输入图像分为 SxS 个格子
- 每个格子预测 B 个 bbox
- 每个 bbox 包含 5 个预测值:x, y, w, h 和 confidence
- confidence 综合考虑目标存在可能性 Pr(Object) 和定位准确性 IoU(pred|truth)
$$\text{confidence} = \text{Pr}(\text{Object}) \times \text{IoU}_{\text{pred}}^{\text{truth}}$$
每个格子还要预测分别属于 C 种类别的条件概率 Pr(Class|Object)。最终某 bbox 的类别置信度为:
$$\text{Pr}(\text{Class}i|\text{Object}) \times \text{Pr}(\text{Object}) \times \text{IoU}{\text{pred}}^{\text{truth}} = \text{Pr}(\text{Class}i) \times \text{IoU}{\text{pred}}^{\text{truth}}$$
最终输出 tensor 维度:$S \times S \times (B \times 5 + C)$。PASCAL VOC 中 S=7, B=2, C=20,输出 7x7x30。
YOLO(v1)优点:
- 检测速度快(Titan X GPU 上 45 FPS,Fast YOLO 可达 155 FPS)
- 背景误判少(每个 cell 使用全局信息做预测)
- 泛化性更好(学习到目标的泛化表示,能迁移到其他领域)
YOLO(v1)缺点:
- 邻近物体检测精度低(每个 cell 只预测两个 bbox 和一个分类)
- 损失函数设计过于简单(用坐标和分类的 MSE 作为损失函数不合理)
- 训练不易收敛(直接预测 bbox 位置,相比预测偏移量,模型收敛不稳定)
YOLO v2/v3/v4 拓展:
- v2:提高训练图像分辨率,引入 anchor box 思想,使用 Darknet-19 网络
- v3:类似 FPN 的多尺度预测,Darknet-53(结合 ResNet),Sigmoid 代替 Softmax 用于多标签分类
- v4:FPN+PAN 多尺度结构,引入加权残差连接(WRC)、跨阶段部分连接(CSP)、跨批量标准化(CmBN)、自对抗训练(SAT)、Mish 激活函数等技巧
YOLOv5:
- Backbone:类似 ResNet,由 1 个 Stem Layer 和 4 个 Stage Layer 组成
- Neck:FPN + PAN(FPN 自顶向下传递强语义特征,PAN 自底向上传递强定位特征)
- Head:耦合检测头,使用共同的 MLP 层预测类别和回归包围框
- CIoU 损失:最大化 IoU + 最小化中心距离 + 最小化长宽比差异
- 最受欢迎的 YOLO 版本之一
YOLO系列演化总结:
| 版本 | 问题 | 关键方法 | 意义 |
|---|---|---|---|
| v1 | 二阶段检测器较为繁琐 | 直接在每个格点预测类别和回归框 | 提出首个一阶段检测器 |
| v2 | 最后一层特征分辨率低,定位不准确 | 使用旁路层融合高分辨率和低分辨率特征 | 增强小物体检测能力 |
| v3 | 对多尺度目标的稳健性差 | 引入残差网络架构和FPN | 增强多尺度物体检测能力 |
| v4 | 特征复用率低 | 用PAN替代FPN,引入CSPNet作为Backbone | 保证计算量同时提升精度 |
| v5 | 当预测框与GT框不重合时(IoU=0),无法计算损失 | 提出CIoU损失 | 良好整合各类方法,最受欢迎版本之一 |
| X | 类别和回归框都使用同一网络预测 | 解耦检测头 | 解耦检测头得到广泛应用 |
| v7 | 需要更深的网络,传统辅助损失难以收敛 | 提出ELAN作为Backbone;设计Coarse to Fine标签分配 | 进一步提升性能 |
| v8 | 对v5进行重构,进一步整合现有方法 | C2F模块替换C3;解耦检测头;优化底层代码 | 成为现今主流项目的基检测器 |
| v9 | 探索训练时更高效的梯度反传 | 提出可编程梯度信息模块PGI辅助训练 | 增强可解释性、鲁棒性和通用性 |
| v10 | NMS策略面临多对一困境,卷积无法建模全局关系 | 引入一对一检测头,匈牙利匹配;提出PSA融合卷积和Transformer | 进一步提高训练效率和准确性 |
图像生成的卷积神经网络
Driving Example:图像风格迁移(Image Style Transfer)
- 使用在 ImageNet 上训练好的 VGG19(去除最后的全连接层和 softmax)
- 给定一张风格图像 $a$ 和一张内容图像 $p$,输入一张随机噪声图像 $x$
- 损失函数希望 $x$ 既保持内容图像 $p$ 的内容,又有风格图像 $a$ 的风格
内容损失函数(只取 conv4 单层特征):
$$\mathcal{L}{\text{content}}(p, x, l) = \frac{1}{2}\sum{i,j}(F_{ij}^l - P_{ij}^l)^2$$
其中 $F_{ij}^l$ 为生成图片在第 $l$ 层第 $i$ 个特征图上位置 $j$ 处的特征值,$P_{ij}^l$ 为内容图片的对应特征值。
风格损失函数(取 conv1~conv5 共5层特征,使用 Gram 矩阵表示图像风格):
$$G_{ij}^l = \sum_k F_{ik}^l F_{jk}^l$$
$$\mathcal{L}{\text{style}}(a, x) = \sum{l=0}^L w_l \frac{1}{4N_l^2 M_l^2}\sum_{i,j}(G_{ij}^l - A_{ij}^l)^2$$
其中 $w_l$ 为各层权重(文中都取 0.2),$A_{ij}^l$ 为风格图片在第 $l$ 层的 Gram 矩阵。
Real-Time Image Style Transfer:
- 对每张待转换图片都要进行前馈和反馈调优过程,无法做到实时转换
- 提前训练好图像转换网络(Image Transform Net),风格转换过程不需要进行反向训练
- Image Transform Net 参考 DCGAN 设计:用步长卷积和小数步长卷积替代 pooling、每个卷积层后接 BatchNorm 和 ReLU、增加残差结构
图像生成模型概述
- 判别模型:学习数据的模式/特征(图像识别)
- 生成模型:学习数据的分布(图像生成)
- 生成模型分类:GAN、VAE、Flow-based、Diffusion

生成对抗网络(GAN)
解决的问题:从训练样本中学习出新样本。为无监督、预测学习提供算法框架
生成器(伪装者):找出观测数据内部的统计规律,尽可能生成能够以假乱真的样本
判别器(警察):判断输入数据是来自真实样本集还是生成样本集
训练过程:

- 更新判别网络:输入真样本 $x$ 时输出接近1,输入生成样本 $G(z)$ 时输出接近0
- 更新生成网络:生成的假样本 $G(z)$ 被判别器判断为接近1,即 $1 - D(G(z))$ 越小越好
GAN训练是极小极大博弈问题(或零和博弈)
$$\min_G \max_D V(D,G) = \mathbb{E}{x \sim p{\text{data}}}[\log D(x)] + \mathbb{E}_{z \sim p_z}[\log(1 - D(G(z)))]$$
GAN问题:
- 梯度消失:当判别器以高置信度成功判断生成器生成的样本为假时,生成器的梯度会消失。应对方法:修改生成器的代价函数
- 模式崩溃(Model Collapse):生成器只生成几种模式的样本,生成样本缺乏多样性。应对方法:采用更平滑的损失函数(如 Wasserstein GAN)
DCGAN:将全连接神经网络扩展到卷积神经网络。判别器用步长卷积,生成器用小数步长卷积取代池化层;使用 BatchNorm;生成器用 Tanh 输出,ReLU 其他层;判别器用 LeakyReLU
Conditional GAN(CGAN):生成器和判别器输入中加入辅助信息(类别标签或其他模态数据),获得预期的输出
- 其他:ResGAN(图像恢复)、SRGAN(超分辨率)、CycleGAN(图像转换)、InfoGAN、BiGAN、VAE-GAN 等
GAN应用:人脸生成、风格转换、超分辨率等。
适合语音/文本处理的循环神经网络(RNN)
循环神经网络(RNN)(原始种)
语言模型
序列数据:有先后顺序的一组数据,数据间有相互依赖关系。
语言模型估计序列发生的概率分布:
$$P(x_1, x_2, \cdots, x_T) = \prod_{t=1}^{T} P(x_t | x_1, x_2, \cdots, x_{t-1})$$
文本处理流程
分词(Tokenization):将文本字符串划分为有意义的基本单元(词元/Token)。
Token 的不同粒度:
- Character-level:token 为字符(序列较长,字符本身无意义)
- Word-level:token 为单词(无法处理未见过的词,相近词划分成不相关 token,对无分隔符语言如中文难以划分)
- Subword-level:token 为 subword。词表构建是动态的,频率高的 word 有自己的 token,频率低的被划分为 subword
BPE(Byte Pair Encoding,字节对编码):目前 LLM 中常用的词元化方法。
- 初始化词表,每个字符为一个词元
- 将频率最高的一对词元合并为一个词元,词表大小+1
- 根据合并后的词元对语料重新分词
- 重复第2-3步,直到词表大小达到要求
GPT词表 40478:478 base characters + 40000次合并。
词元化后处理:建立词元到词表索引的字典,将文本中的词元转换为索引。词表需添加特殊字符(unk, pad, bos, eos 等)。
嵌入(Embedding):将离散的 token 转化为固定维度的连续数值向量表示。
| 方法 | 特点 |
|---|---|
| One-hot | 长度为词表大小的向量,只有一个位置为1。缺陷:无法表达词间相似度,维度高,稀疏,计算不友好 |
| Word2Vec | 稠密表示,维度低,计算友好。能较准确表达不同词之间的相似性和关系。CBOW 和 Skip-gram 两种预训练方法 |
| Embedding 矩阵(Transformer用) | 输入 token 用 one-hot 编码,矩阵乘法简化为查表操作,在训练过程中学习权重 |
RNN结构
正向计算过程:
初始时刻:$h_0$ 为输入的初始零向量。
$$h(t) = f(Wh(t-1) + Ux(t) + b)$$
$$o(t) = Vh(t) + c$$
$$\hat{y}(t) = \text{softmax}(o(t))$$
其中 $f$ 常用 tanh 或 ReLU 激活函数。$W$、$U$、$V$、$b$、$c$ 在时间序列上共享参数。

三个核心特性:
- 时序(Sequence):前后输入数据 $x(t)$ 和 $x(t+1)$ 不独立,相互影响
- 循环(Recurrent):对每个输入的操作都一样,循环往复,每时刻有相同参数(参数共享)
- 记忆(Memory):隐藏层 $h(t)$ 捕捉所有时刻之前的信息,理论上记忆内容可以无限长
多种输入-输出结构:序列转化为序列、序列作为输出、序列作为输入、同步序列转化为序列。对序列的长度无要求,不用预先定义。
反向传播 BPTT(Back-Propagation Through Time):
单个时刻的损失函数:
$$E(t) = -y(t) \ln \hat{y}(t)$$
整个序列的损失函数:
$$E = \sum_{t=1}^{T} E(t) = -\sum_{t=1}^{T} y(t) \ln \hat{y}(t)$$
损失函数对 $W$ 的偏导为:
$$\frac{\partial E}{\partial W} = \sum_{t=1}^{T} \frac{\partial E(t)}{\partial \hat{y}(t)} \cdot \frac{\partial \hat{y}(t)}{\partial o(t)} \cdot \frac{\partial o(t)}{\partial h(t)} \cdot \frac{\partial h(t)}{\partial W}$$
RNN的梯度消失与梯度爆炸
- 由于梯度爆炸或梯度消失的存在,循环神经网络实际上只能学习到短期的依赖关系
- 梯度爆炸 → 梯度截断解决
- 梯度消失 → 模型上的改进,如 LSTM、GRU 算法
当相关信息和预测位置的间隔拉长时,RNN 无法学会连接信息。
长短期记忆模型(LSTM)
隐藏状态:作为神经网络的记忆,保存着网络先前观察到的数据信息。引入”单元状态(Cell State)”$C(t)$ 作为信息传送带,通过三个门限管理信息的增加和删除。

三个门限:
遗忘门:记住前一时刻单元状态的多少内容
输入门:写入多少输入到当前单元
输出门:输出多少当前单元状态
LSTM cell输出:
$$h_t = o_t \times \tanh(C_t)$$
LSTM变体:
- 窥视孔连接(Peephole Connection):门值不仅取决于 $h_{t-1}$ 和 $x_t$,也取决于上一个单元状态 $C_{t-1}$
- 耦合输入门和遗忘门:不单独决定遗忘和新增信息,在输入时一起做决定($f_t = 1 - i_t$)
门控循环单元(GRU)
在 LSTM 基础上,将单元状态和隐藏状态合并,将遗忘门和输入门合并为更新门,无输出门。
更新门决定历史信息和当前信息如何相加;重置门决定保留多少历史信息。
LSTM与GRU对比:哪个模型更好无定论。GRU 参数量更少,训练速度快;数据充足时 LSTM 表征能力更强。
从深度学习到大模型
Seq2Seq模型
Sequence-to-Sequence:序列到序列模型,将一种时序数据转换为另一种时序数据。应用:机器翻译、对话系统、自动文摘。
结构:由编码器(Encoder)和解码器(Decoder)组成。
- 编码器根据输入数据生成语义编码 $e$
- 解码器根据该语义编码输出处理结果
- 适用于输入序列和输出序列不等长的情况
传统 Seq2Seq 通常使用 RNN 或 LSTM 作为编码器和解码器。
Seq2Seq问题:
- 固定长度的语义编码难以存储较长输入序列的所有信息,严重影响模型性能
- 语义编码中每个元素权重相同,模型无法区分各个元素的重要程度
→ 注意力机制解决
注意力机制
基本注意力机制
注意力机制可以抽取少量重要信息,并聚焦于这些重要信息,忽略大多数不重要的信息。通过对输入部分赋予不同的权重,有效抽取关键信息。有效地提升基于RNN(LSTM)的Seq2Seq模型的信息处理能力
计算过程:
- 计算相似度:
$$a_{ij} = \text{softmax}(f(s_{i-1}, h_j))$$
其中 $f(Q, K) = V^T \tanh(WQ + UK)$
- 注意力汇聚:
$$c_i = \sum_{j} a_{ij} h_j$$
注意力的优势:聚焦关键信息使模型做出更准确的判断;可以并行运算,比 RNN 等序列化计算速度快。
缩放点积注意力(Scaled Dot-Product Attention)
输入:查询 $Q$、键 $K$、值 $V$,每个值 $V$ 都与一个键 $K$ 配对。
- Q(查询,Query):代表当前要“问”的位置,例如当前要翻译的目标词或要预测的位置。它来自目标序列(解码器)或源序列(自注意力)。
- K(键,Key):代表输入序列中每个位置的key,用于与 Q 匹配。在自注意力中,K 与 Q 来自同一个输入序列。在编码器-解码器注意力中,K 来自编码器输出。
- V(值,Value):代表输入位置携带的“实际内容”,根据 Q 与 K 匹配的权重来加权求和,得到输出。
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}} + \text{Mask}\right) V$$
点积:查询向量 Q 与每个键向量 K 做点积,得到一个分数,表示当前查询与各个输入位置的“匹配程度”。
缩放:除以 $\sqrt{d_k}$ 的原因:当 $d_k$ 较大时 $QK^T$ 内积值可能很大,除以 $\sqrt{d_k}$ 使 $QK^T$ 内积的方差变为1,获得较大的 softmax 梯度,防止梯度消失。
自注意力(Self-Attention)
$Q$、$K$、$V$ 都来源于同一组输入
自注意力 vs 传统注意力:
- 自注意力:对输入自身进行计算,再把输入端的自注意力权重加入到对输出的影响中。不仅可以捕捉输入和输出的相关关系,还可以捕捉输入内部的相关关系
- 传统注意力:基于输入和输出计算注意力权重。仅能捕捉输入和输出之间的相关关系
多头注意力(Multi-Head Attention)
基于相同的注意力机制学习不同的知识,再进行组合。
$$\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W^O$$
$$\text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)$$
- 对 QKV 进行 $h$ 组不同的线性变换
- 将 $h$ 组不同线性变换后的 QKV 并行计算注意力
- 将 $h$ 组注意力计算结果拼接在一起,并进行线性映射
Transformer
整体架构
- 遵循 Seq2Seq 结构:编码器(Encoder)+ 解码器(Decoder)
- 去掉了循环神经网络结构(效率低,无法并行训练)
- 大量重复使用 attention 机制
词元嵌入:通过学习 Embedding 矩阵将 token ID 转换为向量。
位置编码(Position Encoding):使用波长从 $2\pi$ 到 $10000 \cdot 2\pi$ 的不同正弦和余弦函数计算。

编码器(Encoder)
由 N个相同的层组成(N=6),每层包含两个子层:
- 多头自注意力(Multi-Head Self-Attention):$Q$、$K$、$V$ 同源,无 mask
- 前馈网络(Feed-Forward Network):先升维再降维(512→2048→512),使用 ReLU 引入非线性变换,序列中每个位置共享相同权重
每个子层增加残差连接和层归一化(Layer Norm):
- 原理:将中间层的输入标准化为均值为0、方差为1的高斯分布
- 沿 embedding 方向,对每个嵌入向量分别计算
- 作用:缓解梯度消失问题,加快收敛速度;可以达到类似正则化的效果,防止过拟合;降低调参难度,可以使用较大的学习率
解码器(Decoder)
由 6 个相同的层组成,每层包含三个子层:
- 带 mask 的多头自注意力:捕捉输出序列内部的相关关系。mask 去掉当前位置后面 token 的影响,满足自回归性质
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}} + M\right) V$$
其中 mask 矩阵 $M$ 的右上角值设为 $-\infty$。
- 交叉注意力(Cross-Attention):$Q$ 来自解码器自注意力子层的输出,$K$、$V$ 来自编码器输出,捕捉输入序列和输出序列之间的相关关系
- 前馈网络
解码器的输入:
- 编码器的输出,以及上一个位置的解码器输出
- 训练时:有编码器输入对应的 label(整体向右偏移一位),可以并行处理
- 推理时:没有 label,需要逐个位置进行解码,无法并行
输出:先经过线性变换(全连接层)将输出映射为词汇表空间,再经过 softmax 输出下一个词元的概率分布。
推理过程:
- Prefill 阶段:输入提示词,生成第一个词元。分析全部提示词,用时较长,同时将注意力模块中的 K、V 缓存下来(KV-Cache)
- Decode 阶段:自回归生成,直到生成终止符
输出
先经过一个线性变换(全连接层),将输出映射为词汇表空间
再经过softmax,输出下一个词元的概率分布
自然语言处理大模型
三种架构
| 架构 | 代表模型 | 适用场景 |
|---|---|---|
| Encoder-Decoder | 原始 Transformer, T5, GLM | Seq2Seq 任务(机器翻译、生成对话) |
| Encoder-Only | BERT | 文本分类、情感分析等 NLU 任务 |
| Decoder-Only | GPT, Llama, DeepSeek | 序列生成任务(从已有信息扩展出新内容) |
BERT(Encoder-Only)
- 采用 Transformer 编码器部分,双向 Block 连接(无 mask,每个位置可以看到序列前后的位置)
预训练:利用互联网上大量无标签的语料数据进行自监督训练:
- 完形填空(Masked LM)
- 判断两句话之间是否有上下文关系(NSP)
微调:利用下游任务的有标签数据进行微调,可快速应用于文本分类、序列标注、信息检索等多种下游任务。
优势:大量无标签文本上无监督预训练;挖掘了预训练阶段的潜力;可通过微调快速迁移到各种下游任务;适合各种自然语言理解 NLU 任务。
不足:由于只使用了编码器部分且没有解码器结构,不适合直接处理自然语言生成 NLG 任务;只适合处理句子和段落级别的任务,不适合文档级别的任务。
GPT系列
GPT:提出了 NLP 领域的预训练-微调统一框架。
采用 Transformer 解码器结构:带 mask 的自注意力 + FFN。
预训练(无监督):自回归,给定前 $k$ 个词预测第 $k+1$ 个词。
目标函数为语言模型:
$$\mathcal{L}1(\mathcal{U}) = \sum_i \log P(u_i | u{i-k}, \cdots, u_{i-1}; \Theta)$$
其中 $P$ 是 GPT 模型,使用 mask 保证仅利用前 $k$ 个词计算。
微调(有监督):使用下游任务的数据集和标签,新添加的层从头训练,其他参数微调。最终目标函数为预训练与微调目标函数的加权求和。
$$\mathcal{L}_3(\mathcal{C}) = \mathcal{L}_2(\mathcal{C}) + \lambda \cdot \mathcal{L}_1(\mathcal{C})$$
其中 $L_2(C)$ 为下游任务的目标函数。
GPT-2:
- 核心思想:无需特定任务的监督微调,在预训练阶段使用语言模型建模多种下游任务
- 采用 Pre-LN(Layer Norm 放在子层前面),使各子层的梯度范数保持不变,有利于稳定优化
- 更大的参数量(对标 BERT-large 1.5B),更多层,更多训练数据(40GB vs 5GB)
GPT-3:
- 无需微调,利用少量示例提升泛化能力(Few-Shot)
- 96层/96头/12288维/175B参数,数据量 540GB(filter后)
| GPT | GPT-2 | GPT-3 | |
|---|---|---|---|
| 框架 | 预训练-微调 | 仅预训练,无需微调 | 仅预训练,无需微调 |
| 参数量 | 117M | 1.5B | 175B |
| 数据量 | 5GB | 40GB | 540GB(filter后) |
| 时间 | 2018.6 | 2019.2 | 2020.5 |
- 尺度定律(Scaling Law):增加模型计算量、训练数据量、模型参数规模,Loss 都会单调降低,模型效果越来越好
- 涌现能力(Emergent Ability):当模型规模大到一定程度(约60B),模型能力出现飞跃
- Zero-shot/One-shot/Few-shot:零/一个/若干个示例,无参数更新。传统微调:样本用于参数更新
InstructGPT:使用来自人类反馈的强化学习(RLHF)对预训练大模型进行微调。
- 人类标注产生数据,监督方式微调 GPT-3
- 利用人类标注数据训练一个奖励模型
- 利用奖励模型提供 reward,利用 PPO 微调 step1 的 GPT-3
Llama系列
Llama 的改进:
- 前置 RMSNorm 作为层归一化方法,增强训练稳定性
- 采用 SwiGLU 激活函数,提高模型性能
- 采用旋转位置编码 RoPE,建模长序列数据
- 部分模型采用分组查询注意力机制 GQA,平衡效率和性能
RoPE(旋转位置编码)
使用旋转矩阵编码绝对位置,在自注意力操作中加入相对位置信息,在每个 Transformer 层中注入位置信息。
$$f_{{q,k}}(x_m, m) = R^d_{\Theta,m} W_{{q,k}} x_m$$
任意偶数维的 RoPE 可以表示为二维形式的拼接。
优势:支持长序列,并且随着相对距离增加,词元间依赖下降。
DeepSeek系列
DeepSeek-V3:
- 671B 参数,每 token 激活 37B
- 61层 Transformer layers,从第4层开始 FFN 替换为 MoE
- hidden dimension = 7168,注意力头 128,单头维度 128
- KV 压缩维度 512,Q 压缩维度 1536,旋转位置编码维度 64
- SwiGLU 激活函数
- MoE:1 shared expert + 256 routed experts,每 token 激活 8 个 routed experts
MLA(Multi-head Latent Attention):性能优于 MHA,KV cache 远低于 MHA(小 MoE 约14%,大 MoE 约4%)。
Decoder-Only成为主流的原因探讨
- prompt 可以更加直接地作用于 decoder 每一层的参数,无需经过编码器的转换,微调的信号更强
- 双向 attention 的注意力矩阵容易退化为低秩状态,而 causal attention 的注意力矩阵是下三角矩阵,必然是满秩的,建模能力更强
- causal attention 具有隐式的位置编码功能
- decoder-only 支持复用 KV-Cache,计算效率更高
- Megatron 和 FlashAttention 等重要工具对 causal attention 支持更好
- 实验表明 zero-shot 泛化性能和 in-context learning 能力更强
大模型中的函数/方法变体
激活函数
Swish激活函数:
$$\text{Swish}(x) = x \cdot \text{sigmoid}(x)$$
更加平滑,可以更好的优化和更快的收敛,减少过拟合提高泛化性。
SwiGLU激活函数(Llama3, DeepSeek 等):
$$\text{SwiGLU}(x, W, V, b, c) = \text{SiLU}(xW + b) \odot (xV + c)$$
归一化
RMSNorm(均方根归一化)
Layer Norm 中包含平移和缩放不变性,RMSNorm 去除平移,只保留缩放。效果相当,计算更简单,更稳定。
注意力变体
| 类型 | 特点 |
|---|---|
| MHA(Multi-Head Attention) | 每个 head 有自己单独的 K、V |
| MQA(Multi-Query Attention) | 所有 Q 共享 K、V |
| GQA(Grouped-Query Attention) | Q 分成 N 个组,每个组共享 K、V |
GQA 和 MHA 效果相当,取得了 performance 和速度的 trade-off。
KV cache
Test-time Scaling(TTS)
o1:通过延长推理时间使模型获得强大的推理能力。
R1 两大要素:
- 准确率奖励:有一个几乎完美的验证器(rule-based reward)
- 格式奖励:Question + Think + Answer
- 训练算法:GRPO、PPO 或其他强化学习算法
R1-Zero 训练现象:
- 仅通过两个简单的奖励(准确率奖励 + 格式奖励),模型似乎自己学会了 test-time scaling
- 随着训练进行,准确率稳定上升,回答长度稳定上升
- R1 的 “aha moment”:大模型在某个中间训练步骤,自己学会了反思
- Budget forcing:强行给将要结束的回答添加 “wait”,模型会继续思考,并且准确率真的能继续提升
R1 完整训练流程:
- 用 R1-zero 生成的 CoT 数据进行手工/规则改写 → SFT → 阶段一模型
- 准确率奖励 + 可读性奖励 → RL 训练
- 阶段一模型生成的推理数据 + V3 通用数据 → SFT
- RLHF 的奖励模型 → 最终微调
推理能力的通用性:
- 使用纯 Verilog R1 数据蒸馏能大幅提升代码模型的数学能力,达到非 R1 数学专用模型水平
- 使用纯数学数据 RL 能大幅提升 Verilog 代码生成能力(32B 模型 performance 从 0.355 → 0.516)