注意力机制最初来源于人类视觉系统的工作方式——当我们观察一个复杂场景时,不会同时处理所有信息,而是有选择地聚焦于关键区域。2017年Google提出的Transformer架构将这一思想数学化,创造了如今广泛使用的自注意力(Self-Attention)机制。
这个机制的核心在于三个关键概念:
在语言处理任务中,每个单词都会生成自己的Q、K、V向量。通过计算Query与所有Key的相似度(通常用点积),得到一组注意力权重,再用这些权重对Value进行加权求和。这个过程可以用公式表示为:
Attention(Q,K,V) = softmax(QK^T/√d_k)V
其中d_k是Key向量的维度,√d_k的缩放是为了防止点积结果过大导致softmax梯度消失。
原始论文采用8个并行的注意力头(h=8),每个头都有自己的W_Q、W_K、W_V参数矩阵。这种设计允许模型:
具体实现时,会将所有头的参数矩阵拼接后进行统一计算:
MultiHead(Q,K,V) = Concat(head_1,...,head_h)W_O
其中head_i = Attention(QW_Q^i, KW_K^i, VW_V^i)
由于自注意力机制本身不具备位置感知能力,Transformer引入了正弦位置编码:
PE(pos,2i) = sin(pos/10000^(2i/d_model))
PE(pos,2i+1) = cos(pos/10000^(2i+1/d_model))
这种编码方式具有以下特性:
在编码器部分,每个位置的输出都是通过关注输入序列的所有位置计算得到的。这种全局注意力使得:
解码器使用两种注意力:
实现掩码的关键是在softmax前将非法位置设为负无穷:
MaskedAttention(Q,K,V) = softmax((QK^T + M)/√d_k)V
其中M是一个下三角矩阵,合法位置为0,非法位置为-∞
实际部署时需要考虑:
调试注意力模型时常见问题包括:
实际应用中发现,对于中文等非空格分隔语言,需要特别注意子词切分对注意力效果的影响。建议在使用BPE等算法时适当调整词汇表大小。