第1篇 · 基础 约120分钟 2个实验 4篇原始论文

CHAPTER 01

注意力机制

当一句话装不进一个固定大小的“行李箱”,模型就不再强迫自己一次记住全部内容, 而是在生成每个词时,回到输入中重新查找最相关的信息。

本章地图

先建立一条不会迷路的主线

本章不从公式起步。先看旧方法为什么受限,再理解注意力增加了哪条信息通路,最后才进入计算流程和论文历史。

01压缩

编码器把输入汇总成表示

02瓶颈

长句细节在固定向量中竞争

03查找

每个解码步重新读取输入

04对齐

权重显示本次读取的分配

通俗地说

传统Seq2Seq像让翻译员听完整段话后合上笔记本再翻译;注意力允许他每说一句,都重新查看原文的相关位置。

类比的边界

模型不是人,也没有主动“回看”的意识。所谓查找,是一组可微分的向量打分、归一化与加权求和。

1.1 背景知识

Seq2Seq:先把变长序列变成另一个变长序列

经典Seq2Seq由编码器和解码器组成。编码器读取源序列并产生状态,解码器根据这些信息逐步生成目标序列。

1.1.1 Seq2Seq · 从英文到中文的数据流

箭头不是装饰:它们表示信息实际需要经过的路径。

ENCODERTheh1cath2sath3downh4固定向量 c整句都要装进来DECODER那只坐下源序列可以变长但中间通道宽度不随句长增长 → 信息瓶颈
1.1.1

Seq2Seq不是某一种网络

它是一种任务框架:把一个序列映射为另一个序列。早期常用RNN/LSTM实现编码器和解码器,后来也可以用CNN或Transformer。

1.1.2

编码器—解码器是职责分工

编码器负责形成源端表示;解码器在已有输出前缀的条件下,预测下一个目标符号。架构职责和具体神经网络实现要分开理解。

FROM FLOW TO FORMULA

现在再把刚才的数据流正式写下来

前面的图先回答“信息怎么走”。下面的数学只是在给这条路径命名:序列概率怎样拆开、编码器怎样更新、固定上下文怎样进入解码器,以及训练损失最终优化什么。

A

先定义任务:不是把整句一次性分类,而是逐步建模条件概率

对源序列 x=(x1,,xn)x=(x_1,\ldots,x_n) 和目标序列y=(y1,,ym)y=(y_1,\ldots,y_m),自回归解码器用概率链式法则把整句概率拆成一连串“下一个Token”预测:

p(yx)=t=1mp(yty<t,x)p(y\mid x)=\prod_{t=1}^{m}p(y_t\mid y_{<t},x)

这不是神经网络特有技巧,而是概率论的链式分解。网络的职责,是为每一个条件分布p(yty<t,x)p(y_t\mid y_{<t},x) 给出可学习的参数化。

B

编码器把前缀信息递推到隐藏状态

hi=fenc(xi,hi1)h_i=f_{\mathrm{enc}}(x_i,h_{i-1})

在循环编码器中,hih_i 同时接收当前输入和前一状态。它不是“第 i 个词本身”,而是截至当前位置的连续表示。使用双向RNN时,常把两个方向拼接为 annotation:

hi=[hi;hi]h_i=[\overrightarrow{h_i};\overleftarrow{h_i}]
C

固定上下文方案把全部源端信息收束到一个接口

c=hn,st=fdec(yt1,st1,c)c=h_n,\qquad s_t=f_{\mathrm{dec}}(y_{t-1},s_{t-1},c)
p(yty<t,x)=softmax(Wost+bo)p(y_t\mid y_{<t},x)=\operatorname{softmax}(W_o s_t+b_o)

“固定”指同一条源句在所有解码步骤共享同一个 cc,并且cc 的宽度不会随句长增加;并不是说向量里的数值在训练过程中不变。

D

训练目标把正确译文的概率推高

