变形金刚
当今的生成 AI 应用程序由 语言模型提供支持,这是一种专用的机器学习模型,可用于执行 自然语言处理 (NLP)任务,包括:
- 确定 情绪 或对自然语言文本进行分类。
- 汇总文本。
- 比较多个文本源的语义相似性。
- 生成新的自然语言。
虽然这些语言模型背后的数学原理可能比较复杂,但对用于实现它们的体系结构的基本了解可以帮助你了解它们的工作方式。
转换器模型
用于自然语言处理的机器学习模型多年来一直在发展。 如今的尖端大型语言模型基于 转换器 体系结构,该体系结构基于并扩展了一些技术,这些技术在建模 词汇 方面已经被证明是成功的,以支持 NLP 任务,尤其是生成语言。 转换器模型使用大量的文本进行训练,使它们能够表示字词之间的语义关系,并使用这些关系来确定可能有意义的文本序列。 具有足够大词汇的转换器模型能够生成难以区分人类响应的语言响应。
转换器模型体系结构由两个组件或 块组成:
- 一个 编码器 块,用于创建训练词汇的语义表示形式。
- 生成新语言序列的 解码器 块。
- 该模型使用大量自然语言文本进行训练,通常源自 Internet 或其他公共文本来源。
- 文本序列划分为标记(例如,单个单词),编码器块使用一种称为注意的技术处理这些令牌序列以确定令牌之间的关系(例如,这些标记会影响序列中存在其他标记、同一上下文中常用的不同标记等)。
- 编码器的输出是矢量(多值数值数组)的集合,其中矢量的每个元素都表示标记的语义属性。 这些向量称为嵌入。
- 解码器块适用于新的文本令牌序列,并使用编码器生成的嵌入来生成适当的自然语言输出。
- 例如,鉴于输入序列(如 #B0),模型可以使用注意技术来分析在嵌入中编码的输入标记和语义属性,以预测句子的适当完成,例如 #B1。
实际上,体系结构的特定实现有所不同-例如,Google 开发的转换器(BERT)模型的双向编码器表示形式仅使用编码器块,而 OpenAI 开发的生成预训练转换器(GPT)模型仅使用解码器块。
虽然转换器模型的各个方面的完整说明超出了本模块的范围,但对转换器中某些关键元素的说明可以帮助你了解它们如何支持生成 AI。
标记化
训练转换器模型的第一步是将训练文本分解为 标记 - 换句话说,标识每个唯一的文本值。 为简单起见,可以将训练文本中的每个不同单词视为标记(尽管实际上,可以为部分单词生成标记,或者单词和标点符号的组合)。
例如,考虑以下句子:
I heard a dog bark loudly at a cat
若要标记此文本,可以标识每个离散单词,并为其分配标记 ID。 例如:
- I (1)
- heard (2)
- a (3)
- dog (4)
- bark (5)
- loudly (6)
- at (7)
- ("a" is already tokenized as 3)
- cat (8)
现在可以使用标记来表示句子。 {1 2 3 4 5 6 7 3 8} 同样,#D0 的句子可以表示为 #B1。
继续训练模型时,训练文本中的每个新令牌都会添加到具有适当令牌 ID 的词汇中:
- meow (9)
- skateboard (10)
- *and so on...*
使用足够大的训练文本集,可以编译成千上万个令牌的词汇。
嵌入
虽然将令牌表示为简单的 ID 可能很方便 - 实质上是为词汇中的所有单词创建索引,但它们不会告诉我们有关单词的含义或单词之间的关系的任何内容。 为了创建一个词汇来封装令牌之间的语义关系,我们为其定义上下文向量(称为 嵌入)。 矢量是信息的多值数值表示形式,例如 [10, 3, 1] ,其中每个数值元素表示信息的特定属性。 对于语言令牌,令牌矢量的每个元素都表示令牌的一些语义属性。 语言模型中矢量元素的特定类别是在训练期间确定的,具体取决于单词在一起使用的常见程度或类似上下文中。
矢量表示多维空间中的线条,描述沿多个轴 的方向 和 距离 (可以通过调用这些 振幅 和 数量级来给数学家朋友留下深刻的印象)。 将标记的嵌入向量中的元素视为表示多维空间中路径中的步骤,这非常有用。 例如,具有三个元素的向量表示三维空间中的路径,其中元素值指示向前/后退、左/右和向上/向下行驶的单位。 总的来说,矢量描述路径从原点到终点的方向和距离。
嵌入空间中的标记元素分别表示令牌的一些语义属性,因此语义上类似的标记应产生具有相似方向的向量,换句话说,它们指向同一方向。 一种称为 余弦相似性 的技术用于确定两个向量是否具有类似的方向(而不考虑距离),因此表示语义上链接的单词。 作为一个简单的示例,假设标记的嵌入由包含三个元素的矢量组成,例如:
- 4 ("dog"): [10,3,2]
- 8 ("cat"): [10,3,1]
- 9 ("puppy"): [5,2,1]
- 10 ("skateboard"): [-3,3,2]
我们可以在三维空间中绘制这些矢量,如下所示:
“"dog"
”和“"puppy"
”的嵌入向量描述了几乎相同方向的路径,这与“"cat"
”的方向也很相似。 然而,嵌入向量 "skateboard"
描述了通向截然不同方向的旅程。
注释
上一个示例演示了一个简单的示例模型,其中每个嵌入只有三个维度。 实际语言模型具有更多维度。
有多种方法可以计算给定令牌集的适当嵌入,包括语言建模算法(如 Word2Vec 或转换器模型中的 编码器 块)。
注意
转换器模型中的 编码器 和 解码器 块包括构成模型的神经网络的多层。 我们不需要深入了解所有这些层的详细信息,但考虑这两个块中使用的层类型之一非常有用: 注意 层。 注意是一种用于检查文本标记序列的技术,并尝试量化它们之间的关系强度。 特别是, 自我注意 涉及到考虑一个特定令牌周围的其他令牌如何影响令牌的含义。
在编码器块中,在上下文中仔细检查每个令牌,并为其矢量嵌入确定适当的编码。 向量值基于令牌与其经常出现的其他标记之间的关系。 这种注重上下文环境的方法意味着同一个词可能具有多个嵌入,具体取决于其使用的上下文,例如,“"the bark of a tree"
”的含义与“"I heard a dog bark"
”不同。
在解码器块中,注意层用于预测序列中的下一个标记。 对于生成的每个令牌,模型都有一个关注层,该层将考虑到该点的标记序列。 该模型考虑在考虑下一个令牌应是什么时最有影响力的令牌。 例如,给定序列“"I heard a dog"
”,在考虑序列中的下一个单词时,注意力层可能会为标记“"heard"
”和“"dog"
”分配更大的权重:
I *heard* a *dog* {*bark*}
请记住,注意层使用标记的数字向量表示形式,而不是实际文本。 在解码器中,该过程从表示要完成的文本的令牌嵌入序列开始。 发生的第一件事是,另一个 位置编码 层向每个嵌入添加一个值,以指示其在序列中的位置:
- [1,5,6,2](I)
- [2,9,3,1](听到)
- [3,1,1,2](a)
- [4,10,3,2](狗)
在训练期间,目标是根据前面的标记预测序列中最终令牌的向量。 到目前为止,注意层将数字 权重 分配给序列中的每个标记。 它使用该值对加权向量执行计算,该矢量生成一个 注意力分数 ,可用于计算下一个标记的可能向量。 在实践中,称为 多头关注 的技术使用嵌入的不同元素来计算多个关注分数。 然后,神经网络用于评估所有可能的令牌,以确定要继续序列的最可能令牌。 该过程对序列中的每个令牌进行迭代处理,到目前为止,输出序列会以递归方式用作下一次迭代的输入,实质上是一次生成一个输出令牌。
以下动画演示了这一工作的简化表示形式 - 实际上,注意力层执行的计算更为复杂:但原则可以简化,如下所示:
- 令牌嵌入序列会馈送到关注层中。 每个标记都表示为数值的向量。
- 解码器的目标是预测序列中的下一个标记,这也是一个与模型词汇中的嵌入对齐的向量。
- 注意层到目前为止会评估序列,并将权重分配给每个标记,以表示它们对下一个标记的相对影响。
- 权重可用于计算具有注意分数的下一个标记的新向量。 多头关注使用嵌入内容中的不同元素来计算多个备用令牌。
- 完全连接的神经网络使用计算向量中的分数来预测整个词汇中最可能的令牌。
- 到目前为止,预测输出将追加到序列中,该序列用作下一次迭代的输入。
在训练期间,已知令牌的实际顺序 – 我们只是掩码序列中稍后出现的标记,而不是当前考虑的令牌位置。 与在任何神经网络中一样,标记向量的预测值与序列中下一个向量的实际值进行比较,并计算损失。 然后增量调整权重,以减少损失并改进模型。 用于推理(预测新令牌序列)时,经过训练的注意层应用权重,用于预测模型中迄今为止语义上与序列对齐的最可能标记的权重。
这意味着,转换器模型(如 GPT-4(ChatGPT 和必应背后的模型)旨在采用文本输入(称为提示),并生成语法正确的输出(称为完成)。 实际上,模型的“magic”是它能够将一致的句子串在一起。 这种能力并不意味着模型的任何“知识”或“智能”:只是一个大词汇和生成有意义的单词序列的能力。 然而,大型语言模型(如 GPT-4)如此强大,是经过训练的数据量(来自 Internet 的公共和许可数据)以及网络的复杂性。 这使模型能够生成基于对模型进行训练的词汇中单词之间的关系的完成;通常生成与同一提示的人类响应无法区分的输出。