Data visualization empowers users to
温度

0.8

采样

k=5

什么是 Transformer?

Transformer 是一种神经网络架构,它从根本上改变了人工智能的方法。Transformer 首次出现在开创性论文 "Attention is All You Need" 中,自 2017 年以来已成为深度学习模型的首选架构,为 OpenAI 的 GPT, Meta's Llama, and Google's Gemini. 等文本生成模型提供支持。除了文本,Transformer 还应用于 音频生成, 图像识别, 蛋白质结构预测, 展示了其在众多领域的多功能性。 游戏, 展示了其在众多领域的多功能性。

从根本上说,文本生成 Transformer 模型基于 下一个词预测的原理运行:给定用户的文本提示, 最可能的下一个词是什么?Transformer 的核心创新和力量在于其使用的自注意力机制,这使得它们能够处理完整序列,并比之前的架构更有效地捕获长距离依赖关系。

GPT-2 模型家族是文本生成 Transformer 的突出例子。Transformer Explainer 由 GPT-2 (小版本)模型驱动,该模型拥有 1.24 亿个参数。虽然它不是最新或最强大的 Transformer 模型,但它共享了当前最先进模型中的许多架构组件和原理,使其成为理解基础知识的理想起点。

Transformer 架构

每个文本生成 Transformer 都包含以下 三个关键组件:

  1. 嵌入: 文本输入被分割成称为词元(tokens)的更小单元,可以是词或子词。这些词元被转换为称为嵌入(embeddings)的数值向量,捕获词语的语义意义。
  2. Transformer 块 是模型处理和转换输入数据的基本构建块。每个块包括:
    • 注意力机制, Transformer 块的核心组件。它允许词元与其他词元进行通信,捕获词语之间的上下文信息和关系。
    • MLP(多层感知器)层, 一个前馈网络,独立地作用于每个词元。注意力层的目标是路由词元之间的信息,而 MLP 的目标是精炼每个词元的表示。
  3. 输出概率: 最终的线性层和 softmax 层将处理后的嵌入转换为概率,使模型能够预测序列中的下一个词元。

嵌入

假设您想使用 Transformer 模型生成文本。您添加如下提示: "Data visualization empowers users to". 此输入需要转换为模型可以理解和处理的格式。这就是嵌入的作用:它将文本转换为模型可以使用的数值表示。要将提示转换为嵌入,我们需要:1) 对输入进行词元化,2) 获取词元嵌入,3) 添加位置信息,最后 4) 将词元和位置编码相加以获得最终嵌入。让我们看看这些步骤是如何完成的。

1. 展开嵌入层视图,显示输入提示如何转换为向量表示。该过程涉及 (1) 词元化, (2) 词元嵌入, (3) 位置编码, 和 (4) 最终嵌入。

步骤 1:词元化

词元化是将输入文本分解为更小、更易管理的片段(称为词元)的过程。这些词元可以是词或子词。词 "Data" "visualization" 对应唯一的词元,而词 "empowers" 被分割成两个词元。词元的完整词汇表在训练模型之前确定:GPT-2 的词汇表有 50,257 个唯一词元。现在我们已经将输入文本分割成具有不同 ID 的词元,我们可以从嵌入中获取它们的向量表示。

步骤 2:词元嵌入

GPT-2(小版本)将词汇表中的每个词元表示为 768 维向量;向量的维度取决于模型。这些嵌入向量存储在形状为 (50,257, 768) 的矩阵中,包含约 3900 万个参数!这个庞大的矩阵使模型能够为每个词元分配语义意义。

步骤 3:位置编码

嵌入层还编码有关每个词元在输入提示中位置的信息。不同的模型使用各种位置编码方法。GPT-2 从头开始训练自己的位置编码矩阵,将其直接集成到训练过程中。

步骤 4:最终嵌入

最后,我们将词元和位置编码相加以获得最终嵌入表示。这种组合表示捕获了词元的语义意义及其在输入序列中的位置。

Transformer 块

Transformer 处理的核心在于 Transformer 块,它包含多头自注意力和多层感知器层。大多数模型由多个这样的块组成,这些块按顺序堆叠。词元表示通过层演化,从第一个块到最后一个块,使模型能够建立对每个词元的复杂理解。这种分层方法导致输入的高阶表示。我们正在检查的 GPT-2(小版本)模型包含 12 个这样的块。

