自注意力机制:今天真正弄懂
先记住:一句话定义 + 一句记忆口诀
一句话定义:自注意力机制,就是让一段序列里的每个位置,去“查看”同一段序列里的所有位置,然后按重要程度加权汇总信息。
记忆口诀: “Q 去找 K,分数当权重,最后加权 V。”
生活类比: 你在开会。 每个人都要写一份会议纪要。 写的时候,他不会只看自己说了什么。 他会看所有人说了什么。 谁的话和自己的任务更相关,就多参考谁。 谁不相关,就少参考谁。
在自注意力里: 每个 token、每一帧音频、每一段视频片段,都像会议中的一个人。 它会问: “我应该重点看谁?” 然后把别人的信息按权重合成自己的新表示。
必要公式:
Self-Attention 的核心公式是:
\[ Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V \]
逐个解释符号:
1. \(X\) 输入序列。 可以是一句话的 token 向量。 也可以是一段音频的帧特征。 也可以是一段视频的帧/片段特征。 形状常见为:
\[ X \in \mathbb{R}^{T \times d} \]
其中: - \(T\):序列长度,比如 token 数、音频帧数、视频片段数 - \(d\):每个位置的特征维度
2. \(Q\)、\(K\)、\(V\) 它们都由输入 \(X\) 线性变换得到:
\[ Q=XW_Q \]
\[ K=XW_K \]
\[ V=XW_V \]
其中: - \(Q\):Query,查询。表示“我想找什么信息” - \(K\):Key,键。表示“我有什么特征可被别人匹配” - \(V\):Value,值。表示“如果别人关注我,我实际贡献什么内容” - \(W_Q, W_K, W_V\):可学习的参数矩阵
一个直觉: Q 像搜索词。 K 像文档标签。 V 像文档正文。
3. \(QK^T\) 这是在算相似度。 每个位置的 Q,和所有位置的 K 做点积。 点积越大,说明越相关。
如果序列长度是 \(T\),那么:
\[ QK^T \in \mathbb{R}^{T \times T} \]
这就是注意力分数矩阵。 第 \(i\) 行表示: 第 \(i\) 个位置在看所有位置时,各自有多重要。
4. \(\sqrt{d_k}\) 这是缩放因子。 \(d_k\) 是 Key/Query 的维度。 如果不除以 \(\sqrt{d_k}\),点积可能太大。 softmax 会变得太尖。 模型训练会不稳定。
5. \(softmax\) 把分数变成权重。 每一行的权重加起来等于 1。 可以理解为: “我把注意力预算分给所有位置。”
6. 最后乘以 \(V\) 得到加权求和后的新表示。 也就是: 每个位置根据自己关注的对象,重新整理了一份信息。
它解决什么问题:
自注意力解决的是: “序列中不同位置之间,如何直接建立关系。”
比如一句话: “他说他今天不能来。” 第二个“他”指谁? 要看前文。
比如音频: 当前一帧到底是说话声、背景声、音乐,还是重叠说话? 不能只看当前帧。 要看前后上下文。
比如说话人日志 diarization: 某一段声音属于说话人 A 还是 B。 不能只看这一小段。 还要看更早、更晚的片段。 因为同一个说话人的声音特征会在时间上反复出现。
没有自注意力会怎样:
没有它也能做序列建模。 但会麻烦一些。
以前常用 RNN/LSTM。 它按时间一步一步读。 远距离信息要经过很多步传递。 长序列时容易变弱。 并行也不方便。
也常用 CNN。 它看局部窗口。 想看远处,要堆很多层。 或者加大卷积感受野。 但“谁和谁相关”不是显式算出来的。
自注意力的关键好处是: 任意两个位置可以一步建立联系。 而且可以并行计算。
在音视频理解里,这很重要。 因为视频事件、说话人变化、语音上下文,经常跨越较长时间。
自注意力的一句话定义是什么?
Q、K、V 分别负责什么?
标准自注意力在长音视频上的主要问题是什么?
发展流程:
- 之前怎么做
早期序列模型常用 RNN、LSTM、GRU。 它们像逐字读书。 从左到右读。 读到后面时,前面的信息要靠隐藏状态带过来。
优点: 适合时间顺序。 结构直观。
问题: 长距离依赖难。 训练并行度低。 长音频、长视频很吃力。
后来 CNN 也大量用于序列。 比如语音里的 1D 卷积。 视频里的 2D/3D 卷积。
优点: 并行好。 局部模式强。
问题: 天然更偏局部。 远距离关系要靠堆层数。
- 为什么出现自注意力
核心原因: 模型需要直接判断“序列里谁和谁相关”。
机器翻译中,一个词可能要对齐到很远的词。 语音识别中,一个音素判断可能依赖上下文。 说话人日志中,一个片段的身份可能依赖整段录音中的其他相似片段。
自注意力把这件事显式化了: 每个位置都和所有位置算相关性。 相关性再变成权重。 最后汇总信息。
- 现在怎么用
现在的 Transformer 基本都以自注意力为核心模块。 常见结构是:
输入特征 → 位置编码 → 自注意力层 → 前馈网络 → 残差连接和归一化 → 堆叠多层
在主流模型中的实际位置与用法:
1. 文本模型 token embedding 后面接 Transformer 层。 自注意力负责让词和词互相看见。
2. 音频理解 先把波形变成帧级特征。 比如 log-mel 特征,或者由卷积前端提取特征。 然后送入 Transformer/Conformer。 自注意力负责建模长时间上下文。
在语音识别中: 它帮助当前音频帧利用前后发音信息。
在音频事件检测中: 它帮助模型判断某个声音事件和远处片段是否相关。
3. 视频理解 视频被切成帧、patch 或 clip。 每个单位变成一个向量。 自注意力在时间维度、空间维度,或时空联合维度上计算关系。
它可以回答: 当前动作片段应该参考哪些帧? 画面中哪个区域和当前事件有关?
4. 说话人日志 diarization 典型流程可能是: 音频切片 → 提取帧级或段级声学特征 → 建模时间上下文 → 判断每个时间点谁在说话
自注意力可能出现在: - 帧级编码器里,用来整合前后语音上下文 - 段级 embedding 建模里,用来比较不同时段是否像同一说话人 - 重叠说话检测里,用来利用更长范围的信息 - EEND 类端到端 diarization 模型中,用来直接建模整段录音中各时间帧之间的关系
注意: 自注意力不是“说话人日志的全部”。 它只是其中一种强大的上下文建模工具。 还需要特征提取、说话人表示、聚类或端到端分类、后处理等模块。
与相近概念的区别:
- 自注意力 vs 注意力
注意力是大概念。 意思是:根据相关性,对信息加权汇总。
自注意力是注意力的一种。 特点是:Q、K、V 都来自同一个序列。
如果 Q 来自解码器,K/V 来自编码器,那通常叫交叉注意力。
- 自注意力 vs 交叉注意力
自注意力: 自己看自己。 一段音频内部各帧互相看。 一句话内部各词互相看。
交叉注意力: 一个序列看另一个序列。 比如文本查询去看视频帧。 或者解码器生成词时去看编码器输出。
- 自注意力 vs CNN
CNN 看局部邻域。 它擅长抓局部模式。 比如短时谱图纹理、局部运动。
自注意力可以全局看。 它擅长动态决定远近位置的重要性。
但 CNN 通常计算更省。 自注意力在长序列上更贵。
- 自注意力 vs RNN
RNN 顺序读。 有天然时间方向。 但并行差。
自注意力一次看全体。 并行好。 但它本身不知道顺序。 所以需要位置编码告诉模型顺序。
- 自注意力 vs 多头注意力
自注意力说的是“自己看自己”。 多头注意力说的是“用多组 Q/K/V 从不同角度看”。
多头注意力通常是在自注意力上做增强。 比如一个头关注短距离关系。 另一个头关注远距离相似片段。
当前局限:
事实部分:
1. 长序列计算贵 标准自注意力要计算 \(T \times T\) 的注意力矩阵。 复杂度大约是:
\[ O(T^2) \]
音频和视频序列很长。 几分钟音频可能有上千甚至更多帧。 长视频更明显。 所以标准自注意力会吃显存、吃算力。
2. 需要位置编码 自注意力本身只看集合关系。 如果不加位置信息,它不知道谁在前谁在后。 对语音和视频这类时间信号,顺序非常重要。
3. 注意力权重不等于完整解释 很多人会看 attention map 来解释模型。 但注意力权重只能提供线索。 不能简单说“权重大就一定是模型真正原因”。
4. 数据和训练很重要 自注意力表达能力强。 但如果数据少、标注噪声大、训练设置不好,也会过拟合或学不到稳定关系。
未来可能作用:
以下是推测,不是已确定事实:
1. 更高效的长音视频建模 未来可能有更多高效注意力结构,用更低成本处理小时级音频和长视频。
2. 更强的多模态对齐 自注意力和交叉注意力可能继续帮助音频、视频、文本之间建立细粒度对应。 比如“这个词对应哪段声音和哪个画面动作”。
3. 更自然的说话人状态建模 在 diarization 中,未来模型可能更好地同时建模: 谁在说话、是否重叠、情绪状态、声学环境变化。
4. 与记忆机制结合 长会议、长播客、长视频中,模型可能需要外部记忆。 自注意力可能成为读取和更新记忆的一部分。
学习资料怎么用:
The Illustrated Transformer: 适合先看图。 用它建立 Q、K、V 的直觉。 尤其适合第一次理解“为什么要用三个向量”。
The Annotated Transformer: 适合在有直觉之后看。 它用可运行代码拆解 Transformer。 可以对照实现 scaled dot-product attention。
- 1. 用一句话解释 Q、K、V 分别像什么?
- 2. 为什么 \(QK^T\) 后面要除以 \(\sqrt{d_k}\)?
- 3. 在说话人日志中,自注意力为什么可能比只看局部窗口更有用?