UCB-CS294-深度无监督学习笔记-全-

UCB CS294 深度无监督学习笔记(全)

课程 P1:深度无监督学习简介 🧠

在本节课中,我们将要学习深度无监督学习的基本概念、其重要性以及本课程的整体安排。我们将从讲师团队介绍开始,了解课程的后勤信息,并探讨无监督学习在当今人工智能领域的核心地位与激动人心的应用前景。

讲师团队介绍 👥

我是 Peter Beal,这门课程的教授。我们有三位共同讲师。

以下是他们的自我介绍:

  • 菲利普:我是一名博士生,与 Peter 教授一起研究现实世界的机器人学习,涉及强化学习、模仿学习和监督学习的交叉领域。
  • 凯文:我也是 Peter 和谢尔盖的博士生,从事强化学习算法和生成建模方面的工作。
  • 威尔逊:我是 Peter 的计算机科学学生之一,研究方向是生成模型,特别是视频和语言生成。我之前上过这门课,并在下学期成为了助教。

课程后勤与安排 📅

上一节我们介绍了讲师团队,本节中我们来看看课程的具体安排和后勤信息。

课程网站包含了所有必要信息,我们通常会在讲座前发布幻灯片。

我们使用 Ed 论坛进行课程交流。如果你有疑问,请优先在论坛提问,这样其他同学也能看到并帮助解答,避免重复的单独邮件。如果你已注册或在候补名单上,应该已被加入论坛。

办公时间将从下周开始。我的办公时间在讲座之后。其他助教的办公时间将在下周确定。

课程注册方面,由于需求远超名额,我们会根据作业提交情况调整名单。提交一份高质量的作业是留在课程中的重要指标。如果你认为课程不适合你,请尽早退课,为他人腾出空间。欢迎旁听和提交作业。

关于作业评分,我们设计的作业应该能被有能力完成课程的同学解决。高质量的作业意味着你基本解决了所有问题。我们预计大约90%的正确率是一个良好的门槛。

以下是本课程的主要时间节点:

  • 作业:每两周发布一次,有4天的宽限期。
  • 期中考试:在4月11日的讲座期间进行。考试前一周,我们会提供一份包含重要推导问题和答案的复习文档。
  • 期末项目:涉及探索无监督学习的边界。可以是新算法、应用调查或基准测试等。项目提案于2月28日截止,4月提交中期里程碑报告,5月10日提交最终报告和视频演示。
  • 课程评分:作业占60%,期中考试占10%,期末项目占30%。

课程会被录制并发布在网上。虽然没有强制出勤要求,但强烈推荐参加,以便与同学交流想法。

什么是深度无监督学习? 🤔

上一节我们了解了课程安排,本节中我们来看看深度无监督学习的核心定义。

深度无监督学习是通过深度网络,以无标签的方式捕获原始数据中丰富模式的方法。

无监督学习包含两个主要子领域:

  1. 生成模型:尝试重新创建原始数据分布。
  2. 自监督学习:通常是“填空”任务,通过预测被掩盖或转换的数据部分来学习数据表示。

生成模型与典型监督学习的关键区别在于,它需要对神经网络输出的复杂概率分布进行建模,而不仅仅是预测一个确定性标签。

为什么关心无监督学习? 🚀

上一节我们定义了无监督学习,本节中我们来看看其重要性和动机。

人类大脑拥有约 10^14 个突触,但寿命只有约 10^9 秒。这表明我们拥有的“参数”远多于“标签数据”,因此必须进行大量的无监督学习。

Yann LeCun 在2016年提出的“蛋糕类比”指出,无监督学习(获取世界知识)是蛋糕的主体,监督学习(特定技能)是糖霜,强化学习(精细调整)是樱桃。如今ChatGPT等系统的成功恰恰印证了这一结构:在互联网数据上进行无监督预训练(蛋糕),监督微调(糖霜),基于人类反馈的强化学习(樱桃)。

从智能的本质看,理想的智能可以理解为压缩。找到数据中的所有模式,意味着找到数据的简短描述,即降低其柯尔莫哥洛夫复杂度。在神经网络中,可以理解为:能够最好地重建数据的最紧凑神经网络,可能也是最能理解数据、泛化能力最强的网络。

此外,对数据分布 D1 进行无监督预训练,再对相关分布 D2 进行微调,其效率应高于直接压缩 D2。这为无监督学习作为预训练步骤提供了理论直觉。

无监督学习拥有强大的应用前景,包括生成新数据、条件合成、数据压缩、改进下游任务等。它为监督学习和强化学习提供了可重用的架构组件。

生成模型的发展历程 🖼️

上一节我们探讨了无监督学习的动机,本节中我们快速回顾一下生成模型,特别是图像生成的发展历程。

早期,深度信念网络展示了用神经网络生成类训练集图像的能力。

2014年,变分自编码器(VAEs)和生成对抗网络(GANs)的出现是重大突破。GANs 由 Ian Goodfellow 在一次讨论中构思,通过让一个神经网络(判别器)给另一个神经网络(生成器)提供反馈,首次生成了相对清晰的图像。

随后,GANs 在 Alec Radford 等人的工作中实现了更高质量的图像生成,并催生了像 CycleGAN(图像风格转换)和 BigGAN(大规模高保真图像生成)等许多进展。

然而,GANs 存在模式覆盖不全的问题。2020年,扩散模型的出现改变了局面,它既能生成逼真图像,又能更好地覆盖数据分布。如今,DALL·E、Imagen、Stable Diffusion 等模型展示了令人惊叹的文本到图像生成能力。

超越图像:无监督学习的广泛应用 🎵📹

上一节我们回顾了图像生成的历程,本节中我们来看看无监督学习在其他领域的应用。

音频生成:WaveNet 展示了自回归模型可以生成原始音频。后续工作如 AudioLM 和 Tacotron 将文本和音频标记到同一空间,实现了高质量的文本到语音和音乐生成。

视频生成:从早期的基于GANs的方法,到如今基于扩散模型(如 Emu Video)和自回归模型(如 VideoPoet)的方法,视频生成正迅速进步,尽管一致性和连贯性仍是挑战。

语言模型:从字符级RNN到GPT系列,自回归语言模型通过预测下一个词,展示了强大的文本生成和理解能力。提示工程使我们能够引导这些模型执行特定任务。

3D生成与科学应用:通过NeRF等技术,可以从2D图像无监督地学习3D物体表示和生成。在科学领域,如AlphaFold,无监督的表示学习对蛋白质结构预测起到了关键作用。

压缩:生成模型可以作为压缩器,通过学习数据分布,用比传统方法(如JPEG)更少的比特表示数据。

预训练范式的胜利 🏆

上一节我们看到了无监督学习的广泛应用,本节中我们聚焦于其核心范式:大规模无监督预训练 + 下游任务适配。

这种范式已在多个领域证明其强大。在自然语言处理中,像BERT或GPT这样的模型经过无监督预训练后,只需少量微调或甚至零样本提示,就能在情感分析、阅读理解等任务上取得优异表现。

在计算机视觉中,类似的故事也在上演。通过对比学习或掩码自编码器等无监督方法进行预训练,然后在检测、分割等任务上进行微调,其性能可以超越或媲美完全监督训练的方法。

一个标志性事件是:Jitendra Malik 与 Alyosha Efros 曾打赌,无监督方法能否在2015年秋之前,在不使用额外人工标注的情况下,在Pascal VOC检测任务上匹配R-CNN的性能。直到2020年秋,CPCv2 论文才实现了这一点,证明了从长远看,无监督预训练是一种更强大的方法。

总结与展望 🔮

本节课中,我们一起学习了深度无监督学习的简介。

我们认识了讲师团队,了解了课程的后勤安排、评分方式和重要时间节点。我们深入探讨了无监督学习的定义、其相对于监督学习的核心区别,以及从大脑科学、智能本质到实际效率的多重动机。

我们回顾了生成模型,特别是图像生成技术的发展简史,从VAE、GANs到如今的扩散模型。我们也看到了无监督学习在音频、视频、语言、3D、科学和压缩等领域的广泛应用。最后,我们强调了“大规模无监督预训练 + 适配”这一当前主导范式的成功及其未来潜力。

这个领域发展迅速,今天的常识明天可能就被打破(例如,视觉中的掩码建模曾被认为无效,直到被正确实现)。本课程将详细介绍自回归模型、流模型、隐变量模型、GANs和扩散模型这五类主要生成模型,以及自监督学习等内容。

挑战在于,这些方法的宏观理念与数学细节、工程实现之间可能存在差距,而这正是创新和下一代模型可能诞生的地方。希望本课程能激励你深入思考,或许能催生下一个突破。

课程 P10:半监督学习与无监督分布对齐 🧠

在本节课中,我们将要学习两个核心主题:半监督学习无监督分布对齐。这两个主题虽然在近期大规模预训练模型盛行的背景下研究热度有所降低,但其背后的思想依然非常丰富和富有启发性。我们将探讨如何利用少量标记数据和大量未标记数据来提升模型性能,以及如何在没有任何配对样本的情况下,学习两个不同数据分布之间的对应关系。

概述

首先,我们来了解一下本学期的进度安排。目前家庭作业已完成过半,项目里程碑即将到来。下周是春假,之后我们将讨论模型压缩,并迎来期中考试。考试形式是开卷,我们会提前提供问题列表。

本节课的核心是理解两种特殊的学习范式。半监督学习旨在利用大量未标记数据来辅助少量标记数据的学习。无监督分布对齐则试图在没有配对样本的情况下,找到两个不同数据域(如两种语言、两种图像风格)之间的映射关系。


半监督学习

在传统的监督学习中,我们拥有大量带标签的数据。然而,获取标签通常是耗时且昂贵的。半监督学习的核心思想是:我们拥有少量标记数据和大量未标记数据,目标是利用未标记数据中蕴含的分布信息,来提升模型在标记数据上的学习效果。

从直观上看,如果我们只使用少量标记数据(如下图中间所示),学到的决策边界可能无法捕捉数据的整体结构。而如果我们能利用未标记数据点之间的邻近关系,将标签信息“传播”到邻近的未标记数据上,就可能找到更合理的决策边界(如下图右侧所示)。

问题形式化

在监督学习中,我们试图最大化条件概率 ( P(Y|X) )。在半监督学习中,我们有两个数据集:

  • 有监督数据集 ( D_s ): 包含输入 ( X ) 和输出 ( Y ),来自联合分布 ( P(X, Y) )。
  • 无监督数据集 ( D_u ): 仅包含输入 ( X ),来自边缘分布 ( P(X) ),这个 ( P(X) ) 与 ( D_s ) 中的 ( P(X) ) 相同。

目标是利用 ( D_u ) 来帮助更好地学习 ( P(Y|X) )。

核心方法

历史上,人们提出了多种半监督学习方法。我们将介绍几种代表性思路,它们通常可以结合使用。

1. 熵最小化

直觉是:一个好的分类器应该在数据点上做出自信的预测,即预测分布的熵应该很低。我们不希望决策边界穿过数据密集的区域。

方法:在目标函数中增加一项,最小化模型在未标记数据上的预测熵。
公式
[
\mathcal{L} = \mathcal{L}{sup} + \lambda \mathbb{E} [H(P(y|x))]
]
其中,( H ) 表示熵,( \lambda ) 是权衡超参数。

2. 伪标签

这是一种渐进式的熵最小化方法。

步骤

  1. 在标记数据上训练一个分类器。
  2. 用该分类器对未标记数据进行预测,为置信度最高的一部分样本分配“伪标签”。
  3. 将带有伪标签的样本加入训练集,重新训练分类器。
  4. 重复步骤2和3,直到所有未标记数据都被标记。

这个过程可以看作是从标记数据区域开始,逐步将决策边界扩展到未标记区域。

3. 标签一致性与数据增强

一个更强大的想法是:对输入数据进行不改变其语义的增强(如裁剪、翻转、变色),模型对原始样本和增强样本的预测应该保持一致。

核心:强制模型对同一个数据的不同增强版本产生相似的输出(logits)。这相当于在局部区域平滑了分类器的决策函数。

实现方式(以Π模型为例)

  • 对每个样本(无论是否有标签)应用两次随机数据增强和Dropout,得到两个输出 ( z ) 和 ( \tilde{z} )。
  • 对于有标签样本,计算标准交叉熵损失。
  • 对于所有样本,计算一致性损失,例如均方误差 ( |z - \tilde{z}|^2 )。
  • 总损失是监督损失和无监督一致性损失的加权和。

为了避免每个样本都需要前向传播两次,衍生出了时序集成Mean Teacher等方法。Mean Teacher维护一个模型参数的移动平均版本(“教师”模型),并让学生模型的预测与教师模型的预测保持一致。

4. 虚拟对抗训练

这种方法不是使用预设的数据增强,而是主动寻找模型预测最敏感的变化方向(即“对抗性”方向),并强制模型在这个方向上的变化也很小。

步骤

  1. 对于每个数据点,计算其梯度,找到能最大程度改变模型预测的扰动方向。
  2. 强制模型对施加了该扰动的数据点做出与原始数据点一致的预测。

这能有效促使决策边界在数据点周围保持平坦。

方法比较与演进

一篇重要的论文《深度半监督学习算法的现实评价》对多种方法进行了系统比较。他们使用固定的强大网络架构,在CIFAR-10和SVHN数据集上测试。结果发现,在标记数据量不同时,虚拟对抗训练(VAT) consistently表现优异。

随后,谷歌的研究团队将一致性训练与更先进的数据增强技术结合,提出了无监督数据增强(UDA) 方法。他们在图像(使用AutoAugment策略)和文本(使用回译和TF-IDF词替换)任务上都取得了显著提升,甚至在少量标记数据下超越了完全监督的基线模型。

进一步的改进包括MixMatchNoisy Student

  • MixMatch:融合了数据增强、一致性训练、熵最小化和MixUp(混合样本与标签)技术。
  • Noisy Student:这是一个自训练过程。首先在标记数据上训练一个“教师”模型,用于生成未标记数据的伪标签。然后,训练一个更大的“学生”模型,在加入了噪声(如数据增强、Dropout、随机深度) 的数据上,同时拟合标记数据和伪标签。迭代此过程,学生模型在下一次迭代中成为新的教师。Noisy Student首次在ImageNet上证明了半监督学习可以稳定地超越完全监督学习。

无监督分布对齐

上一节我们介绍了如何利用未标记数据提升分类性能。本节中,我们来看看一个不同但相关的问题:如何在完全没有配对样本的情况下,学习两个数据分布之间的映射。

问题定义

我们有两个域的数据,例如:

  • 域A:英语句子集合
  • 域B:法语句子集合
  • 域A:真实照片
  • 域B:莫奈风格的画作

我们可以分别从分布 ( P_A ) 和 ( P_B ) 中采样,但无法获得成对的样本 ( (a, b) )。目标是学习一个映射函数,能够将域A的样本转换到域B,反之亦然。这个映射可能是确定性的,也可能是随机的(一个分布)。

核心原则

解决这个问题主要依赖两个基本原则:

1. 边缘分布匹配

当我们把域A的样本通过映射 ( G_{A\to B} ) 转换到域B时,生成的样本应该看起来像是从域B的真实分布 ( P_B ) 中采样的。反之亦然。这确保了转换后的样本在目标域中是“逼真”的。

2. 循环一致性

如果我们把一个样本从域A转换到域B,再通过反向映射 ( G_{B\to A} ) 转换回域A,应该能够恢复出原始的样本。即 ( G_{B\to A}(G_{A\to B}(a)) \approx a )。这防止了映射学习到一些平凡或无意义的对应关系。

经典方法:CycleGAN

CycleGAN是应用上述原则的经典工作。它使用生成对抗网络来实现:

  • 边缘匹配:通过GAN的判别器来确保转换后的图像符合目标域的分布。
  • 循环一致性:通过额外的循环一致性损失函数来约束 ( G_{B\to A}(G_{A\to B}(a)) ) 与 ( a ) 尽可能接近。

CycleGAN成功实现了诸如马到斑马、照片到油画风格等转换。然而,GAN训练本身不稳定,且确定性映射有时会“作弊”(例如在转换中隐藏信息以便完美重建),或无法处理一对多的映射关系。

改进与扩展

为了解决一对多映射问题,后续工作引入了潜在变量,使映射变为随机的。同时,为了更鲁棒地实现边缘匹配,有研究提出了去噪自编码器约束的思路:

  1. 将域A样本编码并解码到域B(如生成一段描述)。
  2. 对域B的输出随机掩码一部分。
  3. 使用一个冻结的、预训练的域B模型(如语言模型)去恢复被掩码的部分。
  4. 将恢复后的结果解码回域A,并计算重建损失。

