阅读视图

发现新文章,点击刷新页面。

[译] 什么是 GPT?Transformer 工作原理的动画展示(2024)

译者序

本文翻译自 2024 年的一个视频(前半部分),这是原作者 Deep Learning 系列的第 5 章,强烈推荐原视频:

Transformer 预测下一个单词四部曲。MLP 也称为 feed-forward。

作者以深厚的技术积累,将一些复杂系统以可视化的方式讲给普通人,这种能力是极其难得的。 本译文希望通过“文字+动图”这种可视化又方便随时停下来思考的方式介绍 Transformer 的内部工作原理。 如果想进一步从技术和实现上了解 Transformer/GPT/LLM,可参考:

水平及维护精力所限,译文不免存在错误或过时之处,如有疑问,请查阅原视频。 传播知识,尊重劳动,年满十八周岁,转载请注明出处

以下是译文。



1 图解 “Generative Pre-trained Transformer”(GPT)

GPT 是 Generative Pre-trained Transformer 的缩写,直译为“生成式预训练 transformer”, 我们先从字面上解释一下它们分别是什么意思。

1.1 Generative:生成式

“Generative”(生成式)意思很直白,就是给定一段输入(例如,最常见的文本输入), 模型就能续写(“编”)下去。

1.1.1 可视化

下面是个例子,给定 “The most effective way to learn computer science is” 作为输入, 模型就开始续写后面的内容了。

“Generative”:生成(续写)文本的能力。

1.1.2 生成式 vs. 判别式(译注)

文本续写这种生成式模型,区别于 BERT 那种判别式模型(用于分类、完形填空等等),

1.2 Pre-trained:预训练

“Pre-trained”(预训练)指的是模型是用大量数据训练出来的

1.2.1 可视化

“Pre-trained”:用大量数据进行训练。
图中的大量旋钮/仪表盘就是所谓的“模型参数”,训练过程就是在不断优化这些参数,后面会详细介绍。

1.2.2 预训练 vs. 增量训练(微调)

“预”这个字也暗示了模型还有在特定任务中进一步训练的可能 —— 也就是我们常说的“微调”(finetuning)。

如何对预训练模型进行微调: InstructGPT:基于人类反馈训练语言模型遵从指令的能力(OpenAI,2022)。 译注。

1.3 Transformer:一类神经网络架构

“GPT” 三个词中最重要的其实是最后一个词 Transformer。 Transformer 是一类神经网络/机器学习模型,作为近期 AI 领域的核心创新, 推动着这个领域近几年的极速发展。

Transformer 直译为“变换器”或“转换器”,通过数学运算不断对输入数据进行变换/转换。另外,变压器、变形金刚也是这个词。 译注。

Transformer:一类神经网络架构的统称。

Transformer 最后的输出层。后面还会详细介绍

1.4 小结

如今已经可以基于 Transformer 构建许多不同类型的模型,不限于文本,例如,

本文希望通过“文字+动图”这种可视化又方便随时停下来思考的方式,解释 Transformer 的内部工作原理。

2 Transformer 起源与应用

2.1 Attention Is All You Need, Google, 2017,机器翻译

Transformer 是 Google 2017 年在 Attention Is All You Need paper 中提出的, 当时主要用于文本翻译

2.2 Generative Transformer

之后,Transformer 的应用场景扩展到了多个领域,例如 ChatGPT 背后也是 Transformer, 这种 Transformer 接受一段文本(或图像/音频)作为输入,然后就能预测接下来的内容。 以预测下一个单词为例,如下图所示,下一个单词有多种可能,各自的概率也不一样:

但有了一个这样的预测下一个单词模型,就能通过如下步骤让它生成更长的文字,非常简单:

  1. 初始文本输入模型;
  2. 模型预测出下一个可能的单词列表及其概率,然后通过某种算法(不一定挑概率最大的) 从中选一个作为下一个单词,这个过程称为采样(sampling);
  3. 将新单词追加到文本结尾,然后将整个文本再次输入模型;转 2;

以上 step 2 & 3 不断重复,得到的句子就越来越长。

2.3 GPT-2/GPT-3 生成效果(文本续写)预览

来看看生成的效果,这里拿 GPT-2 和 GPT-3 作为例子。

下面是在我的笔记本电脑上运行 GPT-2,不断预测与采样,逐渐补全为一个故事。 但结果比较差,生成的故事基本上没什么逻辑可言:

下面是换成 GPT-3(模型不再开源,所以是通过 API), GPT-3 和 GPT-2 基本架构一样,只是规模更大, 但效果突然变得非常好, 生成的故事不仅合乎逻辑,甚至还暗示 “物种 π” 居住在一个数学和计算王国:

2.4 ChatGPT 等交互式大模型

以上这个不断重复“预测+选取”来生成文本的过程,就是 ChatGPT 或其他类似大语言模型(LLM) 的底层工作原理 —— 逐单词(token)生成文本

2.5 小结

以上是对 GPT 及其背后的 Transformer 的一个感性认识。接下来我们就深入到 Transformer 内部, 看看它是如何根据给定输入来预测(计算)出下一个单词的。

3 Transformer 数据处理四部曲

