Transformer 学习笔记之可缩放点积注意力(Scaled‑Dot‑Product Attention)
Q1: 在 scaled_dot_product_attention 中,Q、K、V 是张量吗?它们的形状是什么?
A: 是的,Q、K、V 都是 torch.Tensor。在进入注意力计算前,它们的形状为
(batch_size, n_heads, seq_len, d_k),其中 d_k = d_model // n_heads。
Q2: 为什么需要 batch_size 参数?它的作用是什么?
A: batch_size 表示一次前向传播同时处理的样本数量。它用于并行计算,提高 GPU/CPU 利用率,并在训练时对多个样本的梯度进行累计,从而加速训练和提升数值稳定性。
Q3: scores = torch.matmul(Q, K.transpose(-2, -1)) / sqrt(d_k) 计算得到的矩阵是什么?
A: 该矩阵是 每个查询位置对所有键位置的注意力分数(相似度),形状为 (batch_size, n_heads, seq_len, seq_len),即每个头的分数矩阵。
Q4: 为什么对 scores 做 softmax,得到的就是注意力权重?
A: softmax 将任意实数的分数映射为非负且归一化的概率分布(每行和为 1),因此得到的 attn_weights 表示查询在所有键上的关注程度,即注意力权重。
Q5: self.dropout(attn_weights) 的作用是什么?
A: Dropout 在训练时随机将部分注意力权重置为 0(并对剩余权重做尺度补偿),起到 正则化 的作用,防止模型过度依赖少数高权重位置,提高泛化能力。推理时自动关闭。
Q6: 为什么要把注意力权重乘以 V?
A: 乘以 V 实现 加权求和:对每个查询位置,将所有位置的 value 向量按注意力权重加权求和,得到该位置的上下文感知特征表示。即实现了“在考虑其它位置相关性后得到的聚合特征”。
Q7: 注意力分数矩阵是否包含所有头的分数?
A: 是的,scores 的第二维 n_heads 包含了每个注意力头的分数矩阵,形状 (batch_size, n_heads, seq_len, seq_len)。
Q8: 在实际例子 “今天的天气真” 中,位置 “真” 对 “天气” 的注意力分数会高于对 “今天” 的分数吗?
A: 通常情况下,语义上更相关的词(如 “天气” 与 “真”)会得到更大的分数,但这取决于模型已学习的参数和具体任务。模型可能会给 “天气” 更高的分数,也可能给自身或其他词更高的分数,只有实际模型输出才能确认。
Q9: 总结注意力计算的完整流程是什么?
A:
-
投影:将输入
x通过线性层得到 Q、K、V。 -
reshape 为
(batch, heads, seq_len, d_k)。 -
计算分数:
scores = Q·Kᵀ / √d_k→ shape(batch, heads, seq_len, seq_len)。 -
softmax →
attn_weights(归一化注意力分布)。 - dropout(训练时) → 正则化。
-
加权求和:
output = attn_weights · V→ 聚合特征。 -
拼接 & 投影:多头输出合并后通过线性层
W_o恢复d_model维度。
附录
Paper: https://arxiv.org/abs/1706.03762
Transformer‑from‑Scratch: https://github.com/Breeze648/Transformer-from-Scratch
--END--