为什么训练能并行,生成却要逐词?

用目标句子“我 爱 猫”加结束符作示意。BOS / EOS 表示起始符和结束符;图中的“×”表示不可见。

右移目标与因果掩码右移输入与目标标签逐列对应,三角掩码遮挡未来位置,每一行的注意力权重独立归一化。目标输入右移一位输入标签
BOS\mathrm{BOS}
我\text{我}
我\text{我}
爱\text{爱}
爱\text{爱}
猫\text{猫}
猫\text{猫}
EOS\mathrm{EOS}
行:查询位置 列:键位置BOS我爱猫BOS我爱猫×
00
×
00
×
00
×
00
×
00
×
00
屏蔽未来位置
j>t⇒Atj=0j>t\quad\Rightarrow\quad A_{tj}=0
先加负无穷,再做 softmax
1.01.0
0.40.4
0.60.6
0.20.2
0.30.3
0.50.5
0.10.1
0.20.2
0.30.3
0.40.4
每行独立归一化
∑jAtj=1\sum_j A_{tj}=1
数字是教学示意权重
训练时:同时计算各行
BOS→我\mathrm{BOS}\to\text{我}
我→爱\text{我}\to\text{爱}
爱→猫\text{爱}\to\text{猫}
猫→EOS\text{猫}\to\mathrm{EOS}
生成时:逐步扩展前缀
BOS→我→爱→猫→EOS\mathrm{BOS}\to\text{我}\to\text{爱}\to\text{猫}\to\mathrm{EOS}
下一步取决于刚选出的 token
右移目标与因果掩码右移输入与目标标签逐列对应,三角掩码遮挡未来位置,每一行的注意力权重独立归一化。目标输入右移一位输入标签
BOS\mathrm{BOS}
我\text{我}
我\text{我}
爱\text{爱}
爱\text{爱}
猫\text{猫}
猫\text{猫}
EOS\mathrm{EOS}
行:查询位置 列:键位置BOS我爱猫BOS我爱猫×
00
×
00
×
00
×
00
×
00
×
00
屏蔽未来位置
j>t⇒Atj=0j>t\quad\Rightarrow\quad A_{tj}=0
先加负无穷,再做 softmax
1.01.0
0.40.4
0.60.6
0.20.2
0.30.3
0.50.5
0.10.1
0.20.2
0.30.3
0.40.4
每行独立归一化
∑jAtj=1\sum_j A_{tj}=1
数字是教学示意权重
训练时:同时计算各行
BOS→我\mathrm{BOS}\to\text{我}
我→爱\text{我}\to\text{爱}
爱→猫\text{爱}\to\text{猫}
猫→EOS\text{猫}\to\mathrm{EOS}
生成时:逐步扩展前缀
BOS→我→爱→猫→EOS\mathrm{BOS}\to\text{我}\to\text{爱}\to\text{猫}\to\mathrm{EOS}
下一步取决于刚选出的 token

读图重点:右上角被屏蔽,主对角线可见。矩阵数字仅示意归一化结果,不来自前文的三 token 演算;允许区域同时用边框、数字和位置表达。

播放控件显示当前步骤。键盘 ← / → 切换步骤,Home / End 查看起点和终点。