为理解 Transformer 的内部工作原理,本节从端到端(从最初的用户输入,到最终的模型输出)的角度看看数据是如何在 Transformer 中流动的。 从宏观来看,输入数据在 Transformer 中经历如下四个处理阶段:

Transformer 数据处理四部曲

下面分别来看。

3.1 Embedding:分词与向量表示

首先,输入内容会被拆分成许多小片段(这个过程称为 tokenization),这些小片段称为 token

  • 对于文本:token 通常是单词、词根、标点符号,或者其他常见的字符组合;
  • 对于图片:token 可能是一小块像素区域;
  • 对于音频:token 可能是一小段声音。

然后,将每个 token 用一个向量(一维数组)来表示。

3.1.1 token 的向量表示

这实际上是以某种方式在编码该 token;

Embedding:每个 token 对应一个 N*1 维度的数值格式表示的向量。

3.1.2 向量表示的直观解释

如果把这些向量看作是在高维空间中的坐标, 那么含义相似的单词在这个高维空间中是相邻的

词义相近的四个单词 “leap/jump/skip/hop” 在向量空间中是相邻的

将输入进行 tokenization 并转成向量表示之后,输入就从一个句子就变成了一个向量序列。 接下来,这个向量序列会进行一个称为 attention 的运算。

3.2 Attention:embedding 向量间的语义交流

3.2.1 语义交流

attention 使得向量之间能够相互“交流”信息。这个交流是双向的,在这个过程中,每个向量都会更新自身的值。

这种信息“交流”是有上下文和语义理解能力的。

3.2.2 例子:”machine learning model” / “fashion model

例如,“model” 这个词在 “machine learning model”(机器学习模型)和在 “fashion model”(时尚模特)中的意思就完全不一样, 因此虽然是同一个单词(token),但对应的 embedding 向量是不同的

Attention 模块的作用就是确定上下文中哪些词之间有语义关系,以及如何准确地理解这些含义(更新相应的向量)。 这里说的“含义”(meaning),指的是编码在向量中的信息。

3.3 Feed-forward / MLP:向量之间无交流

Attention 模块让输入向量们彼此充分交换了信息(例如,单词 “model” 指的应该是“模特”还是“模型”), 然后,这些向量会进入第三个处理阶段:

第三阶段:多层感知机(multi-layer perceptron),也称为前馈层(feed-forward layer)。

3.3.1 针对所有向量做一次性变换

这个阶段,向量之间没有互相“交流”,而是并行地经历同一处理:

3.3.2 直观解释

后面会看,从直观上来说,这个步骤有点像对每个向量都提出一组同样的问题,然后根据得到的回答来更新对应的向量

以上解释中省略了归一化等一些中间步骤,但已经可以看出: attention 和 feed-forward 本质上都是大量的矩阵乘法

本文的一个目的就是让读者理解这些矩阵乘法的直观意义。

3.3.3 重复 Attention + Feed-forward 模块,组成多层网络

Transformer 基本上是不断复制 Attention 和 Feed-forward 这两个基本结构, 这两个模块的组合成为神经网络的一层。在每一层,

  • 输入向量通过 attention 更新彼此;
  • feed-forward 模块将这些更新之后的向量做统一变换,得到这一层的输出向量;

3.4 Unembedding:概率

3.4.1 最后一层 feed-forward 输出中的最后一个向量

如果一切顺利,最后一层 feed-forward 输出中的最后一个向量(the very last vector in the sequence), 就已经包含了句子的核心意义(essential meaning of the passage)。对这个向量进行 unembedding 操作(也是一次性矩阵运算), 得到的就是下一个单词的备选列表及其概率:

图:原始输入为 "To date, the cleverest thinker of all time was",让模型预测下一个 token。经过多层 attention + feed-forward 之后, 最后一层输出的最后一个向量已经学习到了输入句子表达的意思,(经过简单转换之后)就能作为下一个单词的概率

3.4.2 下一个单词的选择

根据一定的规则选择一个 token,

  • 注意这里不一定选概率最大的,根据工程经验,一直选概率最大的,生成的文本会比较呆板;
  • 实际上由一个称为 temperature 的参数控制;

3.5 小结

以上就是 Transformer 内部的工作原理。

前面已经提到,有了一个这样的预测下一个单词模型,就能通过如下步骤让它生成更长的文字,非常简单:

  1. 初始文本输入模型;
  2. 模型预测出下一个可能的单词列表及其概率,然后通过某种算法(不一定挑概率最大的) 从中选一个作为下一个单词,这个过程称为采样(sampling);
  3. 将新单词追加到文本结尾,然后将整个文本再次输入模型;转 2;

4 GPT -> ChatGPT:从文本补全到交互式聊天助手

GPT-3 的早期演示就是这样的:给 GPT-3 一段起始文本,它就自动补全(续写)故事和文章。 这正式以上介绍的 Transformer 的基本也是核心功能。

ChatGPT 的核心是 GPT 系列(GPT 3/3.5/4),但它怎么实现聊天这种工作方式的呢?

4.1 系统提示词,伪装成聊天

其实很简单,将输入文本稍作整理,弄成聊天内容,然后把这样的文本再送到 GPT/Transformer, 它就会把这个当前是聊天内容,续写下去。最后只需要把它续写的内容再抽出来返回给用户, 对用户来说,就是在聊天。