L=t=1mlogp(yty<t,x)\mathcal{L}=-\sum_{t=1}^{m}\log p(y_t^{*}\mid y_{<t}^{*},x)

训练时常把真实的前一个目标Token yt1y_{t-1}^{*} 输入解码器,这叫 Teacher Forcing;推理时真实后缀不存在,只能把模型自己的上一步输出喂回去。因此,训练和生成使用的是同一组参数,却处在不同的输入分布中。

1.2 技术挑战

真正的问题不只是“句子太长”

固定压缩、对齐、依赖路径和计算方式相互牵连。下面把书中的五个小节放进同一张因果图里。

1.2.1
对齐问题

生成“猫”时,源句哪个位置提供主要信息?

1.2.2
长距离依赖

相关词相隔很远时,信息要走多长的路径?

1.2.3
CNN方案

扩大感受野,换来更多层或更宽卷积。

1.2.4
RNN方案

通过状态接力保留顺序,但路径随距离增长。

1.2.5
现有局限

一个固定向量难以同时保留全部细节。

实验一:两个位置相隔多远,信息要走几步?

这是依赖路径的结构示意,不是实际运行时间基准。

可修改

像接力传话:一步一步把状态传下去

并行性
弱:时间步存在先后依赖
优势
天然表达顺序,适合流式序列
代价
距离越远,信息与梯度要经过越多次变换

CNN不是“看不到远处”,而是要扩展感受野

对步长为1、无膨胀、卷积核宽度为 kk 的一维卷积,堆叠LL 层后的理论感受野为:

R=1+L(k1)R=1+L(k-1)

若第 \ell 层的膨胀率是 dd_\ell,则R=1+(k1)dR=1+(k-1)\sum_\ell d_\ell。让膨胀率按1,2,4,8,1,2,4,8,\ldots 增长,可以用较少层覆盖很长范围,但具体信息仍要经过多层变换。

一个具体数值

k=3k=3L=4L=4

R=1+4×(31)=9R=1+4\times(3-1)=9

四层普通卷积只能让一个位置理论上接触9个连续位置;这解释了为什么卷积方案需要更深、膨胀或更宽的核。

深入:为什么“距离远”会成为优化问题?

早期位置 hih_i 若要影响最终摘要 hnh_n,梯度必须穿过后续每一次状态更新。按链式法则:

hnhi=k=i+1nhkhk1=k=i+1nJk\frac{\partial h_n}{\partial h_i}=\prod_{k=i+1}^{n}\frac{\partial h_k}{\partial h_{k-1}}=\prod_{k=i+1}^{n}J_k

梯度消失

若每个雅可比矩阵的算子范数大致不超过 ρ<1\rho<1,则有上界hn/hiρni\lVert\partial h_n/\partial h_i\rVert\lesssim\rho^{n-i}。 距离指数增加时,早期位置收到的学习信号会迅速变弱。

梯度爆炸

若多个方向持续放大,矩阵乘积可能快速增长,导致训练不稳定。梯度裁剪能限制数值,LSTM门控能建立更平滑的记忆通路,但都没有把两个远位置间的计算图路径变成一步。

固定压缩与梯度问题不是同一个概念

梯度问题描述“训练信号怎样传播”;固定瓶颈描述“所有源信息必须通过哪个接口”。即使优化完全稳定,一个固定宽度的cc 仍要同时服务所有目标步骤。注意力首先改变的是第二件事:让解码器直接访问整组{h1,,hn}\{h_1,\ldots,h_n\}

1.3 原理、结构、流程与效果

注意力增加了一条“按当前需要读取源端”的通路

模型每生成一个目标词,都重新询问一次:“源句中哪些位置对我现在最有用?”先观察这种动态读取怎样变化,再进入它的数学实现。

1.3.101
原理

每个输出步骤按当前需要,动态选择源端信息。

1.3.202
通用结构

需求表示、可匹配索引与实际内容共同完成读取。

1.3.303
计算流程