多头自注意力

自注意力机制使模型能够专注于输入序列的相关部分,使其能够捕获数据中的复杂关系和依赖关系。让我们看看这个自注意力是如何逐步计算的。

步骤 1:查询、键和值矩阵

QKVij=(d=1768Embeddingi,dWeightsd,j)+Biasj QKV_{ij} = ( \sum_{d=1}^{768} \text{Embedding}_{i,d} \cdot \text{Weights}_{d,j}) + \text{Bias}_j
2. 从原始嵌入计算查询、键和值矩阵。

每个词元的嵌入向量被转换为三个向量: 查询 (Q), 键 (K), 这些向量通过将输入嵌入矩阵与学习的权重矩阵相乘得到,分别用于 Q, K, 以下是一个网络搜索类比,帮助我们建立对这些矩阵的直觉:

  • 查询 (Q) 是您在搜索引擎栏中输入的搜索文本。这是您想要 "查找更多信息".
  • 键 (K) 的词元。是搜索结果窗口中每个网页的标题。它表示查询可以关注的可能词元。
  • 值 (V) 是显示的网页的实际内容。一旦我们将适当的搜索词(查询)与相关结果(键)匹配,我们就希望获得最相关页面的内容(值)。

通过使用这些 QKV 值,模型可以计算注意力分数,这决定了在生成预测时每个词元应该获得多少关注。

步骤 2:多头分割

查询 (Q), 键 (K), 向量被分割成多个头——在 GPT-2(小版本)的情况下,分割成 12 个头。每个头独立处理嵌入的一个片段,捕获不同的句法和语义关系。这种设计促进了不同语言特征的并行学习,增强了模型的表示能力。

步骤 3:掩码自注意力

在每个头中,我们执行掩码自注意力计算。这种机制使模型能够通过专注于输入的相关部分来生成序列,同时防止访问未来的词元。

3. 使用查询、键和值矩阵计算掩码自注意力。
  • 注意力分数: 查询 查询 (Q)键 (K) 矩阵的点积确定每个查询与每个键的对齐,产生一个反映所有输入词元之间关系的方阵。
  • 掩码: 将掩码应用于注意力矩阵的上三角部分,以防止模型访问未来的词元,将这些值设置为负无穷。模型需要学习如何在不"窥视"未来的情况下预测下一个词元。
  • Softmax: 掩码后,注意力分数通过 softmax 操作转换为概率,该操作取每个注意力分数的指数。矩阵的每一行总和为 1,表示对左侧其他词元的相关性。

步骤 4:输出和拼接

模型使用掩码自注意力分数并将它们与 值 (V) 矩阵相乘以获得自注意力机制的 最终输出 GPT-2 有 12 个自注意力头,每个头捕获词元之间的不同关系。这些头的输出被拼接并通过线性投影传递。

MLP:多层感知器

4. 使用 MLP 层将自注意力表示投影到更高维度以增强模型的表示能力。

在多个自注意力头捕获输入词元之间的多样化关系后,拼接的输出通过多层感知器(MLP)层传递以增强模型的表示能力。MLP 块由两个线性变换组成,中间有一个 GELU 激活函数。第一个线性变换将输入的维度从 768 增加到四倍,达到 3072. 第二个线性变换将维度降低回原始大小 768, 确保后续层接收一致维度的输入。与自注意力机制不同,MLP 独立处理词元,并简单地将它们从一个表示映射到另一个表示。

输出概率

在输入通过所有 Transformer 块处理后,输出通过最终线性层传递以为词元预测做准备。该层将最终表示投影到 50,257 维空间,其中词汇表中的每个词元都有一个对应的值,称为 逻辑值. 任何词元都可以是下一个词,因此这个过程允许我们简单地根据这些词元成为下一个词的可能性对它们进行排序。然后我们应用 softmax 函数将逻辑值转换为总和为 1 的概率分布。这将允许我们根据可能性对下一个词元进行采样。

Figure 5. Each token in the vocabulary is assigned a probability based on the model's output logits. These probabilities determine the likelihood of each token being the next word in the sequence.

