注意力机制是深度学习中的一个基本概念,它使模型能够选择性地关注输入数据的相关部分,就像人类在复杂环境中集中注意力一样。本页涵盖了 d2l-ai 库中注意力机制的关键组成部分、架构和应用,作为理解注意力如何在深度学习任务中实现和使用的入口。
有关 Transformer 等特定实现的更多信息,请参阅 Transformer。
注意力机制解决了序列处理中的一个核心挑战:如何在生成输出时有效处理可变长度的输入并关注输入中最相关的部分。基本思想是根据输入序列不同部分与特定上下文的相关性,为它们分配不同的权重。
来源
注意力机制包含三个主要组成部分:
注意力机制通过将查询与所有键进行比较来计算权重,然后使用这些权重创建值的加权和。
来源
注意力评分函数计算查询和一组键之间的兼容性分数。两个流行的评分函数是:
加性注意力:使用小型神经网络计算兼容性
缩放点积注意力:使用带缩放的点积以提高稳定性
来源
Nadaraya-Watson核回归是一个简单而完整的例子,演示了机器学习中的注意力机制。它将输出计算为值的加权平均,其中权重取决于查询和键之间的相似性。
来源
Bahdanau 注意力,也称为加性注意力,是机器翻译领域的一项突破。它通过允许解码器在每个解码步骤中关注输入序列的不同部分,解决了编码器-解码器架构中固定长度上下文向量的局限性。
来源
自注意力允许序列中的 token 相互关注,使模型能够捕获任意距离的依赖关系。由于自注意力是排列不变的,因此添加了位置编码来注入位置信息。
来源
多头注意力将基本注意力机制扩展到通过具有不同学习投影的注意力并行应用多次。这使得模型能够联合关注来自不同表示子空间的信息。
来源
Transformer 是一种革命性的架构,完全依赖于注意力机制,消除了对循环或卷积层的需求。它已经改变了包括自然语言处理、计算机视觉和语音识别在内的领域。
来源
Transformer 的输入中的每个位置都由相同的前馈网络处理,该网络由两个线性变换和一个 ReLU 激活组成。
来源
d2l-ai 代码库中的注意力机制实现遵循模块化设计,允许轻松组合不同的注意力组件。
| 组件 | 类 | 关键方法 | 描述 |
|---|---|---|---|
| 注意力评分 | DotProductAttention | forward | 实现缩放点积注意力 |
AdditiveAttention | forward | 实现加性注意力 | |
| 多头注意力 | MultiHeadAttention | forward | 实现并行注意力头 |
| 位置编码 | PositionalEncoding | forward | 向嵌入添加位置信息 |
| Transformer Encoder | TransformerEncoder | forward | 实现完整的编码器堆栈 |
| Transformer Decoder | TransformerDecoder | forward | 实现完整的解码器堆栈 |
| Bahdanau 注意力解码器 | Seq2SeqAttentionDecoder | forward, init_state | 为 seq2seq 实现 Bahdanau 注意力 |
来源
与传统的序列模型相比,注意力机制,特别是自注意力,具有一些优势。
| 架构 | 计算复杂度 | 顺序操作 | 最大路径长度 |
|---|---|---|---|
| CNN (核宽度 k) | O(knd²) | O(1) | O(n/k) |
| RNN | O(nd²) | O(n) | O(n) |
| 自注意力 | O(n²d) | O(1) | O(1) |
自注意力在任意两个位置之间的最大路径长度最短,这使得学习长距离依赖关系更容易,尽管代价是序列长度的二次方复杂度。
来源
注意力机制的一个关键优势是其可解释性。注意力权重可以可视化,以了解模型在进行预测时关注输入的哪些部分。
来源
注意力机制通过允许模型选择性地关注输入的相关部分,彻底改变了深度学习。它们构成了 Transformer 等现代架构的基础,Transformer 在多个领域取得了最先进的结果。
注意力机制的关键优势包括:
不同类型的注意力(加性、点积、多头、自注意力)为解决深度学习中的各种序列建模挑战提供了灵活的工具集。