解码器的解码流程
1.输出嵌入的右向偏移
再开始处理输入序列之前,模型对输出嵌入进行一个向右偏移的一个位置,确保在训练阶段,解码器内的每个符号都能正确的获取之前生成符号的上下文
2.位置编码的整合 按照编码器的设计,模型将位置编码和输出嵌入相结合,以此保留符号序列的顺序信息
3.带掩码的多头自注意力机制
解码器利用带掩码的多头自注意力机制专注于相关片段以及之前产生的符号。在训练过程中,通过掩码技术,防止模型对模型对未来符号的预知,确保每个符号能参考其之前的符号
4.编码器-解码器注意力交互 除了带掩码的自注意力机制外,解码器还融合了编码器-解码器注意力交互,这使得解码器能够聚焦于输入序列的重要部分,进而生成受输入语境影响的输出符号。
5.基于位置的前馈网络 在自注意力层之后,解码器对每个符号独立施加位置编码的前馈网络。该网络旨在捕捉输入和已生成符号之间的复杂模式与关联,以助力精确输出序列的构建。
除了与 Encoder 一样的 Self-Attention 和 Feedforward Network,Decoder 还增加了一个关键的组件——Masked Self-Attention(掩蔽自注意力)。 Masked Self-Attention:在 Decoder 中,当前时刻的位置只能看到它之前的部分,而不能看到未来的位置(即避免信息泄露)。这种掩蔽机制确保了自回归生成模型的性质,防止模型在生成时提前看到未来的词。
解码器的流程为
掩码机制
掩码(mask)的作用:
1. 因果关系(Causality)
在序列生成中,每个输出仅仅应当依赖于之前的输出。例如,生成句子的第四个单词时,我们只能考虑前三个单词,而不能考虑第五个单词。加入掩码确保模型在训练时保持这种因果关系。
2. 训练与推理的一致性
在推理(即实际使用)时,我们通常采用自回归方式生成序列:一次生成一个标记,然后将其作为新输入传递回模型。使用掩码确保模型在训练和推理时的行为是一致的。
3. 避免信息泄露
如果不使用掩码,模型可能会在训练期间“窥视”未来的标记,并过度依赖这些信息。这会导致在推理时性能下降,因为在实际应用中这些未来的标记是不可用的。
在实际操作中,掩码通常是一个上三角形状的矩阵,其中上三角(包括对角线)的部分设为0,其余部分设为负无穷(或非常大的负数)。在应用 softmax 函数计算注意力权重之前,这个掩码会被加到注意力分数上,这样上三角部分的分数在 softmax 后基本上就会变成0,从而实现了掩蔽效果。
padding
假设训练中最长的句子为10个tokens,那么这两句话:
- “我喜欢猫猫”
- “我喜欢打羽毛球”
为了处理这些句子,我们需要将它们转换为模型可以理解的格式。
首先,我们将每个中文字符视为一个token,然后按照以下步骤操作:
步骤 1:Tokenization 我们将每个句子分词,得到以下token序列:
- “我” “喜” “欢” “猫” “猫”
- “我” “喜” “欢” “打” “羽” “毛” “球”
步骤 2:Padding 由于训练集中最长的句子长度为10个tokens,我们需要对这两个句子进行填充,使它们的长度都达到10个tokens。通常使用一个特殊的填充token(例如"")来实现这一点:
- “我” “喜” “欢” “猫” “猫” “” “” “” “” “”
- “我” “喜” “欢” “打” “羽” “毛” “球” “” “” “”
步骤 3:Masking 现在,模型需要知道哪些是真正的token,哪些是填充的token。这是通过创建一个掩码矩阵来实现的,掩码矩阵与输入序列的长度相同。在这个掩码矩阵中,真实token的位置用0表示,填充token的位置用1表示:
- 掩码:[0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
- 掩码:[0, 0, 0, 0, 0, 0, 0, 1, 1, 1]
步骤 4:应用掩码 在模型的注意力机制中,特别是在计算softmax之前,我们会将这些掩码应用到模型中。具体来说,我们会在掩码为1的位置上加上一个非常大的负数(例如负无穷),这样在经过softmax操作后,这些位置的值将接近0,从而不会对全局概率预测产生影响。
通过这种方式,模型在计算注意力权重时,会忽略填充token,确保只关注实际的内容token。这样,模型就能够正确地学习序列数据,而不会被填充token所干扰。
- 自注意力:通过计算输入序列中每个元素的查询(Q)与所有其他元素的键(K)的关系,为每个元素生成表示。它关注的是元素之间的相互关系。
- 多头注意力:对自注意力的扩展,使用多个“头”来从不同的角度捕捉输入的不同信息,增强模型的学习能力。
- 位置编码:解决自注意力无法捕捉序列顺序的问题,通过添加位置信息,使模型理解每个词的位置信息