内容提要
本文介绍了解码器模块的工作原理,包括自注意力层、残差连接和层归一化、编码器-解码器注意力层和前馈层。解码器通过自回归方式生成输出序列的下一个token,并利用编码器的输出进行注意力互动。最后,通过线性层和softmax层将解码器的输出转换成概率,并使用贪婪解码选择最可能的下一个token。文章还提供了一个随机编码器-解码器Transformer的示例,并介绍了生成输出序列的过程。
延伸解读
简化示例的用意与局限
文章刻意将嵌入维度从512降到4、注意力头从8减到2,是为了让矩阵运算可以手工验证,从而直观展示Transformer的数学流程。这种简化有助于理解每一步的形状变换和公式,但也会放大数值不稳定性,例如文中softmax输出接近0和1、多层堆叠后出现NaN。读者应意识到,这些现象源于随机初始化和极小维度,并非真实训练中的常态,实际模型依靠大规模数据和调参来避免此类问题。
残差连接与层归一化的实际作用
文中通过六层编码器堆叠后出现NaN的实验,直观展示了深度网络中梯度爆炸的风险。残差连接将输入直接加到子层输出上,缓解梯度消失;层归一化则对每个嵌入向量在特征维度上标准化,使其均值为0、标准差为1,并引入可学习的缩放和偏移参数以保留表达能力。两者结合让深层Transformer能够稳定训练,这也是原论文在3.1节强调的关键设计。
编码器-解码器注意力的分工
解码器包含两个注意力层:掩蔽自注意力层让解码器只能关注已生成的token,避免看到未来信息;编码器-解码器注意力层则用解码器的当前状态生成查询,用编码器输出生成键和值,从而让解码器在生成每个词时都能聚焦于输入序列的关键部分。这种设计特别适合翻译等序列到序列任务,也是解码器比编码器多一层注意力的原因。
自回归生成与贪婪解码的取舍
解码器以自回归方式逐token生成输出,每次将已生成的序列作为下一次输入,直到产生结束符。这种串行过程导致解码器比编码器慢,因为编码器可一次前向传播处理整个输入。最终输出通过线性层映射到词表大小,再经softmax得到概率,贪婪解码选择概率最高的token。文章指出贪婪解码简单直接,但可能不是最优选择,有时会导致不理想的生成结果。
Q&A
Transformer中的位置编码有什么作用?具体是怎么计算的?
位置编码用于反映单词在句子中的具体位置,因为现有的嵌入技术无法捕获位置信息。它通过正弦和余弦函数生成:对于偶数索引使用正弦函数,奇数索引使用余弦函数,公式为PE(pos, 2i) = sin(pos / 10000^(2i/d_model)),PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))。然后将位置编码与原始嵌入相加,得到包含位置信息的输入表示。
多头注意力机制是如何工作的?为什么要使用多个头?
多头注意力机制通过多个独立的注意力头同时关注来自不同表示子空间的信息。每个头有自己的查询(Q)、键(K)、值(V)权重矩阵,将输入嵌入转换为不同维度的Q、K、V向量。各头的注意力输出被拼接起来,再通过一个线性变换得到最终输出。使用多个头可以让模型捕获更丰富的信息,控制计算复杂性,并提升性能。
解码器中的编码器-解码器注意力层与自注意力层有什么区别?
在自注意力层中,查询、键、值都来自同一输入(解码器的上一层输出)。而在编码器-解码器注意力层中,查询来自解码器的上一层输出,键和值来自编码器的输出。这使得解码器能够关注输入序列的关键部分,适用于翻译等任务,让解码器每个位置都能覆盖输入序列的全部位置。
残差连接和层归一化在Transformer中起什么作用?
残差连接通过将层的输入加到输出上,帮助减轻梯度消失问题,促进梯度流动。层归一化对每个嵌入在特征维度上进行标准化,使其均值为0、标准差为1,并引入可学习的缩放参数γ和偏移参数β以保持表达能力。两者结合可以防止梯度爆炸,使深度网络训练更稳定。
Transformer解码器是如何生成输出序列的?
解码器以自回归方式工作:从起始标记SOS开始,结合编码器的输出,通过多个解码器块生成下一个token。每个解码器块包含掩蔽自注意力、编码器-解码器注意力、前馈层以及残差连接和层归一化。最后通过线性层和softmax层将输出转换为词汇表上的概率分布,选择概率最大的token(贪婪解码),并将该token作为下一步的输入,直到生成结束标记EOS。
为什么解码器比编码器运行速度慢?
因为解码器采用自回归方式生成输出,需要多次前向传递:每次生成一个token,并将之前生成的token作为下一步的输入。而编码器可以在一次前向传递中处理整个输入序列并生成嵌入表示。因此,仅使用编码器的架构(如BERT)比仅使用解码器的架构(如GPT-2)运行得更快。
什么是贪婪解码?它有什么缺点?
贪婪解码是一种生成方法,在每个时间步选择概率最高的下一个token作为输出。虽然这种方法直接有效,但并不总是最优选择,因为它可能导致局部最优解,生成不太理想的序列。例如,它可能错过整体概率更高的序列。