注意力机制

注意力机制(Attention Mechanism)是模拟人类注意力聚焦特性的机器学习技术,核心是通过计算“权重”分配资源,让模型优先关注关键信息。自2014年在神经机器翻译中提出以来,已成为NLP、CV、多模态等领域的核心组件。以下从分类、原理、计算过程、优缺点、场景等维度详细解析。

一、基础注意力机制(Encoder-Decoder Attention)

基础注意力机制诞生于编码器-解码器(Encoder-Decoder)框架,用于解决传统Seq2Seq模型中“固定长度上下文向量”丢失长序列信息的问题。典型代表为Bahdanau注意力(加性注意力)和Luong注意力(乘性注意力)。

1.1 Bahdanau注意力(加性注意力,Additive Attention)

原理

由Bahdanau等人在2014年提出,核心是通过前馈网络计算编码器隐藏状态与解码器隐藏状态的“相关性得分”,动态生成上下文向量。

  • 场景:早期神经机器翻译(如英-法翻译)、文本摘要生成。
  • 核心公式:
    设编码器隐藏状态为 h 1 , h 2 , . . . , h n h_1, h_2, ..., h_n h1,h2,...,hn h i ∈ R d h_i \in \mathbb{R}^d hiRd),解码器当前隐藏状态为 s t ∈ R d s_t \in \mathbb{R}^d stRd,则:
    • 得分函数: s c o r e ( h i , s t ) = v T tanh ⁡ ( W h h i + W s s t ) score(h_i, s_t) = v^T \tanh(W_h h_i + W_s s_t) score(hi,st)=vTtanh(Whhi+Wsst)
      W h , W s ∈ R d a × d W_h, W_s \in \mathbb{R}^{d_a \times d} Wh,WsRda×d v ∈ R d a v \in \mathbb{R}^{d_a} vRda 为可学习参数, d a d_a da 为注意力隐藏维度)
    • 注意力权重: α t , i = exp ⁡ ( s c o r e ( h i , s t ) ) ∑ j = 1 n exp ⁡ ( s c o r e ( h j , s t ) ) \alpha_{t,i} = \frac{\exp(score(h_i, s_t))}{\sum_{j=1}^n \exp(score(h_j, s_t))} αt,i=j=1nexp(score(hj,st))exp(score(hi,st))
    • 上下文向量: c t = ∑ i = 1 n α t , i h i c_t = \sum_{i=1}^n \alpha_{t,i} h_i ct=i=1nαt,ihi
计算过程示例

假设编码器隐藏状态 h 1 = [ 1 , 2 ] h_1 = [1, 2] h1=[1,2] h 2 = [ 3 , 4 ] h_2 = [3, 4] h2=[3,4],解码器状态 s t = [ 5 , 6 ] s_t = [5, 6] st=[5,6],参数 W h = [ [ 1 , 0 ] , [ 0 , 1 ] ] W_h = [[1,0],[0,1]] Wh=[[1,0],[0,1]] W s = [ [ 1 , 0 ] , [ 0 , 1 ] ] W_s = [[1,0],[0,1]] Ws=[[1,0],[0,1]] v = [ 1 , 1 ] v = [1, 1] v=[1,1]

  1. 计算 W h h 1 = [ 1 , 2 ] W_h h_1 = [1, 2] Whh1=[1,2] W s s t = [ 5 , 6 ] W_s s_t = [5, 6] Wsst=[5,6],求和得 [ 6 , 8 ] [6, 8] [6,8],经tanh后为 [ tanh ⁡ ( 6 ) , tanh ⁡ ( 8 ) ] ≈ [ 1 , 1 ] [\tanh(6), \tanh(8)] \approx [1, 1] [tanh(6),tanh(8)][1,1]
  2. 得分 s c o r e ( h 1 , s t ) = v T [ 1 , 1 ] = 2 score(h_1, s_t) = v^T [1, 1] = 2 score(h1,st)=vT[1,1]=2
  3. 同理 s c o r e ( h 2 , s t ) ≈ v T [ tanh ⁡ ( 3 + 5 ) , tanh ⁡ ( 4 + 6 ) ] = v T [ 1 , 1 ] = 2 score(h_2, s_t) \approx v^T [\tanh(3+5), \tanh(4+6)] = v^T [1, 1] = 2 score(h2,st)vT[tanh(3+5),tanh(4+6)]=vT[1,1]=2
  4. 权重 α t , 1 = α t , 2 = 0.5 \alpha_{t,1} = \alpha_{t,2} = 0.5 αt,1=αt,2=0.5,上下文向量 c t = 0.5 × [ 1 , 2 ] + 0.5 × [ 3 , 4 ] = [ 2 , 3 ] c_t = 0.5 \times [1,2] + 0.5 \times [3,4] = [2, 3] ct=0.5×[1,2]+0.5×[3,4]=[2,3]
