简单解释 Diffusion Models (扩散模型)
sean goedecke
简单解释 Diffusion models (扩散模型)
基于 Transformer 的大型语言模型相对容易理解。 你将语言分解成有限的“tokens”(单词或子词成分),然后在数百万个 token 序列上训练神经网络,以便它可以根据所有先前的 token 预测下一个 token。 尽管有一些巧妙的技巧(主要关于模型如何处理序列中的先前 token),但核心机制相对简单。
要对 diffusion models 建立同样的直觉比较困难(部分原因是论文更难读)。 但 diffusion models 几乎与 transformers 一样是 AI 革命的重要组成部分。 高质量的图像生成推动了用户对 AI 的极大兴趣,尤其是 ChatGPT 最近升级的图像生成功能。
即使你不太关心图像,也有一些相当强大的基于文本的 diffusion models——虽然尚未与前沿的 transformer 模型竞争,但我们将来可能会看到一个 diffusion 语言模型在其特定领域达到最先进的水平。
核心直觉
那么什么是 diffusion models? 它们与 transformers 有什么不同? 使 diffusion models 工作的核心直觉是什么?
想象一张狗的照片。 你可以慢慢地向该图片添加随机颜色的像素——视觉上等同于“白噪声”——直到它看起来就像噪声。 你可以对任何可能的图像做同样的事情。 所有这些可能的图像看起来都非常不同,但最终的噪声看起来是一样的。 这意味着对于任何可能的图像,在该图像和“纯噪声”之间都存在一个梯度步骤。
如果你可以训练一个模型来理解这个梯度呢?
训练和推理
要训练 diffusion model,你需要获取一大组图像,每个图像都表示为一个大的 tensor,以及每个图像的标题,每个标题都表示为一个普通的文本模型嵌入。 在训练的每个步骤中,对于当前图像,你添加少量随机噪声。 然后,你将这个带噪声的图像和标题传递给模型,并要求它准确地预测添加到图像中的噪声(例如,哪些像素从什么颜色更改为什么颜色)。 与语言模型不同,没有“tokens”——每个模型步骤都将完整的图像作为输入,并生成一个“噪声报告”作为输出。 最后,你根据模型预测的准确程度来奖励模型1。
重要的是要训练带噪声的图像,从少量噪声到与静态图像无法区分的图像。 通常,这是通过在训练期间(在固定时间表上)向训练集中的图像添加越来越多的噪声来完成的。 最终,你的模型会非常擅长识别最后一层噪声,即使是从看起来像上面“纯噪声”图像的图像中也能识别出来。
在推理时,这正是你所做的:从纯噪声和用户提供的标题开始,然后运行模型以识别“最顶层”的噪声。 删除该层,然后继续运行模型并删除各层,直到剩下“原始”图像。 实际上,该图像完全由模型生成。 识别一层噪声并将其反转的过程称为“去噪”。
这个过程中会使用很多技巧,但最重要的两个是 variational auto-encoders 和 classifier-free guidance。
Variational auto-encoders
将图像(或视频)表示为一个大的 tensor 非常昂贵。 图像有很多像素! 实际上,diffusion models 在每个图像的_压缩_版本上运行,有点像文本模型在 tokens 字符串而不是单个字母或字节上运行一样。 如何生成该压缩版本?
通常使用首先训练的 variational autoencoder (VAE) 模型。 该模型学习将大的图像 tensor 转换为较小的随机外观的 tensor,同时仍然能够将其转换回原始图像。 为什么使用 VAE 而不是现有的知名压缩算法(如 JPEG)?
- 重要的是,压缩后的表示形式应具有随机外观(即高斯形状),以便去噪过程正常工作。 JPEG 压缩具有高度结构化
- 压缩后的表示形式必须始终为相同大小,而当前的压缩算法无法做到这一点
- VAE 可以丢弃一些细节(例如,相机噪声),而 JPEG 压缩会保留这些细节
因此,训练和推理的常用策略是在图像 tensor 上运行 VAE,添加噪声,对其进行去噪,然后将其解码回原始全尺寸图像。 请注意,有些模型不使用 VAE,例如 DALLE-3,但是它速度慢且成本高昂。
Classifier-free guidance
有一个常见的技巧可以确保模型实际上是在学习根据标题生成图像,而不是仅仅生成任何可能的图像。 在训练期间,你会将某些图像的标题归零,因此该模型会学习两个函数:不仅是如何消除标题的噪声,还包括如何消除任何可能图像的噪声。 在推理期间,你使用标题运行一次,不使用标题运行一次,然后混合预测结果(放大这两个向量之间的差异)。 这样可以确保模型非常关注标题。
与 Transformers 的主要区别
此处的根本操作与基于 Transformer 的语言模型完全不同,因此你对 transformers 的许多直觉将不适用。 例如:
- 在每个推理步骤中,transformers 会不断生成新的 token,而 diffusion models 会从(例如)256x256 像素的图像变为不同的 256x256 像素的图像。
- Transformers 从除了提示之外什么都没有开始,但是 diffusion models 需要纯噪声的“空白画布”才能工作。
- Transformers 不会“编辑”先前生成的 token ——一旦输出,它们就被锁定——但是 diffusion models 可以并且确实会在进行过程中更改先前的输出。
- 如果你提前停止 transformer,你可能无法获得想要的答案。 如果你提前停止 diffusion model,则会获得所需图像的噪声版本。
最后一点表明 diffusion models 具有一个有趣的性能:你可以获得一种内置的质量控制旋钮。 如果你想要以质量为代价来获得快速推理,则可以只运行模型更短的时间,并最终在最终输出中产生更多噪声2。 如果你想要高质量,并且乐于花时间到达那里,则可以继续运行该模型,直到它完成消除噪声为止。
为什么它有效?
Transformers 有效,是因为(事实证明)人类语言的结构包含一个功能性的世界模型。 如果你训练一个系统来预测句子中的下一个单词,那么你将得到一个“理解”世界如何以惊人的高水平运作的系统。 所有令人兴奋的功能都由此产生——长期计划、类人对话、工具使用、编程等等。
diffusion models 的等效启动直觉是什么? 我真的不知道,但这可能是关于噪声和数据之间的关系——如果你可以训练一个系统来区分它们,那么你是否必然将世界模型编码到该系统中? 我敢打赌,这里有一种更好的表达方式,或者可以提取出更好的直觉。
适用于图像的相同原理也适用于其他类型的数据:视频、音频,甚至文本。
Diffusion 视频模型
到目前为止,所有这些都是关于图像 diffusion models 的。 那么生成视频的 diffusion models 呢? 据我所知,有很多不同的方法,但最简单的一种是将整个视频视为单个噪声输入。 你的输入不是代表单个图片的 tensor,而是代表视频剪辑中所有帧的(更大的)tensor。 当模型学习识别噪声时,它也在学习每个帧如何与剪辑中的其他帧相关(对象持久性、因果关系等)。
我发现你可以对视频有效运行与对单个图像相同的方法非常酷。 这表明此处的根本机制非常强大。 它也阐明了为什么当前的视频 diffusion models(例如 OpenAI 的 Sora 或 Google 的 VEO)仅生成剪辑而不能像基于文本的 transformer 模型那样“保持继续”。
顺便说一句,音频生成的工作方式相同,只是使用大的音频 tensor 而不是大的视频 tensor。
Diffusion 文本模型
那么生成文本的 diffusion models 呢? 基于文本的 diffusion models 真的很奇怪,因为你不能像对图像或视频一样简单地将噪声像素添加到文本中。主要的策略似乎是将噪声添加到文本_嵌入_中3。 在推理时,你从一大块纯噪声嵌入(大概只是随机数)开始,然后进行去噪,直到它变成实际可解码的文本。
如何将嵌入转换回文本? 没有明显的方法。 如果你只是尝试查找每个嵌入的“最接近”的 token,你通常会得到乱码。 如果你使用单独的解码器模型来转换嵌入,那可以工作,但感觉有点像作弊——此时你的 diffusion model 实际上只是在为你的真实文本生成模型生成计划。
总结
- Diffusion models 经过训练,可以根据标题嵌入识别图像中的少量噪声
- 这意味着你可以从纯噪声和用户提供的标题开始,然后不断消除各层噪声,直到得到模型认为原始图像应该是什么样子
- 操作模型与 transformers 非常不同:不是基于序列的,而是对先前的输出进行操作,并且原则上可以加速或提前停止
- 视频 diffusion 的工作方式与图像 diffusion 的工作方式相同,但是模型更难学习,因为它需要跟踪随时间推移的一致性
- 文本 diffusion 很奇怪,因为你不能轻易地将噪声添加到语言中,并且如果你在添加噪声之前转换为嵌入,则很难可靠地转换回