左边是ViT用的Multi-head S
时间: 2025-04-04 22:09:32 浏览: 38
### Vision Transformer (ViT) 中的 Multi-head Self-Attention 机制
Vision Transformer (ViT) 是一种基于Transformer架构的模型,它通过将图像分割成固定大小的小块并将其视为序列输入来处理视觉数据[^2]。其中的核心组件之一是 **Multi-head Self-Attention (MSA)** 机制。
#### 多头自注意力(Multi-head Self-Attention)
多头自注意力是一种扩展标准自注意力的方法,允许模型从不同的表示子空间学习信息。具体来说:
1. **Self-Attention 的基本原理**
自注意力机制计算输入序列中的每一对位置之间的关系权重,并利用这些权重聚合上下文信息。对于给定的位置 \(i\),其输出可以看作是对其他所有位置加权求和的结果。这种操作可以通过三个矩阵变换实现:查询 (\(Q\))、键 (\(K\)) 和值 (\(V\))。
\[
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V
\]
这里,\(d_k\) 表示键向量的维度,用于缩放点积以稳定梯度。
2. **引入多个头部的原因**
单一的自注意力层可能无法捕捉到所有的特征模式。因此,ViT 使用了多头设计,即在同一时间运行多次独立的自注意力过程,并最终将它们拼接起来形成完整的表示。这样做的好处是可以让网络关注不同部分的信息,从而提高表达能力。
3. **具体的实现方式**
假设我们有 \(h\) 个平行的注意头,则每个头会分别生成自己的 \(Q_i, K_i, V_i\) 并执行上述公式得到各自的输出 \(O_i\)。之后再把这些结果连接在一起并通过线性投影映射回原始尺寸作为最后的输出:
```python
import torch.nn as nn
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, num_heads):
super(MultiHeadAttention, self).__init__()
assert d_model % num_heads == 0
self.d_k = d_model // num_heads
self.num_heads = num_heads
self.linears = clones(nn.Linear(d_model, d_model), 4)
def forward(self, query, key, value):
batch_size = query.size(0)
# 将 QKV 转化为多头形式
q, k, v = [
lin(x).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
for lin, x in zip(self.linears[:3], (query, key, value))
]
scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(self.d_k)
p_attn = F.softmax(scores, dim=-1)
output = torch.matmul(p_attn, v)
concat_output = output.transpose(1, 2).contiguous().view(batch_size, -1, self.num_heads * self.d_k)
final_output = self.linears[-1](concat_output)
return final_output
```
上述代码展示了如何构建一个多头注意力模块,在实际应用中可以根据需求调整参数设置。
4. **在 ViT 中的作用**
在 ViT 架构下,图片被切分成若干片后展平成为 token 序列送入 transformer 编码器堆栈内部进行逐层加工。每一层都包含了 MSA 结构以及前馈神经网络两大部分交替作用完成复杂特征提取任务。
---
### 总结
通过对输入数据的不同视角建模,multi-head self-attention 提升了 vision transformers 对全局依赖性的理解力;而正是由于这一特性加上其它技术创新共同促成了 vit 成功打破 cnn 霸主地位的局面。
阅读全文
相关推荐


















