文章目录
RNN家族的介绍:网页链接
一、注意力机制介绍
1.1 注意力机制的本质
注意力机制源于对人类认知过程的模拟:当人处理信息时,会有选择地聚焦于关键部分而忽略次要信息。例如看到"锦江饭店"照片时,大脑会优先关注牌匾文字而非背景细节:
在深度学习中,注意力机制通过为输入的不同部分分配权重系数实现这种聚焦效果:
- 高权重:重点关注
- 低权重:次要关注
- 零权重:完全忽略
1.2 语义融合方法
注意力机制的核心是融合不同来源的语义信息,常见方法如下:
融合方法 | 计算公式 | 特点 |
---|---|---|
拼接 | [ h i ; s j ] [h_i; s_j] [hi;sj] | 保留原始特征但增加维度 |
累加 | h i + s j h_i + s_j hi+sj | 特征混合但可能信息冲突 |
加权融合 | ∑ α i ⋅ h i \sum \alpha_i \cdot h_i ∑αi⋅hi | 注意力机制核心方法 |
1.3 相似性计算方法
计算注意力权重的核心是度量向量间相似性,常见方法如下:
计算方法 | 公式 | 特点 |
---|---|---|
点积 | score ( Q , K ) = Q ⋅ K \text{score}(Q,K) = Q \cdot K score(Q,K)=Q⋅K | 计算简单高效 |
缩放点积 | Q ⋅ K d k \frac{Q \cdot K}{\sqrt{d_k}} dkQ⋅K | 避免梯度消失(Transformer使用) |
余弦相似度 | Q ⋅ K ∣ Q ∣ ∣ K ∣ \frac{Q \cdot K}{|Q| |K|} ∣Q∣∣K∣Q⋅K | 不受向量长度影响 |
加性模型 | v T tanh ( W [ Q ; K ] ) v^T \tanh(W[Q; K]) vTtanh(W[Q;K]) | 早期RNN常用方法 |
二、注意力机制分类
2.1 软注意(全局注意)
核心特性:
- 权重分配:生成 0~1 连续值的注意力权重(如
[0.2, 0.3, 0.5]
),对输入元素全局考量。 - 关注范围:覆盖所有输入元素,无信息丢弃,充分利用序列语义。
- 计算方式:可微,支持反向传播,便于模型端到端训练优化。
数学表达与计算规则:
软注意通过计算查询(Q
)、键(K
)间相似度得到注意力权重,再加权融合值(V
),常见实现形式有以下几种(符号说明:Q
为查询向量/矩阵,K
为键向量/矩阵,V
为值向量/矩阵,Linear
代表线性变换操作,Softmax
为归一化函数,d_k
为 K
的维度,用于缩放点积 ):
-
拼接线性变换型
先将Q
与K
沿纵轴拼接([Q, K]
表示拼接操作 ),经线性变换提取特征,再用Softmax
生成权重,最后与V
做张量乘法(若为批量数据,当注意力权重矩阵和V
第一维代表 batch 条数时,采用bmm
批量矩阵乘法 ),公式为:
Attention ( Q , K , V ) = Softmax ( Linear ( [ Q , K ] ) ) ⋅ V \text{Attention}(Q, K, V) = \text{Softmax}\big(\text{Linear}([Q, K])\big) \cdot V Attention(Q,K,V)=Softmax(Linear([Q,K]))⋅V -
拼接线性变换 + tanh 激活型
在拼接线性变换基础上,增加tanh
激活函数引入非线性,内部求和(sum
对变换后结果维度压缩 )后再用Softmax
归一化,最终与V
融合,公式为:
Attention ( Q , K , V ) = Softmax ( sum ( tanh ( Linear ( [ Q , K ] ) ) ) ) ⋅ V \text{Attention}(Q, K, V) = \text{Softmax}\Big(\text{sum}\big(\tanh\big(\text{Linear}([Q, K])\big)\big)\Big) \cdot V Attention(Q,K,V)=Softmax(sum(tanh(Linear([Q,K]))))⋅V -
点积缩放型(Transformer 常用)
直接计算Q
与K
转置(K^T
)的点积,除以\sqrt{d_k}
(d_k
为K
单个向量维度,缩放避免点积值过大 ),经Softmax
生成权重后与V
相乘,公式为:
Attention ( Q , K , V ) = Softmax ( Q ⋅ K T d k ) ⋅ V \text{Attention}(Q, K, V) = \text{Softmax}\Big(\frac{Q \cdot K^T}{\sqrt{d_k}}\Big) \cdot V Attention(Q,K,V)=Softmax(dkQ⋅KT)⋅V
从通用框架看,软注意可统一描述为:先计算注意力权重
α
i
=
Softmax
(
score
(
Q
,
K
i
)
)
\alpha_i = \text{Softmax}(\text{score}(Q, K_i))
αi=Softmax(score(Q,Ki))(score
为上述各类相似度计算方式 ),再通过
Attention
=
∑
i
=
1
n
α
i
V
i
\text{Attention} = \sum_{i=1}^n \alpha_i V_i
Attention=∑i=1nαiVi 加权融合 V
中信息,实现对输入的动态聚焦。
2.2 硬注意(局部注意)
核心特性:
- 权重分配:生成非 0 即 1 的离散权重(如
[0, 0, 1]
),仅聚焦部分关键输入元素。 - 关注范围:选择性丢弃部分输入信息,只保留权重为 1 对应元素的语义。
- 计算方式:不可微,无法直接通过反向传播优化,通常结合强化学习(如策略梯度 )训练。
两种实现方式:
- 贪心选择:计算输入元素与查询的相似度,直接选取相似度最高(权重最大为 1 )的单个元素,公式可简化为
Attention
=
V
argmax
(
score
(
Q
,
K
i
)
)
\text{Attention} = V_{\text{argmax}(\text{score}(Q, K_i))}
Attention=Vargmax(score(Q,Ki))(
argmax
选取权重最大元素索引 )。 - 随机采样:依据相似度计算的概率分布,随机选取一个元素(权重为 1 ,其余为 0 ),通过引入随机性探索更多可能,公式为
Attention
=
V
i
\text{Attention} = V_i
Attention=Vi(
i
为按概率分布采样的索引 )。
2.3 自注意(内注意)
核心特性:
- 关注范围:聚焦同一序列内部元素间的关系,无需外部查询,
Q
、K
、V
均来自序列自身。 - 核心能力:高效捕获长距离依赖,突破传统循环神经网络(RNN )逐词传递信息的局限。
- 革命性影响:成为 Transformer 架构的核心,推动自然语言处理等领域模型性能大幅提升,其计算常基于上述点积缩放型等规则,公式可复用软注意的点积缩放形式(如 Transformer 中自注意力 ):
Self-Attention ( X , X , X ) = Softmax ( X ⋅ X T d x ) ⋅ X \text{Self-Attention}(X, X, X) = \text{Softmax}\Big(\frac{X \cdot X^T}{\sqrt{d_x}}\Big) \cdot X Self-Attention(X,X,X)=Softmax(dxX⋅XT)⋅X
(符号说明:X
为序列自身的词嵌入矩阵,同时作为Q
、K
、V
,d_x
为X
单个向量维度 ) ,通过这种方式挖掘序列内部复杂的语义关联。
三、软注意案例:机器翻译详解
RNN中的RNN中的基础Encoder-Decoder框架介绍:网页链接
3.1 任务场景
- 输入序列:
["欢迎", "来", "北京"]
- 目标输出:
["Welcome", "to", "Beijing"]
- 模型架构:带注意力机制的Encoder-Decoder(GRU单元)
3.2 编码器处理流程
- 初始状态:
h0
为三维零向量 - 时间步1(输入“欢迎”):
- 词嵌入:
emb("欢迎") = [0.2, 0.5, 0.3]
(维度3,随机初始化示例) - GRU计算:
h1 = GRU(emb("欢迎"), h0)
,输出h1 = [0.6, 0.7, 0.8]
(编码“欢迎”语义)
- 词嵌入:
- 时间步2(输入“来”):
- 词嵌入:
emb("来") = [0.1, 0.4, 0.2]
- GRU计算:
h2 = GRU(emb("来"), h1)
,输出h2 = [0.5, 0.6, 0.7]
(编码“来”语义,融合“欢迎”上下文)
- 词嵌入:
- 时间步3(输入“北京”):
- 词嵌入:
emb("北京") = [0.3, 0.2, 0.9]
- GRU计算:
h3 = GRU(emb("北京"), h2)
,输出h3 = [0.7, 0.8, 0.9]
(编码“北京”语义,融合前两词上下文)
- 词嵌入:
编码器输出隐藏状态序列
H = [h1, h2, h3]
,其中h3
作为解码器初始状态H0
,且V = [h1, h2, h3] = [[0.6,0.7,0.8], [0.5,0.6,0.7], [0.7,0.8,0.9]]
(形状3×3
,作为注意力机制的V
)
3.3 解码器生成“to”时的注意力计算(模型已生成“Welcome”)
编码器部分结构图
解码器部分结构图:
自注意力机制部分结构图:
完整结构图:
注意力组件定义
组件 | 形状 | 意义 |
---|---|---|
Q | 1×3 | 上一步输出“Welcome”的语义张量,代表已生成内容的语义预期 |
K | 1×3 | 解码器上一时间步隐藏状态 H1 (生成“Welcome”后的隐层输出) |
V | 3×3 | 编码器隐藏状态拼接矩阵 [[0.6,0.7,0.8], [0.5,0.6,0.7], [0.7,0.8,0.9]] |
注意力计算步骤(详细推导)
步骤1:Q与K拼接(融合已生成语义与当前查询)
Q
(“Welcome”语义张量):假设为[0.9, 0.8, 0.7]
(模型训练后学习到的首词语义)K
(解码器上一步隐层输出H1
):假设为[0.8, 0.9, 0.9]
(携带“Welcome”生成后的上下文)- 拼接后形状:
[Q; K] = [0.9, 0.8, 0.7, 0.8, 0.9, 0.9]
(1×6
,融合“已生成语义”与“当前查询需求”)
计算意义:
将“Welcome”的语义(Q
)与解码器内部状态(K
)结合,让模型知道“当前需要生成与‘Welcome’衔接的词”,为聚焦“来”做准备。
步骤2:线性变换(提取关键语义特征)
- 线性变换矩阵
W1
:假设为[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]]
(3×6
,模型训练学习的参数) - 偏置
b1
:假设为[0.0, 0.0, 0.0]
(简化演示) - 计算:
score = tanh ( [ Q ; K ] ⋅ W 1 T + b 1 ) \text{score} = \tanh\left( [Q; K] \cdot W1^T + b1 \right) score=tanh([Q;K]⋅W1T+b1)
代入数据:
[ Q ; K ] ⋅ W 1 T = [ 0.9 , 0.8 , 0.7 , 0.8 , 0.9 , 0.9 ] ⋅ [ 0.1 0.4 0.7 0.2 0.5 0.8 0.3 0.6 0.9 0.8 0.9 0.1 0.9 0.2 0.3 0.9 0.3 0.4 ] T [Q; K] \cdot W1^T = [0.9, 0.8, 0.7, 0.8, 0.9, 0.9] \cdot \begin{bmatrix} 0.1 & 0.4 & 0.7 \\ 0.2 & 0.5 & 0.8 \\ 0.3 & 0.6 & 0.9 \\ 0.8 & 0.9 & 0.1 \\ 0.9 & 0.2 & 0.3 \\ 0.9 & 0.3 & 0.4 \end{bmatrix}^T [Q;K]⋅W1T=[0.9,0.8,0.7,0.8,0.9,0.9]⋅ 0.10.20.30.80.90.90.40.50.60.90.20.30.70.80.90.10.30.4 T
(实际计算需按矩阵乘法展开,结果形状1×3
,假设输出[1.2, 0.8, 0.5]
)
经tanh
激活后:score = [tanh(1.2), tanh(0.8), tanh(0.5)] ≈ [0.83, 0.69, 0.46]
计算意义:
通过线性变换学习“Welcome + 隐层状态”到“目标词需求”的映射,突出与“来→to”关联的特征(如动作、介词语义)。
步骤3:Softmax归一化(生成注意力权重)
- 计算:
α = Softmax ( score ) = [ e 0.83 , e 0.69 , e 0.46 ] e 0.83 + e 0.69 + e 0.46 \alpha = \text{Softmax}(\text{score}) = \frac{[e^{0.83}, e^{0.69}, e^{0.46}]}{e^{0.83} + e^{0.69} + e^{0.46}} α=Softmax(score)=e0.83+e0.69+e0.46[e0.83,e0.69,e0.46]
代入指数计算:
e 0.83 ≈ 2.29 , e 0.69 ≈ 1.99 , e 0.46 ≈ 1.58 e^{0.83}≈2.29, \quad e^{0.69}≈1.99, \quad e^{0.46}≈1.58 e0.83≈2.29,e0.69≈1.99,e0.46≈1.58
求和:2.29 + 1.99 + 1.58 = 5.86
归一化后:α ≈ [0.39, 0.34, 0.27]
(实际训练后会调整,使“来”的权重更高,这里简化演示)
计算意义:
将特征分数转化为概率分布,让模型“投票”选择与生成“to”最相关的编码器隐藏状态(理想中“来”的权重应最高)。
步骤4:加权点积(融合编码器语义)
- 计算:
c = α ⋅ V = 0.39 ⋅ [ 0.6 , 0.7 , 0.8 ] + 0.34 ⋅ [ 0.5 , 0.6 , 0.7 ] + 0.27 ⋅ [ 0.7 , 0.8 , 0.9 ] c = \alpha \cdot V = 0.39 \cdot [0.6,0.7,0.8] + 0.34 \cdot [0.5,0.6,0.7] + 0.27 \cdot [0.7,0.8,0.9] c=α⋅V=0.39⋅[0.6,0.7,0.8]+0.34⋅[0.5,0.6,0.7]+0.27⋅[0.7,0.8,0.9]
展开计算:
c 1 = 0.39 × 0.6 + 0.34 × 0.5 + 0.27 × 0.7 ≈ 0.23 + 0.17 + 0.19 = 0.59 c 2 = 0.39 × 0.7 + 0.34 × 0.6 + 0.27 × 0.8 ≈ 0.27 + 0.20 + 0.22 = 0.69 c 3 = 0.39 × 0.8 + 0.34 × 0.7 + 0.27 × 0.9 ≈ 0.31 + 0.24 + 0.24 = 0.79 c_1 = 0.39×0.6 + 0.34×0.5 + 0.27×0.7 ≈ 0.23 + 0.17 + 0.19 = 0.59 \\ c_2 = 0.39×0.7 + 0.34×0.6 + 0.27×0.8 ≈ 0.27 + 0.20 + 0.22 = 0.69 \\ c_3 = 0.39×0.8 + 0.34×0.7 + 0.27×0.9 ≈ 0.31 + 0.24 + 0.24 = 0.79 \\ c1=0.39×0.6+0.34×0.5+0.27×0.7≈0.23+0.17+0.19=0.59c2=0.39×0.7+0.34×0.6+0.27×0.8≈0.27+0.20+0.22=0.69c3=0.39×0.8+0.34×0.7+0.27×0.9≈0.31+0.24+0.24=0.79
结果:c ≈ [0.59, 0.69, 0.79]
(形状1×3
,融合编码器语义,突出“来”的关联)
计算意义:
根据注意力权重,强化与“to”关联的编码器状态(如“来”的 h2
),让解码器知道“当前应聚焦‘来’的动作语义”。
步骤5:二次线性变换(适配GRU输入)
- 线性变换矩阵
W2
:假设为[[0.2, 0.3, 0.4], [0.5, 0.6, 0.7], [0.8, 0.9, 0.1]]
(3×3
,模型训练学习的参数) - 偏置
b2
:假设为[0.0, 0.0, 0.0]
(简化演示) - 计算:
attn = c ⋅ W 2 T + b 2 = [ 0.59 , 0.69 , 0.79 ] ⋅ [ 0.2 0.5 0.8 0.3 0.6 0.9 0.4 0.7 0.1 ] T \text{attn} = c \cdot W2^T + b2 = [0.59, 0.69, 0.79] \cdot \begin{bmatrix} 0.2 & 0.5 & 0.8 \\ 0.3 & 0.6 & 0.9 \\ 0.4 & 0.7 & 0.1 \end{bmatrix}^T attn=c⋅W2T+b2=[0.59,0.69,0.79]⋅ 0.20.30.40.50.60.70.80.90.1 T
(实际计算后形状1×3
,假设输出[0.6, 0.7, 0.8]
)
计算意义:
将融合后的语义向量 c
转换为解码器GRU可处理的格式,确保输入维度匹配。
步骤6:GRU生成“to”
- GRU输入:
[attn; K] = [0.6, 0.7, 0.8, 0.8, 0.9, 0.9]
(1×6
,融合注意力语义与解码器隐层状态) - GRU计算:
H2 = GRU([attn; K], H1)
,输出新隐藏状态H2
(融合“Welcome + 来”的语义) - 全连接层+Softmax:生成词概率分布,“to”的概率最高(因注意力强化了“来”的动作语义,匹配“to”的介词功能)
计算意义:
通过GRU门控机制,选择性保留“来”的动作信息,抑制无关特征(如“北京”的地点细节),最终精准生成“to”。
3.4 注意力权重动态变化(训练后理想状态)
目标词 | “欢迎”权重 | “来”权重 | “北京”权重 | 语义关联说明 |
---|---|---|---|---|
Welcome | 0.7 | 0.2 | 0.1 | 聚焦“欢迎”的情感语义,完成首词对齐 |
to | 0.1 | 0.6 | 0.3 | 聚焦“来”的动作属性,建立“Welcome to”搭配 |
Beijing | 0.1 | 0.1 | 0.8 | 聚焦“北京”实体特征,准备地点翻译 |
3.5 关键逻辑说明
-
“Welcome”的生成逻辑:
- 编码器
h3
(北京)作为解码器初始状态,结合<GO>
标记 - 注意力机制通过权重(如“欢迎”权重0.7)聚焦首词,实现“欢迎→Welcome”语义对齐
- 编码器
-
“to”的生成逻辑:
- 注意力权重(如“来”权重0.6)聚焦动作词,捕捉“Welcome to”的固定搭配
- 线性变换强化“来”的动作特征,使GRU生成方向介词“to”
四、硬注意案例:"欢迎到北京"的简化应用
4.1 任务假设
- 输入:假设“欢迎来北京”对应图像的三个区域特征(“欢迎”区域、"来"区域、"北京"区域)
- 输出:生成关键词“北京”(仅演示硬注意逻辑,实际翻译需软注意配合)
4.2 硬注意工作流程
- 重要性评分:计算各区域特征对生成“北京”的得分(如“北京”区域得分
0.9
,其他区域0.1
) - 单一选择:通过
argmax
选择得分最高的“北京”区域特征 - 信息丢弃:完全忽略“欢迎”和“来”的特征
4.3 关键特点
- 权重特性:仅“北京”区域权重为1,其他为0
- 计算优势:无需加权求和,直接取用单一特征
- 应用局限:无法捕捉“欢迎来北京”的完整语义链,仅适用于简单实体识别
五、自注意案例:"欢迎来北京"的语义关联(适配任务逻辑,略调整)
5.1 任务场景
输入文本:“欢迎来北京”,理解“来”与“北京”的语义关联,辅助翻译时“来→to”“北京→Beijing”的精准映射
5.2 自注意计算要点
-
生成QKV:
Q
、K
、V
均来自文本的词嵌入向量(假设维度为3
,经模型训练学习得到),例如:Q_来
:“来”的词嵌入向量,承载“动作趋向”语义,如[0.3, 0.6, 0.2]
K_北京
:“北京”的词嵌入向量,承载“地点实体”语义,如[0.2, 0.1, 0.7]
V
:整个输入序列的词嵌入矩阵(含“欢迎”“来”“北京”),形状3×3
,这里聚焦“来”与“北京”的交互,取对应向量参与计算
-
相似度计算:
计算“来”与“北京”的语义相似度(以点积为例):
score ( " 来 " , " 北京 " ) = Q 来 ⋅ K 北京 = 0.3 × 0.2 + 0.6 × 0.1 + 0.2 × 0.7 = 0.32 \text{score}("来", "北京") = Q_{\text{来}} \cdot K_{\text{北京}} = 0.3×0.2 + 0.6×0.1 + 0.2×0.7 = 0.32 score("来","北京")=Q来⋅K北京=0.3×0.2+0.6×0.1+0.2×0.7=0.32
对比“来”与“欢迎”的相似度(假设为0.2
),可见“来”与“北京”语义关联更紧密。 -
权重分配:
将“来”与序列中各词(“欢迎”“来”“北京” )的相似度经 Softmax 归一化,生成注意力权重。因“来”与“北京”得分最高,“北京”的权重会突出(如0.6
),表明二者强关联。
5.3 关键价值
- 长距离依赖捕获:直接建立“来”(第2词)与“北京”(第3词)的语义连接,突破传统 RNN 需逐词传递信息的局限,清晰捕捉“动作趋向 + 地点”的搭配逻辑
- 翻译连贯性提升:让模型学习到“来”的动作语义需关联“北京”的地点语义,翻译时能更精准生成“Welcome to Beijing” ,强化“来→to”“北京→Beijing”的对应关系,避免语义断裂
- 语法模式学习:辅助模型掌握中文里“动词 + 地点”(如来北京)到英文“介词 + 地点”(to Beijing )的语法转换规律,提升翻译质量
六、总结:注意力机制的核心价值
6.1 三类注意力的本质差异
类型 | 核心操作 | "欢迎到北京"案例表现 |
---|---|---|
软注意 | 加权融合全部输入 | 生成 “to” 时聚焦“到”(权重 0.6 ),同时保留“欢迎”和“北京”的语义信息 |
硬注意 | 单选最高权重元素 | 仅选择“北京”特征,丢失“欢迎到”的语义链条,导致翻译不连贯 |
自注意 | 计算序列内部元素关联 | 建立“到”与“北京”的位置依赖,辅助生成“to Beijing”的正确语序 |
6.2 工程实践意义
-
信息处理范式:
- 软注意:动态分配资源,通过权重系数平衡信息保留与聚焦,适用于需要完整语义的翻译任务(如BLEU分数提升3-5分)。
- 硬注意:极端轻量化,牺牲信息完整性换取效率,适用于实时场景(如移动端翻译APP)。
- 自注意:打破序列长度限制,通过全局关联建模长距离依赖,是Transformer架构的基石。
-
翻译任务映射:
- 软注意:解决“欢迎→Welcome”的语义对齐,通过加权融合避免直译错误。
- 自注意:强化“到→to”与“北京→Beijing”的语法关联,提升语序准确性。
- 硬注意:可用于快速定位地名实体(如“北京”),但需与软注意结合使用以保证语义完整。