优缺点
  • 优点:适用于编码器和解码器隐藏维度不同的场景,灵活性高。
  • 缺点:需额外参数( W h , W s , v W_h, W_s, v Wh,Ws,v),计算量略大。

1.2 Luong注意力(乘性注意力,Multiplicative Attention)

原理

由Luong等人在2015年提出,直接通过矩阵乘法计算得分,减少参数。分为点积注意力和缩放点积注意力。

  • 场景:机器翻译、语音识别。
  • 核心公式:
    • 点积得分: s c o r e ( h i , s t ) = h i T s t score(h_i, s_t) = h_i^T s_t score(hi,st)=hiTst(要求 h i h_i hi s t s_t st 维度相同)
    • 缩放点积得分: s c o r e ( h i , s t ) = h i T s t d k score(h_i, s_t) = \frac{h_i^T s_t}{\sqrt{d_k}} score(hi,st)=dk hiTst d k d_k dk 为隐藏维度,缓解高维下点积过大导致softmax梯度消失)
      权重和上下文向量计算同Bahdanau注意力。
计算过程示例

沿用Bahdanau的 h 1 = [ 1 , 2 ] h_1 = [1,2] h1=[1,2] h 2 = [ 3 , 4 ] h_2 = [3,4] h2=[3,4] s t = [ 5 , 6 ] s_t = [5,6] st=[5,6] d k = 2 d_k = 2 dk=2

  1. 点积得分: h 1 T s t = 1 × 5 + 2 × 6 = 17 h_1^T s_t = 1×5 + 2×6 = 17 h1Tst=1×5+2×6=17 h 2 T s t = 3 × 5 + 4 × 6 = 39 h_2^T s_t = 3×5 + 4×6 = 39 h2Tst=3×5+4×6=39
  2. 缩放得分: 17 / 2 ≈ 12.02 17/\sqrt{2} ≈ 12.02 17/2 12.02 39 / 2 ≈ 27.58 39/\sqrt{2} ≈ 27.58 39/2 27.58
  3. 权重: α t , 1 ≈ exp ⁡ ( 12.02 ) / ( exp ⁡ ( 12.02 ) + exp ⁡ ( 27.58 ) ) ≈ 0 \alpha_{t,1} ≈ \exp(12.02)/(\exp(12.02) + \exp(27.58)) ≈ 0 αt,1exp(12.02)/(exp(12.02)+exp(27.58))0 α t , 2 ≈ 1 \alpha_{t,2} ≈ 1 αt,21
  4. 上下文向量 c t ≈ [ 3 , 4 ] c_t ≈ [3,4] ct[3,4](更关注 h 2 h_2 h2)。
优缺点
  • 优点:无额外参数,计算效率高于加性注意力。
  • 缺点:点积在高维下数值不稳定(缩放点积解决此问题)。

二、自注意力(Self-Attention)

自注意力是序列内部元素间的注意力,输入序列中的每个元素同时作为“查询(Query)”“键(Key)”“值(Value)”,捕捉序列内部的长距离依赖(如句子中词语的指代关系)。

原理