最后一步是通过从该分布中采样来生成下一个词元。 温度 超参数在此过程中起着关键作用。从数学上讲,这是一个非常简单的操作:模型输出逻辑值简单地除以 温度:

  • temperature = 1:将逻辑值除以 1 对 softmax 输出没有影响。
  • temperature < 1:较低的温度通过锐化概率分布使模型更加自信和确定性,导致更可预测的输出。
  • temperature > 1:较高的温度创建更柔和的概率分布,允许生成文本中的更多随机性——有些人称之为模型的 "创造性".

此外,可以使用 top-ktop-p 参数进一步细化采样过程:

  • top-k 采样:将候选词元限制为概率最高的前 k 个词元,过滤掉不太可能的选项。
  • top-p 采样:考虑累积概率超过阈值 p 的最小词元集合,确保只有最可能的词元贡献,同时仍允许多样性。

通过调整 温度, top-k, 和 top-p, 您可以在确定性和多样化输出之间取得平衡,根据您的特定需求定制模型的行为。

高级架构特性

有几个高级架构特性可以增强 Transformer 模型的性能。虽然对模型的整体性能很重要,但它们对理解架构的核心概念并不那么重要。层归一化、Dropout 和残差连接是 Transformer 模型中的关键组件,特别是在训练阶段。层归一化稳定训练并帮助模型更快收敛。Dropout 通过随机停用神经元来防止过拟合。残差连接允许梯度直接通过网络流动,并有助于防止梯度消失问题。

层归一化

层归一化有助于稳定训练过程并改善收敛性。它通过跨特征归一化输入来工作,确保激活的均值和方差保持一致。这种归一化有助于缓解与内部协变量偏移相关的问题,使模型能够更有效地学习,并降低对初始权重的敏感性。层归一化在每个 Transformer 块中应用两次,一次在自注意力机制之前,一次在 MLP 层之前。

Dropout

Dropout 是一种正则化技术,通过在训练期间随机将模型权重的一部分设置为零来防止神经网络中的过拟合。这鼓励模型学习更鲁棒的特征,并减少对特定神经元的依赖,帮助网络更好地泛化到新的、未见过的数据。在模型推理期间,dropout 被停用。这基本上意味着我们正在使用训练好的子网络的集成,这导致更好的模型性能。

残差连接

残差连接于 2015 年首次在 ResNet 模型中引入。这种架构创新通过使非常深的神经网络的训练成为可能,彻底改变了深度学习。本质上,残差连接是绕过一层或多层的快捷方式,将层的输入添加到其输出。这有助于缓解梯度消失问题,使训练具有多个堆叠在一起的 Transformer 块的深度网络变得更容易。在 GPT-2 中,残差连接在每个 Transformer 块内使用两次:一次在 MLP 之前,一次在 MLP 之后,确保梯度更容易流动,并且早期层在反向传播期间获得足够的更新。

交互功能

Transformer Explainer 旨在具有交互性,允许您探索 Transformer 的内部工作原理。以下是一些您可以使用的交互功能:

  • 输入您自己的文本序列 以查看模型如何处理它并预测下一个词。探索注意力权重、中间计算,并查看最终输出概率是如何计算的。
  • 使用温度滑块 来控制模型预测的随机性。探索如何通过更改温度值使模型输出更加确定性或更具创造性。
  • 选择 top-k 和 top-p 采样方法 以调整推理期间的采样行为。尝试不同的值,看看概率分布如何变化并影响模型的预测。
  • 与注意力图交互 以查看模型如何专注于输入序列中的不同词元。将鼠标悬停在词元上以突出显示其注意力权重,并探索模型如何捕获上下文和词之间的关系。

视频教程

Transformer Explainer 是如何实现的?

Transformer Explainer 具有直接在浏览器中运行的实时 GPT-2(小版本)模型。该模型源自 Andrej Karpathy 的 GPT PyTorch 实现 nanoGPT 项目 并已转换为 ONNX Runtime 以实现无缝的浏览器内执行。界面使用 JavaScript 构建, Svelte 作为前端框架, D3.js 用于创建动态可视化。数值会根据用户输入实时更新。

谁开发了 Transformer Explainer?

Transformer Explainer 由 Aeree Cho, Grace C. Kim, Alexander Karpekov, Alec Helbling, Jay Wang, Seongmin Lee, Benjamin Hoover, 在佐治亚理工学院创建。 Polo Chau 在佐治亚理工学院创建。