轻松理解 Transformers (4) :Decoder 和 Output 部分

原创
2023/11/13 09:57
阅读数 41

编者按:Transformers凭借其卓越的性能,已经成为自然语言处理领域的代表性模型架构。但是Transformers的内在机制却比较复杂,对许多读者来说可能还存在一定的难度。本系列对 Transformer各组件进行逐一剖析,我们可以更直观地理解这个模型架构的整体运行逻辑。本篇文章是《轻松理解Transformers》系列的最后一篇,主要介绍Transformer的Decoder和Output 部分。

文章首先指出,Transformers属于编码器-解码器架构,输入数据通过编码器转换为数学表征,再输入解码器生成最终输出。接着又以Teacher Forcing为线索,剖析了带Mask的Decoder是如何基于Encoder 的输出,一步步生成目标语言的。在描述每个组件的作用时,作者都会补充通俗的示例或类比,帮助读者更好地理解 Transformers 。

这种融通俗性、系统性与启发性为一体的写作风格,使得本文对于理解 Transformer模型具有很高的参考价值。如果想要全面理解这个极具代表性的模型架构,本文将是很好的学习资料。预祝各位读者的深度学习旅途越走越顺!

以下是译文,enjoy!

作者 | Chen Margalit

https://www.linkedin.com/in/chen-margalit/

编译 | 岳扬

本文经原作者授权,由Baihai IDP编译。如需转载译文,请联系获取授权。

原文链接:https://medium.com/towards-data-science/simplifying-transformers-state-of-the-art-nlp-using-words-you-understand-part-5-decoder-and-cd2810c6ad40

🚢🚢🚢欢迎小伙伴们加入AI技术软件及技术交流群,追踪前沿热点,共探技术难题~

图片来自 Vaswani, A. 等人的论文[1]

如果您之前没有阅读过本系列的前几篇文章,并且对上图架构中左侧组件的工作原理不太了解,我建议你先阅读本系列的其他文章。本文中未解释的任何术语都可能在本系列前面几篇文章中有过介绍。

本系列往期文章:
轻松理解 Transformers(1):Input部分
轻松理解 Transformers(2):Attention部分
轻松理解 Transformers(3):Feed-Forward Layer部分

01 解码器 Decoder

Transformers 是一种编码器-解码器(Encoder-Decoder)架构。输入的数据经过编码(转换)成数学表征(某种形式的数字,通常是向量)。然后,它被传输到另一个被称为解码器的处理单元,在解码器中将数字转换回所需的输出。 在语言模型中,就是生成一个单词作为最终的输出结果。

解码器的首要任务是根据目标序列(我们想要给出的答案)创建值矩阵。它会接收整个目标序列,将其转换为嵌入向量(Embeddings),并像编码器(encoder)一样添加位置编码。然后,它将嵌入向量传递给一个带掩码的多头注意力层,该层就会创建值矩阵。这个矩阵将帮助模型决定用户的Prompt和预期目标如何共同发挥作用。

在解释 Transformers 的工作原理时存在一种悖论,因为我们需要理解各个组成部分才能理解最终结果(end result)是如何产生的,但我们同时也需要理解最终结果是如何产生的才能理解各个组成部分。在解释Transformer的训练过程时,我们将超越当前的理解,从未来的角度进行解释,以便更好地理解Transformer的训练方式:

首先,在编码器中,用户的Prompt被转换为嵌入向量,然后我们在其中添加位置编码。编码器组(原始论文中为6个)处理数据并生成文本的数字表征。接下来,在解码器中,我们将期望的输出(我们希望模型回应的内容)会被加上一个特殊的标记,表示这是每条句子的第一个标记。比如像<BOS>(句子开头)这样的标记,但也可以是模型训练时使用的其他符号。这个输入(input)被转换为嵌入向量,并添加位置编码。解码器组(最初也是6个)接收这些向量,并与编码器的输出一起生成新的单词表征(word representation)。再将单词表征转换为概率分布(probability distribution),并从模型的整个数据集中选出概率最高的单词。最后,根据模型所选单词和模型期望的输出之间的差距计算损失函数。该损失函数可用于生成梯度(gradients),而这些梯度对于反向传播算法(一种根据各自对整体误差的贡献计算权重应如何变化的算法)非常重要。

既然我们已经了解了总体流程,那么让我们来看看一个微小但重要的细节:我们使用的一种名为Teacher Forcing的技术。

02 Teacher Forcing

假如你要做一个数学测试,这个测试有3个题目:

  1. 取数字4,加上5,并记下分数。

  2. 取第一题的结果,乘以2,记分。

  3. 取第二题的结果,除以2。