如果步骤1中的转换不符合域B的分布(如生成了不合语法的描述),那么冻结的预训练模型将无法正确恢复掩码,导致重建困难,损失增大。这巧妙地利用预训练模型作为分布“裁判”,避免了训练GAN判别器的困难。

在多语言词向量中的惊人发现

一个有趣且成功的无监督对齐案例发生在词向量领域。研究者分别用英语语料和法语语料训练词嵌入模型(如Skip-gram),得到两个独立的词向量空间。令人惊讶的是,他们发现这两个空间的结构是同构的,只需一个简单的线性变换(旋转矩阵) 就能将一种语言的词向量空间对齐到另一种语言。

这意味着,在没有平行语料的情况下,仅通过单语数据学习到的语义空间本身就蕴含了跨语言对齐的潜力。这一发现对低资源语言的机器翻译具有重要意义。


总结

本节课中,我们一起学习了两个重要的机器学习范式。

半监督学习部分,我们看到了如何利用大量未标记数据来增强模型。从早期的熵最小化、伪标签,到基于一致性的方法(Π模型、Mean Teacher),再到更强大的虚拟对抗训练(VAT)和无监督数据增强(UDA),最终发展到能够稳定超越完全监督学习的Noisy Student方法。其核心思想始终是:利用未标记数据揭示的整体分布结构,来引导和正则化基于少量标记数据的学习过程。

无监督分布对齐部分,我们探讨了如何在无配对数据的情况下建立两个域之间的映射。CycleGAN通过边缘分布匹配(GAN损失)循环一致性损失开创了这一领域。后续工作通过引入随机性和利用预训练模型(如去噪自编码器约束)来改进。而在词向量层面发现的跨语言线性可对齐性,则展示了无监督对齐的惊人潜力。

这两个主题都强调了利用数据本身的结构和分布信息的重要性,为我们处理标签稀缺或跨域迁移问题提供了有力的工具。

🧬 P11:13a 科学生成模型

在本节课中,我们将学习生成模型在科学研究,特别是蛋白质科学领域的应用。我们将探讨如何利用概率生成模型来理解遗传变异、模拟分子物理以及从头设计全新的蛋白质。


1. 遗传学中的密度模型:从序列数据中解读自然选择

上一节我们介绍了生成模型在科学中的总体角色,本节中我们来看看它在遗传学中的具体应用。我们拥有强大的基因组测序能力,可以获取海量的DNA序列数据。然而,我们对于这些序列中大量突变的功能影响知之甚少。一个关键问题是:如何解读这些遗传变异?

有趣的是,现存生物序列的分布实际上编码了历史自然选择的信息。那些能够存活至今的序列,其分布反映了哪些突变是有益的、哪些是有害的。因此,我们可以通过为这些序列数据拟合一个密度模型,来推断背后的选择压力。

以下是构建和应用此类模型的基本步骤:

  1. 收集数据:获取大量同源蛋白质的序列比对数据。
  2. 拟合密度模型:使用深度生成模型(如变分自编码器VAE)来学习这些序列的分布。
  3. 进行推理:通过计算新序列的对数似然比,评估其是否符合自然选择的模式,从而预测突变的影响。

一个令人惊讶的发现是,这种纯粹基于进化数据训练的无监督密度模型,其输出的原始对数似然度,与实验室中实际测量的突变效应(例如蛋白质功能丧失)具有高度相关性。这证明了进化历史与生物功能之间的深刻联系。

然而,挑战依然存在。针对单个蛋白质家族的数据可能非常有限(有时只有几千个序列),这使得共享统计信息的全局蛋白质语言模型(LM)有时反而不如针对特定家族精心构建的局部模型。因此,当前的前沿方法结合了两者:训练一个覆盖所有蛋白质的大规模基础模型,但在推理时,会检索并整合特定家族的局部序列信息,以提升预测准确性。

这项工作意义重大,它帮助我们识别可能导致疾病的遗传突变,是精准医疗的重要计算工具。


2. 分子物理学作为推断问题:用生成模型加速模拟

上一节我们看到了生成模型如何解读静态序列数据,本节中我们来看看它在模拟动态分子系统中的应用。分子物理学中的一个核心任务是模拟原子和分子的运动,例如蛋白质折叠过程。这本质上是一个推断问题:我们需要从一个由能量函数定义的复杂分布(玻尔兹曼分布)中采样。

传统的分子动力学模拟需要以飞秒为步长运行数百万甚至数十亿步,计算成本极高。生成模型提供了一种“摊销采样”的思路:我们能否训练一个模型,直接生成符合目标分布的样本,从而避免昂贵的模拟过程?

一种方法是使用正则化流。其核心思想是训练一个可逆神经网络,将一个简单的分布(如高斯分布)映射到我们感兴趣的目标分布。训练目标是最小化生成分布与真实玻尔兹曼分布之间的KL散度。

公式KL[ q_φ(x) || p(x) ],其中 p(x) ∝ exp(-E(x)/kT) 是目标玻尔兹曼分布,q_φ(x) 是由流模型定义的分布。

训练完成后,我们可以直接从流模型中快速采样。虽然生成的分布可能不完美,但可以通过重要性采样等技术进行校正。然而,训练这样的流模型本身具有挑战性,因为分子系统的能量景观通常非常崎岖。

另一种更实用的方法是扩散模型增强。许多现有的结构预测模型(如AlphaFold)能给出蛋白质结构的点估计。我们可以将其视为目标分布的一个“模态”。通过向这些结构添加噪声,并微调模型以学习去噪过程,我们可以将一个确定性的预测器转变为一个能生成结构分布的扩散模型。这种方法能以较低成本增加样本的多样性,并与传统模拟数据产生交集。

这个领域仍处于早期阶段,目标是开发出能够真正替代昂贵模拟、并能探索全新分子构象的生成器。


3. 从头蛋白质设计:生成功能性的纳米机器

上一节我们探讨了如何模拟已知系统,本节我们进入更具创造性的领域:从头设计全新的蛋白质。蛋白质是生命的纳米机器,但自然界在过去几十亿年中主要依靠对现有蛋白质的编辑。我们能否利用生成模型打破这一限制,直接设计具有特定功能的全新蛋白质?

计算蛋白质设计领域已被生成模型彻底改变。扩散模型在此尤为成功。其过程与我们熟知的图像生成类似:在蛋白质的3D结构(骨架)上定义一个前向噪声过程,然后训练神经网络学习逆向的去噪过程。

关键是如何将我们对蛋白质的先验知识融入模型:

  • 尺度感知的架构:蛋白质中并非所有原子都需要相互关注。我们使用具有稀疏连接或局部性偏置的图神经网络/注意力机制,以实现接近 O(N log N) 的高效缩放。
  • 结构化的噪声过程:前向扩散的噪声协方差可以融入蛋白质链的统计特性(如链的连续性、局部密度),而非简单的各向同性高斯噪声。
  • 灵活的条件控制:设计通常需要在特定约束下进行(如对称性、结合特定形状、固定部分结构)。我们将这些约束统一到一个框架中,视为对扩散模型得分函数的调整或对采样状态空间的变换。

核心概念:条件生成可以通过两种方式实现:

  1. 软约束(能量调整):类似分类器指导,用一个辅助模型的梯度来调整得分函数。s_cond(x) = s(x) + γ * ∇_x log p(c|x)
  2. 硬约束(状态变换):通过一个可微变换 u(z) 将采样空间映射到一个满足约束的子空间,并相应调整概率密度。

通过堆叠这些条件模块,我们可以进行复杂的“分子编程”。最终,模型能在几分钟内生成全新的、在自然界中不存在的蛋白质复合体结构。通过独立的折叠软件验证,这些设计出的序列能够折叠回预期的形状。更重要的是,我们已经能够在实验室中合成这些蛋白质,并通过X射线晶体学证实了其原子级精度的结构。

这标志着我们首次能够将数字世界的生成设计,无缝转化为物理世界的功能性纳米机器,开启了蛋白质工程的新纪元。


总结

本节课中我们一起学习了生成模型在三个蛋白质科学前沿领域的应用:

  1. 遗传学解读:通过密度模型学习序列分布,零样本地预测突变效应,理解自然选择。
  2. 分子模拟加速:将分子物理视为推断问题,探索用流模型或扩散模型摊销采样,以替代昂贵模拟。
  3. 从头蛋白质设计:利用扩散模型和灵活的条件控制机制,直接生成具有特定结构和功能的全新蛋白质,并实现从数字到物理的跨越。

这些案例表明,生成模型不仅是创造内容的工具,更是强大的科学发现引擎,能够帮助我们看到数据中隐藏的模式,探索前所未有的可能性,并最终创造出新的物质和生命元件。

课程 P12:13b 神经辐射场 (NeRF) 🧠

在本节课中,我们将要学习神经辐射场(NeRF)的基本概念、工作原理及其在三维重建和生成中的应用。我们将从为什么需要三维表示开始,逐步深入到NeRF的数学原理、渲染方程和场景表示方法,最后探讨其优势、局限性与未来方向。

为什么需要三维表示?🌍

上一节我们介绍了课程概述,本节中我们来看看为什么在人工智能和计算机视觉领域,三维表示仍然至关重要。

我们生活在一个三维世界中。对于自动驾驶汽车、机器人等需要与现实世界交互的系统,有时仅处理二维像素信息是不够的。我们可能需要严格的几何测量来保证安全,例如计算前进方向和速度。此外,在增强现实(AR)应用中,例如房屋装修,我们可能希望进行底层测量而无需物理工具。所有这些应用都归结为需要准确的空间测量。

三维表示的另一个重要层面是模拟现实中不存在的场景。一个经典的案例是建筑渲染:在房屋建造前,通过CAD图纸在电脑中模拟不同光照和天气条件下的外观。另一个著名案例是宜家目录,他们使用大型3D模型来生成不同布局和文化的产品图片,而无需实际拍摄。游戏、电影中的计算机图形(CG)行业也完全依赖于底层的3D表示、物理模拟和渲染器。这使得我们可以反复模拟场景,而无需付出巨大的物理成本。

此外,人们直觉地理解物理三维世界,并以此作为交互界面。这在游戏和虚拟现实(VR)中得到了体现,沉浸式的体验和控制方式(如手柄、手势)更具吸引力。对于像苹果头显这样的设备,它需要向你准确展示世界,以避免用户撞上不存在的物体,这需要设备对世界的精确理解。

重建 vs. 生成 🎯

上一节我们探讨了三维表示的必要性,本节中我们来看看三维内容创建的两种主要范式:重建与生成。

重建意味着我们有许多对底层信号的观测或测量(通常通过某个前向模型抽象,例如从3D场景得到2D照片),然后尝试反转这些观测以恢复对底层信号的表示。目标是尽可能准确地还原真实存在的东西,避免产生幻觉。

生成则意味着我们乐于创造未曾观察到的东西。我们可能有一个纯粹的无条件生成模型,或者一个由文本、图像等语义输入控制的生成模型。例如,根据单张图片生成物体或房间,或根据文本查询生成视频。

在视频生成模型中,人们不断推动其生成更长、更一致的视频。虽然单秒的片段可能看起来很好,但观看二三十秒后,可能会开始出现物理上不可能的光学错觉。这表明了超越基础一致性的挑战,例如控制相机路径或将物体插入场景时,需要尊重真实的遮挡关系。在这些方面,使用更三维的界面可能具有优势。

什么是神经辐射场 (NeRF)?🔍

上一节我们区分了重建与生成,本节中我们将聚焦于一种特定的三维重建与合成技术:神经辐射场。

NeRF代表神经辐射场。它是一种用于计算机视觉中“新视角合成”任务的方法。新视角合成的目标是:给定一个场景的一些照片,生成从全新视角观看该场景的图像。

在传统计算机图形学中,渲染需要详细的场景描述:物体的形状、颜色、材质、灯光位置等。然后通过光线追踪或栅格化等算法,模拟相机观察并生成图像。大约在2000年左右,照片级真实感渲染已趋于成熟,并广泛应用于电影和游戏行业。然而,手动创建详细的3D资产(建模、纹理、材质)非常耗时且昂贵。

NeRF背后的驱动力是:能否仅通过一些自动化的3D重建过程,从一组照片中获取场景的3D捕捉,从而渲染新视角,而无需任何手工劳动?它特别注重新视角输出图像的质量,而不一定苛求几何或材质属性的绝对精确度量精度。

NeRF 的工作原理:高级流程 ⚙️

上一节我们定义了NeRF的目标,本节中我们来看看NeRF实现新视角合成的高级流程。

以下是NeRF从训练到渲染的核心步骤:

  1. 输入:我们拥有场景的多张输入图像,以及每张图像对应的相机姿态(包括内部和外部参数)。获取准确的相机姿态本身是一个已得到较好解决的问题(例如通过SLAM技术),尽管在非受控的“野外”视频中仍存在挑战。
  2. 光线采样:在训练时,我们随机选择一张输入图像中的一个像素。利用该图像的相机姿态,我们反向追踪一条从相机中心穿过该像素的光线,进入场景的边界体积中。
  3. 空间点采样:沿着这条光线,在边界体积内采样一系列3D点。
  4. 神经场景查询:将每个采样点的3D坐标(以及视角方向等)输入一个神经网络(通常是多层感知机MLP)。这个网络代表整个场景,它会为每个点输出两个值:
    • 颜色 (c):该点从给定视角方向看的颜色。
    • 体积密度 (σ):该点存在几何结构的概率密度,可以理解为“不透明度”。
  5. 体积渲染:利用所有采样点的颜色和密度值,通过体积渲染方程进行合成,计算出这条光线最终抵达相机传感器的颜色值。这个过程类似于图像编辑中的Alpha(透明度)合成。
  6. 优化:将计算出的颜色与输入图像中该像素的真实颜色进行比较,计算损失(如L2损失)。通过梯度下降法反向传播误差,更新神经网络的权重。重复此过程成千上万次,随机选择不同的像素,最终神经网络就能学会准确表示整个3D场景。

训练完成后,要渲染新视角,只需为新相机的每个像素执行步骤2-5即可。

体积渲染方程 📐

上一节我们概述了NeRF的流程,本节中我们将深入核心,理解其使用的体积渲染方程的数学原理。

NeRF的一个关键创新是使用了可微分的体积渲染,而非传统的表面渲染。在表面渲染中,光线与物体的交点是不连续的(击中或未击中),这给基于梯度下降的优化带来困难。体积渲染则将场景视为充满微小彩色粒子的“云”,光线穿过时会部分被吸收并自身发光,整个过程是平滑、可微的。

我们假设场景由一个体积密度场 σ(x) 和一个颜色场 c(x, d) 定义,其中x是3D位置,d是视角方向。

对于一条从相机出发的光线 r(t) = o + t*d(o是原点,d是方向向量,t是沿光线的距离),我们想计算其最终到达相机的颜色 C(r)

体积渲染方程通过积分计算这个期望值:

C(r) = ∫[t_n, t_f] T(t) * σ(r(t)) * c(r(t), d) dt

其中:

  • σ(r(t)) 是t位置处的体积密度。
  • c(r(t), d) 是t位置处从方向d看的颜色。
  • T(t)透射率,表示光线从起点 t_n 传播到位置 t没有击中任何粒子的概率。它由密度场决定:
    T(t) = exp( -∫[t_n, t] σ(r(s)) ds )
    

在实际计算中,我们无法进行连续积分。NeRF采用数值近似方法:将光线区间 [t_n, t_f] 划分为N个小段,在每个段内采样一个点,并假设该段内的密度和颜色是恒定的。

由此推导出离散化的渲染公式:

C(r) ≈ Σ[i=1 to N] T_i * (1 - exp(-σ_i * δ_i)) * c_i

其中:

  • δ_i 是第i个采样段的长度。
  • T_i = exp( -Σ[j=1 to i-1] σ_j * δ_j ) 是到达第i个段之前的累积透射率。
  • α_i = 1 - exp(-σ_i * δ_i) 可以理解为第i个段的不透明度(Alpha值)。

这个形式清晰地与Alpha合成关联起来。T_i 是之前所有层剩余的透明度,α_i 是当前层的不透明度,c_i 是当前层的颜色。最终颜色是这些层从前到后叠加的结果。

这个方程是完全可微的,允许梯度从渲染的像素颜色反向传播到每个采样点的密度σ和颜色c,从而优化神经网络。

此外,这个公式不仅限于计算颜色期望。通过替换被积函数,我们可以计算其他量的期望,例如:

  • 深度:将 c_i 替换为采样点的深度 t_i,可以估算沿光线的预期深度。
  • 语义特征:将 c_i 替换为从网络输出的特征向量,可以得到在3D空间中一致的特征场。