打分 → Softmax → 加权求和 → 生成。

1.3.404
效果

缓解固定压缩瓶颈,并提供更短的信息访问路径。

效果的边界:注意力缓解而非无条件消除长依赖问题;它仍受表示质量、训练数据、优化过程和计算成本限制。序列很长时,标准全连接注意力本身还会产生平方级比较开销。

实验二:模型生成每个中文词时,会读取英文的哪里?

先选择不同目标词观察连线怎样移动;这里暂时不要求记住公式符号。

数值可追踪
正在生成
decoder state / query生成“当前解码状态 sₜ₋₁Theα 2.6%blackα 5.3%catα 86.7%satα 2.6%onα 0.9%theα 1.2%matα 0.8%cat 是主要信息源;black 与 sat 仍提供少量上下文。
源位置 i对齐分数 eₜᵢexp(e − max)权重 αₜᵢ在context中的角色
The0.30.0300.026αₜᵢ · hᵢ
black1.00.0610.053αₜᵢ · hᵢ
cat3.81.0000.867αₜᵢ · hᵢ
sat0.30.0300.026αₜᵢ · hᵢ
on-0.80.0100.009αₜᵢ · hᵢ
the-0.50.0140.012αₜᵢ · hᵢ
mat-0.90.0090.008αₜᵢ · hᵢ

FROM OBSERVATION TO MECHANISM

现在解释:这些连线究竟怎样被算出来

刚才看到的变化不是预先写好的词典对齐,而是由当前解码状态和每个源端表示共同计算。下面才引入变量、形状和四步公式,并让每一个符号对应刚才图中的对象。

1

把解码需求和源端表示投影到同一个“匹配空间”

eti=vatanh(Wsst1+Whhi+ba)e_{ti}=v_a^\top\tanh(W_s s_{t-1}+W_h h_i+b_a)
对象形状作用
st1s_{t-1}Rds\mathbb{R}^{d_s}当前解码需求
hih_iRdh\mathbb{R}^{d_h}第 i 个源位置表示
WsW_sRda×ds\mathbb{R}^{d_a\times d_s}把解码状态投影到匹配空间
WhW_hRda×dh\mathbb{R}^{d_a\times d_h}把源端状态投影到匹配空间
vav_aRda\mathbb{R}^{d_a}把匹配表示压成标量
etie_{ti}R\mathbb{R}未归一化对齐分数

st1s_{t-1} hih_i 可能维度不同,不能直接逐元素比较。WsW_sWhW_h 把它们映射到共同的dad_a 维空间;tanh\tanh 允许非线性交互;vav_a^\top 再把匹配表示压成一个标量分数。

分数 etie_{ti} 可以为负,也不要求总和为1。它只是可比较的logit,还不是“读取比例”。

2

Softmax把相对分差变成读取分配

αti=exp(etimt)j=1nexp(etjmt),mt=maxjetj\alpha_{ti}=\frac{\exp(e_{ti}-m_t)}{\sum_{j=1}^{n}\exp(e_{tj}-m_t)},\qquad m_t=\max_j e_{tj}

所有分数同时减去同一个常数不会改变Softmax,因为分子分母会约掉同一倍数;选择最大值只是为了避免exp(e)\exp(e) 溢出。Softmax真正保留的是分数差,而不是绝对大小。

αti0,i=1nαti=1\alpha_{ti}\ge 0,\qquad \sum_{i=1}^{n}\alpha_{ti}=1
3

上下文向量是Value的加权混合

ct=i=1nαtihic_t=\sum_{i=1}^{n}\alpha_{ti}h_i

当Value就是 hih_i 时,ctc_t 与每个hih_i 维度相同。由于权重非负且和为1,它是这些表示的凸组合:通常位于源端表示张成的凸包内,而不是把最高权重位置原样复制出来。

4

解码器把本次读取结果用于状态更新和输出

