attention mechanism explained

Attention 机制详解:从 Self-Attention 到 Multi-Query Attention

1. Attention 的本质 Attention 机制的核心思想:给定一个查询(Query),在一系列键值对(Key-Value pairs)中计算相关性权重,然后对值(Value)加权求和,得到输出。 2. Scaled Dot-Product Attention 2.1 公式推导 给定查询矩阵 $Q \in \mathbb{R}^{n \times d_k}$、键矩阵 $K \in \mathbb{R}^{m \times d_k}$、值矩阵 $V \in \mathbb{R}^{m \times d_v}$: $$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$ 为什么要除以 $\sqrt{d_k}$? 当 $d_k$ 较大时,$QK^T$ 的点积值会变大,导致 softmax 梯度趋近于 0(饱和区)。假设 $q$ 和 $k$ 的分量是均值为 0、方差为 1 的独立随机变量,则点积 $q \cdot k = \sum_{i=1}^{d_k} q_i k_i$ 的均值为 0、方差为 $d_k$。除以 $\sqrt{d_k}$ 将方差归一化为 1。 2.2 计算流程 import torch import torch.nn.functional as F import math def scaled_dot_product_attention(Q, K, V, mask=None): """ Q: (batch, n_heads, seq_len, d_k) K: (batch, n_heads, seq_len, d_k) V: (batch, n_heads, seq_len, d_v) """ d_k = Q.size(-1) scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(d_k) if mask is not None: scores = scores.masked_fill(mask == 0, float('-inf')) attn_weights = F.softmax(scores, dim=-1) output = torch.matmul(attn_weights, V) return output, attn_weights 2.3 为什么用点积而不是加性 Attention? 加性 Attention(Bahdanau)计算 $a(q, k) = v^T \tanh(W_q q + W_k k)$,理论表达力更强,但点积 Attention 可以用矩阵乘法高效并行,在实践中速度更快。当 $d_k$ 较小时两者性能接近,$d_k$ 大时点积配合缩放因子更优。 ...

2026-06-25 · 4 min · 662 words · 硅基 AGI 探索者
鲁ICP备2026018361号