这段文本设定用户是在与一个 AI 助手交互的场景,这就是所谓的系统提示词(system prompt)。

4.2 如何训练一个企业级 GPT 助手(译注)

OpenAI 官方对 GPT->ChatGPT 有过专门分享:如何训练一个企业级 GPT 助手(OpenAI,2023)

基础模型不是助手,它们不想回答问题,只想补全文档。 因此,如果让它们“写一首关于面包和奶酪的诗”,它们不仅不“听话”,反而会有样学样,列更多的任务出来,像下面左图这样,

这是因为它只是在忠实地补全文档。 但如果你能成功地提示它,例如,开头就说“这是一首关于面包和奶酪的诗”, 那它接下来就会真的补全一首这样的诗出来,如右图。

我们还可以通过 few-shot 来进一步“欺骗”它。把你想问的问题整理成一个“提问+回答”的文档格式, 前面给一点正常的论述,然后突然来个问题,它以为自己还是在补全文档,其实已经把问题回答了:

这就是把基础模型调教成一个 AI 助手的过程。

5 总结

本文整理翻译了原视频的前半部分,通过可视化方式解释 GPT/Transformer 的内部工作原理。 原视频后面的部分是关于 general deep learning, machine learning 等等的基础,想继续学习的,强烈推荐。


Written by Human, Not by AI Written by Human, Not by AI

[译] 文生图(text-to-image)简史:扩散模型(diffusion models)的崛起与发展(2022)

译者序

本文翻译自 2022 年的一篇英文博客: The recent rise of diffusion-based models, 另外也参考其他资料补充了一点内容,主要方便自己粗浅理解。

Fig. 文生图(text-to-image)近几年演进

由于译者水平有限,本文不免存在错误之处。如有疑问,请查阅原文。



Sources: OpenAI DALL·E 2

生成式建模(generative modeling)近几年发展神速, 网上也涌现出了大批令人惊叹的纯 AI 生成图片。 本文试图总结文生图(text-to-image)领域近几年的发展, 尤其是各种扩散模型(diffusion models)—— 它们已经是业界的标杆架构。

1 OpenAI DALL·E:起于文本,潜入图像,2021.01

1.1 GPT-3 (2020):基于 transformer 架构的多模态大语言模型

2020 年,OpenAI 发布了 GPT-3 模型 [1],这是一个基于 Transformer 架构的多模态大语言模型,能够完成机器翻译、文本生成、语义分析等任务, 也迅速被视为最先进的语言建模方案(language modeling solutions)。

1.2 DALL·E (2021.01):transformer 架构扩展到计算机视觉领域

DALL·E [7] 可以看作是将 Transformer(语言领域)的能力自然扩展到计算机视觉领域

如何根据提示文本生成图片?DALL·E 提出了一种两阶段算法:

  1. 训练一个离散 VAE (Variational AutoEncoder) 模型,将图像(images)压缩成 image tokens

    VAE 是一种神经网络架构,属于 probabilistic graphical models and variational Bayesian methods 家族。

  2. 将编码之后的文本片段(encoded text snippet)与 image tokens 拼在一起(concatenate), 训练一个自回归 Transformer,学习文本和图像之间的联合分布

最终是在从网上获取的 250 million 个文本-图像对(text-image pairs)上进行训练的。

1.3 量化“文本-图像”匹配程度:CLIP 模型

训练得到模型之后,就能通过推理生成图像。但如何评估生成图像的好坏呢?

OpenAI 提出了一种名为 CLIP 的 image and text linking 方案 [9], 它能量化文本片段(text snippet)与其图像表示(image representation)的匹配程度

抛开所有技术细节,训练这类模型的思路很简单:

  1. 将文本片段进行编码,得到 \(\mathbf{T}_{i}\);
  2. 将图像进行编码,得到 \(\mathbf{I}_{i}\);

对 400 million 个 (image, text) 进行这样的操作,

F.g CLIP contrastive pre-training 工作原理 [9]. (文本大意:澳大利亚小狗)。

基于这种映射方式,就能够评估生成的图像符合文本输入的程度。

1.4 小结

DALL·E 在 AI 和其他领域都引发了广泛的关注和讨论。 不过热度还没持续太久,风头就被另一个方向抢走了。

2 Diffusion:高斯去噪,扩散称王,2021.12

Sohl-Dickstein 等提出了一种图像生成的新思想 —— 扩散模型(diffusion models) [2]。 套用 AI 领域的熟悉句式,就是

All you need is diffusion.

2.1 几种图像生成模型:GAN/VAE/Flow-based/Diffusion

Fig. 几种生成式模型(generative models)[13]

Diffusion 模型受到了非平衡热力学(non-equilibrium thermodynamics)的启发,但其背后是一些有趣的数学概念。 它仍然有大家已经熟悉的 encoder-decoder 结构,但底层思想与传统的 VAE(variational autoencoders)已经不同。

要理解这个模型,需要从原理和数学上描述正向和反向扩散过程。

公式看不懂可忽略,仅靠本文这点篇幅也是不可能推导清楚的。感兴趣可移步 [13-15]。

2.2 正向图像扩散(forward image diffusion)

2.2.1 基本原理

向图像逐渐添加高斯噪声,直到图像完全无法识别。