场景表示:从MLP到高效结构 🏗️

上一节我们掌握了渲染的数学工具,本节中我们来看看NeRF如何表示场景,以及这方面的演进。

在原始NeRF中,场景表示是一个简单的多层感知机。它将一个3D坐标点x和视角方向d作为输入,直接输出该点的密度σ和颜色c。

(σ, c) = MLP(x, d)

这被称为“神经隐式表示”。MLP的权重就编码了整个场景。它的优点是紧凑(原始NeRF约5MB),并且MLP本身对信号具有平滑正则化作用,有助于产生干净的重建,避免噪声。

然而,一个普通的MLP难以表示高频细节(如物体边缘、纹理)。原始NeRF引入了一个关键技巧:位置编码。在将坐标x输入MLP之前,先将其映射到一组高频的正弦和余弦函数上:

γ(x) = [sin(2^0 π x), cos(2^0 π x), sin(2^1 π x), cos(2^1 π x), ..., sin(2^(L-1) π x), cos(2^(L-1) π x)]

这相当于为网络提供了更高频率的输入基,使其能够轻松学习场景中的高频变化。位置编码的级数L需要仔细选择,以平衡细节重建和抗锯齿。

尽管MLP表示很优雅,但其查询和训练速度较慢。后续研究提出了更高效的显式或混合表示方法,以加速训练和渲染:

以下是几种主流改进方向:

  • 稀疏体素网格:使用一个3D网格存储特征。查询时,对点所在网格的角点特征进行三线性插值,再将插值后的特征送入一个小型MLP生成σ和c。这比纯MLP快得多。
  • 哈希网格:Instant-NGP等工作使用了多分辨率哈希表。将空间划分为网格,每个网格角点对应哈希表中的一个条目。通过激进的哈希函数允许碰撞,让优化过程自行解决冲突,从而用很小的内存开销实现高分辨率的细节。
  • 张量分解:将3D体积分解为多个低秩矩阵或向量的乘积,从而压缩表示。
  • 点云与高斯:最近的工作如3D Gaussian Splatting,完全放弃了连续的场表示,改用一系列带有各向异性协方差的3D高斯球作为显式表示。这些高斯球具有颜色和不透明度,可以通过高效的光栅化进行渲染,在训练和渲染速度上取得了巨大突破。

这些表示方法各有优劣,但都保留了NeRF核心的体积渲染和可微分优化范式。选择哪种表示通常取决于任务需求(速度、质量、内存)以及对显式控制(如动画编辑)的需要。

NeRF的结果与总结 🎬

上一节我们探讨了不同的场景表示,本节我们通过结果回顾并总结NeRF的特点。

原始NeRF论文在合成数据集上展示了高质量的新视角合成结果,其PSNR(峰值信噪比)指标显著优于前人方法。它也能处理一些真实场景,特别是物体位于画面中央的前向捕获场景。


NeRF对新视角的合成结果示例。

后续工作将NeRF扩展到了更大、更复杂的无界场景(如整个房间、建筑)。

现在,让我们回顾并评估NeRF提出的几个核心思想:

  1. MLP表示场景:虽然证明了神经隐式表示的可行性,并具有紧凑和正则化的优点,但在追求极致效率的今天,纯MLP已不常用。不过,MLP作为解码器或处理低频信号(如形变场)的组件,仍然很有价值。
  2. MLP表示外观:使用MLP将位置和视角映射到颜色,以处理复杂的视点相关效果(如镜面高光),这仍然是一个有效且常用的方法。
  3. 每场景优化:NeRF采用针对单个场景进行优化的范式,而非训练一个通用模型。这已被证明非常强大,能够扩展到极大规模的场景重建,并且简化了流程。
  4. 可微体积渲染:这或许是NeRF最持久和重要的贡献。它提供了一个稳定、可微的框架,用于从2D图像优化3D表示。即使后来的许多方法转向显式表示(如高斯),其优化损失函数仍然建立在体积渲染的思想之上。

总结:在本节课中,我们一起学习了神经辐射场(NeRF)。我们从三维表示的重要性出发,了解了NeRF解决新视角合成问题的目标。我们深入探讨了其核心——可微体积渲染方程的数学原理,以及它如何通过Alpha合成实现可优化。我们还回顾了场景表示从最初的MLP与位置编码,发展到如今各种高效显式结构(如哈希网格、3D高斯)的历程。NeRF不仅推动了三维重建领域的发展,其体积渲染和可微分优化的思想也深刻影响了后续的生成式3D研究。尽管纯NeRF在动态场景处理和实时性能上存在局限,但它为更强大、实用的3D内容创建工具奠定了坚实的基础。

课程 P13:多模态模型 🧠

在本节课中,我们将要学习多模态模型。多模态模型是一种可以集成多种模态(如文本、图像、音频、视频等)的模型。目前,研究主要集中在图像、视频和文本模态上,这主要是因为相关数据更容易获取。学习多模态模型的目标是实现跨模态的理解,并提升单模态任务的表现。

双向模型 🔄

上一节我们介绍了多模态模型的基本概念,本节中我们来看看双向模型。这类模型通常使用非因果的Transformer架构,例如CLIP模型。

CLIP模型采用对比学习目标,同时训练一个图像编码器和一个文本编码器。其核心思想是让匹配的图像-文本对在嵌入空间中彼此靠近,而不匹配的对则彼此远离。

以下是CLIP对比学习目标的简化公式:

loss = -log(exp(sim(I_i, T_i) / τ) / Σ_j exp(sim(I_i, T_j) / τ))

其中,sim 是余弦相似度,I_i 是第i张图像的嵌入,T_i 是第i个文本的嵌入,τ 是温度参数。

CLIP模型有多种应用方式:

以下是CLIP的一些主要应用:

  • 图像分类:计算输入图像与一系列文本类别描述的相似度,选择相似度最高的类别作为预测结果。这种方法在数据分布发生变化时,通常比仅在图像上训练的模型更具鲁棒性。
  • 生成模型指导:在文本到图像生成(如DALL-E)或文本到3D生成(如Dream Fields)中,使用CLIP分数作为优化目标,以引导生成内容与文本描述对齐。
  • 预训练骨干网络:CLIP的图像编码器常被用作其他视觉-语言模型的预训练视觉骨干网络,例如在机器人策略学习(如CLIPort)或指令微调模型中。
  • 零样本迁移:由于CLIP理解了视觉概念与语言描述的关联,经过少量数据微调后,模型可以泛化到未见过的视觉概念上。

编码器-解码器模型 🏗️

上一节我们介绍了双向模型CLIP,本节中我们来看看编码器-解码器架构的多模态模型。这类模型通常包含一个视觉编码器和一个基于Transformer的文本解码器。

Flamingo是这类模型的代表之一。它的核心思想是在一个预训练好的纯文本语言模型(LM)中,插入可学习的“门控交叉注意力”层,使其能够基于图像信息来生成文本。

以下是Flamingo架构的简化描述:

  1. 冻结预训练的语言模型。
  2. 在语言模型的某些层之间插入新的“门控交叉注意力密集层”。
  3. 图像首先通过一个视觉编码器(如ViT)和感知器重采样器,转换为固定数量的视觉标记。
  4. 在文本生成过程中,新插入的层会对这些视觉标记进行交叉注意力计算,从而将视觉信息融入文本生成过程。
  5. 初始化时,门控机制设为零,模型行为与原始语言模型一致。随着训练进行,模型学会何时以及如何利用视觉信息。

这种架构的优势在于能够处理交错的图像-文本数据(如图文对话),并支持少样本学习。

另一类编码器-解码器模型,如Poly,采用了更经典的Transformer编码器-解码器结构。图像通过视觉编码器转换为标记,然后与文本标记拼接,一起输入给编码器。解码器则基于编码器的输出生成答案。提升这类模型性能的关键因素包括扩大模型规模、提高输入图像分辨率以及使用更高质量的训练数据。

仅解码器模型 🧩

上一节我们讨论了编码器-解码器模型,本节中我们来看看仅解码器模型。这类模型将图像和文本都视为标记序列,统一由一个自回归的Transformer解码器进行处理。

《Frozen》是早期探索这一方向的论文。其方法非常简洁:使用一个预训练的视觉编码器(如ResNet)将图像转换为嵌入向量,再通过一个可学习的投影层将其映射到文本嵌入空间。然后,将图像嵌入与文本标记嵌入拼接,输入给一个冻结的预训练语言模型。模型仅在图像-文本对数据上微调这个投影层,通过标准的语言建模损失(下一个标记预测)进行训练。这种方法在视觉问答(VQA)等任务上展现出了不错的零样本和少样本能力。

在此基础上的发展是像LLaVA和MiniGPT-4这样的模型。它们采用了类似的架构,但使用了更强大的视觉编码器(如CLIP-ViT)和语言模型(如Vicuna,一个指令微调版的LLaMA)。训练通常分为两阶段:

  1. 预对齐阶段:冻结视觉和语言骨干网络,只训练连接两者的投影层,使用大量图像-文本对数据。
  2. 指令微调阶段:使用高质量的指令遵循数据,对投影层和语言模型进行微调(有时保持视觉编码器冻结),以提升对话和推理能力。

为了处理高分辨率图像,LLaVA-1.6等模型采用了分块编码策略。将高分辨率图像切割成多个小块分别编码,同时保留一个全局的低分辨率视图编码,然后将所有视觉标记扁平化并拼接输入给语言模型。这种方法显著提升了对文档、图表等细节丰富图像的理解能力。

大规模模型的能力与局限 🌐

上一节我们介绍了仅解码器模型的架构,本节中我们来看看像GPT-4V这样的大规模多模态模型所展现的能力及其局限性。

这些模型就像一个融合了视觉知识的“知识库”。它们不仅能识别常见物体,还能认知著名地标、艺术作品,甚至理解一些文化背景信息。

以下是GPT-4V等模型展示出的核心能力:

  • 复杂视觉推理:能够解析包含多个约束条件的图像(如复杂的路标),并进行逻辑推理以回答问题。
  • 光学字符识别与文档理解:可以阅读图像中的文字,并理解表格、图表和文档的布局与内容。
  • 多模态知识问答:结合视觉信息和内部知识,回答涉及科学、历史、文化等领域的问题。
  • 代码生成:根据图表或示意图,生成大致的实现代码(尽管可能不完美)。
  • 长视频理解:如Gemini 1.5 Pro所示,能够处理长达数小时视频,并完成针检索、基于内容的问答和视觉检索等任务。

然而,这些模型也存在明显的局限性:

  • 幻觉:模型可能会生成看似合理但实际错误的内容,尤其是在专业领域(如医学影像分析)。
  • 视觉理解错误:对空间关系、数量、细节等仍可能产生误解。
  • 复杂视频理解不足:对于需要深层叙事理解、角色动机分析或复杂事件链推理的视频内容,模型能力仍然有限。

多模态生成模型 🎨

前面几节我们主要讨论了以文本为输出模态的模型,本节中我们来看看能够生成多种模态的模型,即多模态生成模型。

一个代表性的工作是CoDi(复合扩散模型)。其目标是构建一个单一的模型,能够接受图像、视频、文本、音频的任意组合作为输入,并生成这些模态的任意组合作为输出。实现这一目标的关键是学习一个所有模态对齐的联合嵌入空间。CoDi通过分阶段训练实现:首先分别训练各模态到文本的对齐编码器;然后训练条件于文本的各个模态生成器;最后进行多模态条件微调,利用对齐的嵌入空间实现跨模态条件生成。

另一类工作专注于图像与文本的互生成,如Emu和CM3。这些模型通常将视觉编码器(如CLIP)产生的图像嵌入视为一种特殊的“标记”,与文本标记一起输入给一个自回归Transformer。模型通过训练学习预测下一个文本标记或回归出下一个图像嵌入。为了生成高质量图像,它们通常会额外微调一个扩散模型解码器,将预测的图像嵌入解码为像素图像。通过精心设计训练数据(交错排列图像和文本标记),模型可以学会根据上下文决定是生成文本描述还是生成图像。

类似的思想也被扩展到视频生成,例如Video LLaMA和Mirasol。它们将视频帧(或关键帧)编码为离散标记序列,与文本标记一同进行自回归预测,最终通过专门的视频解码器生成高质量视频。

总结 📚

本节课中我们一起学习了多模态模型。我们从双向模型CLIP及其应用开始,了解了它如何通过对比学习对齐视觉与语言。接着,我们探讨了编码器-解码器模型(如Flamingo, Poly)和仅解码器模型(如Frozen, LLaVA)的架构与训练方式。然后,我们审视了GPT-4V等大规模模型展现出的强大能力与当前存在的幻觉、理解错误等局限性。最后,我们介绍了旨在实现任意模态间输入输出的多模态生成模型,如CoDi。多模态模型正在快速发展,但在深层次理解、可靠性和复杂推理方面仍面临诸多挑战。

课程 P14:12b 并行化 🚀

在本节课中,我们将学习如何将大型模型(如拥有1750亿参数的GPT-3)的训练过程分布到多个GPU或TPU上。我们将探讨并行化的基本概念、硬件考量以及实现模型分片的核心技术。

硬件基础与计算类型概述 💻

上一节我们介绍了并行化的必要性,本节中我们来看看支撑这些计算的硬件基础。理解硬件特性对于设计高效的并行策略至关重要。

主要硬件类型(如TPU与GPU)可以从几个关键指标来理解:

  • FLOPs:每秒浮点运算次数,衡量计算能力。
  • HBM大小:高带宽内存大小,决定单卡能容纳的数据量(例如,H100 GPU有80GB,TPU v4有16-32GB)。
  • 互联带宽:设备之间的通信带宽,这在多设备训练中极为重要,因为它决定了模型大小和数据吞吐量的上限。

这些硬件的核心设计目标是极快地处理矩阵乘法。这正是Transformer模型能够高效扩展的原因,因为它们主要由矩阵乘法构成,易于硬件优化。

模型分片的基本构建块 🧱

我们已经了解了硬件,现在进入核心:如何将模型计算分片到多个设备上。Transformer模型的基础构建块(如QKV投影、MLP层)本质上都是矩阵乘法。

假设我们需要计算矩阵乘法 y = x * A,其中 xA 都是矩阵。分片的核心思想是将计算分解。

以下是两种基本的分片方式:

1. 行分片与列分片结合

  • 描述:将矩阵 A 按行分片,矩阵 x 按列分片。
  • 计算:每个设备计算自己分片的部分结果(部分和)。
  • 通信:最后需要通过一个 all-reduce 通信操作,将所有设备上的部分和汇总,得到完整的输出矩阵 y

2. 权重分片(列并行)

  • 描述:完整保留输入 x 在每个设备上,将权重矩阵 A 按列分片。
  • 计算:每个设备用完整的 x 与自己持有的那部分 A 计算,得到输出 y 的一部分。
  • 通信:最后需要通过一个 all-gather 通信操作,收集所有设备上的输出部分,拼接成完整的 y

前向传播中的 split(分割)操作,在反向传播中对应 all-gather;前向传播中的 all-gather,在反向传播中对应 split。通信是主要开销,目标是尽可能减少通信量。

MLP与注意力层的分片策略 🔄

理解了基本的分片构建块后,我们来看看如何将其应用到Transformer的具体层中。

MLP层的分片
一个标准的MLP层包含一个上投影(A,例如 d -> 4d)和一个下投影(B,例如 4d -> d)。高效的策略是:

  1. 对第一个权重矩阵 A 进行列分片A1, A2)。
  2. 计算得到分片的激活值 y1, y2
  3. 这些分片的激活值自然成为第二个权重矩阵 B 行分片的输入。
  4. 最后通过一次 all-reduce 得到最终输出。
    这种方式避免了中间的 all-gather 通信,更加高效。

注意力层的分片
注意力层的分片与MLP类似:

  1. Q、K、V的投影矩阵按注意力头进行分片。例如,4个头分布在2个设备上,每个设备处理2个头。
  2. 每个设备独立计算其分片内的注意力。
  3. 输出投影(O)矩阵进行行分片,接收分片的注意力结果。
  4. 最后通过一次 all-reduce 得到跨头混合后的最终输出。

分片(Sharding)即并行化(Parallelization)。它不仅能加速计算,更重要的是能将超大型模型的参数分布到不同设备上,从而节省单设备内存

主流并行化范式 🧩

我们已经看到了层内的分片,现在从更宏观的视角看看几种主流的并行化范式。

数据并行(Data Parallelism)

  • 描述:将训练数据批次(Batch)分割到不同设备上,模型权重在所有设备上完全复制
  • 工作流程:每个设备用自己分到的数据计算本地梯度,然后通过 all-reduce 同步梯度,确保所有设备上的模型权重更新一致。
  • 优点:实现简单,是常见的多GPU训练方式。

