第一篇:从 RNN 到 Attention(为什么要引入注意力?)
1.1 RNN 的局限与瓶颈
任务背景:序列到序列(Seq2Seq)任务,例如机器翻译(英语“we see the sky” -> 意大利语“vediamo il cielo”)。
编码器-解码器架构(Encoder-Decoder):
编码器(Encoder):
,逐步处理输入序列,输出最终隐藏状态
。
解码器(Decoder):
,根据上一个输出
、上一个状态
以及上下文向量 c预测当前输出。
💡 致命瓶颈:通常将编码器的最后一个隐藏状态
直接作为上下文向量 c。这意味着无论输入序列多长(哪怕 T=1000),所有信息都必须被压缩进这一个固定长度的向量 c 中,长序列信息必然严重丢失。
1.2 Bahdanau Attention(RNN + Attention)
核心思想:打破固定长度 c 的瓶颈。在解码器的每一个时间步,动态计算一个专属的上下文向量,让它“回看”整个输入序列。
步骤 1:计算对齐分数(Alignment Scores)
其中是一个简单的线性层(Linear Layer),将解码器前一步状态
和编码器第 i 步状态
拼接后映射为一个标量分数
。
步骤 2:Softmax 归一化得到注意力权重
满足且
。这代表在生成当前词时,对输入序列每个词关注度的大小。
步骤 3:计算上下文向量(Context Vector)
(这是一个对编码器隐藏状态的加权线性组合)。
步骤 4:解码器更新
💡 直观理解与可视化:
翻译 "vediamo"(we see)时,注意力权重
和
较高(对应 "we" 和 "see")。
翻译 "il"(the)时,注意力权重
较高(对应 "the")。
注意力矩阵图(Attention Weight Matrix):横轴是输入词,纵轴是输出词。对角线上亮起表示顺序对应;如果是倒装句,注意力会偏离对角线,完美捕捉语法结构(如欧洲经济区那个案例)。
✅ 核心优点:所有操作都是可微的!不需要人为监督网络“应该看哪里”,只要定义好损失函数,梯度会自动反向传播,让网络学会如何对齐。
第二篇:通用的 Attention 机制(Q, K, V)
2.1 从单查询到多查询
我们将 RNN 的架构剥离,只保留 Attention 操作。把解码器状态看作查询(Query),编码器状态看作数据(Data)。
单查询:q 与每个
计算点积相似度
,经过 Softmax 得到权重
,输出
。
💡 缩放点积(Scaled Dot-Product):当向量维度 D 很大时,点积结果会很大,导致 Softmax 进入饱和区(梯度趋近于0)。因此需要除以
。
2.2 引入 Key 和 Value 矩阵
为了让数据扮演不同的角色,我们引入了键矩阵()和值矩阵(
)。
输入:查询向量
,数据向量
。
投影:
键(Key):
,维度
。
值(Value):
,维度
。
计算步骤(MATLAB格式):
% 1. 计算相似度矩阵 E E = (Q * K') / sqrt(D_Q); % 形状: [N_Q x N_X] % 2. Softmax 归一化得到注意力权重 A (沿着 N_X 维度) A = softmax(E, dim=2); % 形状: [N_Q x N_X] % 3. 计算输出 Y (值的加权线性组合) Y = A * V; % 形状: [N_Q x D_V]💡 直观比喻(搜索引擎):
Query:你在搜索框输入的关键词。
Key:网页的标题(用来和你的搜索词匹配)。
Value:网页的正文内容(当你点击标题后实际获取的信息)。
2.3 交叉注意力(Cross-Attention) vs 自注意力(Self-Attention)
Cross-Attention:Q 来自一个序列(如解码器),K,V 来自另一个序列(如编码器)。用于机器翻译、图文问答等。
Self-Attention:Q,K,V 全部来自同一个输入序列 X。
(通常简写为融合矩阵乘法:)
第三篇:Self-Attention 的局限与改进
3.1 置换等变性(Permutation Equivariance)
性质:如果打乱输入序列的顺序,输出向量将完全保持不变,只是顺序也对应被打乱。即 F(σ(X))=σ(F(X))。
💡 致命问题:Self-Attention 本身完全不知道序列的先后顺序!对于它来说,这句话是 "我 打 你" 还是 "你 打 我" 没有任何区别。
3.2 位置编码(Positional Encoding)
解决方案:将位置信息注入到输入中。
RoPE(Rotary Position Embedding, 旋转位置编码):目前大模型的主流方案。通过将位置映射为角度,旋转 Query 和 Key 向量。由于旋转矩阵的性质,点积结果只依赖于相对位置差
:
3.3 掩码自注意力(Masked Self-Attention)
应用场景:语言模型(如 GPT),预测下一个词。
做法:在计算相似度矩阵 EE 后,将右上角(代表“未来”的位置)全部替换为负无穷(−∞)。
效果:经过 Softmax 后,这些位置的注意力权重变为0。这确保模型在预测当前词时,只能看到它之前的词,防止“偷看”答案。
3.4 多头自注意力(Multi-Head Self-Attention)
动机:一组 Q,K,V 只能学到一种关系。我们希望模型能同时关注不同维度的信息。
做法:并行运行 H 个独立的 Self-Attention 层,每个头拥有自己独立的权重矩阵
。
计算流程(MATLAB格式):
% 假设 H=8, D=512, D_H=64 Q = X * W_Q; % [H x N x D_H] K = X * W_K; % [H x N x D_H] V = X * W_V; % [H x N x D_H] E = Q * K' / sqrt(D_H); % [H x N x N] A = softmax(E, dim=3); Y = A * V; % [H x N x D_H] % 拼接多头输出并融合 Y_concat = reshape(Y, [N, H*D_H]); O = Y_concat * W_O; % [N x D]
第四篇:Transformer Block 完整架构
4.1 Transformer Block 结构
Transformer 就是堆叠相同的 Transformer Block。
输入:一组向量 X。
Step 1: 自注意力层:所有向量通过多头自注意力交互。
Step 2: 残差连接 + 层归一化(LayerNorm):
X=X+Self-Attention(X) (残差连接,防止梯度消失)
X=LayerNorm(X)(对每个样本独立计算均值和方差进行归一化,不依赖 Batch Size)
Step 3: MLP(前馈网络):
经典结构是升维再降维:D→4D→D。
X=X+MLP(X)(MLP 对每个向量独立操作)
X=LayerNorm(X)
输出:一组与输入维度相同的向量 Y。
💡 核心结论:整个 Block 的计算量主要来源于6 次矩阵乘法(4 次来自 Self-Attention,2 次来自 MLP)。
4.2 语言建模中的 Transformer(LLM)
输入层:Embedding Matrix
[V x D],将词转换为向量。核心层:堆叠 Transformer Block,内部的 Self-Attention 必须是 Masked。
输出层:Projection Matrix
[D x V],将隐藏状态映射回词表大小的得分向量,使用 Softmax + 交叉熵损失(Cross-Entropy Loss)预测下一个词。
第五篇:三大序列处理架构大比拼
| 架构 | 处理方式 | 优点 | 缺点 |
|---|---|---|---|
| RNN (循环神经网络) | 串行,有序序列 | 理论上对长序列友好,O(N) 计算和内存 | 无法并行化,必须等前一步算完;长距离信息容易丢失 |
| CNN (卷积神经网络) | 并行,N维网格 | 高度并行,计算效率高 | 感受野受限,需堆叠很多层才能看到全局信息 |
| Self-Attention (自注意力) | 并行,集合向量 | 全局感受野,一步到位捕捉长距离依赖;高度并行(仅靠矩阵乘法) | 计算和内存复杂度为 |
💡 解决 Self-Attention 的 O(N2)O(N2) 内存瓶颈:Flash Attention。通过分块计算(Tiling)和重计算(Recomputation),将内存复杂度降到 O(N),而计算复杂度仍是
,但极大提升了实际运行速度。
第六篇:Vision Transformer (ViT)
核心思想:将图像视为一系列 Patch(图像块),直接套用标准的 Transformer Encoder。
Step 1: Patchify(切块):将 224×224×3 的图像切成 16×16×3 的小块。序列长度
。
Step 2: 线性投影(Flatten & Linear):将每个 16×16×3=768 维的块展平,通过线性层映射为 D 维向量。
💡 等价操作:这等价于使用一个
16x16卷积核,步长为16,输出通道为D的卷积层。
Step 3: 位置编码:加上可学习的位置嵌入(Positional Embedding),告诉 Transformer 每个 Patch 在 2D 图像中的位置。
Step 4: Transformer Encoder:不使用 Masking!每个图像块都可以看到所有其他图像块。
Step 5: 分类头:对所有输出向量进行平均池化(Average Pool),得到 1 个 D 维向量,通过线性层映射到类别数 C。
第七篇:现代 Transformer 架构优化(2024+)
7.1 Pre-Norm(前置归一化)
原版(Post-Norm):
X = LayerNorm(X + Attention(X))。模型很难学习恒等映射,训练不稳定。现代(Pre-Norm):
X = X + Attention(LayerNorm(X))。LayerNorm 放在残差连接内部(在 Attention 和 MLP 之前)。训练更稳定,无需学习率预热(Warmup)。
7.2 QK-Norm
做法:在计算注意力相似度之前,对 Q 和 K 进行归一化(通常使用 RMSNorm)。
公式(RMSNorm):
其中。
目的:防止训练过程中出现梯度尖峰(Gradient Spikes),使大模型训练更加稳定。
7.3 SwiGLU MLP
经典 MLP:
,参数量为 2×D×4D=8D²。SwiGLU MLP(门控机制):引入第三个权重矩阵
。
其中 ⊙ 是逐元素乘法。为了保持总参数量不变,将隐藏层维度 H 设为 8D/3。这样在参数量相同的情况下,增加了非线性表达能力。(注:幻灯片幽默地提到,这种架构有效的原因“归功于神的恩典”,体现了深度学习的玄学。)
7.4 Mixture of Experts (MoE, 混合专家模型)
动机:用极少的计算量增加极大的参数量。
做法:
在 Transformer Block 中,并行学习 E 个不同的 MLP 专家。
对于每个输入 Token,通过一个路由网络(Router)选择激活其中 A 个专家(A<E\)。
案例(Gemma 4 26B-A4B):
128 个路由专家,每个 Token 只选择 8 个专家处理。
总参数量 26B,但每个 Token 仅激活4B参数。
极大地提高了模型容量,但保持了较低的推理算力需求。
💡 复习建议与核心考点:
Attention 的计算过程:手推 Q, K, V 公式,理解缩放点积的作用。
Self-Attention 的置换等变性:理解为什么需要位置编码。
Masked Self-Attention:理解 −∞ 在 Softmax 后变成 0 的机制。
Transformer Block 的 6 次矩阵乘法:理清输入输出和计算流程。
三大序列架构对比:RNN (串行)、CNN (局部并行)、Self-Attention (全局并行,但 O(N²))。
ViT:Patchify 等价于 Conv2D(stride=16)。
现代优化:Pre-Norm、QK-Norm、SwiGLU、MoE(重点理解 MoE 参数大但计算量小的特性)。