注意力机制(Attention Mechanism)是 Transformer 架构的核心组成部分,它允许模型在处理信息时动态地关注输入序列中最相关的部分。这种机制极大地提升了模型对长距离依赖关系的理解能力,成为现代大语言模型(LLM)的关键技术之一。
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V
其中:
Self-Attention 是最基础也是最常用的注意力机制。它通过 Query (Q)、Key (K) 和 Value (V) 向量之间的点积来衡量输入序列中不同位置之间的相关性。
Self-Attention ( X ) = softmax ( Q K T d k ) V \text{Self-Attention}(X) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Self-Attention(X)=softmax(dkQKT)V
其中:
Cross-Attention 发生在 Encoder-Decoder 架构中,用于解码器关注编码器输出的信息。
Query 来自 Decoder 输入,而 Key 和 Value 来自 Encoder 输出。
Cross-Attention ( Q d e c , K e n c , V e n c ) = softmax ( Q d e c K e n c T d k ) V e n c \text{Cross-Attention}(Q_{dec}, K_{enc}, V_{enc}) = \text{softmax}\left(\frac{Q_{dec} K_{enc}^T}{\sqrt{d_k}}\right)V_{enc} Cross-Attention(Qdec,Kenc,Venc)=softmax(dkQdecKencT)Venc
Multi-Head Attention 将输入映射到多个不同的子空间,并独立地进行多次 attention 操作,最后拼接结果并线性变换。
MultiHead ( Q , K , V ) = Concat ( head 1 , . . . , head h ) W O \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO
其中:
head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) headi=Attention(QWiQ,KWiK,VWiV)
Local Attention 只在固定大小的窗口内进行 attention 计算,而不是整个序列。
Sliding Window 则允许窗口在序列上滑动,从而覆盖更多上下文。
A i j = { q i k j T d k , ∣ i − j ∣ < w − ∞ , otherwise A_{ij} = \begin{cases} \frac{q_i k_j^T}{\sqrt{d_k}}, & |i - j| < w \\ -\infty, & \text{otherwise} \end{cases} Aij={dkqikjT,−∞,∣i−j∣<wotherwise
其中 $ w $:窗口大小
Sparse Attention 仅选择部分位置进行 attention 计算,而非全连接。
例如:随机采样 key/value 或基于规则选择重要位置。
SparseAttention ( Q , K , V ) = ∑ j ∈ S ( i ) α i j v j \text{SparseAttention}(Q, K, V) = \sum_{j \in S(i)} \alpha_{ij} v_j SparseAttention(Q,K,V)=j∈S(i)∑αijvj
其中 $ S(i) $:第 i 个 token 的稀疏采样集合
FlashAttention 是 NVIDIA 提出的一种高效 attention 实现方式,通过优化内存访问顺序和减少中间缓存,显著提升 attention 的计算效率。
FlashAttention ( Q , K , V ) = Efficient softmax and matmul on GPU \text{FlashAttention}(Q, K, V) = \text{Efficient softmax and matmul on GPU} FlashAttention(Q,K,V)=Efficient softmax and matmul on GPU
将 Query 分成若干组,每组共享一组 Key 和 Value 向量。
GQA ( Q , K , V ) = Grouped version of MultiHead \text{GQA}(Q, K, V) = \text{Grouped version of MultiHead} GQA(Q,K,V)=Grouped version of MultiHead
即:
所有 attention head 共享相同的 Key 和 Value 向量。
K = X W K , V = X W V ( 所有 head 共享 ) K = X W_K,\quad V = X W_V \quad (\text{所有 head 共享}) K=XWK,V=XWV(所有 head 共享)
Q i = X W Q i Q_i = X W_{Q_i} Qi=XWQi
RoPE 将位置信息以旋转矩阵的方式注入 Query 和 Key 向量中,使 attention score 自动考虑相对位置关系。
对于第 $ i $ 个 token,其向量表示为:
q i ′ = R i q i , k j ′ = R j k j q_i' = R_i q_i,\quad k_j' = R_j k_j qi′=Riqi,kj′=Rjkj
最终 attention score 为:
( q i ′ ) T k j ′ (q_i')^T k_j' (qi′)Tkj′
ALiBi 使用线性偏置引导 attention score,不使用显式的位置嵌入。
score i j = q i k j T d k + m ⋅ ( j − i ) \text{score}_{ij} = \frac{q_i k_j^T}{\sqrt{d_k}} + m \cdot (j - i) scoreij=dkqikjT+m⋅(j−i)
其中 $ m $ 是预设的缩放系数(通常取 1, 2, 4…),用于控制偏置强度。
注意力类型 | 是否支持长文本 | 是否支持 KV Cache 优化 | 是否适合推理加速 | 是否支持位置建模 |
---|---|---|---|---|
Self-Attention | ❌ | ❌ | ❌ | ✅ |
Multi-Head | ❌ | ❌ | ❌ | ✅ |
Sparse | ✅ | ✅ | ✅ | ✅ |
FlashAttention | ✅ | ✅ | ✅ | ✅ |
GQA | ✅ | ✅ | ✅ | ✅ |
MQA | ✅ | ✅ | ✅ | ✅ |
RoPE | ✅ | ✅ | ✅ | ✅ |
ALiBi | ✅ | ✅ | ✅ | ✅ |
注意力机制是大语言模型的核心组成部分,决定了模型如何理解和生成文本。随着模型规模的扩大和应用场景的丰富,越来越多的注意力机制被提出,以解决长上下文、推理效率、内存瓶颈等问题。
选择合适的注意力机制,不仅能提升模型表现,还能显著优化推理速度和部署成本。