完全分片数据并行(Fully Sharded Data Parallel, FSDP/ZERO-3)

  • 描述:在数据并行的基础上,将模型参数、梯度和优化器状态也分片到各个设备上
  • 工作流程:计算某一层时,临时通过 all-gather 在所有设备间收集该层完整的参数;计算完成后,立即丢弃这些完整参数,仅保留自己分片的部分。计算与通信可以重叠。
  • 优点:极大节省内存,允许训练远超单卡容量的模型。其效率取决于计算时间能否掩盖通信时间

张量并行(Tensor Parallelism, TP)

  • 描述:即前面介绍的模型内部分片,将单个层的矩阵运算(如MLP、注意力)横向拆分到多个设备上。
  • 工作流程:如之前所述,需要在层内进行 all-reduceall-gather 通信。
  • 优点:允许在批次大小很小时(甚至为1)进行并行训练,适用于超长序列等场景。

在实践中,这些范式可以组合使用。例如,拥有64台设备,可以配置为4路数据并行 × 16路张量并行。通常优先使用数据并行,当单卡无法容纳模型或极大批次时,再结合使用张量并行。

总结 📚

本节课中我们一起学习了大型Transformer模型并行化训练的核心知识:

  1. 硬件基础:了解了FLOPs、内存和互联带宽对并行训练的影响。
  2. 分片原理:掌握了矩阵乘法行分片、列分片的基本思想及其对应的通信模式(all-reduce, all-gather)。
  3. 层内分片:学习了如何将分片策略应用到MLP和注意力层,实现高效的张量并行。
  4. 并行范式:认识了数据并行、完全分片数据并行和张量并行等主流范式及其优缺点、适用场景。

并行化是训练超大规模模型的必备技术,其核心是在计算、内存和通信之间寻求最佳平衡。

课程 P2:自回归模型 🧠

在本节课中,我们将学习自回归模型的基础知识。自回归模型是生成模型的一种重要类型,广泛应用于文本、图像和语音合成等领域。我们将从一维分布建模开始,逐步扩展到高维数据,并深入探讨当前最流行的因果掩码神经模型。课程的后半部分将介绍一些最新的研究进展。


概述

生成模型的目标是学习数据分布,从而能够生成与训练数据相似的新样本。自回归模型通过将高维联合概率分布分解为一系列条件概率的乘积来实现这一目标。在本节中,我们将首先理解如何对简单的一维分布进行建模。


一维分布建模 📊

上一节我们介绍了生成模型的基本概念。本节中,我们来看看如何对最简单的一维离散分布进行建模。

假设我们有一个数据集,样本是0到100之间的整数。数据分布显示,数值在30和80附近出现的概率较高。我们可以使用直方图来建模这个分布。

直方图方法
直方图通过计算每个数值在数据集中出现的频率来估计其概率。对于数值 i,其概率 P(i) 近似为:

P(i) ≈ (数据集中 i 出现的次数) / (数据点总数)

这是一个非常简单的非参数化方法。

采样
要从这个分布中采样,我们可以构建累积分布函数(CDF)。首先在0到1之间均匀采样一个随机数 u,然后找到最小的 i,使得 CDF(i) >= u。这个 i 就是我们的样本。

局限性
直方图方法的主要问题是泛化能力差。每个数值的概率是独立估计的,知道数值40的概率并不能告诉我们关于数值41的任何信息。当可能的结果数量很多而数据有限时,许多“箱子”的概率可能被错误地估计为零。


参数化模型 🔧

为了解决直方图泛化能力差的问题,我们可以引入参数化模型。其核心思想是:相似的输入应有相似的概率。

我们可以用一条平滑的曲线(例如,由逻辑斯蒂分布的混合组成)来拟合数据,而不是独立的直方图箱子。这个参数化模型 P_θ(x) 由参数 θ 定义。

目标
我们的目标是学习参数 θ,使得模型分布 P_θ(x) 尽可能接近真实的数据分布 P_data(x)。我们通过最小化两者之间的差异来实现。

最大似然估计
我们使用最大似然估计作为训练准则。具体来说,我们最小化训练数据点的负对数似然(Negative Log-Likelihood, NLL):

L(θ) = - Σ_{x in data} log P_θ(x)

最小化NLL等价于最小化经验数据分布与模型分布之间的KL散度。

优化
我们使用随机梯度下降(SGD)或其变体(如Adam)来优化参数 θ。通过小批量数据计算梯度并更新参数,使得训练能够高效处理大规模数据集。

模型约束
我们选择的参数化模型 P_θ(x) 必须满足概率公理,即对所有可能的 xΣ_x P_θ(x) = 1。在自回归模型中,这个约束通过链式法则的结构自动满足。


扩展到高维数据 🚀

我们已经学会如何表示一维分布。然而,现实世界的数据(如图像、文本)通常是高维的。直接将高维空间“展平”为一维分布是不可行的,因为可能状态的数量是天文数字。

自回归分解
自回归模型通过对高维分布进行因式分解来解决这个问题。对于一个 D 维数据点 x = (x1, x2, ..., xD),我们利用概率的链式法则:

P(x) = P(x1) * P(x2 | x1) * P(x3 | x1, x2) * ... * P(xD | x1, x2, ..., x_{D-1})

这样,我们将建模高维联合分布的任务,转化为建模一系列以之前所有变量为条件的一维条件分布。

关键点

  • 这种分解对任何分布和任何变量顺序都成立。
  • 挑战在于如何有效地参数化和学习这些条件分布 P(xi | x1, ..., x_{i-1}),因为条件部分可能非常复杂。

解决方案:因果掩码神经模型 🎭

为了高效地建模高维自回归分布,我们引入了因果掩码神经模型。这是当今最流行且成功的自回归模型实现方式。

核心思想
使用一个神经网络(如MLP、CNN或Transformer)来参数化所有条件分布,并在不同时间步之间共享参数。为了满足自回归的因果性(即预测 xi 时不能看到 xi 本身或未来的信息),我们在神经网络中应用因果掩码

以1D卷积为例(WaveNet)
在WaveNet中,使用扩张因果卷积来建模音频序列。每个输出位置仅依赖于当前及过去的输入位置,这是通过将卷积核中“未来”位置的权重设为零(掩码)来实现的。参数在序列上共享,模型通过输入位置编码来感知绝对或相对位置。

以2D卷积为例(PixelCNN)
对于图像,可以使用2D因果卷积。以光栅扫描顺序(左上到右下)处理像素。卷积核被掩码,使得中心像素及其右侧/下方的像素权重为零,确保每个像素的预测仅依赖于已生成的左上部分像素。

优势

  • 表达力强:神经网络可以捕捉复杂的条件依赖。
  • 训练高效:对于整个序列,所有条件分布的计算可以并行进行(一次前向传播)。
  • 参数共享:提高了统计效率和模型泛化能力。

采样
采样是串行的。我们必须先生成 x1,然后将其输入网络以得到 P(x2|x1) 的分布并采样 x2,再将 (x1, x2) 输入网络得到 P(x3|x1,x2),依此类推。这导致了较慢的采样速度。


基于Transformer的自回归模型 ⚡

Transformer架构,特别是其自注意力机制,为自回归建模带来了革命性的进步。

自注意力
自注意力允许序列中的每个位置(或标记)与序列中所有其他位置进行交互,计算一个加权和作为输出。公式如下:

Attention(Q, K, V) = softmax( (Q K^T) / sqrt(d_k) ) V

其中 Q(查询)、K(键)、V(值)均由输入序列通过线性变换得到。

因果掩码在注意力中的应用
为了使Transformer用于自回归建模,我们在注意力权重矩阵上应用一个下三角掩码。具体做法是将矩阵中 i > j(即查询位置 i 关注未来位置 j)的位置在softmax之前设置为一个极大的负数(如 -1e9),这样其对应的注意力权重就变为零。

MaskedAttention(Q, K, V) = softmax( (Q K^T + M) / sqrt(d_k) ) V

其中 M 是一个下三角矩阵,M[i,j] = 0 if i >= j else -inf

Transformer架构
标准的自回归Transformer(解码器)由堆叠的Transformer块组成。每个块通常包含:

  1. 多头因果自注意力层:建模标记间的依赖关系。
  2. 前馈神经网络(MLP)层:对每个位置的表示进行非线性变换。
  3. 残差连接和层归一化:用于稳定和加速训练。

优势与挑战

  • 无限感受野:理论上,任何位置都可以直接关注序列中任何更早的位置,克服了卷积模型的有限感受野限制。
  • 强大的表现力:注意力机制非常灵活,能学习复杂的依赖模式。
  • 计算复杂度:注意力机制的计算和内存复杂度是序列长度 L 的二次方 O(L^2),这限制了其处理超长序列的能力。为此,发展出了如稀疏注意力、线性注意力等改进方案。

标记化:处理图像与视频 🖼️🎬

对于文本,我们可以使用BPE等子词标记化方法。但对于图像和视频等连续信号,我们需要将其离散化,以便用自回归Transformer建模。

简单方法:原始像素
最直接的方法是将每个像素的RGB值(0-255)视为一个标记。然而,对于一张256x256的图像,这将产生约20万个标记,导致序列过长,计算成本极高。

先进方法:学习离散表示
更有效的方法是先训练一个离散自编码器(如VQ-VAE, VQ-GAN)。

  1. 编码器:将高分辨率图像 x 下采样为低维的离散潜在代码 z
  2. 解码器:从 z 重建图像 x'
  3. 训练目标:最小化重建误差 ||x - x'||,并使用矢量量化使 z 离散。
    训练好自编码器后,我们就在离散的潜在空间 z 上训练自回归Transformer(例如,对 z 的序列进行建模)。生成时,先用Transformer生成 z,再用解码器将其转换回图像 x

好处

  • 序列长度大幅缩短(例如,从196K像素减少到256个潜在代码)。
  • 自回归Transformer只需在抽象、信息密集的潜在空间中进行建模,训练和采样效率更高。
  • 这种方法已成功扩展到视频、音频等多模态数据。

高效推理:键值缓存 💾

自回归模型在推理(采样)时是串行的,这可能导致速度缓慢。一个关键的优化技术是键值缓存(KV Cache)

问题
在生成第 t 个标记时,Transformer需要计算所有前 t-1 个标记的键(K)和值(V)向量,用于注意力计算。如果每次都重新计算,复杂度为 O(t^2)

解决方案
缓存之前所有时间步为每个注意力层计算的 KV 张量。

  • 生成新标记时,只需计算当前新标记的 QK_newV_new
  • K_newV_new 追加到缓存中。
  • 使用完整的缓存(包含所有历史 K, V)和当前 Q 计算注意力。
    这样,每个生成步骤的计算复杂度从 O(t^2) 降低到了 O(t)(主要是矩阵乘法的成本)。

权衡
KV缓存需要额外的GPU内存来存储所有中间状态,这是一种用空间换时间的策略。


其他架构与前沿进展 🌟

除了标准的Transformer,还有一些相关的架构和新兴研究方向。

编码器-解码器架构
原始的Transformer论文提出了编码器-解码器架构,适用于有明确输入-输出对的任务(如机器翻译、图像描述)。

  • 编码器:双向处理输入序列,生成上下文表示。
  • 解码器:自回归地生成输出序列,在每一步通过交叉注意力机制关注编码器的输出。
    虽然像GPT这样的纯解码器模型在通用语言建模上占主导,但编码器-解码器模型(如T5)在某些任务(如文本到图像生成中的文本编码)上仍有优势。

状态空间模型(SSM)的复兴
为了克服Transformer的二次方复杂度,研究者重新审视了循环神经网络(RNN)。新型的状态空间模型(如Mamba)在线性RNN的基础上进行改进,实现了高效的并行训练和线性时间的推理,同时在长序列建模任务上展现了与Transformer相媲美的性能。

分层自回归模型
对于生成高分辨率图像,可以分层进行:

  1. 先用一个自回归模型生成低分辨率图像或高级语义表示。
  2. 再用另一个自回归模型(或超分辨率网络),以低分辨率结果为条件,生成高分辨率细节。
    这种方法将生成任务分解,降低了每一步的建模难度。

总结

本节课我们一起深入学习了自回归模型。

  • 我们从一维分布的建模出发,理解了直方图与参数化模型的区别。
  • 通过链式法则,我们学会了如何将高维联合分布分解为一系列条件分布。
  • 我们重点探讨了因果掩码神经模型,包括基于卷积的WaveNet、PixelCNN,以及基于Transformer的现代架构,理解了其通过掩码实现自回归性的原理。
  • 我们了解了如何通过离散自编码器对图像、视频进行标记化,以便用Transformer处理。
  • 我们介绍了键值缓存这一关键推理优化技术。
  • 最后,我们简要浏览了编码器-解码器架构状态空间模型等前沿进展。

自回归模型以其理论上的严谨性(显式建模概率分布)和强大的实践性能,在生成式人工智能中扮演着核心角色,是理解当前大语言模型和多种生成模型的基础。

课程 P3:流模型 🌀

在本节课中,我们将要学习一种称为“流模型”的生成模型。我们将了解其核心思想、数学原理、实现方式,并探讨其优势与局限性。


概述

流模型是一种基于似然的生成模型,其核心思想是通过一个可逆且可微的变换,将复杂的数据分布映射到一个简单的已知分布(如高斯分布或均匀分布)。通过这种方式,我们可以在简单的分布空间中进行采样和概率评估,然后通过逆变换得到原始数据空间中的样本。


1. 流模型的目标 🎯

上一节我们介绍了生成模型的一般目标。本节中我们来看看流模型具体要解决什么问题。

我们希望拟合一个数据 X 的密度模型 P_θ(X),其中 Xn 维空间中的连续值向量。理想情况下,模型应具备以下能力:

  • 很好地拟合训练数据背后的真实分布。
  • 能够评估新数据点 X 的概率。
  • 能够从学习到的分布中采样,生成新样本。
  • 拥有有意义的潜在表示或嵌入空间。

与自回归模型相比,流模型在采样时可以实现并行化,并且天然地拥有一个嵌入空间(即变换后的 Z 空间)。


2. 拟合密度模型 📊

本节我们将探讨如何为连续数据拟合一个密度模型。

我们采用参数化的密度模型 P_θ,并通过最大化训练数据在该模型下的对数似然来拟合模型。通常,我们将其转化为最小化负对数似然的目标:

L(θ) = - Σ log P_θ(x_i)

这与离散情况下的最大似然估计非常相似。对于连续数据,我们也可以先将其离散化,然后拟合离散模型,但这不是流模型的做法。


3. 为何需要流变换? 🔄

直接在高维原始空间(如像素空间)拟合简单分布(如高斯混合模型)会面临问题。例如,为一张训练图像分配高概率,也会自动为其在像素空间中的“近邻”(即添加了微小噪声的图像)分配高概率,而这些“近邻”通常不是有意义的自然图像。

因此,流模型的核心思想是:承认简单分布在原始空间效果不佳,但如果我们能找到一个合适的变量变换,将数据映射到一个新空间,那么在这个新空间中,简单的分布就可能很好地拟合数据

这个变换函数 Z = f_θ(X) 需要满足两个关键条件:

  1. 可逆性:存在逆变换 X = f_θ^{-1}(Z)。这使得我们可以从简单的 Z 分布中采样,然后通过逆变换生成 X
  2. 可微性:函数可微,便于通过梯度下降优化。

由于 ZX 之间需要一一对应,因此 Z 必须与 X 维度相同。


4. 变量变换公式 🧮

上一节我们引入了可逆变换的概念。本节中我们来看看变换前后概率密度是如何关联的。

当我们将变量从 X 空间变换到 Z 空间时,必须保证概率质量守恒。对于 X 空间中的一个微小体积,其概率质量必须等于它在 Z 空间中映射到的体积的概率质量。

由此推导出变量变换公式

P_θ(X) = P_Z( f_θ(X) ) * | det( d f_θ(X) / d X ) |

其中:

  • P_ZZ 空间中的简单基础分布(如标准正态分布)。
  • det( d f_θ(X) / d X ) 是变换 f_θ 在点 X 处的雅可比矩阵的行列式,它衡量了变换引起的局部体积变化率。

这个公式是我们构建和训练流模型的基础。对数似然目标函数变为:

log P_θ(X) = log P_Z( f_θ(X) ) + log | det( d f_θ(X) / d X ) |


5. 一维流模型 📈

让我们从最简单的一维情况开始理解流模型。

在一维情况下,变换 f_θ 必须是单调函数(始终递增或递减)以保证可逆性。雅可比行列式简化为导数 |df/dx|

