CHAPTER 01
注意力机制
当一句话装不进一个固定大小的“行李箱”,模型就不再强迫自己一次记住全部内容, 而是在生成每个词时,回到输入中重新查找最相关的信息。
本章地图
先建立一条不会迷路的主线
本章不从公式起步。先看旧方法为什么受限,再理解注意力增加了哪条信息通路,最后才进入计算流程和论文历史。
编码器把输入汇总成表示
长句细节在固定向量中竞争
每个解码步重新读取输入
权重显示本次读取的分配
通俗地说
传统Seq2Seq像让翻译员听完整段话后合上笔记本再翻译;注意力允许他每说一句,都重新查看原文的相关位置。
类比的边界
模型不是人,也没有主动“回看”的意识。所谓查找,是一组可微分的向量打分、归一化与加权求和。
1.1 背景知识
Seq2Seq:先把变长序列变成另一个变长序列
经典Seq2Seq由编码器和解码器组成。编码器读取源序列并产生状态,解码器根据这些信息逐步生成目标序列。
1.1.1 Seq2Seq · 从英文到中文的数据流
箭头不是装饰:它们表示信息实际需要经过的路径。
Seq2Seq不是某一种网络
它是一种任务框架:把一个序列映射为另一个序列。早期常用RNN/LSTM实现编码器和解码器,后来也可以用CNN或Transformer。
编码器—解码器是职责分工
编码器负责形成源端表示;解码器在已有输出前缀的条件下,预测下一个目标符号。架构职责和具体神经网络实现要分开理解。
FROM FLOW TO FORMULA
现在再把刚才的数据流正式写下来
前面的图先回答“信息怎么走”。下面的数学只是在给这条路径命名:序列概率怎样拆开、编码器怎样更新、固定上下文怎样进入解码器,以及训练损失最终优化什么。
先定义任务:不是把整句一次性分类,而是逐步建模条件概率
对源序列 和目标序列,自回归解码器用概率链式法则把整句概率拆成一连串“下一个Token”预测:
这不是神经网络特有技巧,而是概率论的链式分解。网络的职责,是为每一个条件分布 给出可学习的参数化。
编码器把前缀信息递推到隐藏状态
在循环编码器中, 同时接收当前输入和前一状态。它不是“第 i 个词本身”,而是截至当前位置的连续表示。使用双向RNN时,常把两个方向拼接为 annotation:
固定上下文方案把全部源端信息收束到一个接口
“固定”指同一条源句在所有解码步骤共享同一个 ,并且 的宽度不会随句长增加;并不是说向量里的数值在训练过程中不变。
训练目标把正确译文的概率推高
训练时常把真实的前一个目标Token 输入解码器,这叫 Teacher Forcing;推理时真实后缀不存在,只能把模型自己的上一步输出喂回去。因此,训练和生成使用的是同一组参数,却处在不同的输入分布中。
1.2 技术挑战
真正的问题不只是“句子太长”
固定压缩、对齐、依赖路径和计算方式相互牵连。下面把书中的五个小节放进同一张因果图里。
生成“猫”时,源句哪个位置提供主要信息?
相关词相隔很远时,信息要走多长的路径?
扩大感受野,换来更多层或更宽卷积。
通过状态接力保留顺序,但路径随距离增长。
一个固定向量难以同时保留全部细节。
实验一:两个位置相隔多远,信息要走几步?
这是依赖路径的结构示意,不是实际运行时间基准。
像接力传话:一步一步把状态传下去
- 并行性
- 弱:时间步存在先后依赖
- 优势
- 天然表达顺序,适合流式序列
- 代价
- 距离越远,信息与梯度要经过越多次变换
CNN不是“看不到远处”,而是要扩展感受野
对步长为1、无膨胀、卷积核宽度为 的一维卷积,堆叠 层后的理论感受野为:
若第 层的膨胀率是 ,则。让膨胀率按 增长,可以用较少层覆盖很长范围,但具体信息仍要经过多层变换。
一个具体数值
当 、:
四层普通卷积只能让一个位置理论上接触9个连续位置;这解释了为什么卷积方案需要更深、膨胀或更宽的核。
深入:为什么“距离远”会成为优化问题?
早期位置 若要影响最终摘要 ,梯度必须穿过后续每一次状态更新。按链式法则:
梯度消失
若每个雅可比矩阵的算子范数大致不超过 ,则有上界。 距离指数增加时,早期位置收到的学习信号会迅速变弱。
梯度爆炸
若多个方向持续放大,矩阵乘积可能快速增长,导致训练不稳定。梯度裁剪能限制数值,LSTM门控能建立更平滑的记忆通路,但都没有把两个远位置间的计算图路径变成一步。
固定压缩与梯度问题不是同一个概念
梯度问题描述“训练信号怎样传播”;固定瓶颈描述“所有源信息必须通过哪个接口”。即使优化完全稳定,一个固定宽度的 仍要同时服务所有目标步骤。注意力首先改变的是第二件事:让解码器直接访问整组。
1.3 原理、结构、流程与效果
注意力增加了一条“按当前需要读取源端”的通路
模型每生成一个目标词,都重新询问一次:“源句中哪些位置对我现在最有用?”先观察这种动态读取怎样变化,再进入它的数学实现。
每个输出步骤按当前需要,动态选择源端信息。
需求表示、可匹配索引与实际内容共同完成读取。
打分 → Softmax → 加权求和 → 生成。
缓解固定压缩瓶颈,并提供更短的信息访问路径。
实验二:模型生成每个中文词时,会读取英文的哪里?
先选择不同目标词观察连线怎样移动;这里暂时不要求记住公式符号。
| 源位置 i | 对齐分数 eₜᵢ | exp(e − max) | 权重 αₜᵢ | 在context中的角色 |
|---|---|---|---|---|
| The | 0.3 | 0.030 | 0.026 | αₜᵢ · hᵢ |
| black | 1.0 | 0.061 | 0.053 | αₜᵢ · hᵢ |
| cat | 3.8 | 1.000 | 0.867 | αₜᵢ · hᵢ |
| sat | 0.3 | 0.030 | 0.026 | αₜᵢ · hᵢ |
| on | -0.8 | 0.010 | 0.009 | αₜᵢ · hᵢ |
| the | -0.5 | 0.014 | 0.012 | αₜᵢ · hᵢ |
| mat | -0.9 | 0.009 | 0.008 | αₜᵢ · hᵢ |
FROM OBSERVATION TO MECHANISM
现在解释:这些连线究竟怎样被算出来
刚才看到的变化不是预先写好的词典对齐,而是由当前解码状态和每个源端表示共同计算。下面才引入变量、形状和四步公式,并让每一个符号对应刚才图中的对象。
把解码需求和源端表示投影到同一个“匹配空间”
| 对象 | 形状 | 作用 |
|---|---|---|
| 当前解码需求 | ||
| 第 i 个源位置表示 | ||
| 把解码状态投影到匹配空间 | ||
| 把源端状态投影到匹配空间 | ||
| 把匹配表示压成标量 | ||
| 未归一化对齐分数 |
和 可能维度不同,不能直接逐元素比较。 与 把它们映射到共同的 维空间; 允许非线性交互; 再把匹配表示压成一个标量分数。
分数 可以为负,也不要求总和为1。它只是可比较的logit,还不是“读取比例”。
Softmax把相对分差变成读取分配
所有分数同时减去同一个常数不会改变Softmax,因为分子分母会约掉同一倍数;选择最大值只是为了避免 溢出。Softmax真正保留的是分数差,而不是绝对大小。
上下文向量是Value的加权混合
当Value就是 时, 与每个 维度相同。由于权重非负且和为1,它是这些表示的凸组合:通常位于源端表示张成的凸包内,而不是把最高权重位置原样复制出来。
解码器把本次读取结果用于状态更新和输出
不同实现会在更新状态之前或之后计算注意力,也可能改变拼接位置。阅读源码时,不应只搜索类名 Attention,而应沿张量流确认 。
完整数值算例:从状态一直算到输出概率
为了能手工追踪,下面故意使用两个源位置、二维向量和单位投影;真实模型维度更高,但计算顺序相同。
给定解码状态、源端表示和参数
计算两个源位置的加性注意力分数
第二个位置分数更高,不是因为它永久“更重要”,而是当前状态 与它经过共同投影后的匹配结果更大。
Softmax得到读取比例
Softmax依赖分差 。较低分位置仍保留31.8%的贡献,所以这是软读取,不是二选一。
对Value加权求和
观察Context怎样改变输出分布
这个玩具输出头故意只使用 ,以隔离注意力的影响;真实解码器通常同时使用、上一Token表示和 。因此,注意力权重不能单独等同于最终词概率。
为什么软对齐能端到端学出来?
关键不是权重“看起来像概率”,而是从损失到分数的每一步都可导。Softmax的雅可比元素为:
当 时,导数为 ;当 时为 。提高一个位置的权重会相对压低其他位置,这正符合“总和保持为1”的约束。
指出目标词概率偏低
把误差信号分到各Value
调整下次的匹配与权重
梯度有两条主要路径
- Value路径:损失通过 直接影响被加权的编码器表示。
- Score路径:损失通过 调整投影矩阵和打分向量。
如果Softmax极度饱和,很多权重接近0或1,上式中的部分导数也会很小。这说明注意力“可导”不等于任何初始化和数据条件下都容易训练。
图书馆类比
Query像检索需求,Key像目录索引,Value像书中内容。相关性决定“借阅比例”,加权结果形成context。
类比的边界
早期Bahdanau注意力并不使用后来Transformer中标准化的Q/K/V线性投影。这里借用检索角色帮助建立直觉,不混同具体公式。
常见误解:注意力权重不自动等于完整解释
权重描述这次加权读取的分配,但最终预测还取决于隐藏表示、Value内容、解码器状态和后续变换。 因而它可以作为观察线索,却不能仅凭一张热力图就宣称找到了模型决策的全部因果。
1.4 发展历史
从“最后一个状态”到“注意力成为主干”
技术演进不是突然出现一个万能公式,而是信息通路一步步改变。
编码器最后状态承担整句摘要;证明端到端序列映射可行。
解码器每一步动态计算源位置权重,缓解固定向量瓶颈。
统一讨论global/local attention及dot、general、concat等打分。
用自注意力与交叉注意力替代循环主干,注意力从辅助模块变成架构中心。
从加性注意力走向缩放点积
| 方法 | 打分 | 结构含义 |
|---|---|---|
| Bahdanau Additive | 先投影、非线性交互,再压成标量 | |
| Luong Dot | 维度相同后直接内积,计算简单 | |
| Luong General | 在点积前学习一个线性变换 | |
| Scaled Dot Product | 控制高维点积的数值尺度 |
为什么Transformer要除以 ?
假设Query和Key每一维独立、均值为0、方差为1。点积是 个乘积之和:
因而点积的标准差约为 。维度越高,未缩放logit越容易幅度过大,使Softmax接近one-hot并进入低梯度区域。除以 后,方差重新约为1,训练尺度更稳定。这不是为了让权重和为1——Softmax本来就负责归一化。
历史叙述提醒
“为了解决某问题,所以研究者设计了某结构”常常是便于理解的事后重构。除非论文或作者材料明确说明,我们会把设计动机标记为教学推导,而不是历史事实。
论文与源码地图
读原始证据,不把链接堆成收藏夹
每篇只给一个本章阅读任务。完成本章不需要从头通读四篇论文。
Sequence to Sequence Learning with Neural Networks
Sutskever, Vinyals, Le
解决:用两个RNN把变长序列映射到变长序列。
本章读法:先看Figure 1,再看编码器最后状态如何成为解码器的初始信息。
Neural Machine Translation by Jointly Learning to Align and Translate
Bahdanau, Cho, Bengio
解决:不再要求一个固定向量承载整句信息,引入可学习的软对齐。
本章读法:重点读3.1节:annotation、alignment model与context vector。
Effective Approaches to Attention-based Neural Machine Translation
Luong, Pham, Manning
解决:系统比较全局/局部注意力及多种对齐打分方式。
本章读法:重点对照Figure 2、global/local attention和Table 1的score函数。
Attention Is All You Need
Vaswani et al.
解决:让注意力从RNN的辅助模块变成序列建模的主要计算骨架。
本章读法:本章只读引言与2—3节;自注意力细节留到第9章。
源码按层级阅读
先找到encoder、decoder与attention类,适合对应本章。
打开资料观察训练循环、teacher forcing与attention decoder。
打开资料用于把本章注意力连接到第2、9章,不作为Bahdanau原始实现。
打开资料知识回顾与阅读笔记
把整章收束成一条可回查的脉络
这里不设置题目和评分,只保留阅读完成后最值得带走的四个判断,以及继续核对纸书与论文时的个人记录。
固定压缩让全句信息竞争同一接口;循环网络的长路径还会带来雅可比矩阵连续相乘。
解码状态和源端表示先投影到共同匹配空间,再得到每个源位置的对齐logit。
Softmax保留相对分差并产生和为1的权重,Context是Value表示的凸组合。
预测损失同时通过Value直接路径和Score间接路径更新编码器与对齐参数。
加性、点积和缩放点积共享相关性读取思想,但参数化和数值尺度不同。
短访问路径不等于无限记忆;注意力权重也不能单独代表最终决策因果。
我的第1章笔记
只保存在当前设备,适合记录自己的类比、疑问和纸书页码。