这个过程可以被形式化为顺序扩散马尔可夫链(Markov chain of sequential diffusion steps)。

2.2.2 数学描述

  • 假设图像服从某种初始分布 \(q(\mathbf{x}_{0})\),
  • 那么,我们可以对这个分布采样得到一个图像 \(\mathbf{x}_{0}\),
  • 接下来,我们希望执行一系列的扩散步骤,\(\mathbf{x}_{0} \to \mathbf{x}_{1} \to ... \to \mathbf{x}_{T}\),每次扩散都使图像越来越模糊
  • 如何添加噪声?由一个 noising schedule(加噪计划/调度) \(\{\beta_{t}\}^{T}_{t=1}\) 定义, 对于每个 \(t = 1,...,T\),有 \(\beta_{t} \in (0,1)\)。

基于以上定义,我们就可以将正向扩散过程描述为

\[q\left(\mathbf{x}_{t} \mid \mathbf{x}_{t-1}\right)=\mathcal{N}\left(\sqrt{1-\beta_{t}} \mathbf{x}_{t-1}, \beta_{t} \mathbf{I}\right).\]

注,

  1. \(\mathcal{N}\) 可能来自 next 首字母,表示下一个状态的概率分布(马尔科夫状态转移概率);

几点解释:

  1. 随着加噪次数的增多 \((T \to \infty)\),最终分布 \(q(\mathbf{x}_{T})\) 将趋近于常见的各向同性高斯分布(isotropic Gaussian distribution),这使得未来的采样非常简单和高效。
  2. 使用高斯核加噪还有一个好处 —— 可以绕过中间加噪步骤,直接得到任意中间状态(intermediate latent state), 这要归功于 reparametrization。直接采样,

    \[q\left(\mathbf{x}_{t} \mid \mathbf{x}_{0}\right)=\mathcal{N}\left(\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0},\left(1-\bar{\alpha}_{t}\right) \mathbf{I}\right) = \sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \cdot \epsilon,\]

    其中 \(\alpha_{t} := 1-\beta_{t}\),\(\bar{\alpha}_{t} := \prod_{k=0}^{t}\alpha_{k}\),\(\epsilon \sim \mathcal{N}(0, \mathbf{I})\)。 这里的 \(\epsilon\) 表示高斯噪声 —— 这个公式对于模型训练至关重要

2.3 反向图像扩散(reverse image diffusion)

2.3.1 基本原理

正向过程定义好了,是否能定义一个反向过程 \(q\left(\mathbf{x}_{t-1} \mid \mathbf{x}_{t}\right)\), 从噪声回溯到图像呢?

Fig. The Markov chain of forward (reverse) diffusion process of generating a sample by slowly adding (removing) noise [13]

首先,从概念上来说,是不行的;

其次,这需要 marginalization over the entire data distribution。 要从加噪样本返回到起始分布 \(q(\bf{x}_{0})\),必须对所有可能从噪声中得到 \(\mathbf{x}_{0}\) 的方式进行 marginalization,包括所有中间状态。 这意味着计算积分 \(\int q(\mathbf{x}_{0:T})d\mathbf{x}_{1:T}\),这是不可行的。

不过,虽然无法精确计算,但可以近似! 核心思想是以可学习网络(learnable network)的形式, 近似反向扩散过程

2.3.2 数学表示

Fig. An example of training a diffusion model for modeling a 2D swiss roll data. [2]

实现这一目标的第一步是估计去噪步骤的均值和协方差(mean and covariance):

\[p_{\theta}\left(\mathbf{x}_{t-1} \mid \mathbf{x}_{t}\right)=\mathcal{N}(\mu_{\theta}(\mathbf{x}_{t}, t), \Sigma_{\theta}(\mathbf{x}_{t}, t) ).\]

在实践中,

  • 可以通过神经网络估计 \(\mu_{\theta}(\mathbf{x}_{t}, t)\),
  • \(\Sigma_{\theta}(\mathbf{x}_{t}, t)\) 可以固定为与 noising schedule 相关的常数,例如 \(\beta_{t}\mathbf{I}\)。

用这种方式估计 \(\mu_{\theta}(\mathbf{x}_{t}, t)\) 是可行的,但 Ho 等 [3] 提出了另一种训练方法: 训练一个神经网络 \(\epsilon_{\theta}(\mathbf{x}_{t}, t)\) 来预测前面公式 \(q\left(\mathbf{x}_{t} \mid \mathbf{x}_{0}\right)\) 中的噪声 \(\epsilon\)。

与 Ho 等的方法类似[3],训练过程包括以下步骤:

  1. 采样图像 \(\mathbf{x}_{0}\sim q(\bf{x}_{0})\),
  2. 在扩散过程中选择特定的步骤 \(t \sim U(\{1,2,...,T\})\),
  3. 添加噪声 \(\epsilon \sim \mathcal{N}(0,\mathbf{I})\),
  4. 估计噪声 \(\epsilon_{\theta}(\mathbf{x}_{t}, t)= \epsilon_{\theta}(\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \cdot \epsilon, t)\),
  5. 通过梯度下降学习网络上的损失 \(\nabla_{\theta} \|\epsilon - \epsilon_{\theta}(\mathbf{x}_{t}, t)\|^{2}\)。

一般来说,损失可以表示为

