AI学习日记——Transformer的核心:自注意力机制
目录
一、自注意力机制的目的
1. 传统模型的困境
在自然语言处理中,我们经常需要处理序列数据。传统方法面临两个核心挑战:
(1)如何考虑上下文信息?
- 比如"I saw a saw"中的两个"saw"含义不同
- 传统全连接网络难以有效捕捉这种上下文依赖
(2)如何处理变长序列?
- 序列长度不确定,传统方法需要固定窗口大小
- 固定窗口无法捕捉长距离依赖关系
2. 自注意力机制的定义
自注意力机制的核心目的是获取整个句子的n个向量信息,在保留每个向量本身信息的同时,捕获它和整个句子中其他所有向量的关系,最终输出n个经过上下文信息增强的新向量。

3. 自注意力机制的优势
全局信息交互:
-
每个位置都能直接访问序列中的所有位置
-
打破传统方法的距离限制
灵活处理变长序列:
-
不需要固定窗口大小
-
自动适应不同长度的输入序列
信息完整性:
-
输出向量既包含自身特征
-
又融入了丰富的上下文关系信息
二、自注意力机制详解
1. 核心计算流程
自注意力机制通过三个关键步骤来处理序列信息:
步骤一:生成Q、K、V向量
输入序列的每个词向量首先通过三个不同的线性变换,生成对应的:
-
查询向量(Query):表示当前词"想要寻找什么"
-
键向量(Key):表示每个词"能提供什么"
-
值向量(Value):表示每个词"实际包含的内容"
Q = aᵢ × W_Q K = aᵢ × W_K V = aᵢ × W_V

就像在图书馆找书:Query是"你想找什么书",Key是"书的索引标签",Value是"书的实际内容",通过Query和Key的匹配找到相关书籍,然后读取Value内容
步骤二:计算注意力权重
对于序列中的每个位置,计算其查询向量Q与所有位置的键向量K的相似度:
-
注意力分数 = Qᵢ · Kⱼ(点积运算)
-
缩放处理:分数 / √dₖ(dₖ是键向量的维度)
-
Softmax归一化:得到注意力权重α

步骤三:加权求和生成输出
用计算得到的注意力权重对值向量进行加权求和:
-
输出向量bᵢ = Σ(αᵢⱼ × Vⱼ)

学习参数只有 W_k , W_q , W_v (多头注意力机制还会有参数W_o)
2. 多头注意力机制
多头注意力通过多个"注意力头"来捕捉不同类型的信息关系,将标准的单组权重矩阵(W_k , W_q , W_v)复制多份,每一份对应一个注意力头,从而允许模型同时关注来自不同表示子空间的信息。
工作原理:
对于第 i 个注意力头:
-
查询权重矩阵:W_Q_i
-
键权重矩阵:W_K_i
-
值权重矩阵:W_V_i
每个头独立地计算注意力:
-
Q_i = X × W_Q_i
-
K_i = X × W_K_i
-
V_i = X × W_V_i

然后计算该头的输出:head_i = Attention(Q_i, K_i, V_i)


每个向量结果的所有头的输出被拼接成一个大的矩阵(图中是bi向量的两个头拼接的结果),然后通过一个可学习的权重矩阵 W_O 进行线性变换,来决定哪个头所保留的信息重要,以融合不同头的信息:
-
多头输出 = Concat(head_1, head_2, ..., head_h) × W_O

其中,h 是头的数量,W_O 的维度是 (h × d_v) × d,d 是输出维度。
多头机制的优势:
-
头1:可能关注语法结构关系
-
头2:可能捕捉语义相似性
-
头3:可能学习指代关系
-
头n:捕获其他特定模式的关系
3. 实际的矩阵乘法实现
在实际计算中,自注意力机制通过矩阵运算高效处理整个序列:
步骤一的矩阵形式:

Q = X × W_Q [n×d] × [d×d_k] = [n×d_k]
其中X是输入序列矩阵,n是序列长度,d是输入维度(词向量个数),d_k和d_v是投影维度。
步骤二的矩阵运算:

每一列代表一个词向量的softmax结果(a11,a12,a13,a14代表着a1向量的结果)
步骤三的矩阵运算:

4. 位置编码
由于自注意力机制本身不包含位置信息,需要通过位置编码注入序列顺序:
输入向量 = 词嵌入向量 + 位置编码向量

位置编码方法:
-
正弦余弦编码(Transformer原版)
-
可学习的位置编码(BERT使用)
-
相对位置编码
三、自注意力机制的应用
1. 在自然语言处理中的应用
序列标注任务(判别一句话中每个词的词性):
-
词性标注:每个词输出一个标签
-
命名实体识别:识别文本中的实体

序列分类任务(判别一句话是积极还是消极):
-
情感分析:整个序列输出一个情感标签
-
文本分类:判断文本类别

序列生成任务(把一句话从中文翻译成英文):
-
机器翻译:序列到序列的转换
-
文本摘要:生成文本摘要

2. 在其他领域的应用
语音处理:
-
挑战:语音序列极长(每10ms一个向量)
-
解决方案:Truncated Self-Attention,只关注局部上下文
图像处理:
-
将图像划分为patch,每个patch作为一个向量
-
组成vector set进行自注意力计算
图神经网络:
-
在图上只计算相连节点之间的attention
-
形成图注意力网络(GAT)
3. 自注意力与CNN、RNN的对比
自注意力 vs CNN:
-
CNN是简化版的Self-Attention,只在小范围内计算注意力
-
Self-Attention具有全局感受野,CNN的感受野受限
-
CNN更适合局部模式,Self-Attention更适合长距离依赖
自注意力 vs RNN:
| 特性 | RNN | Self-Attention |
|---|---|---|
| 并行性 | 顺序处理,难以并行 | 完全并行计算 |
| 长距离依赖 | 容易梯度消失/爆炸 | 直接连接,无距离衰减 |
| 计算复杂度 | O(n) | O(n²) |
| 上下文理解 | 单向或双向有限 | 完全双向全局 |
总结
自注意力机制是一种突破性的序列建模方法,有效解决了传统模型在上下文理解和变长序列处理上的局限。其核心是通过查询(Q)、键(K)、值(V)三组向量计算注意力权重,实现全局信息交互。多头注意力机制进一步扩展了模型捕捉不同关系模式的能力。相比CNN和RNN,自注意力具有并行计算、全局感受野等优势,已成功应用于NLP、语音、图像等领域,成为Transformer等现代深度学习架构的基础组件。
更多推荐


所有评论(0)