一、解码器的实现步骤

为了方便描述解码器的实现步骤,以下是解码器中这一过程的简化流程图:

输入序列 (目标语言) ----> 嵌入位置编码 ----> 解码器自注意力层 ----> 编码器-解码器注意力层 ----> 融合编码器输出 ----> 解码器前馈网络 ----> 输出序列

二、因果掩码

因果掩码源自以上流程中解码器自注意力层,它和前面所学的编码器注意力层是一样的,就是多了个因果掩码(Causal Mask),也称为三角掩码或下三角掩码,其中矩阵的对角线及以上的元素为0(或负无穷大,用于Softmax操作前的计算),对角线以下的元素为1。这意味着在自注意力计算中,对于序列中的每个位置,只有该位置及之前的位置会被考虑,而该位置之后的位置会被掩码掉。

因果掩码应用于计算注意力分数之前。掩码与查询(Query)和键(Key)的点积结果相乘,通常用来将某些分数置为负无穷大(在softmax操作之前),这样在应用softmax函数时,这些位置的权重会接近于零。

为了方便描述在自注意力层中注意力掩码的位置,带箭头的流程如下:

输入序列 ----> 获得Q, K, V ----> 计算Q和K的点积 ----> 对点积结果掩码操作 ----> 除以\sqrt{d_k} ----> Softmax归一化 --> 获取计算注意力权重 --> 权重与V相乘 --> 输出。

三、解码器自注意力层

解码器自注意力层的流程需要经过以下几个步骤:

  1. 输入序列

    • 模型接收输入序列,通常是经过嵌入和位置编码处理的。

  2. 获得Q, K, V

    • 输入序列通过线性变换生成查询Q、键K和值V。

  3. 计算Q和K的点积

    • 计算查询Q和键K之间的点积,得到原始的注意力分数。

  4. 掩码操作

    • 应用掩码(如因果掩码或填充掩码)以防止模型在自注意力计算中关注不适当的信息。

  5. 除以\sqrt{d_k}

    • 为了数值稳定性,将点积结果除以键向量维度d_k的平方根。

  6. softmax

    • 应用softmax函数将注意力分数转换为概率分布,即注意力权重。

  7. 计算注意力权重

    • 使用softmax函数处理后的注意力分数。

  8. 权重与V相乘

    • 使用计算得到的注意力权重对值V进行加权求和。

  9. 输出

    • 最终得到自注意力层的输出,这将作为下一层的输入或作为最终的序列表示。

四、编码器-解码器注意力层

接下来要对编码器和解码器之间的特征进行融合,这个过程是通过注意力机制实现的,而不是简单的相乘或拼接。具体来说,是通过编码器-解码器注意力层(Encoder-Decoder Attention)来实现的。以下是这个过程的详细步骤:

  1. 编码器的输出

    • 编码器处理源语言序列后,生成了一系列的输出,这些输出包含了源语言序列的语义和句法信息。

  2. 解码器的自注意力层的输出

    • 解码器首先在自注意力层处理目标语言序列的输入。在这个层中,使用因果掩码(确保解码器只能看到当前位置之前的信息)。

  3. 编码器-解码器注意力层

    • 在编码器-解码器注意力层,解码器自注意力层的输出作为查询(Query),编码器的输出作为键(Key)和值(Value)。

    • 解码器生成的查询Q与编码器的键K进行点积操作,计算出注意力分数。

    • 这些注意力分数经过标准化(通常是除以键向量维度的平方根)和Softmax函数处理,得到注意力权重。

    • 然后,这些权重用于编码器的值V进行加权求和,得到编码器-解码器之间的融合特征。

  4. 融合特征

    • 融合后的特征(即编码器-解码器注意力层的输出)与解码器自注意力层的输出进行残差连接,并通过层归一化(Layer Normalization)。

  5. 前馈网络

    • 经过层归一化的特征随后进入解码器的前馈网络,进行进一步的非线性变换。

  6. 输出

    • 最终,解码器层的输出会被传递到下一个解码器层,或者作为最终的输出序列。

在实际的Transformer模型中,编码器和解码器之间的信息流动是通过注意力机制动态地实现的,而不是通过简单的拼接或相乘。这种注意力机制允许解码器在生成每个词时,能够根据当前的上下文动态地选择源语言序列中最重要的信息。

总结来说,编码器的特征不是直接与解码器的特征拼接,而是通过注意力机制进行加权融合,这样解码器就可以在生成目标语言序列时充分利用源语言的信息。

五、解码器面临的挑战

在翻译的开始时,解码器通常从一个特殊的起始标记(如 <sos>)开始,以触发序列的生成。

输入的起始标记和位置编码相加,输入到模型中,期间会和编码器的输出融合,最后经过处理,输出预测结果。

但随着聊天次数的增多,在每次迭代中,解码器都会将上一次生成的输出作为本次的输入的一部分。因此,Transformer解码器在自回归(autoregressive)翻译或生成任务中的工作方式与RNN有相似之处。

也就是说,解码器的输入就像RNN一样,每次都要将上一轮输出的内容作为本轮的输入,随着聊天的次数增多,会越积累越多。这种方式确保了生成的序列可以逐步构建,同时保持与之前生成内容的连贯性。

随着聊天或生成任务的进行,解码器需要处理的历史信息量会增加,这可能会对内存和计算效率产生影响。因此,为了提高效率,研究人员和工程师们开发了各种优化技术,如缓存机制(用于存储重复计算的状态),以及在生成过程中使用beam search等策略来平衡质量和速度。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