Transformer多头自注意力机制
时间: 2025-05-11 20:42:52 浏览: 36
### 多头自注意力机制工作原理
在Transformer模型中,多头自注意力(Multi-Head Attention)机制允许模型关注来自不同位置的不同表征子空间的信息[^3]。
#### 输入处理
输入序列中的每一个token都会被转换成向量表示。这些向量作为查询(Query)、键(Key)以及值(Value),用于计算注意力分数。对于一个多头注意模块来说,它实际上包含了多个并行运行的自注意力层,每个都独立地学习如何加权组合输入特征来形成新的表达形式。
#### 并行化自注意力计算
具体而言,在给定输入$X$的情况下,会创建$h$份副本并将它们送入各自对应的自注意力函数里去。这意味着存在$h$组参数矩阵$\{W_i^Q\}$,$\{W_i^K\}$ 和 $\{W_i^V\}(i=1,...,h)$ 来投影原始数据到低维空间以便于后续操作:
$$ Q_i=X W_i^{Q}, K_i=X W_i^{K}, V_i=X W_i^{V} $$
其中$i \in {1,\ldots,h } $ 表示第几个头部(head),而$W_i^{*}$ 则代表该路径下的线性变换权重矩阵[*对应公式来源于对Self-Attention的理解和实现方式]$.
接着按照标准做法利用softmax函数求得注意力分布:
$$ \text{{attn}}_i=\operatorname{Softmax}\left(\frac{\mathbf{Q}_i {\mathbf{K}_i}^\top}{\sqrt{d_k}}\right)\cdot \mathbf{V}_i $$
这里$d_k$指的是维度大小的一个缩放因子用来稳定梯度传播过程;上述运算最终会产生一组经过重新分配后的value vectors即$\text{{attn}}_i$, 它们反映了当前时刻各个词在整个句子范围内的重要性程度。
#### 输出聚合
当所有的单个head完成了各自的计算之后,就需要把这些结果汇总起来构成最后的整体输出。这通常通过简单的拼接(concatenation)再乘以额外的学习参数完成:
```python
import torch.nn.functional as F
def multi_head_attention(query, key, value, num_heads):
d_model = query.size(-1)
head_dim = d_model // num_heads
# Split and process each head separately
q_split = query.view(batch_size, seq_len, num_heads, head_dim).transpose(1, 2)
k_split = key.view(batch_size, seq_len, num_heads, head_dim).transpose(1, 2)
v_split = value.view(batch_size, seq_len, num_heads, head_dim).transpose(1, 2)
scores = torch.matmul(q_split / math.sqrt(k_split.size(-1)), k_split.transpose(-2,-1))
attn_weights = F.softmax(scores,dim=-1)
context_vectors = torch.matmul(attn_weights,v_split).transpose(1,2).contiguous().view(batch_size,seq_len,d_model)
output_linear = nn.Linear(d_model, d_model)(context_vectors)
return output_linear
```
此代码片段展示了如何在一个批次内执行multi-head attention的操作流程,并且返回了一个形状与初始输入相同的张量作为下一步骤的基础.
阅读全文
相关推荐


















