简介
Transformer 模型由编码器(Encoder)和解码器(Decoder)两部分组成。这里我会着重描述解码器的结构以及在预训练、输入输出和预测时的输入输出。
解码器结构:
-
自注意力层(Self-Attention Layers):与编码器类似,解码器也包含多个自注意力层,用于在解码器端对输出序列的不同位置进行关注,解码器中的自注意力层被修改为接受一个遮盖(masking)向量,以便在计算注意力权重时将未来的信息屏蔽掉,只关注当前位置之前的信息。。
-
编码器-解码器注意力层(Encoder-Decoder Attention Layers):除了自注意力层外,解码器还包含编码器-解码器注意力层,用于将编码器端的信息与解码器端的信息进行交互,帮助解码器更好地理解输入序列。
-
前馈神经网络(Feed-Forward Neural Networks):与编码器一样,解码器也包含前馈神经网络层,用于对特征进行映射和转换。
-
位置编码(Positional Encoding):解码器也需要位置编码来将位置信息融入模型中,以便模型能够理解输入序列的顺序信息。
Decoder在预训练、输入输出和预测时的输入输出:
-
预训练:
- 输入:在预训练期间,解码器的输入通常是由目标序列(target sequence)以及可选的编码器端输出的上下文信息组成。这些输入经过嵌入(embedding)和位置编码后,被送入解码器中。
- 输出:解码器预训练的目标是生成目标序列的下一个词的概率分布。因此,在每个时间步,解码器会生成一个预测概率分布,以便训练模型。
-
输入输出:
- 输入:在进行输入输出(Inference)时,解码器的输入通常是由上一个时间步生成的词以及编码器端的上下文信息组成。这些输入通过嵌入和位置编码后,传递给解码器。
- 输出:解码器在每个时间步生成的输出通常是一个概率分布,用于预测下一个词的概率。根据应用场景,可以使用不同的策略(如贪婪搜索、束搜索等)来选择最终的输出序列。
-
预测:
- 输入:在预测阶段,解码器的输入通常是由起始符号(如)以及编码器端的上下文信息组成。这些输入经过嵌入和位置编码后,传递给解码器。
- 输出:解码器生成的输出是一个概率分布,用于预测下一个词的概率。根据应用需求,可以根据生成的概率分布采样得到最终的预测结果。
结构
上图红色部分为 Transformer 的 Decoder block 结构,与 Encoder block 相似,但是存在一些区别:
- 包含两个 Multi-Head Attention 层。
- 第一个 Multi-Head Attention 层采用了 Masked 操作。
- 第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行计算,而Q使用上一个 Decoder block 的输出计算。
- 最后有一个 Softmax 层计算下一个翻译单词的概率。
先理解:自注意力的计算过程
原理
第一个 Multi-Head Attention
Decoder block 的第一个 Multi-Head Attention 采用了 Masked 操作,因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词。通过 Masked 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。下面以 “我有一只猫” 翻译成 “I have a cat” 为例,了解一下 Masked 操作。
下面的描述中使用了类似 Teacher Forcing 的概念,不熟悉 Teacher Forcing 的童鞋可以参考以下上一篇文章Seq2Seq 模型详解。在 Decoder 的时候,是需要根据之前的翻译,求解当前最有可能的翻译,如下图所示。首先根据输入 “” 预测出第一个单词为 “I”,然后根据输入 “ I” 预测下一个单词 “have”。