以下是一些一维可逆函数的选择:

  • 线性函数:z = a*x + b,其中 a > 0
  • 系数为正的奇次幂多项式。
  • Sigmoid 函数 σ(ax+b) 或任何累积分布函数。

基础分布 P_Z 通常选择均匀分布 Uniform(0,1) 或标准正态分布 N(0,1)。如果选择均匀分布,并且 f_θ 是数据的累积分布函数,那么流模型就等价于直接对数据密度 P_θ(X) 进行建模。

核心思想:通过训练 f_θ,我们可以将复杂的一维数据分布“流”成一个简单的均匀分布或正态分布。


6. 扩展到二维与自回归流 🔀

本节我们将流模型的思想扩展到二维,并引入一种重要的结构——自回归流。

在二维中,我们可以按顺序进行变换,这引出了自回归流。一种自然的顺序是:

  1. z1 = f_θ1(x1)
  2. z2 = f_θ2(x2; x1) # f_θ2 的参数可以依赖于 x1

这里的关键是,f_θ2 在将 x2 映射到 z2 时,可以以任意复杂的方式依赖于 x1(例如通过一个神经网络),只要对于每个给定的 x1,从 x2z2 的映射是可逆的即可。这极大地增加了模型的表达能力。

对数似然目标变为两项之和:
log P_θ(x1, x2) = log P_Z(z1, z2) + log |df_θ1/dx1| + log |∂f_θ2/∂x2|

我们可以将多个这样的流层堆叠起来,并在不同层交换变量的处理顺序,从而构建非常富有表现力的模型。


7. 高维流模型与耦合层 🧱

现在,我们来看如何将流模型应用于图像等高维数据。

高维流模型的核心挑战是:变换 f_θ 必须是可逆的,并且其雅可比行列式必须易于计算,否则训练成本会过高。

一种巧妙的设计是耦合层,例如 Real NVP 模型中提出的方法。其操作如下:

  1. 将输入向量 X 分成两部分:x_ax_b
  2. 对第一部分直接复制:z_a = x_a
  3. 对第二部分进行变换,其参数由第一部分计算得出:
    z_b = x_b ⊙ exp( s_θ(x_a) ) + t_θ(x_a)
    其中 s_θt_θ 是由 x_a 参数化的任意神经网络(缩放和平移函数), 表示逐元素乘法。
  4. 输出为 Z = (z_a, z_b)

这个变换的逆变换很容易计算:

  1. x_a = z_a
  2. x_b = (z_b - t_θ(z_a)) ⊙ exp( - s_θ(z_a) )

其雅可比矩阵是分块三角阵,行列式就是对角线上缩放系数的乘积 exp( sum(s_θ(x_a)) ),非常容易计算。通过堆叠多个耦合层,并在不同层对输入进行不同的划分(如按棋盘格、按通道等),模型可以获得强大的表达能力。


8. 反量化:处理离散数据 🔢

流模型是为连续数据设计的。但图像、音频等数据通常是离散的(如8位像素值0-255)。直接对离散值拟合连续密度模型会导致模型在离散值处放置无限高的尖峰,这不符合我们的初衷。

反量化是解决这一问题的标准技巧:在训练时,向每个离散数据点添加一个在 [-0.5, 0.5] 区间内的均匀噪声(或其他学习到的噪声)。这相当于用一系列连续区间来“软化”离散的峰值,使得连续密度模型能够进行有意义的拟合。在生成时,我们从连续模型采样,然后四舍五入到最近的离散值。


9. 流模型的总结与思考 💎

本节课中我们一起学习了流模型的核心内容。

总结

  • 原理:通过可逆、可微的变换 f_θ,将数据 X 从复杂分布映射到简单分布 Z
  • 训练目标:最大化对数似然,涉及基础分布的概率和雅可比行列式。
  • 关键结构:自回归流和耦合层是构建高维可逆变换的核心技术。
  • 优势:可精确计算似然,采样速度快(并行),天然具有潜在空间便于插值和属性控制。
  • 挑战:可逆性和易计算行列式的要求限制了模型架构的选择,这可能影响了其在某些任务上相对于其他生成模型(如扩散模型)的最终性能。

流模型提供了一种优雅且原理清晰的生成建模框架,虽然目前并非最主流的首选,但其思想深刻,并且在密度估计、数据压缩等需要精确似然值的领域仍有其独特价值。

课程 P4:隐性变量模型和变分自动编码器 🧠

在本节课中,我们将要学习隐性变量模型及其核心实现——变分自动编码器。我们将从基本概念出发,逐步理解其数学原理、训练方法以及各种变体,最终掌握如何利用这些模型进行数据生成和表示学习。

概述

我们已经研究过自回归模型和流模型,它们直接对观测变量 X 的分布进行建模。在隐性变量模型中,情况有所不同。我们假设存在一个低维度的潜在变量 Z,它编码了 X 中体现的核心信息。捕获这个更紧凑的表示 Z,有助于数据压缩、插值或在之上构建分类器。

自回归模型采样速度慢,因为需要顺序生成所有像素。而如果数据在高级语义信息(如图像内容描述)上条件独立,那么通过潜在变量 Z 生成整个 X 可以更快。

隐性变量模型基础

上一节我们介绍了模型的动机,本节中我们来看看其基本形式。

在最简单的情况下,Z 是一个单变量(例如,抛硬币的结果),我们根据 Z 的值来生成 XZ 也可以是向量值,编码场景中的多种信息(如是否有车、是否有狗)。模型的使用方式是:先从先验分布 p(z) 中采样得到 z,然后从条件分布 p_θ(x|z) 中采样生成 x

为了训练模型,我们需要最大化观测数据的对数似然。对于单个数据点 x_i,其概率是所有可能 z 导致该 x_i 的概率之和:
p_θ(x_i) = Σ_z p(z) * p_θ(x_i|z)

这里的求和操作使得我们无法像自回归模型那样将对数似然简单地分解开,这带来了优化上的挑战。

训练隐性变量模型

上一节我们介绍了模型的基本形式,本节中我们来看看如何训练它们。我们将探讨两种场景:精确可处理的情况和需要近似的情况。

场景一:精确可处理(Z 取值少)

当潜在变量 Z 只能取少量值时,我们可以直接枚举所有可能的 Z 来计算求和项。例如,Z 取三个值,X 是根据 Z 决定的多元高斯分布,这本质上就是一个高斯混合模型。我们可以直接使用梯度下降优化模型参数(如各高斯的均值和协方差)。

场景二:需要近似(Z 取值多或连续)

Z 取值很多或连续时,精确求和或积分难以计算。此时,我们可以利用 Z 的分布,将对 Z 的期望用采样来近似。然而,如果直接从先验 p(z) 中采样,大多数样本对当前数据点 x_i 的似然贡献几乎为零,计算效率低下。

为了解决这个问题,我们引入重要性采样。我们从一个新的提议分布 q(z) 中采样,并引入一个校正因子 p(z)/q(z) 来获得无偏估计。理想情况下,q(z) 应该集中在那些对当前 x_i 有高似然的 z 区域,即后验分布 p(z|x_i)

变分推断与变分下界

上一节我们提到了需要逼近后验分布 p(z|x),本节中我们来看看如何通过变分推断来实现。

我们无法直接使用真实后验,因此引入一个参数化的分布 q_φ(z|x)(例如高斯分布),并尝试使其尽可能接近真实后验。衡量两个分布差异的常用指标是 KL 散度。我们的目标是最小化 q_φ(z|x)p_θ(z|x) 之间的 KL 散度。

经过推导,我们可以得到数据对数似然的一个下界,称为证据下界:
log p_θ(x) ≥ E_{z~q_φ(z|x)}[log p_θ(x|z)] - KL(q_φ(z|x) || p(z))

这个下界由两部分组成:

  1. 重构项:期望 z 能够很好地重建 x
  2. 正则化项:KL 散度项,迫使 q_φ(z|x) 接近我们设定的简单先验 p(z)(如标准高斯分布)。

通过最大化这个下界,我们同时优化了生成模型参数 θ 和推断网络参数 φ

变分自动编码器

上一节我们推导出了变分下界,本节中我们来看看其具体实现——变分自动编码器。

VAE 的结构直观地对应了下界的两部分:

  • 编码器:对应 q_φ(z|x)。它是一个神经网络,输入 x,输出潜在变量 z 的分布参数(如均值和方差)。
  • 解码器:对应 p_θ(x|z)。它是一个神经网络,输入采样得到的 z,试图重建出 x

训练时,我们通过编码器得到 z 的分布,从中采样一个 z(使用重参数化技巧以使梯度可回传),然后用解码器重建 x,并计算重构损失和 KL 散度损失。

