服务端阅读 06月1日 15:05
注意力机制是什么?为什么 Transformer 靠它替代了 RNN?
注意力机制让模型在处理每个词时,能动态决定该"看"输入序列的哪些其他词。它是 Transformer 的核心,也是 BERT、GPT 等现代 NLP 模型的基础。没有注意力机制,就没有今天的大语言模型。直觉:注意力在做什么想象你在读"银行"这个词,想理解它的意思。如果上下文是"他去银行存钱","银行"和"存钱"的关系最密切——你的注意力会聚焦在"存钱"上。如果上下文是"他坐在河的银行边",注意力会转向"河"。注意力机制做的就是这个:对序列中的每个位置,计算它和其他所有位置的相关程度,然后按相关程度加权聚合信息。相关程度高的权重大,低的权重小。核心计算:Query、Key、Value注意力机制借用了数据库检索的概念:Query(Q):当前词想知道"我应该关注谁"Key(K):每个词提供的"我是谁、我有什么信息"Value(V):每个词实际传递的信息内容计算过程:Q 和每个 K 做点积,得到相关性分数 → 除以 √d_k(缩放,防止点积太大导致 softmax 梯度消失)→ softmax 归一化成权重 → 用权重对 V 加权求和,得到输出。公式:Attention(Q, K, V) = softmax(QK^T / √d_k) V为什么 Q·K^T 能代表相关性?因为它们是学出来的向量——训练过程中,相关的 Q 和 K 会被调整到点积更大的方向,不相关的被调到点积更小的方向。点积只是度量相似性的工具,真正的知识在 Q 和 K 的参数里。自注意力 vs 交叉注意力自注意力:Q、K、V 都来自同一个序列。模型在处理一个句子时,让每个词和句子中所有其他词交互。这是 Transformer 编码器的核心——BERT 全靠自注意力理解上下文。交叉注意力:Q 来自一个序列,K 和 V 来自另一个序列。典型场景是机器翻译:Q 来自目标语言(正在生成的词),K 和 V 来自源语言(待翻译的句子)。交叉注意力让模型在生成每个目标词时,"回头看"源句子的哪个部分最相关。多头注意力:为什么不只用一个注意力一个注意力头只能学一种关联模式。但语言中有多层关系:语法关系(主语-谓语)、语义关系(同义词)、位置关系(相邻词)。多头注意力让模型同时学多种模式——每个头独立计算 Q/K/V,最后拼接起来。Transformer 原论文用了 8 个头,GPT-3 用了 96 个头。头数不是越多越好,太小不够表达,太大参数浪费,通常和模型维度一起调。注意力为什么替代了 RNNRNN 的致命问题是顺序依赖:处理第 t 个词必须先处理完前 t-1 个词,无法并行。序列长了梯度消失/爆炸,LSTM 的门机制缓解但没根治。注意力一步到位:每个位置直接和所有位置交互,不需要逐步递归,训练时完全并行。GPU 最擅长的就是并行矩阵运算——注意力的 QK^T 计算就是大矩阵乘法,GPU 跑起来飞快。代价是 O(n²) 的计算和内存复杂度——序列长度翻倍,计算量翻四倍。这就是为什么早期 BERT 只支持 512 token,直到 FlashAttention 等优化技术出现才突破了长序列的瓶颈。实际影响注意力机制不只是 Transformer 的一个组件,它改变了整个 NLP 的范式。RNN 时代,模型架构是瓶颈;注意力时代,瓶颈变成了数据和算力。从 BERT 到 GPT-4,底层都是注意力机制,差别只在规模和训练策略。