基于注意力机制的Transformer编码器-解码器架构的完整前向传播与自回归生成过程
题目描述
Transformer模型彻底改变了序列到序列(Seq2Seq)学习领域,其核心摒弃了传统的循环结构,完全依赖自注意力(Self-Attention) 和前馈网络(Feed-Forward Network) 来建模序列信息。本题目旨在详细拆解Transformer的编码器-解码器架构,深入讲解其完整的前向传播过程,以及在推理阶段如何利用编码器输出和解码器的自回归(Autoregressive) 机制生成目标序列的每一步。我们将从输入表示开始,逐步经过编码器栈、解码器栈,直至最终输出概率分布,并剖析其中的掩码(Masking)技术与自回归生成逻辑。
解题过程
让我们从数据如何流入模型开始,一步步拆解其计算图。
步骤1:输入表示与位置编码
模型的输入包括源语言序列(例如一句英文)和目标语言序列(例如对应的法文)。但在训练和推理阶段,解码器的输入处理方式不同。
- 词嵌入:将源序列的每个词(Token)通过一个可学习的嵌入矩阵转换为一个
d_model维的向量(例如512维),得到源序列嵌入矩阵X_src∈ ℝ^(N × d_model),其中N是源序列长度。同理,目标序列在训练时使用整个序列,在推理时使用已生成的部分序列,得到目标序列嵌入矩阵X_tgt∈ ℝ^(M × d_model),M是目标序列长度。 - 位置编码:由于自注意力机制本身是位置无关的(置换等价),必须显式注入序列的顺序信息。Transformer使用正弦和余弦函数来生成固定的位置编码向量
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))和PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model)),其中pos是位置,i是维度索引。最终,编码器输入E_in = X_src + PE_src,解码器输入D_in = X_tgt + PE_tgt。这确保了模型能感知每个词在序列中的绝对位置。
步骤2:编码器(Encoder)栈的前向传播
编码器由L个完全相同的层堆叠而成,每层包含两个核心子层。
- 多头自注意力子层:
- 查询、键、值投影:对于第
l层的输入H^(l-1)(第0层为E_in),分别通过三个不同的线性层投影得到查询(Q)、键(K)、值(V) 矩阵,每个头的维度为d_k = d_model / h(h为头数)。 - 缩放点积注意力:计算
Attention(Q, K, V) = softmax( (Q K^T) / √d_k ) V。这个操作让序列中的每个词都能基于键-值对与所有其他词(包括自身)进行交互,通过注意力权重聚合信息。在编码器中,这是一个全局注意力,没有掩码,每个词能看到整个源序列的上下文。 - 多头拼接与线性变换:
h个头的输出被拼接起来,再通过一个线性层W^O投影回d_model维,得到多头注意力输出MultiHead(Q, K, V)。 - 残差连接与层归一化:
Z = LayerNorm( H^(l-1) + MultiHead(Q, K, V) )。这有助于缓解深层网络中的梯度消失问题。
- 查询、键、值投影:对于第
- 前馈网络子层:
FFN(x) = max(0, x W_1 + b_1) W_2 + b_2,这是一个两层全连接网络,中间使用ReLU激活。它独立地应用于Z的每个位置。 - 再次残差连接与层归一化:
H^(l) = LayerNorm( Z + FFN(Z) )。
经过L层的处理后,我们得到编码器的最终输出H_enc = H^(L)∈ ℝ^(N × d_model),它融合了源序列所有词之间的丰富上下文信息。
步骤3:解码器(Decoder)栈的前向传播与掩码机制
解码器同样由L个相同的层堆叠,但每层包含三个子层,且其自注意力子层是掩码的。
- 掩码多头自注意力子层(第一个子层):
- 输入是解码器的嵌入与位置编码之和
D_in(训练时为完整目标序列,推理时为已生成的序列)。 - 与编码器自注意力类似,但计算注意力权重时,必须防止当前位置“看到”未来的信息(即自回归属性)。这是通过在
softmax之前,在(Q K^T)矩阵的上三角部分(不包括对角线右侧,具体实现时可能包含当前位置自身)加上一个极大的负值(如-1e9)来实现的,称为因果掩码(Causal Mask)。这样,在计算第t个位置的输出时,它只能关注到位置1到t(包括t自身)的信息。此步骤旨在让解码器在生成过程中,仅基于已生成的部分来构建其内部表示。 - 同样经过残差连接和层归一化,输出记为
M。
- 输入是解码器的嵌入与位置编码之和
- 编码器-解码器注意力子层(第二个子层,或称交叉注意力):
- 此子层的查询(Q) 来自于上一步的输出
M,而键(K) 和值(V) 则来自于编码器的最终输出H_enc。 - 计算
CrossAttention(Q, K, V) = softmax( (Q K^T) / √d_k ) V。这里没有因果掩码,因为编码器的输出H_enc代表了完整的源序列信息,解码器的每个位置都可以访问所有这些信息。这个机制允许解码器在生成目标序列的每个词时,都能“有选择地关注”源序列的不同部分,实现对齐。 - 同样经过残差连接和层归一化,输出记为
C。
- 此子层的查询(Q) 来自于上一步的输出
- 前馈网络子层(第三个子层):与前一步骤相同,
FFN(C)后再经过残差连接和层归一化,得到当前解码器层的输出H_dec^(l)。
经过L层解码器处理后,得到解码器的最终输出H_dec = H_dec^(L)∈ ℝ^(M × d_model)。
步骤4:输出层与自回归生成
- 线性投影与Softmax:解码器的最终输出
H_dec通过一个线性层(其权重矩阵通常与目标词嵌入矩阵共享,以节省参数并提升效果)投影到目标词汇表大小的维度V。然后,对这个V维向量应用softmax函数,得到当前步在整个词汇表上的概率分布P = softmax(H_dec * W_out)∈ ℝ^(M × V)。 - 训练阶段:对于完整的目标序列,我们同时计算所有
M个位置的概率分布,并与真实的“下一个词”进行交叉熵损失计算,这称为“教师强制”(Teacher Forcing)。 - 推理/生成阶段(自回归):这是关键的不同点。
- 从起始符
<sos>开始,将其作为初始解码器输入(序列长度为1)。 - 将
<sos>的嵌入向量(加上位置编码)送入解码器。解码器利用编码器输出的H_enc和因果掩码的自注意力,计算出第一步的隐藏状态,并通过输出层得到第一个词在词汇表上的概率分布P_1。 - 根据
P_1,通过贪婪搜索(取概率最大的词)或束搜索(维护多个概率高的候选序列)选择第一个生成的词y_1。 - 将
<sos>, y_1拼接,作为新的解码器输入序列(长度为2),重复上述过程,计算第二步的概率分布P_2,并选择y_2。 - 以此类推,每次生成都将之前所有已生成的词作为输入,直到生成结束符
<eos>或达到最大生成长度。这个“基于历史生成未来”的过程就是自回归生成。
- 从起始符
总结
Transformer通过编码器利用全局自注意力对源序列进行深度编码,生成富含上下文的表示H_enc。解码器则通过掩码自注意力确保自回归性,再通过编码器-解码器注意力(交叉注意力)桥接源序列信息,最后通过线性层和softmax产生目标词的概率分布。在推理时,模型以自回归的方式,将上一步的输出作为下一步的输入,逐步生成整个目标序列。这个过程完全并行化了训练,并在推理时高效地利用了缓存机制,是Transformer强大能力的基础。