\[L_{\text{diffusion}}=\mathbb{E}_{t, \mathbf{x}_{0}, \epsilon}\left[\left\|\epsilon-\epsilon_{\theta}\left(\mathbf{x}_{t}, t\right)\right\|^{2}\right],\]

这里的公式、参数化和推导都没有详细展开,想深入了解推导过程,强烈推荐 [13-15]

以上已经解释了为什么扩散模型也是一种生成模型。 一旦模型 \(\epsilon_{\theta}(\mathbf{x}_{t}, t)\) 训练好,就可以用它从加躁的 \(\mathbf{x}_{t}\) 回溯到原始图像 \(\mathbf{x}_{0}\)。 由于从各向同性高斯分布中采样噪声非常简单,我们可以获得无限的图像变化。

2.4 引导扩散(guiding the diffusion)

如果在训练过程中向神经网络提供额外的信息,就可以引导图像的生成。 假设图像已经打标(labeled),关于图像的类别信息 \(y\) 就可以送到 class-conditional diffusion model \(\epsilon_{\theta}(\mathbf{x}_{t}, t \mid y)\) 中。

  • 引入指导的一种方式是训练一个单独的模型,该模型作为噪声图像的分类器(classifier of noisy images)。

    在每个去噪步骤中,分类器检查图像是否以正确的方向去噪,并将自己的损失函数梯度计入扩散模型的整体损失中。

  • Ho & Salimans 提出了一种无需训练额外分类器,就能将类别信息输入模型的方法 [5]。

    训练过程中,模型 \(\epsilon_{\theta}(\mathbf{x}_{t}, t \mid y)\) 有时(以固定概率)类别标签被替换为空标签 \(\emptyset\),也就是不显示实际的类别 \(y\)。 因此,它学会了在有和没有引导的情况下进行扩散

    对于推理,模型进行两次预测,一次给定类别标签 \(\epsilon_{\theta}(\mathbf{x}_{t}, t \mid y)\),一次不给定 \(\epsilon_{\theta}(\mathbf{x}_{t}, t \mid \emptyset)\)。 模型的最终预测变成乘以引导比例(guidance scale) \(s \geqslant 1\),

    \[\hat{\epsilon}_{\theta}\left(\mathbf{x}_{t}, t \mid y\right)=\epsilon_{\theta}\left(\mathbf{x}_{t}, t \mid \emptyset\right)+s \cdot\left(\epsilon_{\theta}\left(\mathbf{x}_{t}, t \mid y\right)-\epsilon_{\theta}\left(\mathbf{x}_{t}, t \mid \emptyset\right)\right)\]

    这种无分类器引导(classifier-free guidance)复用主模型的理解力,不需要额外的分类器,Nichol 等的研究显示这种方式效果更好 [6]。

3 GLIDE:文本引导,定向扩散,2022.04

以上介绍了扩散模型的工作原理,现在要回答的两个问题是:

  • 如何使用文本信息(textual information)来引导扩散模型?
  • 如何确保模型的质量足够好?

GLIDE 论文见提出了非常新颖和有趣的见解 [6]。

3.1 架构

三个主要组件:

  1. 一个基于 UNet 的模型:负责扩散的视觉部分(visual part of the diffusion learning),
  2. 一个基于 Transformer 的模型:负责将文本片段转换成文本嵌入(creating a text embedding from a snippet of text),
  3. 一个 upsampling 扩散模型:增大输出图像的分辨率

前两个组件生成一个文本引导的图像,最后一个组件用于扩大图像并保持质量。

3.2 工作原理

GLIDE 模型的核心是著名的 UNet 架构 [8],用于扩散。

  • 串联几个下采样和上采样卷积的残差层。
  • 还包括 attention 层,这对于同时进行文本处理至关重要。
  • 模型有约 2.3b 个参数,并在与 DALL·E 相同的数据集上进行了训练。

用于引导的文本(text used for guidance)编码为 token,并送入 transformer 模型。 GLIDE 中使用的 transformer 有约 1.2b 个参数, 由 24 个 2048-width 的残差块构建。transformer 的输出有两个目的:

  1. 最终 embedding token 用作 \(\epsilon_{\theta}(\mathbf{x}_{t}, t \mid y)\) 中的 class embedding \(y\),
  2. final layer of token embeddings 添加到模型的每个 attention layer 中。

很明显,为了生成图像的准确性,大量精力放在了确保模型获得足够的与文本相关的上下文(text-related context)。 根据 text snippet embedding,模型将编码的文本与 attention 上下文拼接(concatenate),并在训练期间使用无分类器引导。

最后,使用扩散模型,通过一个 ImageNet upsampler 将图像从低分辨率转成高分辨率。

3.3 小结

Fig. GLIDE 效果。提示词 "a corgi in a field"(田野里一只柯基) [6]

GLIDE 融合了近年的几项技术精华,为文本引导图像生成带来了新的启示。 考虑到 DALL·E 模型是基于不同结构(非扩散)构建的,因此,可以说 GLIDE 开启了扩散式文生图时代

4 DALL·E 2:取长补短,先验称奇,2022.04

OpenAI 团队马不停蹄,在 2022 年 4 月份以 DALL·E 2 [7] 再次震撼了整个互联网。 它组合了前面介绍的 CLIP 模型和 GLIDE 架构的精华。

