Multi-Head Self-Attention(多头自注意力机制)
一、什么是注意力机制(Attention)?
当你看一张图片时,你不会一次性注意所有像素。比如看一只猫,你可能先注意它的头,再注意尾巴、背景等。
注意力机制就是让模型学会在不同部分之间分配关注度。
二、自注意力(Self-Attention)的含义
自注意力的意思是:一个元素(比如一个图像块 patch)要根据序列中其他所有元素的信息,来决定自己应该关注哪些部分。
在ViT中,每个Patch都可以“看”到其他所有Patch,从而学会它们之间的全局关系。
三、它是怎么计算的?
假设图像被切成了多个Patch:$[ P_1, P_2, P_3, …, P_n ]$
每个Patch经过线性变换后会生成三个向量:
| 名称 | 含义 | 作用类比 |
|---|---|---|
| Q(Query)查询向量 | 当前元素想“询问”别人什么 | 我的问题是什么? |
| K(Key)键向量 | 每个元素“代表”的特征标签 | 别人是谁? |
| V(Value)值向量 | 实际要传递的内容 | 别人能提供什么信息? |
Step 1:计算相似度(Q × Kᵀ)
我们先用当前Patch的Q去和所有其他Patch的K做点积:$ \text{score}_{ij} = Q_i \cdot K_j$
它表示第i个Patch对第j个Patch的关注程度。比如猫头(Patch₁)对猫尾巴(Patch₇)的score可能高,对背景(Patch₉₉)的score可能低。
Step 2:Softmax归一化
将所有score通过 Softmax 转成概率(注意力权重):$ \alpha_{ij} = \text{softmax}(score_{ij})$
这样每个Patch的注意力分布都加起来等于1。
Step 3:加权求和
用这些权重对所有V加权求和:$ \text{output}i = \sum_j \alpha{ij} \cdot V_j $
这一步相当于:我(Patch_i)从其他Patch那里借信息的加权平均。结果是每个Patch都融合了来自其他位置的信息。
四、那为什么要多头(Multi-Head)?
上面描述的过程只是一种“注意力”,但现实中的图像关系是多层次的:
- 一些头可能关注“形状结构”(边缘、轮廓)
- 一些头可能关注“颜色区域”(红绿蓝差异)
- 一些头可能关注“空间关系”(相对位置)
所以ViT引入了多头机制:
将输入向量分成多个子空间,让模型并行学习多个不同类型的注意力模式。
形式上:
如果有 8 个头,每个头就会计算独立的一组 (Q, K, V),得到 8 种不同的注意力结果:$\text{head}_1, \text{head}_2, …, \text{head}_8$
然后把它们拼接(Concatenate)在一起,再通过一个线性层整合成最终输出。
例子:
假设你在看一张“猫坐在椅子上的图片”:
| 注意力头 | 模型关注的重点 |
|---|---|
| Head 1 | 猫的边缘和轮廓(形状) |
| Head 2 | 猫的颜色分布(颜色) |
| Head 3 | 猫与椅子的空间关系(位置) |
| Head 4 | 背景与前景的分离(区域) |
所有这些头的信息最后被合并,模型就能得到一个包含多层次语义关系的整体图像表示。
五、公式总结
设输入矩阵为 ( $X \in \mathbb{R}^{n \times d} $),则:
$$
Q = X W_Q,\quad K = X W_K,\quad V = X W_V
$$
单头注意力:
$$
\operatorname{Attention}(Q, K, V) = \operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right) V
$$
多头注意力:
$$
\operatorname{MultiHead}(Q, K, V) = \operatorname{Concat}(\text{head}_1, \ldots, \text{head}_h) W_O
$$
其中:
$$
\text{head}i = \operatorname{Attention}(Q W{Q_i}, K W_{K_i}, V W_{V_i})
$$