【ViT解析系列】(六)多头注意力 (MHA) vs. 编码器块 (Block):微观算子与宏观架构的博弈
在学习 Vision Transformer 时,初学者常会混淆 Attention(多头注意力) 和 Block(编码器块) 的关系。简单来说:如果你把 ViT 比作一列火车,那么 Block 就是一节节车厢,而多头注意力则是车厢里的引擎。
今天我们通过对比,彻底搞清楚它们的作用与区别。
1. 多头注意力 (Multi-Head Attention):信息交换的“核心算子”
多头注意力(MHA) 是 Block 内部的一个子组件,它的职责非常单一且纯粹:计算 Patch 之间的相关性。
核心作用:
-
全局建模:打破空间限制,让第 1 个 Patch 也能和第 196 个 Patch 产生联系。
-
多维度观察:通过“分头”机制(Heads),让不同的头关注不同的特征(如有的看颜色,有的看形状)。
它的局限性:
-
线性性:它本质上是在做矩阵乘法和加权求和,缺乏非线性表达能力。
-
不稳定性:直接堆叠注意力层会导致数据分布剧烈波动,模型极难收敛。
2. Block:功能完备的“标准生产线”
Block(通常指 Transformer Encoder Block)是 ViT 的基本构建单元。一个 Block 内部封装了多头注意力以及一堆“辅助设施”。
Block 的内部构成:
-
LayerNorm:入场前的“安检”,稳定数据分布。
-
MHA (多头注意力):核心算法,负责 Patch 间的社交。
-
Residual Connection (残差):防止信息丢失的“高速公路”。
-
MLP (多层感知机):负责非线性特征映射,对信息进行深度加工。
核心作用:
-
深度堆叠:因为 Block 内部有残差和归一化,我们可以稳定地堆叠 12 层、24 层甚至更多,而不必担心梯度消失。
-
非线性增强:MLP 引入了激活函数(如 GELU),补齐了注意力机制在非线性表达上的短板。
3. 深度对比:MHA vs. Block
我们可以通过下表一眼看出两者的区别:
| 特性 | Multi-Head Attention (多头) | Encoder Block (块) |
| 定义 | 一个功能模块(Function) | 一个结构单元(Component) |
| 关系 | 是被包含关系(Block 包含 MHA) | 是包含关系(它是 MHA 的容器) |
| 数据处理 | 侧重“横向”社交(Patch 间互动) | 侧重“纵向”精炼(特征映射与转换) |
| 非线性 | 极弱(主要靠 Softmax) | 强(拥有完整的 MLP 结构) |
| 独立性 | 无法单独堆叠(会崩溃) | 可以无限堆叠(构建深度网络) |
4. 形象比喻:警察局的故事
为了方便理解,我们可以打个比方:
-
多头注意力 (MHA) 就像是警察局里的**“审讯室”**。在这里,嫌疑人(Patch)之间进行信息比对、交叉询问,目的是找出谁跟谁有关联。
-
Block 则是整座**“警察局”**。它不仅有审讯室(MHA),还有大门(LayerNorm)、走廊(残差连接)和分析科(MLP)。
没有审讯室,警察局无法破案;但只有审讯室而没有其他辅助设施,警察局就无法正常运转。
5. 代码层面的直观感受
在 PyTorch 实现中,两者的层级关系一目了然:
# Block 是容器
class Block(nn.Module):
def __init__(self, dim, num_heads):
super().__init__()
self.norm1 = nn.LayerNorm(dim)
self.attn = Attention(dim, num_heads) # 多头注意力只是 Block 的一部分
self.norm2 = nn.LayerNorm(dim)
self.mlp = Mlp(dim)
def forward(self, x):
# 这里的加号就是残差连接
x = x + self.attn(self.norm1(x))
x = x + self.mlp(self.norm2(x))
return x
结语
在 ViT 架构中,多头注意力负责“联想”,而 Block 负责“稳固”。 我们通过 Patch Embedding 得到输入,然后让数据在一层层 Block 中流过。每一层 Block 内部,Attention 负责看全局,MLP 负责看局部特征的深入提取。
只有理解了这种“算子”与“包装”的关系,你才能真正明白为什么 Transformer 能够横跨 NLP 和 CV 两大领域,成为当之无愧的架构之王。
本文地址:https://www.yitenyun.com/6245.html