核心是通过线性变换生成Q、K、V,计算每个元素对其他元素的权重。

  • 场景:Transformer、BERT、GPT等预训练模型,长文本语义理解。
  • 核心公式:
    设输入序列 x = [ x 1 , x 2 , . . . , x n ] x = [x_1, x_2, ..., x_n] x=[x1,x2,...,xn],通过线性变换得到:
    • Q = W q x Q = W_q x Q=Wqx K = W k x K = W_k x K=Wkx V = W v x V = W_v x V=Wvx W q , W k , W v ∈ R d m o d e l × d k W_q, W_k, W_v \in \mathbb{R}^{d_{model} \times d_k} Wq,Wk,WvRdmodel×dk 为参数)
    • 注意力权重: α i , j = exp ⁡ ( Q i T K j / d k ) ∑ k = 1 n exp ⁡ ( Q i T K k / d k ) \alpha_{i,j} = \frac{\exp(Q_i^T K_j / \sqrt{d_k})}{\sum_{k=1}^n \exp(Q_i^T K_k / \sqrt{d_k})} αi,j=k=1nexp(QiTKk/dk )exp(QiTKj/dk )
    • 输出: z i = ∑ j = 1 n α i , j V j z_i = \sum_{j=1}^n \alpha_{i,j} V_j zi=j=1nαi,jVj

计算过程示例