Fig. Visualization of DALL·E 2 two-stage mechanism. [13]

4.1 架构:unCLIP = prior + decoder

两个主要基础组件(也是两个阶段),

  • prior
  • decoder

二者组合产生图像输出。整个机制名为 unCLIP, 如果还记得前面介绍的 CLIP 机制,就能从 unCLIP 这个名字猜到底层可能是如何工作的。

4.2 The prior

第一阶段称为 prior,作用是将标题 —— 例如 “a corgi playing a flame throwing trumpet” —— 从文本转换成文本嵌入(text embedding)。

这个通过一个冻结参数的 CLIP 模型实现的。

4.2.1 为什么需要 prior 层(为什么单单 CLIP 不够)

前面介绍过,CLIP 模型记录的 text embedding 和 image embedding 的联合分布。所以, 直觉上来说,有了一个经过良好训练的 CLIP 模型,只要经过下面简单三步就能完成文生图的任务:

  1. 将文本(提示词)转换成对应的 text embedding;
  2. 将 text embedding 输入 CLIP 模型,获取最佳的 image embedding;
  3. 用 image embedding 通过扩散生成图像。

这里有问题吗?有,在第 2 步。DALL·E 2 的作者给了一个很好的解释:

“(在 CLIP 空间里)可能有无数的图像与给定的标题一致,因此两个编码器的输出不会完全一致。 因此,需要一个单独的 prior 模型来将 text embedding “翻译”为对应的 image embedding ”。

下面是对比:

Fig. 分别通过三种方式生成的图片:仅标题(caption)、标题+CLIP 和 prior-based。[7]

4.2.2 prior 选型:decoder-only transformer

作者对 prior 模型测试了两类模型:

  1. 自回归模型(autoregressive model)
  2. 扩散模型(diffusion model)

本文只讨论第二种:扩散 prior 模型。因为从计算角度来看,它的性能优于自回归模型

为了训练 prior 模型,选择一个 decoder-only Transformer, 通过以下几个输入进行训练:

  1. 已编码的文本(encoded text)
  2. CLIP text embedding
  3. embedding for the diffusion timestep
  4. 加噪的 image embedding

目标是输出一个无噪的 image embedding (unnoised image embedding)\(z_{i}\)。

4.2.3 损失函数

直接预测未加噪声的 image embedding 而不是预测噪声更合适,这与之前讨论的 Ho 等提出的训练方式不同。 因此,回顾前面引导模型中扩散损失的公式

\[L_{\text{diffusion}}=\mathbb{E}_{t, \mathbf{x}_{0}, \epsilon}\left[\left\|\epsilon-\epsilon_{\theta}\left(\mathbf{x}_{t}, t\mid y\right)\right\|^{2}\right],\]

我们可以将 prior 扩散损失(the prior diffusion loss)表示为

\[L_{\text{prior:diffusion}}=\mathbb{E}_{t}\left[\left\|z_{i}-f_{\theta}\left({z}_{i}^{t}, t \mid y\right)\right\|^{2}\right],\]

其中

  • \(f_{\theta}\):prior 模型
  • \({z}_{i}^{t}\):带噪图像的嵌入
  • \(t\):时间戳
  • \(y\):用于引导的标题。

4.2.4 小结

以上就是 unCLIP 的前半部分,旨在生成一个能够将文本中的所有重要信息封装到 CLIP 样式的 image embedding 中的模型。 有了这个模型之后,就能根据用户输入的文本得到一个 image embedding。 而有了 image embedding,就能基于扩散模型反向(un-)生成最终的视觉输出 —— 这就是 unCLIP 名称的由来 —— 从 image embedding 回溯到图像,与训练 CLIP image encoder 的过程相反。

接下来看 DALL·E 2 中是如何实现这个反向过程的。

4.2 The decoder:基于 GLIDE 的改进

一个扩散模型的尽头是另一个扩散模型!(After one diffusion model it is time for another diffusion model!)。

在 DALL·E 2 中,“另一个扩散模型”就是前面已经介绍过的 GLIDE

对 GLIDE 做了点修改,将 prior 输出的 CLIP image embedding 添加到 vanilla GLIDE text encoder 中。 其实这正是 prior 的训练目标 - 为 decoder 提供信息

4.3 引导扩散和上采样

引导方式与普通的 GLIDE 一样。为改进效果,10% 概率将 CLIP embedding 设置为 \(\emptyset\),50% 概率设置文本标题 \(y\)。

跟 GLIDE 一样,在图像生成之后,利用另一个扩散模型进行上采样。 这次用了两个上采样模型(而不是原始 GLIDE 中的一个),一个将图像从 64x64 增加到 256x256,另一个进一步提高分辨率到 1024x1024。

5 Google Imagen:删繁就简,扩散三连,2022.05

DALL·E 2 发布不到两个月, Google Brain 团队也展示了自己的最新成果 - Imagen(Saharia 等 [7])。

5.1 架构:T5-XXL + Diffusion + Diffusion + Diffusion

Fig. Overview of Imagen architecture. [7]

Imagen 架构在结构上非常简单:

  1. 预训练的文本模型用于创建 embedding,然后用这些 embedding 扩散成图像;
  2. 通过超分辨率扩散模型增加分辨率。