以下是 VAE 训练的核心步骤:

  1. 编码器将输入 x 映射为潜在分布的参数(均值 μ 和方差 σ^2)。
  2. 通过重参数化技巧采样:z = μ + ε * σ,其中 ε 来自标准正态分布。
  3. 解码器将 z 映射回数据空间,得到重建的 x'
  4. 计算损失:损失 = 重构损失(x, x') + β * KL(N(μ, σ^2) || N(0, I))。其中 β 是权衡两项的超参数。

VAE 的变体与扩展

上一节我们介绍了标准 VAE,本节中我们来看看一些重要的变体和改进。

1. 先验分布的改进

标准 VAE 使用各向同性的高斯先验,这限制了潜在空间的表达能力。改进方法包括:

  • 分层 VAE:让先验 p(z) 本身也是一个学习得到的分布(如自回归模型),从而捕获 z 各维度间的依赖关系。
  • 矢量量化 VAE:使用离散的潜在空间。编码器输出映射到一个离散的码本中最近的向量。这能产生更清晰的潜在表示,并自然地对信息容量进行约束。

2. β-VAE

通过引入超参数 β 来调整正则化项的权重。增大 β 会鼓励学习到更解耦、更具解释性的潜在因子(如物体的颜色、大小等),但可能会牺牲一些重建质量。

3. 重要性加权自编码器

通过从 q_φ(z|x) 中采集多个样本 z 来计算重构项,可以得到一个更紧致的似然下界,通常能提升生成样本的质量。

VAE 的应用与总结

在本节课中,我们一起学习了隐性变量模型和变分自动编码器。

VAE 主要有两大应用方向:

  1. 生成模型:训练完成后,可以从先验分布 p(z) 中采样 z,然后通过解码器生成新的数据样本 x
  2. 表示学习:编码器学习到的潜在变量 z 可以作为数据 x 的一个低维、有意义的表示,用于下游任务(如分类、检索)。

VAE 的优点在于它提供了一个稳固的概率框架和易于优化的下界,并且其潜在空间通常具有较好的连续性,便于插值操作。虽然其在纯粹的图像生成质量上可能略逊于一些最新模型,但 VAE 及其变体(尤其是 VQ-VAE)作为强大的表示学习工具和生成流程中的关键组件(例如在 Stable Diffusion 中),至今仍在许多最先进的生成模型中发挥着重要作用。

总结来说,VAE 巧妙地结合了神经网络和变分推断,为我们提供了一种同时学习数据生成和有效数据表示的强大框架。

课程 P5:生成对抗网络 (GANs) 🎭

在本节课中,我们将学习生成对抗网络(GANs)。这是一种强大的生成模型,它通过让两个神经网络相互对抗来学习生成逼真的数据。我们将从动机和基本概念开始,逐步深入到其工作原理、训练技巧、评估方法以及近年来的重要进展。


概述:什么是隐式生成模型? 🤔

在之前的课程中,我们介绍了自回归模型、流模型和变分自编码器。这些模型都是基于可能性的模型,它们通过优化数据的对数似然来进行训练。

今天,我们将研究一种不同的方法:隐式生成模型。这类模型的核心思想是,如果我们主要关心生成高质量的样本,那么我们可以直接优化这个目标,而不必显式地计算数据的概率密度。

在一个隐式模型中,我们从一个易于采样的先验分布(如均匀分布或高斯分布)中采样一个噪声向量 z,然后通过一个深度神经网络(生成器)将其转换为我们想要的样本 x。这个网络引入了一个我们无法直接评估的密度 P_model(x)。我们的目标是调整生成器,使得它生成的样本看起来像是来自真实的数据分布 P_data(x)


GANs 的诞生与核心思想 ⚔️

GANs 的发明者 Ian Goodfellow 在2014年提出了一个巧妙的构想:使用一个判别器网络来指导生成器网络的训练。

核心博弈过程如下:

  • 判别器 (D) 的目标是区分真实数据(来自训练集)和生成器生成的假数据。它试图最大化自己做出正确判断的能力。
  • 生成器 (G) 的目标是生成足以“欺骗”判别器的数据,使其误以为生成的数据是真实的。它试图最小化判别器识破它的能力。

这形成了一个极小极大博弈,其价值函数 V(D, G) 可以表示为:

min_G max_D V(D, G) = E_(x~p_data(x))[log D(x)] + E_(z~p_z(z))[log(1 - D(G(z)))]

其中:

  • D(x) 是判别器认为样本 x 来自真实数据的概率。
  • G(z) 是生成器根据噪声 z 生成的样本。

在理想平衡状态下,生成器将生成与真实数据无法区分的样本,而判别器对任何样本的输出概率都将是 0.5(即完全无法判断)。

以下是训练一个基础 GAN 的伪代码流程:

for 训练轮次:
    # 1. 更新判别器 k 步
    for k steps:
        采样一批真实数据 {x}
        采样一批噪声 {z}
        生成假数据 {G(z)}
        计算判别器损失 L_D = -[log D(x) + log(1 - D(G(z)))]
        通过梯度上升更新判别器参数以最大化 L_D

    # 2. 更新生成器
    采样一批噪声 {z}
    计算生成器损失 L_G = -log(D(G(z)))  # 或使用 L_G = log(1 - D(G(z)))
    通过梯度下降更新生成器参数以最小化 L_G

评估 GANs:我们如何知道它学得好不好? 📊

由于 GANs 不直接优化似然函数,评估其性能是一个挑战。以下是几种常用的评估方法:

1. 核密度估计 (KDE):
在低维空间中,可以在生成的样本周围放置高斯核来构建一个近似的密度函数,然后计算真实数据在该密度下的对数似然。但在高维图像空间中,这种方法效果不佳。

2. Inception 分数 (IS):
使用在 ImageNet 上预训练的 Inception 网络对生成的图像进行分类。

  • 高质量:分类器应对图像所属类别有高置信度。
  • 高多样性:生成的图像应覆盖多个类别。
    一个高的 IS 通常意味着生成图像质量高且多样。但其缺陷是,即使每个类别只生成一个完美样本,也能得到高分,无法衡量类内多样性。

3. Fréchet Inception 距离 (FID):
计算真实图像和生成图像在 Inception 网络某一中间层特征空间中的统计距离(均值和协方差)。FID 值越低,表示两个分布越接近,即生成质量越好。FID 比 IS 更能综合反映生成图像的质量和多样性。


理论视角:GANs 在优化什么散度? 🧮

从理论上看,当判别器达到最优时,生成器的优化目标等价于最小化真实分布 P_data 和生成分布 P_G 之间的 Jensen-Shannon 散度 (JSD)

然而,JSD 和更常见的 Kullback-Leibler 散度 (KL 散度) 存在一些缺陷:

  • KL(P_data || P_G)(前向 KL)会导致模式覆盖:生成分布会试图覆盖所有真实数据点,容易产生模糊的平均样本。
  • KL(P_G || P_data)(反向 KL)会导致模式坍塌:生成分布会坍缩到某个高概率模式,缺乏多样性。

JSD 可以看作是这两种 KL 散度的对称组合,在一定程度上缓解了这些问题,这也是 GANs 早期能生成比 VAE 更清晰图像的原因之一。


训练 GANs 的挑战与改进 🛠️

原始的 GAN 训练非常不稳定,主要面临以下挑战:

  1. 判别器过强:导致生成器梯度消失(饱和)。
  2. 模式坍塌:生成器只生成少数几种样本,缺乏多样性。
  3. 训练震荡:生成器和判别器无法达到良好平衡。

为了解决这些问题,研究者们提出了一系列重要的改进:

以下是一些关键的训练技巧和架构改进:

  • 使用 -log(D(G(z))) 损失:将生成器的目标从最小化 log(1 - D(G(z))) 改为最大化 log(D(G(z))),可以缓解训练初期梯度消失的问题。
  • DCGAN 架构:提出了使用卷积层构建稳定 GAN 的一套架构准则,如使用步长卷积代替池化层、在生成器和判别器中使用批量归一化等。
  • Wasserstein GAN (WGAN):用 Wasserstein 距离(推土机距离) 替代 JSD 作为优化目标。其判别器(在 WGAN 中常称为“评论家”)输出一个无界分数,而不是概率。这提供了更稳定的训练和更有意义的损失曲线(损失值可以反映生成质量)。
  • WGAN-GP (梯度惩罚):WGAN 要求判别器满足 1-Lipschitz 约束,原始论文通过权重裁剪来实现。WGAN-GP 提出了一种更好的方法:直接对判别器的梯度范数施加惩罚,使其接近 1。
  • 谱归一化 (Spectral Normalization):通过对网络每一层的权重矩阵进行谱范数归一化,来强制满足 Lipschitz 约束。这是一种更优雅、更通用的实现方式。
  • 自注意力机制:在卷积网络中引入自注意力层,使模型能够捕捉图像中的长程依赖关系,生成结构更合理的图像。
  • 渐进式增长:从低分辨率开始训练生成器和判别器,然后逐步添加新的层来学习更高分辨率的细节。这有助于生成高分辨率、高质量的图像。
  • BigGAN:通过将模型规模(批大小、网络宽度和深度)扩大到极致,并结合截断技巧、正交正则化等方法,在 ImageNet 上实现了当时最惊人的生成效果。
  • StyleGAN:对生成器的输入潜空间 z 进行非线性映射得到中间潜空间 w,并将 w 通过自适应实例归一化 (AdaIN) 注入到生成网络的每一层。这使得能够精确控制生成图像的高级属性(如姿态、发型)和随机细节(如雀斑、发丝),实现了出色的风格混合和插值效果。

GANs 的扩展与应用 🎨

GANs 不仅用于无条件图像生成,还被广泛应用于各种条件生成和创造性任务:

以下是一些重要的扩展方向:

  • 条件 GANs (cGANs):在生成器和判别器的输入中同时加入条件信息(如类别标签、文本描述、另一张图像),从而实现可控生成。例如,Pix2Pix 框架用于图像到图像的转换(如语义分割图→照片、草图→上色图)。
  • CycleGAN:在缺乏成对数据的情况下,通过引入循环一致性损失,实现两个域之间的图像风格转换(如马→斑马、照片→油画)。
  • 潜在空间探索:通过向 GAN 的潜空间添加额外的结构化约束或辅助损失,可以学习到解耦的、有意义的特征表示。例如,InfoGAN 通过最大化生成图像与一部分潜码之间的互信息,让潜码自动对应上语义特征(如数字的旋转角度、笔画的宽度)。
  • GANs 与基于能量的模型 (EBMs):理论分析表明,WGAN 的优化目标与训练一种特殊的基于能量的模型密切相关。这为理解 GANs 提供了另一个理论视角。

现代前沿:规模化与组件化 🚀

近年来,GANs 的发展主要体现在两个方面:一是继续向更大规模、更高性能迈进;二是作为强大组件融入其他生成框架。

1. 规模化尝试:GigaGAN
GigaGAN 是一个文本到图像的 GAN 模型,参数规模达到十亿级别。它通过引入自适应核选择、Lipschitz 稳定的自注意力层、多尺度鉴别器损失等创新,实现了高质量的文本生成图像和极快的推理速度(远超扩散模型),并展示了优秀的潜空间插值和超分辨率能力。

2. 作为高效表征学习器:VQ-GAN
VQ-GAN 的核心思想是利用 GAN 来改进向量量化变分自编码器 (VQ-VAE) 的重建质量。VQ-VAE 先将图像压缩为离散的潜编码(标记),但其重建结果往往模糊。VQ-GAN 在 VQ-VAE 的重建损失基础上,增加了基于PatchGAN 鉴别器的对抗损失和感知损失,使得重建图像在保持高层结构的同时,恢复了丰富的纹理细节。这种高质量的离散标记化方法,为后续基于 Transformer 的自回归图像生成(如 DALL-E)或扩散模型(如 Stable Diffusion 的 VAE 编码器)提供了强大的基础。


总结 🎯

本节课我们一起深入学习了生成对抗网络 (GANs)。

  • 我们从隐式生成模型的动机出发,理解了 GANs 不依赖于显式密度估计的核心思想。
  • 我们剖析了 GANs 的极小极大博弈框架,包括生成器和判别器的角色与目标函数。
  • 我们探讨了评估 GANs 的难点和方法,如 Inception 分数 (IS)Fréchet Inception 距离 (FID)
  • 我们从理论层面分析了 GANs 优化的 Jensen-Shannon 散度及其与 KL 散度的区别。
  • 我们详细回顾了 GANs 训练中的主要挑战(模式坍塌、梯度消失)和一系列关键改进,从 DCGAN、WGAN-GP 到谱归一化、StyleGAN。
  • 我们了解了 GANs 在条件生成表征学习等方面的扩展应用。
  • 最后,我们看到了 GANs 在现代生成式 AI 中的前沿角色,无论是追求极致规模和速度的 GigaGAN,还是作为强大标记化工具的 VQ-GAN

尽管当前扩散模型在图像生成领域占据主导,但 GANs 因其训练和采样的高效性、潜空间良好的可控性,仍然是生成式模型工具箱中不可或缺的一部分,并持续在特定领域和与其他模型的结合中焕发活力。

课程 P6:扩散模型 🧠

概述

在本节课中,我们将要学习扩散模型。这是一种强大的生成模型,近年来在图像、视频乃至机器人控制等领域取得了突破性进展。我们将从基础概念出发,了解其工作原理、发展历程以及如何应用于各种实际任务。


扩散模型基础

上一节我们概述了课程内容,本节中我们来看看扩散模型的基本思想。

扩散模型的核心可以被视为一个降噪器。其训练方式如下:我们从一个干净图像 x0 开始,逐步添加高斯噪声,得到一个纯噪声图像。模型的目标是学习相反的过程,即从噪声图像中恢复出原始图像。

这个过程可以形式化描述。正向过程(加噪)是确定的:
q(xt | x{t-1}) = N(xt; sqrt(1-βt) * x{t-1}, βt * I)
其中 βt 是噪声调度参数。经过足够多步后,xT 的分布将接近标准高斯分布。

反向过程(去噪)则需要学习:
pθ(x{t-1} | xt) = N(x{t-1}; μθ(xt, t), Σθ(xt, t))
模型需要预测在给定当前噪声图像 xt 和时间步 t 时,前一步图像的均值和方差。

一种简化且常见的参数化方式是,不直接预测 x{t-1},而是预测添加到 xt 中的噪声 ε。训练目标是最小化预测噪声与真实噪声之间的差异。

以下是训练算法的简化描述:

  1. 从数据集中采样干净图像 x0
  2. 随机采样时间步 t 和噪声 ε ~ N(0, I)
  3. 构造噪声图像 xt = sqrt(ᾱt) * x0 + sqrt(1-ᾱt) * ε,其中 ᾱtβt 的累积乘积。
  4. 训练神经网络 εθ(xt, t) 来预测噪声 ε,损失函数为 ||ε - εθ(xt, t)||²

采样(生成)时,我们从纯高斯噪声 xT 开始,反复应用学习到的去噪步骤,逐步得到清晰图像。


关键发展与改进

理解了基础原理后,我们来看看推动扩散模型性能提升的一系列关键工作。

从DDPM到先进图像生成

最初的DDPM模型展示了扩散模型在图像质量和多样性上媲美甚至超越GAN的潜力。随后的工作从架构、引导和缩放等方面进行了改进。

以下是几项重要的改进:

  • 架构改进:使用更深的U-Net,在多个分辨率层引入自注意力机制,并采用组归一化等技术。
  • 分类器引导:在采样过程中,利用一个在噪声图像上训练的分类器的梯度,引导生成过程朝向特定类别,以提高生成图像的逼真度。
  • 无分类器引导:无需单独训练分类器。通过同时训练条件生成器和无条件生成器,并在采样时用条件预测减去无条件预测的加权差来实现引导。这避免了模式崩溃,在真实性和多样性间取得了更好平衡。

文本到图像的演进

将条件从类别标签扩展到文本描述,是扩散模型走向实用的关键一步。

以下是相关模型的发展:

  • GLIDE:基于文本条件进行扩散,并引入了CLIP引导。它采用两阶段生成(低分辨率生成后超分),取得了高质量结果。
  • DALL-E 2:采用两阶段方法。首先,一个扩散模型将文本编码映射到图像编码(CLIP空间);然后,另一个扩散模型将图像解码为像素。这实现了高质量的文本到图像生成。
  • Imagen:强调文本编码器的重要性。它使用大型语言模型(如T5)生成文本嵌入,然后输入给扩散模型,简化了架构但仍能获得优异结果。

加速采样:从DDIM到蒸馏

扩散模型的一个缺点是采样需要多步迭代,速度较慢。研究人员提出了多种加速方法。

以下是两种主要思路:

  • DDIM采样器:一种更高效的求解器,允许跳过步骤,用更少的采样步数生成图像,在速度和质量间进行权衡。
  • 渐进式蒸馏:使用一个训练好的多步模型(教师)来训练一个步数更少的模型(学生)。学生模型学习模仿教师多步去噪的效果,从而将采样步数大幅减少(如从256步减到4步),且质量损失很小。


架构与扩展应用

上一节我们介绍了性能提升的关键技术,本节中我们来看看模型架构的演变以及超越图像生成的应用。

潜在扩散模型与稳定扩散

直接在像素空间操作计算成本高。潜在扩散模型先使用VAE将图像压缩到低维潜在空间,然后在潜在空间中进行扩散过程,大大提升了效率。

稳定扩散是潜在扩散模型的一个著名实现。它在潜在空间进行扩散,并引入交叉注意力层来实现文本条件控制,成为了强大的开源文本到图像生成基础模型。

视频生成

将扩散模型扩展到视频生成是自然的发展。核心思想是在图像模型的基础上,增加时间维度的建模能力。

以下是常见的视频生成模型构建方法:

  • 时空U-Net:在2D卷积层之间插入1D时间卷积层,在空间注意力后增加时间注意力层,以捕捉帧间时序关系。
  • 初始化与微调:通常从强大的文本到图像模型(如稳定扩散)初始化空间层权重,然后冻结或微调这些权重,主要训练新添加的时间层。这能有效利用图像数据知识。
  • 级联模型:像图像生成一样,视频生成也常采用级联方式。先生成低分辨率、低帧率的视频,再通过一系列时空超分模型逐步提升分辨率和流畅度。

超越生成:表示学习

扩散模型不仅擅长生成,其内部学习到的表示也可用于其他任务。

以下是扩散模型在表示学习方面的应用:

  • 语义对应:通过向图像添加不同强度的噪声并提取扩散模型中间层特征,可以建立图像内或图像间的语义对应关系(如找到不同狗图片中鼻子的位置)。
  • 零样本图像编辑:利用上述对应关系,可以将一张图中的编辑(如添加墨镜)迁移到另一张图的对应语义位置。
  • 图像分类:通过比较噪声图像在不同文本条件下去噪预测的噪声,可以计算图像与文本的匹配度,从而实现零样本分类。

其他领域的应用

扩散模型的灵活性使其能应用于多种连续数据。

以下是扩散模型在其他领域的应用示例:

  • 材料生成:将原子在晶胞中的位置参数化为矩阵,使用扩散模型生成新的稳定材料结构。
  • 机器人轨迹规划:将机器人的状态或动作序列视为时间序列数据,用扩散模型生成多样、连贯的运动轨迹,在模仿学习等任务中表现出色。

总结

本节课中我们一起学习了扩散模型。我们从其基本降噪思想出发,回顾了它从DDPM发展到强大文本到图像、视频生成模型的历程。我们探讨了其关键组件,如U-Net架构、引导技术和潜在空间扩散。我们还了解了加速采样方法(如DDIM和蒸馏),以及扩散模型在表示学习、机器人学等领域的广泛应用。扩散模型因其强大的生成能力和灵活性,已成为当前人工智能生成内容领域的核心驱动力之一。

课程 P7:自监督学习 🧠

在本节课中,我们将学习自监督学习。这是一种无需人工标注数据,通过设计巧妙的预测任务,让模型从数据本身学习到高质量表示的方法。我们将从核心概念出发,回顾其发展历程,并深入探讨多种主流方法,包括基于重建和基于对比的方法,以及它们在视觉、音频、多模态和机器人控制等领域的应用。


概述

自监督学习的目标是预训练一个神经网络,使其能够提取数据中有意义的表示。之后,我们可以通过微调或在顶部添加简单的分类器,使其在数据有限的下游任务上取得良好性能。生成模型可以实现这一目标,但本节课我们将重点介绍不涉及生成模型的替代方案。

良好的表示至关重要。例如,在分类任务中,如果数据在特征空间中已经很好地分离开,学习一个分类器就会容易得多。在深度学习中,网络通过逐层组合低级特征(如边缘)来形成更高级、更具语义意义的特征(如面部检测器)。预训练网络已经包含了这些有用的特征,使得后续任务(如情绪识别)变得非常容易。


早期尝试:去噪自编码器与上下文预测

在深度学习兴起之前,人们就已经开始探索自监督学习。一个早期的想法是去噪自编码器

核心思想:向数据中添加噪声,然后训练一个网络去恢复原始数据。这迫使网络学习数据的本质结构(流形),从而获得良好的表示。

公式/代码描述
给定输入图像 x,我们添加噪声得到 。编码器 E 映射到潜在表示 z,解码器 D 尝试从 z 重建原始图像 x。损失函数是重建损失,例如均方误差(MSE):
L = || D(E(x̃)) - x ||²

这种方法可以分层堆叠以训练深度网络,最后再添加一个针对具体任务(如分类)的监督损失进行微调。这让人联想到现代的扩散模型,后者也是通过去噪过程进行学习。


上一节我们介绍了通过重建进行表示学习的基本思想。本节中,我们来看看另一种早期方法:上下文预测

其想法是训练一个网络来预测图像中缺失的部分。这不是一个确定性的任务,但网络在匹配监督信号的同时,也能获得一定的泛化能力。

以下是该方法的几个关键设计点:

  • 任务设计:对输入图像的某些区域进行掩码,编码器处理非掩码区域,解码器则尝试填充空白区域。
  • 损失函数:同时使用重建损失(如L2)和对抗损失。仅使用重建损失会导致模糊的填充结果;结合对抗损失可以使填充内容看起来更真实,并与周围环境更兼容。
  • 评估:在ImageNet等大数据集上预训练后,在Pascal VOC等小数据集上进行检测和分割任务的微调。结果显示,填空预训练与其他自监督方法相比具有竞争力,尽管当时监督预训练(ImageNet)仍然更优。

色彩化与跨通道预测

除了掩码空间区域,我们还可以在通道维度上设计预测任务,例如图像着色

方法:将图像从RGB空间转换到Lab色彩空间。将亮度通道(L)作为输入,要求网络预测两个颜色通道(a和b)。这迫使网络理解图像的结构和语义,才能进行合理的着色。

改进:使用交叉熵离散损失代替L2损失,以更好地建模颜色分布的多模态特性(例如,一辆车可以是红、蓝、绿等多种颜色)。此外,裂脑自编码器将图像分割成两部分(如L通道和ab通道),用两个网络分别处理,再结合它们的输出来重建图像,这需要额外的损失来防止平凡解。

在视频中,可以访问第一帧的颜色信息,然后预测后续灰度帧的颜色。这变成了一个跨帧的对应关系学习问题,效果非常好,甚至可以用于学习跟踪。


掩码自编码器 (MAE) 🎭

之前的方法虽然有趣,但并未在视觉表示学习领域成为主流。直到掩码自编码器 的出现,它结合了简单的思想和正确的细节,取得了突破性进展。

核心思想:随机掩码输入图像中大量的图像块(例如75%),仅将可见块输入编码器,然后在潜在空间中用一个小解码器重建被掩码的块。

关键设计

  1. 高掩码率:高达75%的掩码率迫使模型学习全局语义理解,而不是依赖局部纹理进行简单复制。
  2. 非对称架构:编码器仅处理可见块,计算高效;轻量级解码器用于重建。预训练后,我们只关心编码器学到的表示。
  3. 适用于Transformer:Vision Transformer 能自然地处理可变数量的图像块,非常适合MAE框架。

效果:MAE在ImageNet等基准上取得了优异的线性探测和微调性能。其简单性和有效性使其成为当前最流行的自监督学习方法之一。


上一节我们看到了MAE在图像上的成功。本节中我们来看看这个思想如何扩展到其他模态。

视频MAE:将MAE应用于视频序列。关键创新是管状掩码——在时空维度上掩码同一个区域,防止模型简单地从前一帧复制信息。由于视频冗余度更高,掩码率甚至可以达到90-95%。这种方法在视频动作识别、目标跟踪和姿态传播等任务上达到了最先进水平。

音频MAE (Audio-MAE):将音频转换为频谱图,将其视为“图像”,然后应用MAE。编码器仅处理非掩码的时频块,解码器重建掩码部分。这种方法在音频和语音分类任务上设立了新的性能基准。

多模态MAE:可以同时掩码多种模态的数据(如图像、深度、语义分割图),并训练模型重建缺失的模态。这有助于学习更丰富的跨模态表示。例如,结合图像和文本进行MAE预训练,在图像分类任务上比仅使用图像预训练的MAE表现更好。

多视图MAE:在机器人等领域,常有多个摄像头从不同角度观察同一场景。多视图MAE随机掩码不同视图的图像块,并尝试重建。这迫使模型学习场景的3D几何和语义信息,从而获得对视角变化更鲁棒的表示。


对比学习:另一种主流范式 🔄

在MAE兴起之前,基于对比学习的方法是自监督学习的主流。其核心思想是学习一个表示空间,其中相似样本(正样本对)的表示彼此靠近,而不相似样本(负样本对)的表示彼此远离。

核心概念(噪声对比估计):模型不直接预测数据,而是学会区分数据样本和噪声样本。给定一个锚点样本,目标是识别出与之配对的正面样本,并从一堆负面样本中区分出来。

一个经典的早期工作是对比预测编码。在音频中,它利用当前上下文来预测未来的音频片段,并通过对比损失使正样本对的表示更接近。


实例判别:MoCo 与 SimCLR

我们将深入探讨两个重要的对比学习方法:MoCoSimCLR

MoCo(动量对比)

  • 挑战:对比学习需要大量负样本以获得好效果,但受限于GPU内存,无法使用很大的批大小。
  • 解决方案:引入一个动态字典作为负样本队列,并采用一个动量编码器来缓慢更新键编码器,以保持字典中特征的一致性。
  • 流程:查询编码器处理当前增强样本,动量编码器处理历史样本(作为键)。通过对比损失,使查询与其正样本键相似,与负样本键不相似。

SimCLR(一个简单的对比学习框架)

  • 简化:去除了动量编码器和字典,直接在同一批数据中构造正负样本对。
  • 关键组件
    1. 强大的数据增强:组合使用裁剪、颜色抖动、翻转等。
    2. 非线性投影头:在编码器后添加一个小的MLP网络,将特征映射到对比损失空间。
    3. 大批次训练:利用现代硬件,使用非常大的批大小(如4096)来获得足够多的负样本。

SimCLR展示了简单的端到端对比学习框架配合规模化训练,也能取得卓越的性能。


迈向更简单的目标:BYOL 与 DINO

对比学习需要精心构造正负样本对。后续研究试图进一步简化,甚至移除显式的负样本。

BYOL(引导你自己的潜在空间)

  • 方法:使用两个网络:在线网络和目标网络。目标网络是在线网络的指数移动平均。在线网络预测目标网络的输出,目标网络提供训练目标。损失是简单的L2损失。
  • 神奇之处:没有负样本,为何不崩溃?研究发现,投影头中的批归一化层起到了关键作用,它隐式地引入了对比效应。

DINO(自蒸馏与无标签)

  • 方法:受知识蒸馏启发。学生网络学习匹配教师网络输出的特征分布。教师网络是学生网络权重的指数移动平均。
  • 中心化与锐化:对教师输出进行中心化(减去均值)和锐化(用低温softmax),防止模式崩溃并鼓励模型关注显著特征。
  • 效果:DINO能学习到优异的图像特征,并且其注意力图能很好地聚焦于前景物体,甚至可用于无监督分割。

iBOTDINOv2 是DINO的扩展,引入了像MAE一样的掩码图像建模,在补丁级别进行自蒸馏,进一步提升了表示质量。


自监督学习在多模态与机器人中的应用

自监督学习的思想也被成功应用于连接不同模态和机器人控制领域。

CLIP(对比语言-图像预训练)

  • 目标:学习一个共享的表示空间,使匹配的图像和文本对靠近,不匹配的对远离。
  • 方法:使用大规模的图像-文本对数据集。分别用图像编码器和文本编码器提取特征,计算对比损失。
  • 应用:CLIP实现了强大的零样本分类能力,其预训练的特征也被广泛用作各种视觉-语言模型的基石。

在机器人控制中的应用
机器人需要从丰富的感知数据(如多视角图像)中学习对任务有用的表示。自监督学习提供了一种无需昂贵动作标注的预训练方式。

  • CURL:将对比学习应用于RL,从像素中学习状态表示,其性能可媲美使用真实状态信息的算法。
  • R3M:利用带有语言注释的野外视频(如Ego4D),通过时间对齐对比和视频-语言对齐对比进行预训练,学到的表示能更好地迁移到机器人操作任务。
  • MVP 与 Masked World Models:将MAE风格的重建目标用于机器人视觉预训练。通过掩码重建多视角观察或状态序列,学习到的表示能显著提升下游策略学习的样本效率和性能。

总结

本节课我们一起深入探讨了自监督学习。我们从表示学习的重要性出发,回顾了从早期的去噪自编码器、着色到现代主流的掩码自编码器和对比学习的发展历程。

我们学习了:

  • 基于重建的方法(如MAE):通过设计掩码重建任务,让模型学习数据的结构和语义。
  • 基于对比的方法(如MoCo, SimCLR):通过拉近正样本、推开负样本,学习判别性表示。
  • 更简化的方法(如BYOL, DINO):甚至尝试移除负样本,通过自蒸馏等方式学习。
  • 多模态学习(如CLIP):对齐不同模态的表示空间。
  • 在机器人中的应用:如何利用自监督预训练从视觉数据中学习对控制任务有用的鲁棒表示。

自监督学习的魅力在于,它利用数据本身的结构作为监督信号,避免了大量人工标注的成本。随着模型和数据的不断规模化,自监督学习已成为学习通用、强大表示的基石技术,为人工智能系统迈向更广泛的理解和能力奠定了基础。

课程 P8:大语言模型 🧠

在本节课中,我们将要学习大语言模型的基础知识、核心原理、扩展规律以及一些实用的训练和研究指南。我们将从语言模型的基本定义开始,逐步深入到如何高效地训练和扩展这些模型,并探讨其推理能力、代码生成等高级功能。


语言模型基础

语言模型本质上是序列上的概率分布。我们对一个由参数 θ 参数化的似然分布进行建模,目标是建模标记序列的概率分布。

公式P(x_1, x_2, ..., x_T; θ)

想象你有一个单词序列或其他标记序列,你需要学习一些参数,以便能够捕获此类序列的分布。通常,语言模型是自回归的。我们将序列的似然分布自回归地分解,每个标记 x_t 仅以它之前的所有标记为条件。

公式P(x_1, x_2, ..., x_T; θ) = ∏_{t=1}^{T} P(x_t | x_{<t}; θ)

我们通常使用 Transformer 架构来参数化这个模型。其核心目标是在标记序列上最大化自回归似然。

那么,为什么我们想要进行自回归分解呢?主要原因有两个。首先,自回归预测使得每个标记都成为预测目标,这对于语言模型的扩展至关重要。其次,自回归预测对于对话式人工智能来说是横向的,像 ChatGPT 这样的模型能够如此逼真地预测语言,正是因为它们可以进行自回归交互。

我们的目标是要求模型预测未来的标记,并且预测得要好。最大似然估计的目标是使观察到的数据在模型中的可能性最大。我们将采用许多序列,计算对数似然,然后取平均值。这就是我们的目标函数,我们将尝试最大化该目标。

公式L(θ) = E_{x ~ D} [∑_{t=1}^{T} log P(x_t | x_{<t}; θ)]

在像 Llama 这样的大型语言模型中,我们可能有 1.5 万亿个标记,而参数 θ 通常是数十亿个。


语言模型的学习阶段

在学习过程中,我们实际上有三个主要阶段。

  1. 大规模预训练:这是构建模型的基础阶段。我们最大化一个大型序列数据集(例如来自互联网的数万亿标记)的可能性。这个阶段决定了模型的基本能力。
  2. 针对特定任务进行微调:在预训练期间,我们建模的是通用数据分布,可能无法捕获我们关心的某些特定任务。微调阶段关注如何调整预训练模型,使其在特定任务上表现更好。
  3. 从反馈中学习:当我们有一个好的模型时,我们希望它能遵循用户的意图。用户可能会提供一些反馈(例如,通过强化学习从人类反馈中学习,即 RLHF)。此阶段关注如何利用这些反馈来进一步调整模型。

在本节课中,我们将主要关注预训练阶段,因为这是决定模型好坏的基础。我们也会花一些时间讨论微调和从反馈中学习。


为什么进行无监督预训练?

你可能会问,我们为什么要进行这种自回归的无监督学习?下图来自 Llama 论文,显示了预训练阶段平均对数似然损失(越低越好)与训练期间所见标记数量的关系。

可以看到,这些曲线并没有饱和,而是在不断减少。我们在互联网上有海量的未标记语言数据可用。通过训练这些数万亿甚至数百万亿的标记,模型可以很好地捕获数据分布,并且比仅进行监督学习能更好地泛化。

从著名的“AI 的主要教训”中可知,人工智能的主要成功将来自于利用计算的方法。因此,我们的目标是通过增加更多计算来更好地建模数据分布。


什么是计算?

计算是我们进行一次前向传播和反向传播所消耗的资源。对于一堆标记,我们运行模型,计算损失,然后进行反向传播。这就是我们花费计算的方式。这种计算主要是矩阵乘法,我们使用 FLOPs(浮点运算次数)来衡量。

我们可以估计计算成本 C,它由参数数量(模型大小 N)、数据大小(标记数量 D)以及上下文长度和模型隐藏维度等因素决定。

公式C ≈ 6 * N * D

这个公式表明,我们可以通过使用更多参数(更大的模型)、使用更多数据(更多标记)或使用更长的上下文窗口来增加计算量。

为什么我们要这样做?有证据表明,如果我们这样做,确实会得到更好的人工智能模型。


标记化

之前我多次提到“标记”。我们可以对字节序列进行建模,但这通常会导致序列非常长,计算成本高昂。另一种选择是基于字符进行标记化,但较长的单词会有更多标记,也存在类似问题。

人们尝试基于单词的标记化,但问题是模型需要知道某些单词具有非常相似的语义含义。因此,现在我们通常在两者之间进行权衡,使用一种称为 字节对编码 的技术。

BPE 的工作原理是:用一个新的标记来替换语料库中出现频率最高的标记对。你有一堆单词序列,将单词分成子词,然后重复查找出现最频繁的子词对,并用一个新标记替换它们。重复此操作,直到达到特定的给定词汇表大小。


从 RNN 到 Transformer 的演变

几年前,人们尝试使用更多计算来训练基于 RNN 的语言模型。他们执行自回归的 N 个标记生成。一个有趣的现象发生了:他们发现 RNN 中有一个神经元可以控制输出的情感是正面还是负面。模型学会了理解人类情感,这在当时被认为是一项非常困难的任务。

然而,训练 RNN 非常困难。随后,人们提出了一种称为 注意力 的新架构。注意力的扩展性要好得多。

下图显示了每个标记的测试损失。x 轴是标记索引,y 轴是对应于该特定标记的损失。红线是基于 RNN 的语言模型,蓝线是不同大小的 Transformer 模型。

可以看到,随着上下文变长(达到 1K 标记),RNN 和 Transformer 之间的差距变得更大。右图显示了模型平均性能与参数数量的关系。Transformer 表现出非常漂亮的线性缩放效果,并且很早就饱和了,而 RNN 则不然。这导致人们选择 Transformer 来构建更强大的模型。


Transformer 架构回顾

我想简要回顾一下 Transformer 架构。正如之前所示,在没有注意力的情况下处理传递标记,你必须维持一定的隐藏状态。但在注意力机制中,你可以直接处理任何传递标记,模型没有这个信息瓶颈。

Transformer 扩展性如此好的另一个原因是,你可以通过添加更大的 MLP(多层感知机)网络来轻松增加参数。MLP 网络只是矩阵乘法,真正的大矩阵乘法。因此,它可以很好地与我们几代 GPU 和 TPU 一起扩展。


不同的建模目标

我们通常进行自回归预测,但你可能也听说过其他目标,如 掩码标记预测前缀标记预测

  • 掩码语言模型:一个很好的例子是 BERT。它的工作原理是随机屏蔽一个句子中一定比例(例如 50%)的单词,然后训练模型来预测这些被屏蔽的部分。
  • 自回归语言模型:如 GPT,你以先前的标记为条件,预测下一个或未来的标记。
  • 前缀语言建模:它是介于两者之间的东西。例如,前三个词主要使用双向注意力掩码(这些词可以相互关注),但之后的预测是自回归的(只能关注之前的词)。

掩码语言模型对于某些目的来说确实很棒。例如,如果你想学习一个句子嵌入模型(一个代表句子语义的隐藏向量),你可能不想进行自回归预测,因为句子的语义最好通过让模型关注整个句子来捕获。事实证明,这是一个更容易的任务。

前缀语言模型在编码器-解码器架构中很有趣,例如,你可以将双向注意力部分视为编码器,自回归部分视为解码器。

最广泛使用的语言模型(如 GPT)是第一种(自回归)图。在计算方面,我们为这些不同的目标支付几乎相同数量的 FLOPs,但编码器-解码器架构被证明是最具可扩展性的。


Transformer 的替代架构

你们中的许多人可能考虑过 Transformer 的不同替代架构。有一篇论文绘制了不同架构的预训练困惑度与训练过程中花费的 FLOPs 的关系。

绿色线代表标准的 Transformer(Vanilla Transformer),红线代表许多其他有趣的替代模型想法。大多数其他架构的扩展性似乎不如 Transformer。如果我们看下游任务的性能,大多数其他架构的表现似乎也不及 Transformer。

因此,在你的研究过程中,我强烈建议检查这个图表:你的新想法针对 FLOPs 的比例定律,是否比标准 Transformer 有更好的比例?我认为最好检查一下。这里展示的许多模型实际上对于某些特定情况非常有用,如果你感兴趣,我鼓励你去研究它们,这是非常酷的工作。


计算成本估算

我想讨论计算成本,让你了解我们如何估计它,这对后面的内容非常有用。

公式C ≈ 6 * N * D

其中:

  • C 是总计算成本(FLOPs)。
  • N 是模型参数总数。
  • D 是训练数据的总标记数。

这个公式表明,计算成本大致与参数数量和标记数量的乘积成线性关系。如果我们插入 70 亿个参数和 2 万亿个标记,我们可以看到 FLOPs 是相当疯狂的,达到 10^22 次方。这就是问题所在:训练语言模型将花费大量的计算。

我们知道计算成本与模型大小(参数数量)呈线性振荡关系。那么,我该如何分配我的计算预算?我应该将我的计算分配给模型大小还是数据量?


缩放定律

人们试图发现是否存在一个缩放规律或缩放假设。人们训练了不同大小的模型、不同数量的标记(这些是图中的蓝色点),然后检查在一些未见过的数据集上的测试损失。

通过改变模型大小和标记数量,他们得到不同的配置(蓝色点)。对于每个配置,我们可以选择能达到的最低损失点。然后我们可以绘制黑色曲线,这基本上是最小损失与计算量的关系。

事实证明,在对数-对数坐标上,这更像是一个幂律关系。你可以通过回归得到系数。这告诉我们,每个单独因素(模型大小、数据量)和性能之间似乎存在一个低幂次关系。

如果我们不受数据大小的限制,那么分配参数数量的最佳方法就是不断增加数据大小,我们会得到线性减少的损失。但实际上,我们受到其他因素(如固定计算预算)的约束。

因为我们知道计算量 C ≈ 6 * N * D,并且我们知道单个因素的最佳缩放比例,我们可以将它们结合在一起。然后我们发现,幂律系数 ab 大约等于 1。这比以前更简单。

在 GPT-3 出现之前,有很多研究这方面的论文。OpenAI 写了一篇名为《Scaling Laws for Neural Language Models》的论文(表中第一行)。他们发现,你可能希望将更多的计算分配给参数数量,即应该训练更大的模型,而不是训练更多的数据。

后来,第二行是另一篇论文(Chinchilla),他们使用不同的数据集运行了一系列不同的实验。他们发现,数据量可能大致同等重要,甚至更重要。最佳实践是训练不同的小模型和数据大小组合,自己拟合常数。你不需要训练真正的大模型,只需训练非常小的模型,具有不同数量的标记,你会得到一堆蓝色点,选择它们的最低点,绘制黑色曲线,然后你可以拟合这个常数。这是我建议用于研究或其他目的的最可靠方法。


Chinchilla 缩放定律

后来发表的 Chinchilla 论文表明,也许我们应该为数据分配更多的计算,应该训练更多的数据,而不是一味地增加模型大小。这是当今许多模型采用的方法。

下图显示,如果你遵循这个 Chinchilla 缩放定律,很多在 Chinchilla 之前发布的模型(如 GPT-3、Gopher、Megatron)在参数上花费了更多,但根据 Chinchilla 的估计,它们浪费了计算,因为这三个星号都比三条线高得多,这不理想。虚线是原始的 OpenAI 比例定律,他们在模型侧放置了更多的权重。

事实证明,在了解了大多数模型之后,遵循这个规模,他们增加了模型的参数数量,我们得到了 GPT-3(超过 1000 亿)、Gopher(几乎是 3000 亿)、Megatron(像 5000 亿个参数)。这更像是一个经验观察,一个缩放假设。


缩放定律的实用性和见解

关于为什么幂律在实践中成立,我没有很好的直觉。首先,它不会是指数级的,因为那将非常疯狂(花费多一点计算,模型能力指数级增长)。它可能是指数级的倒数。我鼓励对此进行更多研究,例如了解为什么幂律在物理、数学和许多其他领域中似乎广泛存在。

如果我们明智地分配计算,那么这个图表明,通过花费相同的计算量,Chinchilla 模型比 Gopher 模型更好。x 轴是一堆不同的语言建模任务,y 轴是 Chinchilla 比 Gopher 模型好多少。我们可以看到,大多数任务的性能提高了 10% 到 30%。花费相同的计算量,你会得到更好的模型。

但这是否总是成立?这只是一个观察结果,模型不同。我想,如果你将 Chinchilla 与其他以前可用的模型进行比较,你会得到一个不同的图。这取决于很多因素,而不仅仅是缩放定律。缩放定律告诉你如何使用你的计算,但如果数据集可能比其他数据集更差,那么这种缩放不能保证你有一个更好的模型。更主要的是关于你如何使用你的计算。


如何外推缩放定律?

这是一个非常好的问题。我想说,有些人使用缩放定律更像是一个假设。你看看这些线,它们不平坦,不饱和,这似乎对你有帮助。x 轴是对数尺度,所以这个幂律在不同的尺度上都成立。所以人们假设,这对于更大尺度(比如 10 倍或 100 倍)也是正确的。但是我不能确定,假设我们将计算规模扩大一百万倍,这个规律是否还成立,很难说。


实践中的简单经验法则

现在假设你想做一些与语言模型相关的研究,你意识到你不想训练一堆小模型来拟合常数,因为那工作量很大。有没有简单的经验法则可以遵循?

变更文件显示了这个表。让我们看一下第二列和第四列。第二列告诉你有多少 FLOPs 要花费,而第一列和第三列告诉你模型大小。例如,如果你有 4 亿个参数和这么多的 FLOPs,那么你可能想要花费 80 亿个标记。这是一堆建议。我们可以很容易地说,标记的数量大约是参数数量的 20 倍。这是一个很好的经验法则。

但我想说,在实践中最好将此估计值加倍。因此,如果你要训练一个 10 亿参数的模型,你可能需要训练 400 亿个标记,而不是 20 倍,是 40 倍。为什么?这只是一个建议。我觉得如果有人在他们的研究论文中展示这一点,那么我和其他大多数人都会相信这是一个不错的选择。

那么,这是否意味着我们必须选择 40 倍的标记数量?例如,对于 10 亿模型,我们将使用 400 亿个标记。我当然可以使用更多。现在人们会做一些称为“推理最优”的事情。假设你有大量计算,那么你可能想远远超出 Chinchilla 最优。对于前面提到的 70 亿模型,我们可能想做参数数量的 20 到 40 倍,所以大约是 4000 亿个标记。我们可以看到,他们训练的 Llama 语言模型用了 1 万亿个标记。动机是:我只需要正确训练这个模型一次,然后我可以拥有一个非常好的推理模型。因为在推理时,你只需支付该模型大小的计算成本。当你增加参数时,你在哪里增加它们?你使模型的隐藏尺寸更大或层数更多。通常你会同时增加两者。你可能想保持层数和隐藏维度之间的比例,当你增加模型参数时。


损失是性能的决定因素

一个有趣的观察是,损失最终成为性能的决定因素。假设我们训练了一个 10 亿参数的模型,还训练了一个 7650 亿参数的模型。如果我想在更少数量的标记上训练更大的模型怎么办?因为它更昂贵,也许我只想在更少数量的标记上训练我的模型,我会得到相同质量的模型还是更差的模型?

如果我们在这里画一条线(相同的训练损失),你可以将其视为测试损失,因为在训练期间没有重复数据。如果我们查看不同的模型大小,并选择其中达到相同训练/测试损失的点,我们可以说,对于对应 2000 亿标记的最大模型和对应 1 万亿标记的最小模型,它们有相同的损失。

现在让我们转到右边的数字,即下游任务性能。我们检查 2000 亿标记和 1 万亿标记的模型在这个红十字点。我们可以看到,我们得到了完全相同的下游性能(在 Trivia QA 测试和 HellaSwag 任务上)。我也可以粗略地说,这在不同的下游任务中都适用。所以在实践中,当你有一个新想法或者你要为你的公司训练一个模型时,如果数据集相同,那么如果你使用任何模型获得较低的损失,无论模型大小如何,你都会获得更好的性能。如果你获得相同的损失,你知道这两个模型的性能大致相同。所以这个图可以回答前面的问题之一:如何缩放?不一定要保持更大的规模。


关于训练数据的质量

训练标记是随机采样的吗?还是基于类似的数据?因为我们只有一个 epoch,我们是否首先使用低质量数据?不,我们做随机抽样。我们没有低质量的数据。在预训练中,你不想放入较低质量的数据,因为我认为数据质量太重要了。你在互联网上有更多有价值的数据,困难的部分是你如何筛选互联网上的这些数据。互联网上几乎有无限量的标记,但有些数据可能不是那么好。一个好的启发式方法是:维基百科确实是很好的数据,因为可能花了很多精力来管理它们。但一些随机网站可能不是好的数据,没有太多的知识。所以你需要训练一个分类器来检查这些数据是否与维基百科相似。你做一个分类,基本上是针对维基百科进行校准。如果你这样做,你就有更多的可用数据可以训练。所以通常我们不会将没有坐标的数据混合到训练中。对于问题的第二部分,我们做任何类似课程学习吗?据我所知,人们不会这样做。我们的目标是最大似然。如果你从你的分布中均匀地采样你的训练数据,这可能是最好的,而不是先在维基百科上训练,然后继续训练其他数据,这可能不是一个好主意。


序列建模与长上下文

这张幻灯片是关于序列建模的。它是语言模型或多模态模型的一个主要瓶颈。我们想要对单词进行建模,而不仅仅是文本。世界上有很多视频,或者如果你想尝试使用反复试验经验的人工智能代理,如果你想理解代码库、超链接网站或通用序列,所有这些都需要每个序列数亿甚至数十亿个标记。我们无法将其放入 Transformer 中,因为 Transformer 注意力具有很高的内存成本。

因此,分块并行 Transformer 是进一步分解语言模型 Transformer 计算图的想法。通常

课程 P9:视频生成基础与前沿 🎬

在本节课中,我们将要学习视频生成领域的基础知识、核心挑战、主流技术方案以及未来的应用方向。课程内容将分为两个主要部分:第一部分介绍视频生成的基础概念和历史脉络;第二部分将探讨Sora等前沿模型,并分析视频生成在模拟器和视频编辑等领域的应用。

视频数据与压缩基础

视频生成面临的首要挑战是数据量巨大。一段一分钟的1080p、24 FPS视频,如果以原始像素张量(例如 1920 x 1080 x 3 x 1440)存储,其大小约为8 GB。若将其归一化到浮点数表示,数据量会进一步膨胀至约32 GB,这对计算和存储资源提出了极高要求。

因此,实际应用中视频通常使用编解码器(如H.264, H.265, AV1)进行高度压缩。这些编解码器通过利用空间冗余时间冗余来实现压缩。

  • 空间冗余:将单帧视为图像进行压缩。
  • 时间冗余:利用连续帧之间的高度相似性。例如,一个移动的物体可能只在相邻帧间偏移几个像素。

编解码器通常将视频帧编码为三种类型:

  • I帧(关键帧):像压缩JPEG图像一样,完整编码单帧。
  • P帧和B帧(预测帧):不编码完整像素数据,而是编码相对于前后帧的运动矢量(例如,描述一个 16x16 像素块如何移动)。这种方式实现了极高的压缩比(可达数百倍),同时保持了良好的视觉质量。

视频生成的核心挑战与范式

理论上,我们拥有建模复杂数据分布的工具(如自回归模型、扩散模型)和成功架构(如U-Net、Transformer)。将图像生成技术直接迁移到视频生成的主要瓶颈在于计算成本。直接对长序列、高保真度的视频帧进行建模非常困难。

因此,许多研究工作聚焦于设计更高效的模型。以下是几种主流范式,它们并非互斥,常被混合使用:

1. 级联方法 (Cascaded Approach)

此方法将生成过程分解为多个独立步骤,逐步提升视频的时空分辨率。

代表工作:Imagen Video, Lumiere

  • 流程:首先在极低时空分辨率(如 40x24 空间, 3 FPS)下生成视频。然后通过一系列独立的时间超分辨率空间超分辨率模型,逐步提升帧率和分辨率,最终得到高保真度视频。
  • 优势:每个子模型计算量较小,易于在有限算力下分别训练。
  • 示例:Imagen Video 使用了T5文本编码器和多个级联扩散模型。

2. 每帧潜空间模型 (Per-Frame Latent Models)

此方法利用预训练的强大文本到图像模型(如Stable Diffusion),将其扩展以适应视频生成。

代表工作:ModelScope, AnimateDiff, Stable Video Diffusion

  • 流程
    1. 使用预训练的图像VAE分别编码视频的每一帧,得到每帧的潜表示。
    2. 为了降低时间维度的计算量,通常采用降低帧率(如从24 FPS采样到4 FPS)的方式进行时间压缩。
    3. 在模型中,空间注意力层独立应用于每一帧。为了建模时间关系,会插入额外的时间层,如一维卷积、3D卷积或时空注意力层。
    4. 通常需要另一个独立的模型对帧率进行上采样(时间超分)。
  • 优势:能利用强大的预训练图像模型权重,加速视频训练并保持单帧质量。有时会冻结空间参数以防止图像质量退化。
  • 变体:Emu Video 等方法先生成第一帧图像,再以第一帧为条件生成后续帧。

3. 时空联合潜空间模型 (Spatiotemporal Latent Models)

此方法训练一个全新的、能够在空间和时间维度同时进行压缩的自动编码器(VAE)。

代表工作:VideoGPT, MAGVIT, LVDM, Sora

  • 流程
    1. 训练一个3D VAEVQ-VAE。其编码器使用3D卷积,在空间和时间维度同时进行下采样(例如,空间下采样16倍,时间下采样4倍),得到一个压缩的时空潜表示。
    2. 在此潜空间上训练扩散模型或自回归模型等生成模型。
  • 优势:潜表示更紧凑,建模效率可能更高。
  • 挑战:难以直接利用预训练的文本到图像模型,通常需要从头开始联合训练图像和视频数据。处理单张图像(可视为1帧视频)时,需要特殊的架构设计(如掩码注意力)来兼容。

潜表示量化:从VQ到FSQ

在离散潜空间模型中,量化方式至关重要。除了传统的VQ(向量量化),近期FSQ(有限标量量化)等方法受到关注。

  • VQ (Vector Quantization):编码器输出向量,通过查码本找到最近邻的码向量。可能面临码本利用不均衡或崩溃的问题。
  • FSQ (Finite Scalar Quantization):将潜变量约束在一个超立方体内,然后直接舍入到预设的离散格点上。梯度通过直通估计器(Straight-Through Estimator)传播。
    • 公式示意z_quantized = round((z + 1) * (bins-1) / 2) * 2 / (bins-1) - 1
    • 优势:实现更简单,训练更稳定,支持更大的有效码本(通过因式分解,如 8^8 = 16M 组合),且性能随码本增大而稳定提升。

如何改进视频生成模型

上一节我们介绍了视频生成的主要技术范式,本节中我们来看看有哪些关键方向可以持续改进视频生成模型。我们认为有三个核心轴心:

  1. 扩大模型规模:与其他AI领域一样,在更多数据和更大模型上训练,通常能直接带来性能提升。
  2. 学习更好的潜表示:设计更高效的压缩方法,在更紧凑的潜空间中捕捉视频信息,这能直接提升训练效率和模型容量。
  3. 使用更高质量的数据:数据质量在很大程度上决定了模型的上限。高质量数据包括:
    • 丰富的动态:包含大量物体运动、场景变化的视频。
    • 精准的文本描述:详细描述视频内容、动作、物体属性、摄像机运动的文本标签。
    • 高视觉质量:高分辨率、美学评分高的视频。
    • 合成标注:利用强大的视频理解模型(VLM)为无标签视频自动生成高质量描述,这已被证明比许多原始网络字幕更有效。

视频生成的应用

我们已经了解了视频生成的技术原理,现在来看看它的两个重要应用方向:作为物理模拟器和用于视频编辑。

应用一:作为物理模拟器

视频生成模型能够预测物体和智能体在物理世界中的运动,因此可被用作世界模型或模拟器。

应用场景

  • 机器人规划:给定初始状态和目标,模型可以生成完成任务的动作序列视觉预测,进而通过逆动力学模型推导出具体动作指令。
  • 自动驾驶模拟:在驾驶视频数据上训练的模型,可以根据文本指令(如“左转”)生成相应的驾驶场景视频,用于仿真测试。
  • 强化学习奖励:视频模型对成功完成任务轨迹会赋予高似然度,此似然度可直接作为强化学习的奖励信号,引导智能体学习。

局限性:模型的行为受限于训练数据分布。例如,一个在安全驾驶数据上训练的模型,很难生成撞车等异常行为的逼真模拟。

应用二:视频编辑

基于预训练的视频扩散模型,可以实现多种强大的视频编辑功能。

1. 控制网络 (ControlNet) 风格编辑

  • 原理:为预训练模型添加一个可训练的条件分支,接受额外控制信号(如深度图、边缘图、人体姿态序列)。
  • 流程编辑后视频 = 视频生成模型(文本提示, 控制信号视频)
  • 应用:实现姿态驱动、风格迁移、背景替换等,同时保持视频时序连贯性。

2. SDEdit 风格编辑

  • 原理:对原始视频施加一定步数的前向扩散噪声,部分破坏其内容,然后使用新的文本提示进行反向去噪采样。
  • 流程
    1. 噪声视频 = 添加噪声(原始视频, 噪声步数t)
    2. 编辑后视频 = 采样(噪声视频, 新文本提示)
  • 控制:噪声步数 t 是关键超参数。t 越小,保留原视频结构越多,编辑变化越小;t 越大,编辑自由度越高,但原视频信息丢失也越多。

3. 基于微调的主题驱动编辑

  • 原理:针对单个特定视频进行快速微调(类似DreamBooth),使其与一个特定标识符(如 [V])绑定。然后通过修改文本提示(如将 [V] 与新的动作描述结合)来编辑该视频。
  • 流程
    1. 微调模型 = 在单个视频及标识符 “[V]” 上微调(预训练视频模型)
    2. 编辑后视频 = 微调模型(“[V] 正在做新动作”)
  • 应用:可以改变视频中主体的动作、属性等,同时保持主体身份和场景背景。

4. 视频修复与绘制 (Inpainting)

  • 原理:在采样过程中,对视频的特定区域(被掩码遮盖)进行重建,并以新的文本提示为条件。
  • 应用:可用于移除视频中物体、替换物体(如给人物戴上帽子)、修复缺损帧等。

总结

本节课中我们一起学习了视频生成的核心内容。我们首先了解了视频数据庞大且高度压缩的特性。接着,探讨了为应对计算挑战而发展的三大技术范式:级联方法每帧潜空间模型时空联合潜空间模型,并介绍了FSQ等更先进的潜表示量化技术。然后,我们分析了改进视频生成模型的三个关键方向:扩大规模优化潜表示提升数据质量。最后,我们展望了视频生成在两个领域的应用:作为物理模拟器用于机器人规划与自动驾驶仿真,以及用于实现可控视频编辑,包括控制网络、SDEdit、主题微调等多种技术。这些基础知识和前沿动态为我们理解Sora等更先进的模型奠定了坚实的基础。

posted @ 2026-02-04 18:21  绝不原创的飞龙  阅读(2)  评论(0)    收藏  举报