一、概述
让我们从生成式 AI 世界中的一些基本概念开始。
来源:解锁创成式 AI 模型和系统(如 GPT-4 和 ChatGPT)的力量,用于高等教育 学生和讲师指南 解锁创成式 AI 模型和系统(如 GPT-4 和 ChatGPT)的力量 面向高等教育 学生和讲师指南
1. 生成式人工智能
生成式人工智能是人工智能的一个分支,主要专注于生成新内容。虽然传统的机器学习模型被训练来识别模式、做出预测或对信息进行分类,但生成式人工智能完全是关于创造的(因此被称为"生成")。内容类型可以是图像、音乐,或者对我们的讨论来说很重要的文本。在机器学习的广阔领域中,将生成式 AI 视为专注于根据其训练输出新的原创内容的细分市场。
2. 语言模型
简而言之,语言模型 (LM) 是一种经过训练来理解和生成人类语言的 AI 模型。通过处理大量文本数据,它可以学习语法、词汇、上下文和细微差别,从而能够根据给定的提示生成相关文本。例如,它可以帮助自动完成句子,生成对问题的回答,甚至撰写文章。
3. 大语言模型
大型语言模型 (LLM) 本质上是标准语言模型的增强版本。他们接受了更大规模的训练,处理了更多样化和更广泛的数据集。由于这种广泛的培训,他们可以更深入地理解上下文,生成更连贯的文本,并处理更广泛的语言任务。这一类别中值得注意的例子包括OpenAI的GPT-3和GPT-4。
4. 生成式人工智能和大型语言模型
生成式人工智能与LLM有何关系?从本质上讲,LLM是生成AI的一个子集。如前所述,它们只是专门的模型,只关注文本,生成可以模仿人类编写内容的句子和段落。当我们在制作书面内容的背景下谈论生成人工智能时,我们经常指的是这些语言模型。
5. 基础模型
从本质上讲,基础模式就像我们生命早期接受的通识教育。它提供了对世界的广泛和基础的理解,但不是专业化。同样,人工智能中的基础模型是在庞大的数据集上预先训练的,使它们能够掌握广泛的一般模式和信息。它们的通用性允许它们使用较小的、特定于任务的数据集进行微调或适应特定任务。在许多方面,LLM可以被视为一种基础模型。例子包括GPT,BERT,Llama等。
二、变压器架构
1. 这是什么?
变压器架构是在2017年的"注意是你需要的一切"论文中提出的,并已成为构建LLM的热门选择。该架构允许模型使用注意力机制学习句子中所有单词的上下文,而不仅仅是局限于相邻单词。通过为单词之间的这些关系分配注意力权重 ,模型可以学习每个单词与其他单词的相关性,无论它们在输入文本中的哪个位置。根据权重值,模型在进行预测时可以选择性地选择关注或关注*某些单词。*这些权重通常是在训练过程中学习的,通常使用大量数据。
值得注意的是,与按顺序逐字处理文本的传统NLP模型不同,转换器可以一次处理多个单词,从而实现并行处理,因此性能更好。
真正使这种架构与众不同并使其具有革命性的一些重要因素是:
- 自我注意:这允许模型权衡输入序列中不同单词相对于特定单词的重要性,从而在单词周围的单词上下文中"理解"单词。通过训练,这将自动建立一种内部表示或对语言的理解。这种内部表示越好,它在任何语言任务中的表现就越好。
- 位置编码:转换器需要一种方法来从输入文本中捕获单词的顺序,以便它将有关顺序的信息存储在数据本身中(对位置进行编码并添加到输入嵌入中)。然后,当您使用更多数据进行训练时,模型将能够学习如何更好地解释这些位置编码。
转换器模型可以被认为是半监督学习,因为本质上它们是使用大型未标记数据集进行预训练的,然后通过监督训练进行微调以提高其性能。
此体系结构有 2 个主要部分:编码器和解码器。它们共享一些相似的核心组件------输入标记化、嵌入层、位置编码、自我注意层、前馈网络等。
在将它们放在一起之前,让我们先了解每个核心组件,以了解编码器和解码器中的流程。
2. 输入标记化
我们需要做的第一件事是标记输入的单词。标记化是将原始文本转换为较小的块或标记的过程,然后可以由模型进行处理。
标记化后,每个标记都会转换为数字/唯一ID,每个数字代表模型可以使用的所有可能单词(模型的词汇表)在字典中的位置。此词汇表是在预训练期间建立的,应包含数千甚至数百万个唯一令牌。
3. 嵌入层
一旦输入被表示为数字,我们就会将其传递给嵌入层。令牌化过程中的原始令牌 ID 对模型不是特别有用。这些数字不包含有关它们所表示的单词的语义信息。
该层是一个可训练的向量嵌入空间,其中每个标记都转换为一个向量(也称为嵌入),以便捕获语义本质并将标记的含义/上下文编码为一系列数值,并且向量在该空间中占据唯一位置。这些输入令牌的处理也设计为并行完成。
具有相似含义或出现在相似上下文中的单词将具有更靠近的嵌入,具有不同含义的单词将具有更远的嵌入。例如:像"苹果"、"香蕉"、"橙子"等词在空间中会非常接近,同时与"汽车"、"火车"、"自行车"等相距甚远。
矢量大小通常为 512,这相当大,但仍然可以变大。
您可以将向量大小想象为嵌入空间中的维数。更高的维度允许模型编码更复杂的关系和微妙之处,但它也需要更多的数据和计算能力来有效训练。
作为简化的示例,使用仅 3 的向量大小,然后您可以将单词绘制到 3D 空间中并查看它们之间的关系。
这些密集的向量表示不仅仅是随机分配的。他们是有学问的。训练语言模型(或使用嵌入的任何模型)时,初始嵌入可能会随机开始。但是,当模型在大量文本上进行训练时,它会调整这些嵌入以最大程度地减少其预测误差。随着时间的推移,该模型将具有相似含义或出现在类似上下文中的单词更紧密地放置在此嵌入空间中,因为这样做有助于做出更好的预测。
4. 位置编码
变压器设计用于同时并行处理输入序列的所有部分。这意味着他们无法固有地识别令牌的顺序。如果没有考虑序列信息的机制,所有单词都将显得独立且不受上下文限制。
在高级别上,位置编码涉及将唯一生成的向量添加到每个输入令牌的嵌入中。《注意就是你需要的一切》一文提到,位置编码与嵌入具有相同的维度/长度,因此可以将两者相加。这是一种确保尽管并行处理所有单词,但模型不会失去语言的顺序本质的方法。
此向量仅根据令牌在序列中的位置确定,而与令牌本身无关。目标是确保令牌嵌入和位置编码的总和对于每个位置都是唯一的,并为模型提供足够的信息来确定每个单词的原始位置。
想象一下,试图将一个句子从英语翻译成法语。形容词和名词的位置在两种语言之间经常不同。为了产生流畅的翻译,模型必须识别这些位置差异。通过位置编码了解每个单词的位置,Transformer可以生成上下文准确的翻译,保留语言之间的词序细微差别。
4. 自我注意层
对输入令牌和位置编码求和后,将生成的向量传递到自注意层,在该层中,模型分析输入序列中标记之间的关系。
想象一下,阅读一个句子,对于你阅读的每个单词,能够感觉到该句子中每个单词在理解当前单词的上下文方面的重要性。这本质上就是自我关注的作用。
对于句子中的每个单词,自我注意会给其他每个单词分配一个权重,指示它应该对该单词给予多少"注意",允许模型关注输入序列的不同部分,以更好地捕获单词之间的上下文依赖关系。如果一个单词相对于另一个单词具有较高的注意力权重,则意味着模型认为这两个单词在给定的上下文中密切相关。
值得注意的是,它可以将注意力集中在附近的单词或相距很远的单词上。这使模型能够捕获数据中的短期和长期依赖关系,使其特别擅长理解句子或段落等长序列中的上下文。
例如,如果一个模型试图理解句子"他坐在河岸边"中的"bank"这个词,注意机制可以突出显示"river"这个词对于将"bank"上下文化特别重要(权重更高)。
*多头注意力*
在转换器架构中,这种自我注意机制不会只应用一次。相反,多组自我注意力权重(又名头部 )是相互**独立并行学习的。**这里的直觉是,每个头都可以学会关注数据中的不同方面或关系。
例如,一个头可能关注句法关系,另一个头关注语义关系,另一个头关注句子中人实体之间的关系,正在描述的活动,另一个头关注特定的单词模式或押韵。每个磁头产生自己的输出,这些输出被串联和线性变换以产生最终的多头输出。此输出是输入的更丰富的表示形式,捕获了各个方面和细微差别。
举这句话的例子:
"猫坐在垫子上。"
假设我们的模型的维度为 512(我们称之为值 d_model),2 个注意力头,并对单词而不是子单词进行操作。进入注意力层的输入嵌入看起来像
scss
| Word | d_model (512) |
|------|--------------------------|
| The | [0.1,0.2,...512th value] |
| cat | [0.3,0.1,...512th value] |
| sat | [0.9,0.2,...512th value] |
| on | [0.5,0.6,...512th value] |
| the | [0.1,0.2,...512th value] |
| mat | [0.4,0.8,...512th value] |
第一个注意力头集中在活动"坐"上,所以它可能更重于活动"猫"的主题和活动"垫子"的位置。第二个头可能会注意不同实体的关系------"猫"和"垫子"。单词"sat"的每个头的计算输出可能如下所示:
scss
| Head | d_model (512) |
|--------|------------------------------------------------|
| Head 1 | Weighted combination of ["cat", "sat", "mat"] |
| Head 2 | Weighted combination of ["cat", "mat"] |
在多头计算之后,我们从每个头获得单词"sat"的输出,然后,我们通过连接向量来组合它们------结果将是一个大小的向量*。*2 * 512
ini
concatenated = [value1,value2,...,512th value,value1,value2,...,512th value]
现在,我们无法将大小的向量馈送到期望大小为 .因此,我们使用线性变换(基本上是矩阵乘法)将这个大小的向量投影回 .1024``512``1024``512
ini
combined = concatenated x weight_matrix
得到的组合向量进入前馈网络的后续步骤。请记住,对输入句子中的每个单词重复此操作。
注意力层中包含的注意力头数量因模型而异。常见的选择可能是 8、12 甚至多达 100 个头。
不建议提前规定注意力主管将学习语言的哪些方面。这使得不同的注意力模式在训练过程中自然出现。每个头部的权重是随机初始化的,并给予足够的训练数据和时间,每个头部将学习语言的不同方面。灵活性对于模型适应各种任务的能力至关重要。
5. 前馈网络
现在,所有注意力权重都已应用于您的输入,输出将通过全连接的前馈网络 (FFN) 进行处理。
前馈是一种人工神经网络,其中节点之间的连接不会形成循环......前馈模型是神经网络的最简单形式,因为信息只在一个方向上处理。虽然数据可能通过多个隐藏节点,但它始终朝一个方向移动,从不向后移动。
从**DeepAI的 "前馈神经网络"
FFN 层对我们刚刚从多头注意力层接收到的输出应用线性变换,然后是非线性激活函数,然后是另一个线性变换(详细的数学方程,请参阅原文)。这意味着它可以捕获输入中每个单词的非线性关系。如果没有非线性组件,网络将不会非常强大,因为它无法学习简单的线性关系之外的数据中的复杂模式或关系。
简单来说,在注意力机制弄清楚单词之间的"上下文"和关系之后,FFN应用一组一致的转换来进一步完善上下文信息。打个比方:如果注意力机制就像识别一道菜的关键相关成分,那么前馈网络就像微调味道并确保所有东西很好地融合在一起。
根据 FFN 是在编码器组件还是解码器组件中,输出可能会有所不同。编码器中 FFN 层的输出是一系列转换后的嵌入。
另一方面,对于解码器,输出是logits(来自神经网络最后一层的原始预测),表示模型词汇字典中每个令牌的概率得分。
然后,可以将 logits 传递给最终的 softmax 函数([Softmax 是一个数学函数,它将数字向量转换为概率向量,其中每个值的概率与向量中每个值的相对尺度成正比),其中](machinelearningmastery.com/softmax-act... is a mathematical function,each value in the vector.))它们被归一化以为每个可能的下一个单词/标记生成概率分布。一个令牌的分数将高于其他令牌,因此它很可能是预测的令牌。
6. 编码器和解码器
这就是所有的核心组件,现在我们可以将它们放在一起,通过一些额外的调整来形成编码器和解码器。
就编码器而言,前面已经描述了大多数组件:
-
输入标记化
-
嵌入层
-
位置编码
-
多头自我关注
-
前馈网络
-
残差连接和层归一化:编码器中的每个步骤(自我注意和前馈神经网络)都被残差连接包围,然后是层归一化。这有助于稳定激活,并通过添加从前几层继承的信息来允许更深层次的模型。
- 堆叠编码器:变压器型号不仅有一个编码器,还可以将多个编码器堆叠在一起(通常为 6 个)。这意味着当信息流经这些层时,模型能够越来越多地了解关系和模式。
最终编码器层的输出被认为是解码器的输入特征------它是输入的上下文丰富的表示形式,其中每个标记的表示都受到其周围标记的影响。
解码器组件大多类似于编码器,但它适用于目标输出序列,并且在层上有一些细微的差异:
-
输入标记化:有 2 个主要输入 --- 一个来自编码器,另一个是解码器正在生成的持续序列
-
嵌入层
-
位置编码
-
屏蔽多头注意力:注意力机制与编码器的略有不同,因为输入被部分屏蔽。"屏蔽"部分确保在预测特定单词时,模型只能关注序列中的早期位置(或当前位置),而不能关注未来位置(屏蔽位置获得 0 分)。这可确保对特定单词的预测不依赖于序列中的未来单词,从而保留解码器的自回归属性。
-
编码器-解码器注意层:该层根据编码器的输出和解码器不断生成的部分输出计算注意力(输出令牌被传递回输入以触发下一个令牌的生成,直到模型预测序列结束令牌)。
-
前馈网络
-
残余连接和层归一化:类似于编码器。
-
输出:如前所述,FFN 的输出是 logits,它通过 softmax 函数传递以在词汇表上产生概率分布,从而确定序列中的下一个单词。
从本质上讲,编码器的作用是表示输入数据并将其压缩到上下文中,而解码器的工作是将此上下文展开为有意义的输出序列,根据需要关注编码输入的最相关部分及其自己的先前输出。
从技术上讲,您可以将这些组件分开以创建体系结构的变体。实际上,有许多型号仅使用编码器,编码器-解码器或仅使用解码器。