但架构中还是有一些新颖之处,比如模型本身和训练过程,总体来说还是先进一些。 这里只介绍下它与前面几个模型不同之处。

5.2 与 GLIDE、DALL·E 2 等架构的不同

5.2.1 使用预训练的 transformer (T5-XXL) 而不是从头开始训练

与 OpenAI 的工作相比,这是核心区别

对于 text embedding,

  • GLIDE 使用了一个新的、经过专门训练的 transformer 模型;
  • Imagen 使用了一个预训练的、冻结的 T5-XXL 模型 [4]。

这里的想法是,T5-XXL 模型在语言处理方面比仅在图像标题上训练的模型有更多的上下文, 因此能够在不需要额外微调的情况下产生更有价值的 embedding

5.2.2 使用更高效的底层神经网络(efficient U-net)

使用了称为 Efficient U-net 的升级版神经网络, 作为超分辨率扩散模型的核心。

比之前的版本更节省内存,更简单,并且收敛速度更快。 主要来自残差块和网络内部值的额外缩放。细节详见 [7]。

5.2.3 使用 conditioning augmentation 来增强图像保真度(image fidelity)

Imagen 可以视为是一系列扩散模型,因此在模型连接处 (areas where the models are linked)可以进行增强。

  • Ho 等提出了一种称为条件增强(conditioning augmentation)的解决方案[10]。 简单来说就是在将低分辨率图像输入超分辨率模型之前对其 apply 多个 data augmentation 技术,如高斯模糊。
  • 还有一些对于低 FID score 和高图像保真度至关重要的资源(例如 dynamic thresholding), 论文 [7] 中有详细解释。但这些方法的核心已经在前几节都涵盖了。

5.3 小结

截至 2022.04,Google’s Imagen 是最好的 text-to-image generation 模型。

Fig. Imagen 根据提示词生成的一些图片。[7]

6 总结

6.1 如何评估模型好坏

Imagen 的作者提供了两种评估方式,详见论文 [7]。

Fig. Comparison of several models. [7]

6.2 好玩儿的才刚开始

除了图像生成能力,文生图模型还有许多有趣的特征,比如图像修复、风格转换和图像编辑等等。

另一方面,扩散模型也还存在一些缺点,例如与以前的模型相比,采样速度较慢[16]。

不同类型的文生图模型的考虑因素/优缺点 [16]

最后,对于喜欢深入实现细节的人,强烈推荐 [19],这是一些 github 项目, 众人手撸实现那些没有公开代码的模型。

参考资料

  1. Language Models are Few-Shot Learners Tom B. Brown et al. 2020
  2. Deep Unsupervised Learning using Nonequilibrium Thermodynamics 扩散数学原理,2015
  3. Denoising Diffusion Probabilistic Models 去噪扩散模型论文,基于 2,同一作者,2020
  4. How Much Knowledge Can You Pack Into the Parameters of a Language Model? Adam Roberts, Colin Raffel, Noam Shazeer. 2020
  5. Classifier-Free Diffusion Guidance Jonathan Ho, Tim Salimans. 2021
  6. GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models Alex Nichol et al. 2021
  7. Zero-Shot Text-to-Image Generation Aditya Ramesh et al. 2021
  8. Diffusion Models Beat GANs on Image Synthesis Prafulla Dhariwal, Alex Nichol. 2021
  9. Learning Transferable Visual Models From Natural Language Supervision Alec Radford et al. 2021
  10. Cascaded Diffusion Models for High Fidelity Image Generation Jonathan Ho et al. 2021
  11. Hierarchical Text-Conditional Image Generation with CLIP Latents Aditya Ramesh et al. 2022
  12. Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding Chitwan Saharia et al. 2022
  13. What are Diffusion Models? 数学推导,Lilian Weng. 2021
  14. Diffusion Models as a kind of VAE 数学推导,Angus Turner. 2021
  15. An introduction to Diffusion Probabilistic Models 数学推导,Ayan Das. 2021
  16. Improving Diffusion Models as an Alternative To GANs, Part 1 Arash Vahdat, Karsten Kreis. 2022
  17. DrawBench prompts Google Brain team. 2022
  18. DALL·E 2 subreddit Reddit. 2022
  19. Phil Wang’s repositories Phil Wang. 2022

Written by Human, Not by AI Written by Human, Not by AI

大语言模型LLM的基本逻辑

上一篇说到我准备入个坑,结果就是最近埋头苦苦补习最基本的一些知识。随便写点东西梳理一下思路吧,这样万一我真的开始做点什么也算是一个基本素材。一些英文的名词我就不翻译了,反正现在大家英语都挺好的。

先来一些可以基本望文生义的名词解释。LLM=large language model = 大语言模型。这简直是个不能再俗的名字了。GPT = generative pre-trained transformer ,也是够直白的。

再来个极其简单的(受限于园主阅历)历史回顾。自然语言处理基本上经历了 word2vec, RNN,然后就是现在的transformer了。其实说到底,自然语言处理的基本问题就是一个时间序列问题。当园主意识到这点的时候也是惊掉了下巴,什么,计量里面的时间序列不是Autoregression, moving average,stationary 那些东西么,怎么看都跟自然语言扯不上关系了。后面看到做量化的人都在跟这个方向的进展,才明白说到底都是时间序列嘛。想想也是,自然语言就是一个把词按照特定顺序排列起来的数据,词与词之间的关联和顺序最终表达了一定的意义。

