模型维度跨头分割 | AI生成和翻译
问题:在多头注意力中,模型维度被拆分到不同的注意力头上,而不是批次大小或token长度被拆分,这种理解正确吗?
回答:
是的,你的理解是正确的。
在多头注意力(MHA)中,核心思想是将隐藏维度(模型维度,(d_{model}))拆分到多个头上,而不是拆分批次大小或token长度。
1. 什么被拆分?
假设:
-
输入形状: [ (B, T, d_{model}) ] 其中:
- (B) = 批次大小
- (T) = token长度(序列长度)
- (d_{model}) = 嵌入/隐藏大小
在多头注意力中:
-
我们仅拆分特征维度: [ d_{model} \rightarrow h \times d_{head} ] 其中:
- (h) = 头数
- (d_{head} = d_{model} / h)
因此每个头处理每个token的一个更小的向量。
2. 什么没有被拆分?
- ❌ 批次大小 (B):保持不变
- ❌ token长度 (T):保持不变
每个token仍然关注序列中的所有token。
3. 内部实际发生了什么?
对于每个头:
- 将输入投影到Q、K、V: [ Q, K, V \in (B, T, d_{head}) ]
- 每个头独立计算注意力: [ Attention(Q, K, V) ]
- 然后将所有头拼接起来: [ (B, T, h \cdot d_{head}) = (B, T, d_{model}) ]
- 最后的线性投影将它们重新混合。
4. 直观理解
可以这样理解:
- 每个token由一个大向量描述
- 多头注意力将该向量拆分为多个“子空间”
-
每个头学习不同类型的关系:
- 语法
- 长距离依赖
- 位置模式
- 语义相似性等
5. 关键要点
- ✔ 拆分:特征维度(嵌入空间)
- ✘ 不拆分:批次大小或序列长度
- ✔ 每个头看到完整的序列,只是用更低维度的表示
如果你愿意,我还可以画出精确的张量形状流程(类似PyTorch的view/reshape/transpose逐步操作),让你看到它在代码中是如何实现的。