输入句子“猫坐在垫子上”,分词后 x = [ x 1 ( 猫 ) , x 2 ( 坐 ) , x 3 ( 在 ) , x 4 ( 垫子 ) , x 5 ( 上 ) ] x = [x_1(猫), x_2(坐), x_3(在), x_4(垫子), x_5(上)] x=[x1(),x2(),x3(),x4(垫子),x5()],假设 d k = 2 d_k = 2 dk=2,线性变换后:

  • Q = [ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] , [ 7 , 8 ] , [ 9 , 10 ] ] Q = [[1,2], [3,4], [5,6], [7,8], [9,10]] Q=[[1,2],[3,4],[5,6],[7,8],[9,10]](每行对应 Q 1 Q_1 Q1 Q 5 Q_5 Q5
  • K = [ [ 1 , 1 ] , [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 4 ] , [ 5 , 5 ] ] K = [[1,1], [2,2], [3,3], [4,4], [5,5]] K=[[1,1],[2,2],[3,3],[4,4],[5,5]]
  • V = [ [ 0 , 1 ] , [ 1 , 0 ] , [ 2 , 1 ] , [ 3 , 2 ] , [ 4 , 3 ] ] V = [[0,1], [1,0], [2,1], [3,2], [4,3]] V=[[0,1],[1,0],[2,1],[3,2],[4,3]]

i = 1 i=1 i=1(“猫”)为例:

  1. 计算 Q 1 T K j / 2 Q_1^T K_j / \sqrt{2} Q1TKj/2
    j = 1 j=1 j=1 ( 1 × 1 + 2 × 1 ) / 1.414 ≈ 2.12 (1×1 + 2×1)/1.414 ≈ 2.12 (1×1+2×1)/1.4142.12 j = 4 j=4 j=4(“垫子”): ( 1 × 4 + 2 × 4 ) / 1.414 ≈ 8.48 (1×4 + 2×4)/1.414 ≈ 8.48 (1×4+2×4)/1.4148.48(假设“猫”与“垫子”相关性高)
  2. 权重 α 1 , j \alpha_{1,j} α1,j α 1 , 4 \alpha_{1,4} α1,4 最大;
  3. 输出 z 1 z_1 z1 主要由 V 4 V_4 V4 贡献,捕捉“猫”与“垫子”的关系。

优缺点

  • 优点:并行计算(无RNN的时序依赖),长距离依赖捕捉能力强。
  • 缺点:计算复杂度 O ( n 2 ) O(n^2) O(n2),长序列(如n>1000)效率低。

三、多头注意力(Multi-Head Attention)

多头注意力是自注意力的扩展,通过多个并行的“注意力头” 捕捉不同子空间的特征,提升模型表达能力。

原理

将Q、K、V分割为h个“头”(每个头维度 d k / h d_k/h dk/h),每个头独立计算自注意力,最后拼接结果并线性变换。

  • 场景:Transformer的核心组件(编码器、解码器均使用),BERT、GPT等。
  • 核心公式:
    • 分头: Q h = [ Q 1 , Q 2 , . . . , Q h ] Q^h = [Q_1, Q_2, ..., Q_h] Qh=[Q1,Q2,...,Qh] K h , V h K^h, V^h Kh,Vh 同理(每个 Q i ∈ R n × d k / h Q_i \in \mathbb{R}^{n \times d_k/h} QiRn×dk/h
    • 多头输出: M u l t i H e a d ( Q , K , V ) = W o [ h e a d 1 ; h e a d 2 ; . . . ; h e a d h ] MultiHead(Q,K,V) = W_o [head_1; head_2; ...; head_h] MultiHead(Q,K,V)=Wo[head1;head2;...;headh]
      h e a d i = A t t e n t i o n ( Q i , K i , V i ) head_i = Attention(Q_i, K_i, V_i) headi=Attention(Qi,Ki,Vi) W o ∈ R d m o d e l × d m o d e l W_o \in \mathbb{R}^{d_{model} \times d_{model}} WoRdmodel×dmodel 为参数)

计算过程示例

h = 2 h=2 h=2 d k = 4 d_k=4 dk=4(每个头维度2),沿用自注意力的Q、K、V:

  1. 分头: Q 1 = [ [ 1 , 2 ] , [ 3 , 4 ] , . . . ] Q_1 = [[1,2], [3,4], ...] Q1=[[1,2],[3,4],...] Q 2 = [ [ 5 , 6 ] , [ 7 , 8 ] , . . . ] Q_2 = [[5,6], [7,8], ...] Q2=[[5,6],[7,8],...](假设Q原始维度4,拆分后每个头2维);
  2. 头1计算“猫-动作”关系,头2计算“猫-位置”关系;
  3. 拼接头1和头2的输出,经 W o W_o Wo 变换得到最终结果。

优缺点

  • 优点:捕捉多维度特征(如语义、语法、位置),性能远超单头注意力。
  • 缺点:参数和计算量增加(约h倍)。

四、交叉注意力(Cross-Attention)

交叉注意力用于两个不同序列间的注意力,Query来自一个序列,Key和Value来自另一个序列,实现跨序列信息交互。

原理

核心是Query与Key/Value来源不同,计算方式同自注意力,但Q、K、V来自不同输入。

  • 场景:编码器-解码器(解码器Q关注编码器K/V)、图像描述(文本Q关注图像K/V)、视觉问答(问题Q关注图像K/V)。

计算过程示例

图像描述任务中,输入图像特征 I = [ v 1 , v 2 , . . . , v m ] I = [v_1, v_2, ..., v_m] I=[v1,v2,...,vm](K/V来源),解码器生成文本时当前状态 s t s_t st(Q来源):

  1. Q = W q s t Q = W_q s_t Q=Wqst K = W k I K = W_k I K=WkI V = W v I V = W_v I V=WvI
  2. 注意力权重反映“生成当前词时应关注图像的哪个区域”(如生成“狗”时,权重集中在图像中狗的区域特征)。

优缺点

  • 优点:高效实现跨模态/跨序列信息融合。
  • 缺点:依赖两个序列的对齐质量(如文本与图像的语义对齐)。

五、注意力变体(优化长序列/效率)

为解决自注意力 O ( n 2 ) O(n^2) O(n2) 复杂度问题,衍生出稀疏注意力、局部注意力等变体。

5.1 稀疏注意力(Sparse Attention)

原理

仅计算部分元素的注意力(而非全连接),常见策略:

  • 局部窗口:每个位置只关注附近k个元素(如上下各5个);
  • 固定模式:如每间隔k个元素关注一次(如Transformer-XL的“段级循环”);
  • 动态选择:通过学习选择关键元素(如Longformer的“全局token”)。
  • 场景:长文本(如法律文档)、基因组序列(长度达10^4以上)。

5.2 局部注意力(Local Attention)

原理

每个位置仅关注固定大小的局部窗口,平衡效率与性能。

  • 场景:Transformer-XL(处理超长文本)、视频理解(帧序列过长)。
  • 优点:复杂度降为 O ( n k ) O(nk) O(nk)(k为窗口大小),适合长序列;
  • 缺点:丢失全局依赖(需结合其他机制弥补)。

六、视觉注意力机制

在计算机视觉中,注意力机制用于聚焦图像的关键区域或通道,典型代表为空间注意力和通道注意力。

6.1 空间注意力(Spatial Attention)

原理

通过学习空间权重矩阵,突出图像中重要的空间位置(如目标区域)。

  • 场景:目标检测(聚焦目标位置)、图像分割。
  • 计算:对特征图 F ∈ R C × H × W F \in \mathbb{R}^{C \times H \times W} FRC×H×W,先全局池化得 F a v g ∈ R 1 × H × W F_{avg} \in \mathbb{R}^{1 \times H \times W} FavgR1×H×W F m a x ∈ R 1 × H × W F_{max} \in \mathbb{R}^{1 \times H \times W} FmaxR1×H×W,拼接后经卷积和sigmoid得到空间权重 M s ∈ R 1 × H × W M_s \in \mathbb{R}^{1 \times H \times W} MsR1×H×W,输出 F ′ = F ⊗ M s F' = F \otimes M_s F=FMs ⊗ \otimes 为逐元素乘)。

6.2 通道注意力(Channel Attention)

原理

通过学习通道权重,突出重要特征通道(如目标的边缘、纹理通道)。

  • 场景:图像分类(抑制背景通道)、语义分割。
  • 计算:对特征图 F F F 全局平均池化得 F a v g ∈ R C F_{avg} \in \mathbb{R}^C FavgRC,全局最大池化得 F m a x ∈ R C F_{max} \in \mathbb{R}^C FmaxRC,经MLP和sigmoid得到通道权重 M c ∈ R C M_c \in \mathbb{R}^C McRC,输出 F ′ = F ⊗ M c F' = F \otimes M_c F=FMc

七、各类注意力机制的核心区别总结

类型 核心特点 输入来源 典型场景 复杂度
Bahdanau注意力 加性得分,参数多 编码器+解码器 早期机器翻译 O ( n m ) O(nm) O(nm)
缩放点积注意力 乘性得分,无额外参数 编码器+解码器 机器翻译 O ( n m ) O(nm) O(nm)
自注意力 序列内部依赖 单一序列(Q=K=V) Transformer、BERT O ( n 2 ) O(n^2) O(n2)
多头注意力 多子空间特征 单一序列(分多头) Transformer核心 O ( h n 2 ) O(hn^2) O(hn2)
交叉注意力 跨序列依赖 两个序列(Q≠K/V) 图像描述、VQA O ( n m ) O(nm) O(nm)
稀疏注意力 局部/动态稀疏连接 单一序列 长文本、基因组序列 O ( n k ) O(nk) O(nk)
空间/通道注意力 图像空间/通道权重 图像特征图 目标检测、图像分类 O ( H W ) O(HW) O(HW)

八、总结

注意力机制通过动态权重分配实现“聚焦关键信息”,从基础的编码器-解码器注意力到自注意力、多头注意力,再到针对效率优化的稀疏变体和视觉专用注意力,其发展始终围绕“捕捉依赖”和“提升效率”两大核心。选择注意力类型需结合场景:长序列优先稀疏/局部注意力,跨模态任务用交叉注意力,通用语义理解用自注意力/多头注意力。未来,注意力机制将进一步与动态路由、记忆网络等结合,提升复杂任务的建模能力。

更多推荐