动手学深度学习——注意力机制

张开发
2026/4/19 23:31:06 15 分钟阅读

分享文章

动手学深度学习——注意力机制
1. 前言前面我们已经把这条线走到了Seq2Seq和束搜索编码器先读入整个输入序列解码器再一步步生成输出序列束搜索帮助我们在生成阶段找到更好的候选句子但在基础 Seq2Seq 里还存在一个非常关键的问题编码器要把整个输入序列压缩成一个固定长度的上下文向量。如果输入句子很短这样做也许还可以。但如果句子变长问题就会越来越明显重要信息容易丢失长距离依赖更难保留解码器无论生成第几个词看到的都是同一个固定摘要这显然不够灵活。于是一个极其重要的思想出现了注意力机制Attention它的核心目标非常直观不要让解码器只盯着一个固定摘要而是让它在每一步生成时都能动态地去看输入序列中更相关的部分。这一步几乎可以说是现代序列建模和 Transformer 时代真正到来的关键转折点。2. 为什么基础 Seq2Seq 不够先回忆一下最基础的 Seq2Seq。编码器读完整个输入句子后通常会把最终状态作为整个源句子的语义摘要然后解码器拿着这个摘要去生成目标句子。问题在于2.1 所有信息被压到一个固定向量里这就像让你读完一整篇文章只准用一句话概括全部内容然后再根据这句话去完整复述文章。显然会很难。2.2 不同目标词需要关注的源信息不同翻译时生成不同目标词关注的源句位置往往不一样。例如翻译一句英文时生成主语时可能更关注源句开头生成动词时可能更关注中间生成宾语时可能更关注后半句但基础 Seq2Seq 中解码器每一步拿到的上下文都一样这就不够合理。2.3 长句更容易出问题句子越长固定长度上下文越容易装不下全部关键信息。所以我们很自然会问能不能让解码器在每一步生成时都重新决定“现在该看输入的哪里”这就是注意力机制的动机。3. 什么是注意力机制注意力机制可以简单理解为在处理当前任务时不平均对待所有输入信息而是有选择地关注更相关的部分。这个思想其实非常符合人类直觉。例如你在读一句话时如果被问到某个词是什么意思你的目光通常会自动去看它附近的上下文而不是平均看整句每一个词。所以注意力机制本质上是在做按相关性分配关注权重也就是说不同输入位置的重要程度可以不同。4. 注意力机制在 Seq2Seq 里是怎么用的放到机器翻译场景中注意力机制的意思是解码器在生成第t个目标词时不再只依赖一个固定上下文向量而是去参考编码器在所有时间步上的输出并根据当前需要给它们分配不同权重。这句话非常重要。也就是说编码器不只输出最后一个状态它会保留所有时间步的隐藏状态解码器每一步都可以“回头看”这些编码结果然后决定当前最该看哪几个位置于是解码器每一步拿到的上下文就不再相同而是动态变化的上下文向量这就是注意力机制在 Seq2Seq 中最核心的作用。5. 为什么叫“注意力”因为这个机制真的很像“注意”这件事。假设源句子是i love deep learning当解码器在生成“我”时可能更应该关注i当生成“喜欢”时可能更应该关注love当生成“深度学习”时可能更应该关注deep learning也就是说生成不同目标词时模型“目光聚焦”的源句部分会不同。这和人类翻译时的直觉非常一致。所以“注意力”这个名字非常贴切。6. 注意力机制解决的核心问题是什么如果只抓一个核心问题那就是让解码器摆脱对单个固定上下文向量的过度依赖。具体来说它解决了6.1 长句信息瓶颈不再要求把所有信息硬塞进一个固定长度向量里。6.2 解码不同步的问题不同时间步可以关注不同输入位置。6.3 输入和输出对齐更自然例如翻译时当前目标词通常与源句某些位置更相关注意力机制让模型能自己学这种软对齐关系。所以注意力机制不是简单“加了点权重”而是在根本上改变了 Seq2Seq 的信息使用方式。7. 注意力机制最核心的直觉公式注意力机制最核心的思想可以浓缩成一句话上下文向量 对所有输入表示的加权和也就是说假设编码器输出了很多隐状态H_1, H_2, ..., H_n那么解码器在第t步得到的上下文向量可以写成c_t a_{t1} H_1 a_{t2} H_2 ... a_{tn} H_n其中a_{ti}表示第t步对第i个输入位置的注意力权重这些权重一般加起来等于 1这意味着当前上下文不是固定向量而是对全部编码器输出做的一次“加权汇总”。而权重怎么来就是后面“注意力分数”要讲的事情。8. 什么是注意力权重注意力权重就是当前解码步对输入各位置的重要性分配。例如一个 4 个词的源句子在某一步生成时模型可能给出权重[0.1, 0.6, 0.2, 0.1]这表示第 2 个词最重要第 3 个词次之第 1 和第 4 个词相对没那么重要所以注意力机制本质上把“我现在更该看哪里”这件事显式量化了。这比基础 Seq2Seq 里“始终盯着同一个摘要”要灵活得多。9. 为什么注意力权重通常加起来等于 1因为它通常被设计成一种“概率分布”或“归一化权重分布”。也就是说每个位置分到一部分注意力全部注意力总量是固定的模型只是决定如何分配这份总注意力这样做有两个好处9.1 解释性强你可以直接看出模型当前更关注哪些位置。9.2 数值稳定上下文向量是加权平均而不是无限放大。所以在实现中注意力分数通常会经过 softmax把它们变成一组非负且和为 1 的权重。10. 注意力机制和“软对齐”是什么关系在机器翻译里注意力机制常常被理解成一种软对齐soft alignment为什么叫“软”因为它不是说当前目标词只严格对应某一个源词而是说当前目标词可能主要对应某几个源词但其他位置也可以有少量影响也就是说它给出的不是硬性的“一对一对齐”而是一组连续权重表示的相关性分布这比硬对齐更灵活也更适合神经网络端到端学习。11. 注意力机制在 Seq2Seq 中的数据流怎么变了和基础 Seq2Seq 比较一下就很清楚。基础 Seq2Seq编码器输出最后状态解码器每一步都用同一个上下文摘要加注意力的 Seq2Seq编码器保留所有时间步输出解码器每一步都根据当前状态重新计算注意力权重得到当前专属的上下文向量再结合这个上下文进行生成所以最大的变化就是上下文从“固定”变成了“动态”。这就是注意力机制的本质升级。12. 注意力机制为什么影响这么大因为它不只是一个“小技巧”而是解决了一个非常根本的问题信息该如何在序列中被访问。在基础 Seq2Seq 里信息访问方式非常粗糙先压缩成一个定长向量然后一直用这个向量而注意力机制让访问方式变成所有编码结果都先保留当前需要什么再动态取什么这就让模型的信息使用方式从“静态摘要”升级成了“动态检索”。这一步非常关键。13. 注意力机制不只用于机器翻译虽然它最早在 Seq2Seq 机器翻译里特别出名但它的思想远远不止翻译。只要一个任务里存在当前处理单元需要从一组输入表示中选择性获取信息那就可能用到注意力。例如文本摘要阅读理解图像描述语音识别后来的 Transformer所以注意力机制本质上是一种非常通用的信息选择机制。14. 注意力机制和人类认知为什么很像这也是它特别有吸引力的一点。人类处理复杂信息时不会平均看所有内容而是会把有限认知资源集中到更相关的部分。例如听别人说话时会特别关注关键词看一张图时目光会集中在显著区域读句子时会重点参考上下文中对当前词最有帮助的部分注意力机制把这种“选择性处理”的思想引入了神经网络。所以它的直觉特别自然。15. 李沐这一节最想让你理解什么这一节最重要的不是立刻背公式而是把下面这条主线抓住第一基础 Seq2Seq 的问题在于固定上下文向量长句会更容易信息瓶颈。第二注意力机制允许解码器动态查看输入序列不同位置而不是一直依赖同一个摘要。第三注意力本质上是“加权汇总”不同位置有不同权重。第四这是一种非常通用的信息选择机制不只适用于机器翻译。所以这一节其实是在告诉你Seq2Seq 为什么必须进一步升级以及升级的核心方向是什么。16. 注意力机制和后面内容怎么衔接这一节其实只是总览和直觉建立。后面通常会顺着这条线继续展开下一步代码实现看最基础的注意力层怎么写。再下一步注意力分数也就是权重到底怎么计算再后面带注意力的 Seq2Seq把注意力真正装进 Seq2Seq 解码器里。所以这一节是一个非常关键的过渡层先建立思想再进入公式和实现。17. 本节总结这一节我们学习了注意力机制核心内容可以总结为以下几点。17.1 注意力机制的核心是动态关注输入中更相关的部分而不是平均使用所有信息。17.2 在 Seq2Seq 中它解决了固定长度上下文向量的信息瓶颈特别是长句问题。17.3 解码器每一步都会根据当前需要重新分配对输入各位置的注意力权重因此上下文向量是动态变化的。17.4 注意力本质上是对输入表示做加权和权重通常来自归一化后的注意力分布。17.5 它是一种非常通用的信息选择机制后面会进一步发展成更强大的模型框架。18. 学习感悟注意力机制这一节特别重要因为它几乎改变了大家对“神经网络如何使用信息”的理解。以前的思路更像是把信息都压进一个向量里再想办法从这个向量里读出来。而注意力机制换了一个思路不要强迫所有信息提前压缩好先把它们保留下来等真正需要的时候再去有选择地读取。这一步看似简单实际上非常深刻。因为它让模型的信息流从“固定压缩”变成了“动态访问”。也正是从这里开始后面的 Transformer 才真正变得顺理成章。

更多文章