nlp模型想法差不多,就是基于已经有的词,预测对应的下一个词的概率。建模不是问题,但数据上来后计算是问题啊……于是有了transformer 那篇著名的 Attention is all you need,伴随着经典的encoder-decoder结构,就出现了让图灵测试不再是问题的大语言模型们。

再来一轮名词解释。自然语言到建模之前,需要先把unstructured data转换为可以计算的数字,这就是embedding 这一步,也叫token 化。然后再怎么办呢?transformer的核心是再算一下attention 矩阵,这个矩阵主要涵盖了词与词之间关联程度(不贴公式了),然后要做的就是放到神经网络里面去算了。这里有意思的是,encoder里面不只有一个基于attention数据的模型,而是多个,所以称之为 multi-head attention (多头注意力)。为啥需要多个模型呢,因为神经网络很有名的一个feature(bug)是local optima,即随着初始值的不同,参数可能会迭代到一个局部最优。至于全局最优嘛,存不存在都还是个迷。反映到encoder这里,有意思的是每个单独的模型就有可能抓住语言的某一个层面的特征,比如语法,比如逻辑,比如修辞,比如情绪,以及一些语义学还无法解释的神秘模型。但不要紧,大力出奇迹,只要计算机能算得出来就行。

encoder到这里已经可以做很多任务了,最显著的大概是sentiment analysis, 就是判断里面的情绪。比如一个评价是正面负面,或者是关于价格还是物流速度,等等。这些分类模型对于很多应用场景都是很有价值的信息提取过程,也称为auto-encoding。

decoder呢,任务就更直接,就是通过输入的新数据来预测并生成下文。这也是GPT的厉害之处,可以自己写小作文了。所以这一类也叫autoregressive model ,即AR!再看下去,其实decoder的架构和encoder很像,所以他们的并不是模型架构本身,而是任务的目标不同。

那什么时候我们会同时需要encoder和decoder呢?典型的例子就是两种语言之间的翻译。大概的数学任务就是,给定前后的词,来猜中间缺失的词是什么。这一类就是sequence to sequence 模型了。至于模型的评价,现有Rouge, Bleu等指标(怎么都是法语里的颜色……)。

好了,现在我们有一个transformer模型了,就可以高枕无忧了么?当然不是,下一阶段就是,fine-tuning 或者更准确的说,instruction fine tuning。

这一步,说到底就是让模型理解人们的意图。比如,我想让ChatGPT给我写代码,那我就会先给一个指令,help me write a code in python,这样它才可以理解我要的是代码而不是一个翻译任务。这类对于指定任务类型的 instruction 的训练,不仅仅在于理解目的,还牵扯到对于不同类型任务的参数细调。最简单粗暴的,我们可以要求对某一类型任务完全刷新所有参数,即full fine tuning,也可以省点资源,来只训练部分参数,即parameter efficient fine tuning PEFT。近期还有比较有意思的LoRa方法,在原来的参数矩阵外额外训练两个rank小很多的矩阵,最后再把新的两个小矩阵的乘起来,加到原始的参数矩阵上。甚至我们可以对instruct 的数据单独做一个小模型单独训练,然后在embedding 那一步把数据预处理后再喂给encoder or decoder。

fine tuning之后,理论上llm模型已经有了不错的预测能力了,但还需要一步alignment,即通过reinforcement learning 来进一步训练模型给出更符合人们需求的回答,比如 HHS (helpful, honest, harmless)。这一步主要是利用额外的人为标记的数据,比如对于多个候选答案之间的排序等等。当然,我们还可以搞个单独用来打分的模型给GPT的答案打分,哈哈,让机器自动自我修正。

这一些做完,基本上就是chatGPT 的雏形了。然后我们发现,不够,远远不够,一个AGI不能只有对话功能。下一步显然就是多模态Multimodality,即文字语音图像视频等等形式的结合。到这里,我们大概可以窥见这是一种“搭积木”的挑战了,即每一块儿自己的AI模型要和其他领域的结合起来,互通有无。

再来一组名词解释。Langchain,主要想法是各领域最后都转化为一个文本语言问题,然后互通有无。RAG (retrieval augmented generation) ,主要用来引入额外的信息来补全LLM的知识储备。ReAct (Reasoning and Acting augments) 主要是理解指令并利用各种多模态的模块来执行具体任务。

——

对了,为啥么这里园主通篇不提prompt。因为,园主觉得这就是个成长过程中不成熟阶段的伪命题……过两年可能就完全嵌入大模型本身了。

——

园主这些知识大概一半是Coursera 这门Generative AI with LLM 课扫盲来的。这门课主打一个深入浅出,适合理清大模型的整体逻辑,极其适合入门。剩下一半就是读各类的新闻和paper,还有各种视频。只能说,互联网时代,知识本身触手可及,考验的是系统学习的鉴别能力。

——

这篇本来是想写个提纲然后扔给GPT帮我完成的,结果最后还是老老实实的手动敲完了。哎,下次试试能不能用GPT写的更好一些。

❌