深度学习笔记:注意力评分机制
学习目标:通过本笔记,你将深入理解注意力机制的核心——注意力评分函数,掌握其数学原理、实现方法和工程技巧。
目录
- 动机与直觉
- 数学基础
- 优化算法
- 工程实现
- 批判性思维
- 总结与拓展
1. 动机与直觉
1.1 从现实问题出发
想象你正在阅读一篇长文章,寻找特定信息。你不会逐字逐句地平等对待每个词,而是:
- 快速扫描,寻找关键词
- 在相关段落上集中注意力
- 忽略不相关的内容
这就是注意力机制的核心思想:选择性地关注最相关的信息。
1.2 实际应用场景
场景1:机器翻译
中文输入: "我 爱 深度 学习" 英文输出: "I love deep learning" 问题:翻译"love"时,模型应该重点关注哪个中文词? 答案:应该重点关注"爱",而不是平等对待所有词传统Seq2Seq的问题:
编码器: [x1, x2, x3, ..., xn] → 固定向量 c (信息瓶颈!) 解码器: c → [y1, y2, y3, ..., ym]无论输入多长,都压缩到一个固定维度向量,导致:
- ❌信息丢失:长序列信息无法完全保留
- ❌远距离依赖弱:序列开头的信息在解码末尾时已经淡化
- ❌无法突出重点:所有位置被平等对待
场景2:文档问答系统
文档: "人工智能(AI)是计算机科学的一个分支。深度学习是AI的子领域。 神经网络是深度学习的基础。卷积神经网络特别适合图像处理。" 问题: "什么适合图像处理?" 期望行为: - 模型应该重点关注"卷积神经网络特别适合图像处理"这句话 - 其他句子的权重应该较低场景3:图像字幕生成
图像: [一只猫坐在沙发上] 生成字幕的过程: - 生成"a" → 关注整体场景 - 生成"cat" → 重点关注猫的区域 (高注意力) - 生成"sitting" → 关注猫的姿势 - 生成"on" → 关注空间关系 - 生成"sofa" → 重点关注沙发区域 (高注意力)1.3 注意力机制的核心思想
类比:查询数据库
# 传统方法:取平均deftraditional_retrieval(query,database):returnaverage(database)# 所有信息平等对待# 注意力机制:加权检索defattention_retrieval(query,database):scores=compute_relevance(query,database)# 计算相关性weights=normalize(scores)# 归一化为概率returnweighted_sum(weights,database)# 加权求和数学表达:
记忆库 = [(key₁, value₁), (key₂, value₂), ..., (keyₙ, valueₙ)] 查询 = query 步骤1: 计算相关性分数 score_i = relevance(query, key_i) 步骤2: 归一化为权重 weight_i = softmax(score_i) 步骤3: 加权聚合 output = Σ weight_i × value_i1.4 为什么这样设计有意义?
- 动态上下文表示:每个输出位置可以有不同的上下文表示
- 可解释性:注意力权重可以可视化,理解模型关注什么
- 灵活性:适用于各种序列长度,不受固定向量限制
- 效果显著:在机器翻译、文本生成等任务上大幅提升性能
2. 数学基础
2.1 注意力机制的数学框架
注意力机制的核心是一个加权求和过程:
Attention ( q , K , V ) = ∑ i = 1 n α i v i \text{Attention}(\mathbf{q}, \mathbf{K}, \mathbf{V}) = \sum_{i=1}^{n} \alpha_i \mathbf{v}_iAttention(q,K,V)=i=1∑nαivi
符号定义:
- q ∈ R d q \mathbf{q} \in \mathbb{R}^{d_q}q∈Rdq:查询向量(Query),代表"我想要什么信息"
- K = [ k 1 , k 2 , . . . , k n ] ∈ R n × d k \mathbf{K} = [\mathbf{k}_1, \mathbf{k}_2, ..., \mathbf{k}_n] \in \mathbb{R}^{n \times d_k}K=[k1,k2,...,kn]∈Rn×dk:键矩阵(Keys),代表"记忆库的索引"
- V = [ v 1 , v 2 , . . . , v n ] ∈ R n × d v \mathbf{V} = [\mathbf{v}_1, \mathbf{v}_2, ..., \mathbf{v}_n] \in \mathbb{R}^{n \times d_v}V=[v1,v2,...,vn]∈Rn×dv:值矩阵(Values),代表"记忆库的内容"
- α i ∈ [ 0 , 1 ] \alpha_i \in [0, 1]αi∈[0,1]:注意力权重,满足∑ i = 1 n α i = 1 \sum_{i=1}^{n} \alpha_i = 1∑i=1nαi=1
计算流程:
输入: Query q, Keys K, Values V 步骤1: 计算相关性分数 e_i = score(q, k_i) ← 这是本笔记的核心! 步骤2: Softmax归一化 α_i = exp(e_i) / Σⱼ exp(e_j) 步骤3: 加权求和 output = Σᵢ α_i × v_i2.2 注意力评分函数详解
注意力评分函数score ( q , k i ) \text{score}(\mathbf{q}, \mathbf{k}_i)score(q,ki)衡量查询q \mathbf{q}q与键k i \mathbf{k}_iki的相关性。
不同的评分函数有不同的性质和应用场景。
2.2.1 加性注意力 (Additive Attention)
别名:Bahdanau Attention
数学表达:
score ( q , k i ) = v T tanh ( W q q + W k k i ) \text{score}(\mathbf{q}, \mathbf{k}_i) = \mathbf{v}^T \tanh(\mathbf{W}_q \mathbf{q} + \mathbf{W}_k \mathbf{k}_i)score(q,ki)=vTtanh(Wqq+Wkki)
参数:
- W q ∈ R h × d q \mathbf{W}_q \in \mathbb{R}^{h \times d_q}Wq∈Rh×dq:查询投影矩阵
- W k ∈ R h × d k \mathbf{W}_k \in \mathbb{R}^{h \times d_k}Wk∈Rh×dk:键投影矩阵
- v ∈ R h \mathbf{v} \in \mathbb{R}^{h}v∈Rh:注意力向量
- h hh:隐藏层维度
推导过程:
目标:学习一个函数来衡量q \mathbf{q}q和k i \mathbf{k}_iki的匹配程度
步骤1:线性变换到同一空间
由于q \mathbf{q}q和k i \mathbf{k}_iki可能来自不同的表示空间(维度可能不同),我们首先将它们投影到相同的隐藏空间:
h q = W q q ∈ R h \mathbf{h}_q = \mathbf{W}_q \mathbf{q} \in \mathbb{R}^hhq=Wqq∈Rh
h k = W k k i ∈ R h \mathbf{h}_k = \mathbf{W}_k \mathbf{k}_i \in \mathbb{R}^hhk=Wkki∈Rh
步骤2:加性组合
在隐藏空间中,我们将两个向量相加(这是"加性"的由来):
h = h q + h k = W q q + W k k i \mathbf{h} = \mathbf{h}_q + \mathbf{h}_k = \mathbf{W}_q \mathbf{q} + \mathbf{W}_k \mathbf{k}_ih=hq+hk=Wqq+Wkki
步骤3:非线性激活
使用tanh \tanhtanh激活函数引入非线性,使模型能捕捉复杂的相关性模式:
h ′ = tanh ( h ) = tanh ( W q q + W k k i ) \mathbf{h}' = \tanh(\mathbf{h}) = \tanh(\mathbf{W}_q \mathbf{q} + \mathbf{W}_k \mathbf{k}_i)h′=tanh(h)=tanh(Wqq+Wkki)
tanh \tanhtanh的作用:
- 将值压缩到( − 1 , 1 ) (-1, 1)(−1,1)区间
- 引入非线性,增强表达能力
- 梯度性质好(相比sigmoid)
步骤4:降维到标量
使用可学习的向量v \mathbf{v}v将隐藏表示映射到一个标量分数:
e i = v T h ′ = v T tanh ( W q q + W k k i ) e_i = \mathbf{v}^T \mathbf{h}' = \mathbf{v}^T \tanh(\mathbf{W}_q \mathbf{q} + \mathbf{W}_k \mathbf{k}_i)ei=vTh′=vTtanh(Wqq+Wkki)
特点分析:
| 特性 | 描述 |
|---|---|
| ✅表达能力强 | 通过非线性变换,能捕捉复杂的匹配模式 |
| ✅灵活性高 | 可以处理不同维度的q \mathbf{q}q和k \mathbf{k}k |
| ❌计算成本高 | 需要两次矩阵乘法和一次非线性激活 |
| ❌参数量大 | O ( d q ⋅ h + d k ⋅ h + h ) O(d_q \cdot h + d_k \cdot h + h)O(dq⋅h+dk⋅h+h) |
| ❌并行化难 | 加法操作一定程度上限制并行 |
应用场景:
- 原始的编码器-解码器注意力(Bahdanau et al., 2015)
- 当d q ≠ d k d_q \neq d_kdq=dk时必须使用
- 需要强表达能力的任务
数值示例:
# 假设参数d_q=256# 查询维度d_k=512# 键维度h=128# 隐藏维度# 计算一个样本q=[0.5,0.3,...,0.1]# 256维k=[0.2,0.7,...,0.4]# 512维# 步骤1: 投影h_q=W_q @ q# 128维h_k=W_k @ k# 128维# 步骤2-3: 加法和激活h=tanh(h_q+h_k)# 128维# 步骤4: 得分score=v.T @ h# 标量2.2.2 点积注意力 (Dot-Product Attention)
数学表达:
score ( q , k i ) = q T k i \text{score}(\mathbf{q}, \mathbf{k}_i) = \mathbf{q}^T \mathbf{k}_iscore(q,ki)=qTki
矩阵形式:
对于多个查询,可以高效地批量计算:
E = Q K T ∈ R n q × n k \mathbf{E} = \mathbf{Q}\mathbf{K}^T \in \mathbb{R}^{n_q \times n_k}E=QKT∈Rnq×nk
其中:
- Q ∈ R n q × d \mathbf{Q} \in \mathbb{R}^{n_q \times d}Q∈Rnq×d:查询矩阵(n q n_qnq个查询)
- K ∈ R n k × d \mathbf{K} \in \mathbb{R}^{n_k \times d}K∈Rnk×d:键矩阵(n k n_knk个键)
- E i j = q i T k j \mathbf{E}_{ij} = \mathbf{q}_i^T \mathbf{k}_jEij=qiTkj:第i ii个查询与第j jj个键的分数
几何解释:
点积衡量两个向量的余弦相似度(当向量归一化时):
q T k = ∥ q ∥ ∥ k ∥ cos ( θ ) \mathbf{q}^T \mathbf{k} = \|\mathbf{q}\| \|\mathbf{k}\| \cos(\theta)qTk=∥q∥∥k∥cos(θ)
- 当两向量方向相同:cos ( θ ) = 1 \cos(\theta) = 1cos(θ)=1,分数最大
- 当两向量正交:cos ( θ ) = 0 \cos(\theta) = 0cos(θ)=0,分数为零
- 当两向量相反:cos ( θ ) = − 1 \cos(\theta) = -1cos(θ)=−1,分数最小
特点分析:
| 特性 | 描述 |
|---|---|
| ✅计算极快 | 只需矩阵乘法,GPU高度优化 |
| ✅无需参数 | 不增加模型参数量 |
| ✅完全并行 | 所有分数可同时计算 |
| ✅内存高效 | 不需要额外的中间变量 |
| ❌维度限制 | 要求d q = d k d_q = d_kdq=dk |
| ❌可能不稳定 | 高维度时分数方差大 |
复杂度分析:
- 时间复杂度:O ( n q ⋅ n k ⋅ d ) O(n_q \cdot n_k \cdot d)O(nq⋅nk⋅d)
- 空间复杂度:O ( n q ⋅ n k ) O(n_q \cdot n_k)O(nq⋅nk)(存储注意力矩阵)
应用场景:
- 自注意力机制(query, key, value来自同一序列)
- 需要高效计算的场景
- 维度相同且不需要强非线性的情况
2.2.3 缩放点积注意力 (Scaled Dot-Product Attention)
数学表达:
score ( q , k i ) = q T k i d k \text{score}(\mathbf{q}, \mathbf{k}_i) = \frac{\mathbf{q}^T \mathbf{k}_i}{\sqrt{d_k}}score(q,ki)=dkqTki
矩阵形式(Transformer标准):
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left(\frac{\mathbf{Q}\mathbf{K}^T}{\sqrt{d_k}}\right)\mathbf{V}Attention(Q,K,V)=softmax(dkQKT)V
为什么需要缩放?理论推导
问题陈述:当维度d k d_kdk很大时,点积的值会变得很大,导致softmax函数进入饱和区,梯度接近零。
数学证明:
假设q \mathbf{q}q和k \mathbf{k}k的每个元素独立同分布,服从标准正态分布:
q i , k i ∼ N ( 0 , 1 ) q_i, k_i \sim \mathcal{N}(0, 1)qi,ki∼N(0,1)
点积定义为:
q T k = ∑ i = 1 d k q i k i \mathbf{q}^T \mathbf{k} = \sum_{i=1}^{d_k} q_i k_iqTk=i=1∑dkqiki
计算期望:
E [ q T k ] = ∑ i = 1 d k E [ q i k i ] = ∑ i = 1 d k E [ q i ] E [ k i ] = 0 \mathbb{E}[\mathbf{q}^T \mathbf{k}] = \sum_{i=1}^{d_k} \mathbb{E}[q_i k_i] = \sum_{i=1}^{d_k} \mathbb{E}[q_i]\mathbb{E}[k_i] = 0E[qTk]=i=1∑dkE[qiki]=i=1∑dkE[qi]E[ki]=0
计算方差:
由于各项独立:
Var [ q T k ] = ∑ i = 1 d k Var [ q i k i ] \text{Var}[\mathbf{q}^T \mathbf{k}] = \sum_{i=1}^{d_k} \text{Var}[q_i k_i]Var[qTk]=i=1∑dkVar[qiki]
对于标准正态分布的乘积:
Var [ q i k i ] = E [ q i 2 k i 2 ] − E [ q i k i ] 2 = E [ q i 2 ] E [ k i 2 ] − 0 = 1 ⋅ 1 = 1 \text{Var}[q_i k_i] = \mathbb{E}[q_i^2 k_i^2] - \mathbb{E}[q_i k_i]^2 = \mathbb{E}[q_i^2]\mathbb{E}[k_i^2] - 0 = 1 \cdot 1 = 1Var[q