st=fdec(yt1,st1,ct),p(yt)=softmax(Wo[st;ct]+bo)s_t=f_{\mathrm{dec}}(y_{t-1},s_{t-1},c_t),\qquad p(y_t)=\operatorname{softmax}(W_o[s_t;c_t]+b_o)

不同实现会在更新状态之前或之后计算注意力,也可能改变拼接位置。阅读源码时,不应只搜索类名 Attention,而应沿张量流确认 st1etαtctp(yt)s_{t-1}\rightarrow e_t\rightarrow\alpha_t\rightarrow c_t\rightarrow p(y_t)

完整数值算例:从状态一直算到输出概率

为了能手工追踪,下面故意使用两个源位置、二维向量和单位投影;真实模型维度更高,但计算顺序相同。

01

给定解码状态、源端表示和参数

s=[1,0],h1=[1,0],h2=[0,2],Ws=Wh=I,va=[1,1]s=[1,0]^\top,\quad h_1=[1,0]^\top,\quad h_2=[0,2]^\top,\quad W_s=W_h=I,\quad v_a=[1,1]^\top
02

计算两个源位置的加性注意力分数

e1=[1,1]tanh([2,0])0.964e_1=[1,1]\tanh([2,0]^\top)\approx0.964
e2=[1,1]tanh([1,2])0.762+0.964=1.726e_2=[1,1]\tanh([1,2]^\top)\approx0.762+0.964=1.726

第二个位置分数更高,不是因为它永久“更重要”,而是当前状态 ss 与它经过共同投影后的匹配结果更大。

03

Softmax得到读取比例

α=softmax([0.964,1.726])[0.318,0.682]\alpha=\operatorname{softmax}([0.964,1.726])\approx[0.318,0.682]

Softmax依赖分差 1.7260.964=0.7621.726-0.964=0.762。较低分位置仍保留31.8%的贡献,所以这是软读取,不是二选一。

04

对Value加权求和

c=0.318[1,0]+0.682[0,2]=[0.318,1.364]c=0.318[1,0]^\top+0.682[0,2]^\top=[0.318,1.364]^\top
05

观察Context怎样改变输出分布

z=Woc=c,p=softmax(z)[0.260,0.740]z=W_oc=c,\qquad p=\operatorname{softmax}(z)\approx[0.260,0.740]

这个玩具输出头故意只使用 cc,以隔离注意力的影响;真实解码器通常同时使用sts_t、上一Token表示和 ctc_t。因此,注意力权重不能单独等同于最终词概率。

为什么软对齐能端到端学出来?

关键不是权重“看起来像概率”,而是从损失到分数的每一步都可导。Softmax的雅可比元素为:

αiej=αi(δijαj)\frac{\partial\alpha_i}{\partial e_j}=\alpha_i(\delta_{ij}-\alpha_j)

i=ji=j 时,导数为 αi(1αi)\alpha_i(1-\alpha_i);当iji\ne j 时为 αiαj-\alpha_i\alpha_j。提高一个位置的权重会相对压低其他位置,这正符合“总和保持为1”的约束。

预测损失

指出目标词概率偏低

Context

把误差信号分到各Value

Score参数

调整下次的匹配与权重

梯度有两条主要路径

  • Value路径:损失通过 ctc_t 直接影响被加权的编码器表示。
  • Score路径:损失通过 ctαtetc_t\rightarrow\alpha_t\rightarrow e_t 调整投影矩阵和打分向量。
cthi=αtiIValue直接路径+jhjαtjhiScore间接路径\frac{\partial c_t}{\partial h_i}=\underbrace{\alpha_{ti}I}_{\text{Value直接路径}}+\underbrace{\sum_j h_j\frac{\partial\alpha_{tj}}{\partial h_i}}_{\text{Score间接路径}}

如果Softmax极度饱和,很多权重接近0或1,上式中的部分导数也会很小。这说明注意力“可导”不等于任何初始化和数据条件下都容易训练。

图书馆类比