如果根据每个题目解答的结果单独排名,无论对错。您发现什么问题了吗?如果第一题做错了,那么在第二题和第三题中也会做错。Teacher Forcing技术就解决了这个问题。 由于语言模型也是基于序列的(例如,如何预测第二个单词取决于第一个单词是什么),为了后续的内容正确,必须在之前的内容就正确。在上文给出的示例中,Teacher Forcing会在第二题给出正确答案,然后在第三题给出正确答案,这样实际上我们接受的是乘法/除法测试,而不是加法测试。每个题目仍会单独评分,只是不会因为在第一题中犯错误而在第二题中受到影响。

具体而言,Teacher Forcing可以帮助我们更快地完成训练。我们在每个步骤都给模型提供正确的标签,确保第x个单词的预测是准确的。例如,第4个单词将基于前3个正确的标签,而不是可能有错误的预测标签,这样可以确保模型不会因为之前的错误而无法继续正确地运行。

好的,现在回归正题。在将输入转换为嵌入向量并添加位置编码之后,我们将输入通过一个带有掩码的多头注意力层进行处理。

03 带有掩码的多头注意力机制  Masked Multi-Head Attention

在本系列前面部分的内容已经介绍了注意力层(attention layer)的作用和存在的原因。带有掩码的注意力层基本上是出于同样的原因做同样的事情,但有一个重要区别。由于解码器会处理全部的期望输出,模型很容易在构建注意力得分(attention scores)时使用整个序列。由于这些注意力得分是 Transformers 工作机制的重要组成部分,因此我们必须正确处理。假设我们需要生成这样一条句子:“Amazing technology, I love it”。在当前阶段,我们正试图预测单词“technology”。但在推理时(实际使用模型的时候),模型只能逐步生成输出,而无法一次性获取整个句子的信息。 因此,在训练模型时,为了使其能够适应实际使用,我们需要确保模型只能依赖于已经生成的前面的单词,而不能直接访问后面的单词。 这个步骤就是通过掩码(隐藏)未来的单词来实现的。

你可能已经猜到了,由于机器学习与数学紧密相连,并不仅仅只有隐藏单词这样一种方法,还有一种更高级的方法。具体来说,在计算注意力得分时,我们会加上负无穷大(一个非常小的负数,例如-86131676513135468),这将使得在下一阶段softmax函数会将这些负数变为0。这种技术确保了模型在没有访问权限的情况下无法访问下一个单词。

该图片由作者提供

在计算完经过掩码的注意力得分之后,输入(the input)会经过一个“Add & Normalize”层(译者注:“Add & Normalize”层主要执行加法和归一化操作。),其工作方式和使用原因与该系列文章第二篇所解释的相同。它还接收来自注意力计算(attention calculation)前层的skip connection(译者注:本系列第二篇文章第6节介绍了skip connection技术)。之后,值矩阵(Values)进入下一阶段。然后从编码器中获取Q(查询)和K(键)矩阵,它们分别代表用户的提示词(Prompt)和针对给定的查询(query),可能的建议或推荐内容。(译者注:编码器提供了与查询相关的建议,这些建议可以用来帮助解码器生成合适的输出。这些建议可以是与查询相关的相关单词、短语或句子,用于辅助解码器在生成输出时做出更准确的决策。)解码器带有自己的值矩阵(Values),以决定重点关注编码器输入的哪一部分。通过这3个矩阵(2个来自编码器,1个来自解码器),我们计算出一个“常规”的注意力得分。

接下来,又有另一个前馈网络和 “Add & Normalize”层,它接收另一个skip connection,就像前文说明的那样,然后...解码器部分就讲述完成了!

现在我们来到最后一步。堆叠的解码器层(stack of decoders)中的最后一个(即第6个)解码器(译者注:在 Transformers 架构中,解码器通常由多个相同结构的解码器层组成。堆叠的解码器层可以通过逐层传递信息和特征来逐步生成输出,从而实现更准确的预测和生成)将其输出传递给一个线性层(linear layer)。通过线性层,我们可以生成任意数量的数字表征。在语言模型中,我们希望表征的数量与模型的词汇量相匹配。如果模型的全部词汇量(它所见过的所有单词)是 1000 个,那么就需要 1000 个数字来表示词汇表中的每个单词。我们需要对每个位置上的每个单词都这样做。如果最终的输出内容拥有10个单词,我们要为其中的每一个单词计算1000个数字(译者注:即需要为每个单词生成一个1000维的数值向量)。然后,我们将其传递给一个Softmax层,该层会给出每个单词的概率,最高概率的单词就是我们要使用的单词。Softmax会返回给我们一个索引,比如3。模型就会输出词汇表中索引为3的单词。如果我们的词汇表是['a', 'man', 'works', 'nice', 'go'],那么输出的单词将是'nice'。

本系列文章的全部内容到此结束,感谢您的支持!希望通过阅读本系列文章,能够让您对Transformers架构的工作原理有一个较为深入的理解。

Have a good time.

END

参考资料

[1]https://proceedings.neurips.cc/paper_files/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf

🚢🚢🚢欢迎小伙伴们加入AI技术软件及技术交流群,追踪前沿热点,共探技术难题~

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部