Query像检索需求,Key像目录索引,Value像书中内容。相关性决定“借阅比例”,加权结果形成context。

类比的边界

早期Bahdanau注意力并不使用后来Transformer中标准化的Q/K/V线性投影。这里借用检索角色帮助建立直觉,不混同具体公式。

常见误解:注意力权重不自动等于完整解释

权重描述这次加权读取的分配,但最终预测还取决于隐藏表示、Value内容、解码器状态和后续变换。 因而它可以作为观察线索,却不能仅凭一张热力图就宣称找到了模型决策的全部因果。

1.4 发展历史

从“最后一个状态”到“注意力成为主干”

技术演进不是突然出现一个万能公式,而是信息通路一步步改变。

2014
固定向量Seq2Seq

编码器最后状态承担整句摘要;证明端到端序列映射可行。

2014
Bahdanau软对齐

解码器每一步动态计算源位置权重,缓解固定向量瓶颈。

2015
Luong系统化比较

统一讨论global/local attention及dot、general、concat等打分。

2017
Transformer

用自注意力与交叉注意力替代循环主干,注意力从辅助模块变成架构中心。

从加性注意力走向缩放点积

方法打分结构含义
Bahdanau Additivevtanh(Wqq+Wkk)v^\top\tanh(W_q q+W_k k)先投影、非线性交互,再压成标量
Luong Dotqkq^\top k维度相同后直接内积,计算简单
Luong GeneralqWkq^\top Wk在点积前学习一个线性变换
Scaled Dot Productqk/dkq^\top k/\sqrt{d_k}控制高维点积的数值尺度

为什么Transformer要除以 dk\sqrt{d_k}

假设Query和Key每一维独立、均值为0、方差为1。点积是 dkd_k 个乘积之和:

qk=r=1dkqrkr,Var(qk)dkq^\top k=\sum_{r=1}^{d_k}q_rk_r,\qquad \operatorname{Var}(q^\top k)\approx d_k

因而点积的标准差约为 dk\sqrt{d_k}。维度越高,未缩放logit越容易幅度过大,使Softmax接近one-hot并进入低梯度区域。除以dk\sqrt{d_k} 后,方差重新约为1,训练尺度更稳定。这不是为了让权重和为1——Softmax本来就负责归一化。

Attention(Q,K,V)=softmax ⁣(QKdk)V\operatorname{Attention}(Q,K,V)=\operatorname{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V

历史叙述提醒

“为了解决某问题,所以研究者设计了某结构”常常是便于理解的事后重构。除非论文或作者材料明确说明,我们会把设计动机标记为教学推导,而不是历史事实。

论文与源码地图

读原始证据,不把链接堆成收藏夹

每篇只给一个本章阅读任务。完成本章不需要从头通读四篇论文。

源码按层级阅读

作者公开稿:探秘Transformer系列之(1):注意力机制。它用于对照作者叙事和查找线索;技术结论仍回到论文与源码核验。

知识回顾与阅读笔记

把整章收束成一条可回查的脉络

这里不设置题目和评分,只保留阅读完成后最值得带走的四个判断,以及继续核对纸书与论文时的个人记录。

01 · 问题

固定压缩让全句信息竞争同一接口;循环网络的长路径还会带来雅可比矩阵连续相乘。

02 · 机制

解码状态和源端表示先投影到共同匹配空间,再得到每个源位置的对齐logit。

03 · 计算

Softmax保留相对分差并产生和为1的权重,Context是Value表示的凸组合。

04 · 学习

预测损失同时通过Value直接路径和Score间接路径更新编码器与对齐参数。

05 · 演进

加性、点积和缩放点积共享相关性读取思想,但参数化和数值尺度不同。

06 · 边界

短访问路径不等于无限记忆;注意力权重也不能单独代表最终决策因果。

我的第1章笔记

只保存在当前设备,适合记录自己的类比、疑问和纸书页码。

LOCAL ONLY