「CS231n:计算机视觉与深度学习」学习笔记(Lec 12 - Lec 17)

本篇为《CS231n: Deep Learning for Computer Vision》课程的学习笔记,课程版本为 Spring 2025。该篇笔记涵盖了 Lec 12 - Lec 17。

主要参考了 CS231n 官网B 站课程视频,相关代码和作业实现可以参考 个人完成记录

前置说明:基础知识可参考 《PyTorch深度学习实践》。本文默认读者已掌握该课程的基础常识,故不再进行赘述。

这一系列笔记为个人随手记录,且是直接从 Obsidian 强行复制过来的,不保证排版和可读性()


导航链接:


Lecture 12: Self-supervised Learning

学习表征(Learned Representations)

对于一个神经网络(以图像分类为例),学习表征 即为线性分类层(最后一层)之前的数据表示,其能很好地代表图像,且可通过简单的线性映射即可从其中提取特征获取类别。

但对于训练,其硬性要求数据必须经过手动标记标签。

自监督学习

考虑是否有方法可不依赖大量人工标注数据集进行训练,即为 自监督学习(Self-Supervised Learning)。

在无标记的数据集上,考虑可通过 预设任务(pretext task)的目标函数来训练神经网络,以获得图像的良好特征。而当需要在小规模已标注的数据集上进行特定任务的训练时,我们只需转移这个训练好的编码器,并用于下游任务特征提取。

在此,我们需定义预设任务为一个足够通用的任务以从图像中学习特征(称之为编码器),并用该编码器解决实际场景下的下游任务。

自监督学习即为:数据集(无标签)-> 编码器 -> 学习表征 -> 解码器 / 分类器 / 回归器(其通过学习表征生成输出)。 在完成训练后,则将其应用至有标签的小数据集(例如图像分类),则有:数据集(有标签)-> 编码器 -> 学习表征 -> 全连接网络 -> 标签。 此时则只需训练最后的浅层的全连接网络,若特征足够好,则无需大量的训练。

以下角度可评估自监督学习:

  • 预设任务的表现(Pretext Task Performance);
  • 表征质量(Representation Quality);
    • 线性评估协议(Linear Evaluation Protocol):在学习到的表征上训练一个线性分类器;
    • 聚类(Clustering):衡量聚类性能;
    • t-SNE:降低表征的维度,并可视化表征以评估其可分性;
  • 鲁棒性与泛化能力(Robustness and Generalization);
  • 计算效率(Computational Efficiency);
  • 迁移学习与下游任务性能(Transfer Learning and Downstream Task Performance)。

其中,评估下游任务性能最为重要。

自监督预设任务

定义预设任务主要需遵循:能让我们获得良好的特征,且可通过预设任务自动生成标签。 故一些例子为:图像补全(盖住一部分图像,要求预测盖住的部分)、图像旋转(给出旋转过的图像,要求预测旋转的角度)、拼图(将图像拆成若干块,要求按照顺序拼回去)、图像上色(给出黑白图像,要求上色)等等。

这些任务通常都围绕视觉常识的概念进行设计。

而预设任务也会有问题:

  • 设计单独的预设任务较为繁琐;
  • 得到的学习表征与预设任务有关,不一定是通用的(即可能对预设任务有效,但对通常的任务不那么有效)。

图像旋转

其基于假设:模型只有在具备“物体未受扰动时的正确形态”这类常识的前提下,才能识别出物体的正确旋转角度。

例如,将图片旋转四种角度(\(0^{\circ}, 90^{\circ}, 180^{\circ}, 270^{\circ}\)),输入 CNN,并预测旋转的是哪种角度以进行预训练。然后将习得的表征,通过微调编码器和分类器(例如冻结 conv1 和 conv2,微调 conv3 和 linear layers)运用至图像分类,其可达到较好的效果,且在预训练时就达到了较高的准确率。

当下游任务较简单时(例如 CIFAR-10),完全监督模型和该方法得到的模型准确率通常会收敛至同一值。但当下游任务很复杂时,不经过预训练通常得不到理想的效果,且使用自监督学习非常有效(甚至可能接近在 ImageNet 预训练的效果)。

尝试进行权重可视化,可发现由于只解决单一问题,监督模型通常有更集中的区域;而自监督模型需全面理解图像,故会观察更多特征,覆盖更多区域。

预测相对位置

在图像中截取一块,创建 \(3 \times 3\) 网格,给定中心块和其他任意一个块,预测该块的位置,其为八分类。

拼图

在图像中截取一块,创建 \(3 \times 3\) 网格,将其中的块打乱,预测这些块原本的顺序(不过一般只会取其中 \(64\) 种顺序进行打乱),其为 \(64\) 分类。

图像补全

即遮挡部分图像,然后让模型绘制被遮挡的部分。

对于图像,会先进行掩码,然后输入编码器得到编码器特征(Encoder Features),其经过全连接层后转为解码器特征(Decoder Features),然后输入解码器进行解码,得到的输出与遮挡的部分进行比较即为 loss。 其为学习重建缺失像素的过程,且为某种形式的 自编码器(Auto Encoder),即将输入编码为所需的表示以进行解码。

一般来说,基于重建的框架会产生大量模糊且平滑的输出(类似于高斯模糊的视觉效果),所以需要加上额外的对抗性目标函数,以改善该情况。

该方法是目前用于预训练最常见预设任务之一。

图像上色

即对于有颜色的图像,分离出其亮度和颜色(使用 Lab 颜色空间)。 则为给定 L,预测 ab。即给定 \(X \in \mathbb{R}^{H \times W \times 1}\),预测 \(\hat{Y} \in \mathbb{R}^{H \times W \times 2}\),且拼接 \((X, \hat{Y})\) 即为彩色图像。

显然,该方法不仅可用于预训练,其本身也有相当的应用价值。且其表现出良好的理解能力(例如生成水中倒影的颜色与原物体相同)。

分裂脑自编码器(Split-brain Autoencoder)

即将图像分为亮度通道和颜色通道,然后训练两个神经网络,一个通过亮度预测颜色,另一个通过颜色预测亮度,最后将两者结合,生成新的图像,然后与实际图像相比较,得到 L2 loss 或其他举例函数计算 loss。

可提取 idea:通道分为两组,训练两个神经网络,给定其中一组,预测另一组,最后合并输出得到结果。这样可较为容易地计算 loss。

此可应用与其他情况。例如 RGB-HHA 图像,则可分为 RGB 通道和 HHA 深度通道。

该种方法在多种下游任务种表现较好。

视频上色

即给出一个带有颜色的一帧,然后给后续帧上色。在该过程中,实际上我们在尝试追踪视频中的像素和物体,使其可隐式学习这些追踪模式。

若有参考帧,对于输入帧则许找到特定物体的对应位置,然后根据位置确定颜色,并复制颜色作为输出目标的颜色。

该方法的实现与注意力机制比较类似。对参考帧和目标帧,先将其输入 CNN 得到特征图(参考帧 \(f_{i}\),目标帧 \(f_{j}\)),然后对目标帧中的像素,计算其与参考帧的每个像素的注意力: \[ A_{ij} = \frac{\exp(f_{i}^{\top}f_{j})}{\sum_{k} \exp(f_{k}^{\top}f_{j})}. \] 之后即可得到预测颜色: \[ y_{j} = \sum_{i} A_{ij}c_{i}. \] 最后只需最小化 loss 即可: \[ \min_{\theta} \sum_{j} \mathcal{L}(y_{j}, c_{j}). \]

利用该技术,不仅可视频上色,也可通过上色实现追踪物体,甚至识别视频中的关键点。

掩码自编码器(Masked Auto Encoder,MAE)

其会设置一个采样率,然后对图片划分成网格,对其中采样率比例个 patches 设置掩码,然后进行类似于图像补全的重建,以提取图像特征。其通过定义良好的编码器和解码器实现。

其先将图片拆为 patches,然后均匀采样(采样率通常较高,如 \(75\%\)),对采样部分设置掩码。 使用高遮罩比例会增加预测任务难度,从而增强预设任务的效果。且由于高遮罩比例,可大幅扩充数据量(每次遮住同一张图的不同部分)。

对于编码器,其只可看到未被遮挡的数据。这些数据先进行 embedding,接着添加位置嵌入,输入编码器。编码器由 Transformer 组成,且由于输入数据量较小,编码器可设计得很大。

对于解码器,对于被掩码覆盖的 patches,使用 共享掩码 token(shared mask tokens,其为可训练的参数,可视为对缺失部分提供的平均表示)进行替代,将其与编码器输出进行合并,添加位置编码,输入解码器。解码器(采用 Transformer,后接一个线性层进行输出)则将输入转为完整的 patches,得到最终图像的输出。

使用 MSE(mean squared error loss)计算原始图像和重建图像的差异,且该 loss 只计算被遮住的 patches。

完成训练后,可在编码器后接线性层完成下游任务。此时可采用线性探测(linear probing),也可采用微调:

  • 对于线性探测,会冻结编码器,只训练线性层,其可反映学习表征的质量
  • 对于微调,编码器和线性层均会经过微调,其更有潜力去适配新任务

对比表征学习(Contrastive representation learning)

对于之前的预设任务,都是在同一种图像上进行变换。而当数据集中存在完全不同种类的图像时,我们可以考虑以下任务:对于同一种类对象的变换,在空间中吸引(attract),而不同种类对象在空间中则排斥(repel),即为 对比表征学习

其定义吸引与排斥函数,若参考源图片为 \(x\),则经过变换(例如遮挡、旋转、拼图、上色等等)的均为正样本 \(x^{+}\),数据集中的其他对象则为负样本 \(x^{-}\)

对于评分函数 \(\operatorname{score}\),我们希望有: \[ \operatorname{score}(f(x), f(x^{+})) \gg \operatorname{score}(f(x), f(x^{-})). \] 定义评分函数后,即可定义 loss 以训练评分函数 \(s\)\[ L = -\mathbb{E}_{X}\left( \log \frac{\exp(s(f(x), f(x^{+})))}{\exp(s(f(x), f(x^{+}))) + \sum_{j=1}^{N - 1} \exp(s(f(x), f(x_{j}^{-})))} \right). \] 该损失函数形式与交叉熵损失较为类似,称为 信息噪声对比估计损失(InfoNCE loss)。

InfoNCE loss 为 \(f(x)\)\(f(x^{+})\) 之间 互信息(mutual Information,其衡量两张图象之前的依赖或共享信息)的下界: \[ MI(f(x), f(x^{+})) - \log(N) \geq -L. \] 故最小化 \(L\) 意味着使 \(MI(f(x), f(x^{+}))\) 更可能增大。 且负样本(\(N\))数量越大,下界越紧。故对于该种神经网络,通常要求批次较大。

SimCLR

SimCLR 为一个用于对比学习的简单框架,其将同一张图片分别经过两种变换 \(t \sim \mathcal{T}\)\(t' \sim \mathcal{T}\),得到 \(\tilde{x}_{i}\)\(\tilde{x}_{j}\),然后得到学习表征 \(h_{i} = f(\tilde{x}_{i}), \ h_{j} = f(\tilde{x}_{j})\),并映射至空间,有 \(z_{i} = g(h_{i}), \ z_{j} = g(h_{j})\)

其有余弦相似度: \[ s(u, v) = \frac{u^{\top}v}{\|u\| \|v\|} \] 使用该函数对 \(z_{i}, z_{j}\) 进行打分,目标为最大化打分值。

对于 \(g\) 的设计,其基于假设:使用对比学习时,可能会丢失对对比学习无关紧要,但对下游任务有利的信息。故会使用 \(g\) 处理后再进行对比学习,以在 \(h\) 中保留更多信息。

使用训练后的特征,例如在图像分类的下游任务中,加入线性分类器,即可得到较好的效果。

该方法在大批次下的表现更好,但由于硬件限制,大多数时候并不能做到这一点。

动量对比学习(Momentum Contrastive Learing,MoCo)

其提出了使用动量对比学习,即使用队列存储了 \(q\) 个之前批次的样本(在当前视角即为负样本),故其不完全依赖批次中的负样本。

其存储了一定数量的负样本,并随时间更新,以计算 loss。但显然这里由于样本可能不在队列中,无法反向传播,故需分开:编码器(encoder)处理正样本,称为 query;动量编码器(momentum encoder)处理负样本,称为 key。此时训练只会影响编码器。 而对于动量编码器,则使用动量规则进行更新(使用了 encoder 的权重): \[ \theta_{k} \gets m\theta_{k} + (1 - m)\theta_{q}. \]

使用该方法,则可避免对比学习对批次大小的依赖,不需大批次以增强效果。

DINO

其与 MoCo 类似,但其使用 KL 散度 loss 而不是 softmax。

此外,进化而来的有 DINOv2,其为 非常强大的自监督特征模型,如今应用十分广泛。其大幅扩大了训练数据(甚至远大于 ImageNet)。


Lecture 13: Generative Models 1

机器学习任务分类

机器学习任务可进行二分类:

  • 监督学习(Supervised Learning):有数据集 \((x, y)\),其中 \(x\) 为数据,\(y\) 为标签,需学习映射 \(x \mapsto y\)
  • 无监督学习(Unsupervised Learning):有数据集 \(x\),无标签,需学习数据的隐藏结构,不一定需要针对特定的任务(例如 K-means 聚类、PCA 降维、密度估计等)。

生成模型

从另一种角度,有(该角度中,总可认为数据中有一定的概率结构,且我们可发现或学习;且这里 \(x\) 为数据,\(y\) 为标签):

  • 判别模型(Discriminative Model):学习条件概率分布 \(p(y \mid x)\)
  • 生成模型(Generative Model):学习数据本身的概率分布 \(p(x)\)
  • 条件生成模型(Conditional Generative Model):学习条件概率分布 \(p(x \mid y)\)

对于判别模型,其没有办法拒绝不合理的输入。 其可用于对数据分配标签、特征学习等。

对于生成模型,所有可能的图像都在相互竞争概率质量,而此时为了生成内容的合理性,必须仔细考虑合理数据中存在的结构(例如三条腿的狗生成的概率远高于三个胳膊的猴子生成的概率)。 由于该种性质,生成模型可以通过基于某图像很低的概率,以表达某图像是不合理的输入。 不过从实际上,生成模型用处不大,其可用于检测异常值、特征学习(但实际上效果远差于对比学习)、采样并生成数据(但由于无法控制输出,意义不大)。

对于条件生成模型,每一个标签,都会独立地在所有图像之间引发概率质量竞争。 且当 \(y\) 较为复杂时(例如为文字描述,甚至为图像 + 文字描述),则该模型则涉及的为非常复杂且定义不明确的问题,需要对涉及对象的深入推理。 条件生成模型应用则十分广泛,其可用于分配标签且拒绝异常值(不过实际上用得不多)、采样并根据标签生成数据(我们可控制输出,故其应用十分广泛)等。

在文献中,“生成模型”可能指的是生成模型,也可能指的条件生成模型(甚至有时对于条件生成模型,会省略 \(y\))。

对于条件生成模型,可尝试使用 Bayes 公式(尽管该方法极不常用): \[ P(x \mid y) = \frac{P(y \mid x)}{P(y)} P(x). \]

当尝试建模的任务中存在一些模糊性时(可能存在不止一种输出),则需使用生成模型,其根据输入对整个输出分布进行建模。

生成模型的分类


graph TD
%% 核心节点定义
Root[生成模型 <br/><b>Generative models</b>]

%% 显式密度分支
Explicit["显式密度 <br/><b>Explicit density</b><br/><small>模型可以计算 $P(x)$</small>"]
Tractable["可解密度 <br/><b>Tractable density</b><br/><small>真正计算 $P(x)$</small>"]
Approx["近似密度 <br/><b>Approximate density</b><br/><small>近似 $P(x)$</small>"]
AR[<b>自回归模型</b><br/>Autoregressive]
VAE[<b>变分自编码器</b><br/>VAE]

%% 隐式密度分支
Implicit["隐式密度 <br/><b>Implicit density</b><br/><small>无法计算 $P(x)$,但可以从中采样</small>"]
Direct["直接采样 <br/><b>Direct</b><br/><small>可以直接从 $P(x)$ 中采样</small>"]
Indirect["间接采样 <br/><b>Indirect</b><br/><small>通过迭代过程来近似采样</small>"]
GAN[<b>生成对抗网络</b><br/>GAN]
Diffusion[<b>扩散模型</b><br/>Diffusion Models]

%% 建立连接
Root --> Explicit
Root --> Implicit

Explicit --> Tractable
Explicit --> Approx
Tractable --> AR
Approx --> VAE

Implicit --> Direct
Implicit --> Indirect
Direct --> GAN
Indirect --> Diffusion

%% 样式美化
style Root fill:#d4e6f1,stroke:#2e4053,stroke-width:2px
style Explicit fill:#eaeded,stroke:#7f8c8d,stroke-width:1px
style Implicit fill:#eaeded,stroke:#7f8c8d,stroke-width:1px

对于间接采样,可将采样过程视作黑盒,然后当成直接采样处理,但由于间接采样需要进行近似(需要迭代无限步收敛,在模型中采取有限步进行近似计算),通常不会这么做。

自回归模型(Autogressive Models)

最大似然估计(MLE)

设对概率分布有显式函数 \(p(x) = f(x, W)\)。给定数据集 \(x^{(1)}, x^{(2)}, \cdots, x^{(N)}\)(需假设 \(x\) 是 IID(独立同分布)的),我们希望训练模型得到: \[ W^{*} = \arg\max_{W} \prod_{i} p(x^{(i)}). \] 即最大化该数据出现的概率,称为 最大似然估计(Maximum Likelihood Estimation)。

则有: \[ \begin{align*} W^{*} &= \arg\max_{W} \sum_{i} \log p(x^{(i)}) \\ &= \arg\max_{W} \sum_{i} \log f(x^{(i)}, W). \end{align*} \] 于是可得到用于训练神经网络的目标函数,即可变换为 loss 进行训练。

自回归模型

自回归模型假设 \(x\) 是一个一列子部分的序列,即: \[ x = (x_{1}, x_{2}, \cdots, x_{T}). \] 则有: \[ \begin{align*} p(x) &= p(x_{1}x_{2} \cdots x_{n}) \\ &= p(x_{1})p(x_{2} \mid x_{1})p(x_{3} | x_{1}x_{2}) \cdots \\ &= \prod_{t=1}^{T} p(x_{t} \mid x_{1} \cdots x_{t - 1}). \end{align*} \]

考虑训练一个神经网络,其输入序列 \(x\) 的前一部分,预测序列下一部分的概率分布。显然 RNN、Masked Transformer 等结构可解决。

自回归模型需要 \(x\) 是一个序列,显然文本数据是适配的,而图像则有点棘手(其不是天然地一维的,且不是天然地离散的)。

图像上的自回归模型

即将图像视为像素序列,且每个像素为三个 \(8\) 位数字。 则考虑将图像转化为一个一维长序列,其中每个元素为图像的子像素值即可。 显然,使用该方法时,序列长度过长。

另一种方法为考虑利用某种模型,将图片分解为一维序列。

变分自动编码器(Variational Autoencoders,VAEs)

在 VAE 中,我们放弃对概率密度的精确计算(也可能是难以计算),改为近似计算(实际是真实密度下限的近似密度)。这样反而能得到计算能表达数据的隐向量的能力。

自动编码器(Autoencoders,AEs)

这是一种无监督学习,用于从无标签的输入 \(x\) ,通过编码器,提取特征 \(z\)。其中编码器可为任意网络。 需要解决如何学习 \(z\),考虑建立解码器并输入 \(z\),我们希望其能重建输入,即输出 \(\hat{x}\),并有loss: \[ \| \hat{x} - x \|_{2}^{2}. \]

而为了使其学习的不是恒等映射,需要限制 \(z\),这里让 \(z\) 远小于 \(x\) 即可。

学习 \(z\) 之后,则与自监督学习一样,将解码器替换成所需的网络,然后进行有标签的下游训练即可。

从另一种角度,对于生成模型,则考虑丢掉 编码器,以某种方法采样匹配模型数据的 \(z\),然后通过解码器用 \(z\) 生成新的样本 \(\hat{x}\)。此方法无需对概率密度进行建模。

但实际上,生成新的 \(z\) 并不比生成新的 \(x\) 容易。

变分自动编码器

其在上述思路上,考虑对 \(z\) 强制加上一些结构,例如符合高斯分布,以此可强制 AEs 具有概率性,并再潜在空间上强制规制在某个概率结构。

其有步骤:

  1. 从原始数据学习隐特征 \(z\),其中 \(z\) 被规制在某种特定结构中;
  2. 采样并生成新数据。

假设 \(x^{(i)}\) 可由 \(z\) 生成。则在训练后,可在先验分布 \(p_{\theta^{*}}(z)\)(多规定为高斯分布)中找一个 \(z\),经过解码器,从条件分布 \(p_{\theta^{*}}(x \mid z^{(i)})\) 采样得到新样本 \(x\)

对于训练,考虑使用最大似然,即若能有数据集 \((x, z)\),则可训练条件生成模型 \(p(x \mid z)\)

由于不知道 \(z\),尝试将其边缘化: \[ p_{\theta}(x) = \int p_{\theta}(xz) \, \mathrm{d}z = \int p_{\theta}(x \mid z)p_{\theta}(z) \, \mathrm{d}z. \] 其中,\(p_{\theta}(x \mid z)\) 可通过解码器进行计算,且 \(p_{\theta}(z)\) 已假设为高斯分布,但该积分难以计算。

另一种思路,考虑 Bayes 公式,有: \[ p_{\theta}(x) = \frac{p_{\theta}(x \mid z)p_{\theta}(z)}{p_{\theta}(z \mid x)}. \] 其中,\(p_{\theta}(x \mid z)\) 可通过解码器进行计算,且 \(p_{\theta}(z)\) 已假设为高斯分布,但 \(p_{\theta}(z \mid x)\) 难以计算。 这里则需要考虑使用另一个网络,学习 \(q_{\phi}(z \mid x) \approx p_{\theta}(z | x)\)

于是对于 VAE,需要联合学习两个神经网络,一个为解码器 \(z \mapsto p_{\theta}(x \mid z)\),另一个是编码器 \(x \mapsto q_{\phi}(z \mid x)\),并使用各自独立的权重进行单独训练。

这里则需强加结构:\(p_{\theta}(x \mid z) = \mathcal{N}(\mu_{x \mid z}, \sigma^{2}), \ q_{\phi}(z \mid x) = \mathcal{N}(\mu_{z \mid x}, \Sigma_{z \mid x})\)。 解码器的输出为对角高斯分布,其中对角线元素对应像素,则解码器输出的则为对角高斯分布的均值 \(\mu_{x \mid z}\)(其会固定方差);同理,编码器输出 \(\mu_{z \mid x}\)\(\Sigma_{z \mid x}\)。 这里均使用对角高斯分布,避免了协方差矩阵过大(例如 \(H^{2}W^{2}\) 而不是 \(HW\))的情况。

解码器固定方差后,取对数,则有: \[ \log p_{\theta}(x \mid z) = -\frac{1}{2\sigma^{2}} \| x - \mu \|_{2}^{2} + C_{2}. \] 则对其最大化即为最小化 \(x\) 与网络输出的 L2 距离。 另外,若不固定方差,即对每个像素分配独立的方差,解码器则倾向于“作弊”,即输出的始终为均值则可达到“完美效果”。

ELBO

我们需要最大化 \(\log p_{\theta}(x)\),有: \[ \begin{align*} \log p_{\theta}(x) &= \log \frac{p_{\theta}(x \mid z)p(z)}{p_{\theta}(z \mid x)} \\ &= \log \frac{p_{\theta}(x \mid z)p(z)q_{\phi}(z \mid x)}{p_{\theta}(z \mid x)q_{\phi}(z \mid x)} \\ &= \log p_{\theta}(x \mid z) - \log \frac{q_{\phi}(z \mid x)}{p(z)} + \log \frac{q_{\phi}(z \mid x)}{p_{\theta}(z \mid x)}. \end{align*} \] 另外,由于 \(p_{\theta}(x)\)\(z\) 无关,有: \[ \log p_{\theta}(x) = \mathbb{E}_{z \sim q_{\phi}(z \mid x)} (\log p_{\theta}(x)). \] 则有: \[ \begin{align*} \log p_{\theta}(x) &= \mathbb{E}_{z}(\log p_{\theta}(x \mid z)) - \mathbb{E}_{z}\left( \log \frac{q_{\phi}(z \mid x)}{p(z)} \right) + \mathbb{E}_{z}\left( \log \frac{q_{\phi}(z \mid x)}{p_{\theta}(z \mid x)} \right) \\ &= \mathbb{E}_{z \sim q_{\phi}(z \mid x)}(\log p_{\theta}(x \mid z)) - D_{KL}(q_{\phi}(z \mid x), p(z)) + D_{KL}(q_{\phi}(z \mid x), p_{\theta}(z \mid x)). \end{align*} \] 其中后两项为 KL 散度,其为概率分布之间差异 / 不相似性的度量。

对于该公式,每一项可有解释:

  • \(\mathbb{E}_{z \sim q_{\phi}(z \mid x)}(\log p_{\theta}(x \mid z))\):其为数据重建,即将 \(x\) 输入编码器以获得 \(z\) 的分布,然后将该概率分布中的任意样本传入解码器,以恢复 \(x\)
  • \(D_{KL}(q_{\phi}(z \mid x), p(z))\):其为先验约束,即编码器输入 \(x\) 之后对 \(z\) 的预测分布应与 \(z\) 的先验分布(通常为对角高斯分布)相匹配,这里即测量了匹配程度;
  • \(D_{KL}(q_{\phi}(z \mid x), p_{\theta}(z \mid x))\):由于有 \(p_{\theta}(z \mid x)\),该项难以计算,但 KL 散度大于等于 \(0\)

于是考虑缩放,有: \[ \log p_{\theta}(x) \geq \mathbb{E}_{z \sim q_{\phi}(z \mid x)}(\log p_{\theta}(x \mid z)) - D_{KL}(q_{\phi}(z \mid x), p(z)). \] 于是最大化下限(即不等式右侧)即更可能最大化 \(\log p_{\theta}(x)\),即该下限可为 VAE 的训练目标。

于是我们需要联合训练编码器 \(q\) 和解码器 \(p\),以最大化数据似然的变分下界。 该下界也被称为 证据下界(Evidence Lower Bound,ELBo)。

训练

即需要最大化 ELBO: \[ \mathbb{E}_{z \sim q_{\phi}(z \mid x)}(\log p_{\theta}(x \mid z)) - D_{KL}(q_{\phi}(z \mid x), p(z)). \]

对于训练,有:

  1. 输入数据 \(x\) 至编码器,得到 \(z\) 的概率分布 \(q_{\phi}(z \mid x) = \mathcal{N}(\mu_{z \mid x}, \Sigma_{z \mid x})\)
  2. 计算 先验损失(Prior loss):\(z\) 的概率分布应为标准高斯分布(均值为全 \(0\),标准差为全 \(1\));
  3. \(q_{\phi}(z \mid x)\) 使用 重参化(Reparamenterization trick,该技巧能对 \(z\) 进行反向传播)采样 \(z\)\[ \begin{align*} \epsilon &\sim \mathcal{N}(0, I) \\ z &= \epsilon \odot \Sigma_{z \mid x} + \mu_{z \mid x} \end{align*} \]
  4. \(z\) 输入解码器,得到预测数据的高斯分布的均值;
  5. 计算 重构损失(Reconstruction loss):输出的均值应与 \(x\) 在 L2 距离下接近。

实际上,这两种损失是相互对抗的:

  • 重构损失倾向于 \(\Sigma_{z \mid x} = 0\),且 \(\mu_{z \mid x}\) 对应的 \(x\) 是唯一的,以此完美重建每个数据集中的点;
  • 先验损失倾向于 \(\Sigma_{z \mid x} = I, \ \mu_{z \mid x} = 0\),以此使编码器输出为标准高斯分布。 故在此基础上训练即为在重建数据与强制潜在空间接近先验分布之间找到平衡。

采样

训练完成后,可进行采样。

只需在先验分布(标准高斯分布)中采样 \(z\),输入解码器,即可得到一个样本。

由于潜在空间 \(z\) 的先验为标准高斯分布,故其每个元素可视为相互独立。 故可分别调整它们,且这些独立的维度往往能编码出数据中一些有用、可解释或正交的信息。 例如在手写数字数据集上进行训练,则在改变潜在空间的两个维度时,数字会平滑地从一个类别变到另一个类别。


Lecture 14: Generative Models 2

生成对抗网络(Generative Adversarial Networks,GANs)

对于无法计算 \(p(x)\) 的情况,可使用 GAN,其放弃直接建模 \(p(x)\),但可从模型拟合的隐含分布中采样。

开始时,我们有有限个从数据分布 \(p_{\text{data}}(x)\) 抽取的数据 \(x_{i}\),并希望从 \(p_{\text{data}}\) 中采样。

考虑引用遵循先验分布 \(p(z)\)(多为单位高斯分布)的隐变量 \(z\)。 于是考虑使用模型建模数据生成过程,即采样 \(z \sim p(z)\),输入 生成网络(Generative Network),得到 \(x = G(z)\)。此时 \(x\) 即为 生成分布(Generative distribution)\(p_{G}\) 的一个采样。我们希望有 \(p_{G} = p_{\text{data}}\)

则只需从 \(p(z)\) 中采样 \(z\),输入生成网络 \(G\),即可转化为数据分布中采样的 \(x\),即为生成的图像。

而为了训练 \(p_{G} = p_{\text{data}}\),考虑训练另一个网络,称为判别器 \(D\),其被输入图片(可能为真图片、可能为假图片),并判断该图片是否为真的图片。 于是需要网络 \(G\)\(D\) 相互对抗,即希望 \(G\) 能欺骗 \(D\),且希望 \(D\) 能正确区分真假数据。 理想状态下,\(D\) 的分类能力应越来越好,从而迫使 \(G\) 生成更能接近真实的数据。

具体地,会通过极小极大博弈(minimax game)联合训练 \(G\)\(D\)\[ \min_{G}\max_{D}\left( \mathbb{E}_{x \sim p_{\text{data}}}\left( \log D(x) \right) + \mathbb{E}_{z \sim p(z)}\left( \log(1 - D(G(z))) \right) \right). \] 其中,\(D(x)\) 输出 \(x\) 是否为真数据的概率,即 \(D(x) = 0\) 为假,\(D(x) = 1\) 为真。 故显然当固定 \(G\) 时,\(D\) 希望对真数据有 \(D(x) = 1\),即最大化 \(\mathbb{E}_{x \sim p_{\text{data}}}\left( \log D(x) \right)\);且希望对假数据有 \(D(x) = 0\),即最大化 \(\mathbb{E}_{z \sim p(z)}\left( \log(1 - D(G(z))) \right)\)。 而固定 \(D\) 时,\(\mathbb{E}_{x \sim p_{\text{data}}}\left( \log D(x) \right)\)\(G\) 无关,且 \(G\) 希望对假数据有 \(D(x) = 1\),即最小化 \(\mathbb{E}_{z \sim p(z)}\left( \log(1 - D(G(z))) \right)\)

在数学上,可将其抽象为: \[ \min_{G}\max_{D} V(G, D). \] 故可进行梯度下降:

1
2
3
4
5
6
while True:
grad_D = compute_gradient(V, D)
D = D + alpha_D * grad_D

grad_G = compute_gradient(V, G)
G = G - alpha_G * grad_G

需要注意,\(V\) 并不是 loss,且 \(V\) 的大小不反映 \(G\)\(D\) 以及 GAN 的效果。故 GAN 通常难以训练,甚至难以判断训练是否成功(\(G\)\(D\) 的 loss 都意义不大)。

在训练 GAN 时,有一个技巧:在开始训练时,生成器 \(G\) 输出为完全随机的噪声,其与真实图像相差巨大,故此时判别器 \(D\) 的任务极其简单,故仅在几次迭代后即可分辨。 故在训练初期,\(D(G(z))\) 十分接近于 \(0\),而 \(\log(1 - D(G(Z)))\) 在接近 \(0\) 处图像极其平缓,故 \(G\) 的梯度接近于 \(0\),在初期难以训练。 为解决该问题,考虑最小化 \(-\log(D(G(z)))\) 以替代最大化 \(\log(1 - D(G(Z)))\)(此时 \(G\)\(D\) 使用的 \(V\) 则不同),以避免 \(0\) 附近的梯度消失,以在初期更好训练。

经过数学推导,可得最优的判别器为: \[ D_{G}^{*}(x) = \frac{p_{\text{data}}(x)}{p_{\text{data}}(x) + p_{G}(x)}. \] 即取 \(D_{G}^{*}(x)\) 时最大化内层目标函数。且可推导得,当且仅当满足以下等式时最小化外层目标函数: \[ p_{G}(x) = p_{\text{data}}(x). \] 故从理论上,该方法是自洽的。 但达到该种自洽需要假设:网络 \(G\)\(D\) 理论上可拟合任意函数,不过由于神经网络固定大小和容量,该假设不可达成,故该理论无法说明在有限数据情况下,\(G\)\(D\) 能否收敛至最优解。

GAN 的隐空间是平滑的。具体来说,若有两个隐向量 \(z_{0}\)\(z_{1}\),然后进行插值: \[ \begin{align*} z_{t} &= tz_{0} + (1 - t)z_{1} \\ x_{t} &= G(z_{t}) \end{align*} \] 得到的图像 \(x_{t}\) 在两个原始样本之间是平滑过渡的。这意味着模型可能确实发现了有用的结构,并嵌入了隐空间。

综上,GAN 优缺点有:

  • 优点:
    • 公式简单;
    • 调整得当时,可生成高质量图像(相较于 VAE 通常生成较为模糊的图像,GAN 可生成很清晰干净的好图像)。
  • 缺点:
    • 没有 loss 曲线进行参考;
    • 训练过程不稳定,稍有不慎就会爆炸(称为 模式崩溃(mode collapse),即出现 NaNinf 或网络生成内容崩溃等等),故调参、归一化、采样等过程需十分谨慎;
    • 难以拓展至大规模模型,处理海量数据。

DC-GAN

显然,GAN 中的 \(G\)\(D\) 均为神经网络。

早期 GAN 采用 CNN,并不流行,但在 ViT 出现后,GAN 效果显著提升。

其中,DC-GAN 是第一个取得显著结果的 GAN,其采用了五层卷积网络。

StyleGAN

其采用了更复杂的架构,但效果很好。 该架构为理解 GAN 的很好的例子。

扩散模型(Diffusion Models)

这里只会涉及 整流流(Rectified Flow)。

直觉

噪声分布(noise distribution)\(z \sim p_{\text{noise}}\)(其与数据形状一致,且通常为标准高斯分布)。 考虑原始数据 \(x\) 在不同 噪声水平(noise levels)\(t\)\(0 \leq t \leq 1\))下被噪声侵蚀,得到 \(x_{t}\)。其中 \(t = 0\) 时则为无噪声(即完全干净的数据样本),\(t = 1\) 则为完全噪声(即该样本直接来自噪声分布),且 \(t\) 会平滑地在数据分布于噪声分布之间插值。

我们希望能训练一个神经网络,其可 少量渐进式去噪\(f_{\theta}(x_{t}, t)\),即对一张被某种程度侵蚀的图片,其会去除少量噪声,以略微清理该图。

于是在推理时,需采样 \(x \sim p_{\text{noise}}\),然后逐步应用 \(f_{\theta}\) 以去除噪声,以得到无噪声的图片 \(x_{0}\)

整流流(Rectified Flow)

假设我们有确定的 \(p_{\text{noise}}\)(其较为简单,如高斯分布)和 \(p_{\text{data}}\)。 在每次训练迭代中,采样 \(z \sim p_{\text{noise}}, \ x \sim p_{\text{data}}, \ t \sim \mathcal{U}(0, 1)\),于是可取 \(x_{t} = (1 - t)x + tz, \ v = z - x\). 于是考虑训练一个神经网络以预测 \(v\)\[ L = \| f_{\theta}(x_{t}, t) - v \|_{2}^{2}. \]

使用几行代码即可实现:

1
2
3
4
5
6
for x in dataset:
z = torch.randn_like(x)
t = random.uniform(0, 1)
xt = (1 - t) * x + t * z
v = model(xt, t)
loss = (z - x - v).square().sum()

推理

会先取一个步骤数 \(T\)(通常从 \(50\) 开始),采样 \(x \sim p_{\text{noise}}\)。 然后进入循环 \(t \in \left\{ 1, 1 - \frac{1}{T}, 1 - \frac{2}{T}, \cdots, 0 \right\}\),在每次循环中,计算 \(v_{t} = f_{\theta}(x_{t}, t)\),并更新 \(x = x - \frac{v_{t}}{T}\)。 最终得到的 \(x\) 即为生成的样本。

相较于 GAN,尽管推理过程更复杂,其更具稳定性,且往往能生成更好的样本,且其能较好地拓展至大规模数据集和大型模型。

且实现代码也很简单:

1
2
3
4
sample = torch.randn(x_shape)
for t in torch.linspace(1, 0, num_steps):
v = model(sample, t)
sample = sample - v / num_steps

条件整流流(Conditional Rectified Flow)

考虑数据集中有多种数据,即数据集中有不同的子部分,即数据为 \((x, y)\),其中 \(y\) 为类别等。

则对训练,有:

1
2
3
4
5
6
for (x, y) in dataset:
z = torch.randn_like(x)
t = random.uniform(0, 1)
xt = (1 - t) * x + t * z
v = model(xt, y, t)
loss = (z - x - v).square().sum()

对于采样,有:

1
2
3
4
5
y = user_input()
sample = torch.randn(x_shape)
for t in torch.linspace(1, 0, num_steps):
v = model(sample, y, t)
sample = sample - v / num_steps

其中 \(y\) 形式多样,可为文本、图片,也可为用户希望推理的输入等,其使模型更具可控性和可用性。

CFG(Classifier-Free Guidance)

可考虑一个问题:是否可控制模型对该条件信号 \(y\) 的关注程度。例如当直接训练模型时,它们往往不会以我们希望的那样遵循条件信号。

考虑进行修改训练阶段即可实现:

1
2
3
4
5
6
7
8
for (x, y) in dataset:
z = torch.randn_like(x)
t = random.uniform(0, 1)
xt = (1 - t) * x + t * z
if random.random() < 0.5:
y = y_null
v = model(xt, y, t)
loss = (z - x - v).square().sum()
即在训练时,有一定概率删除条件信息(设为零值或空值等),该概率为超参数(通常设为 \(50\%\))。

此时,该模型则需学习两种速度向量,即对有部分噪声的 \(x_{t}\),有:

  • \(y\) 为空,则 \(v^{\varnothing} = f_{\theta}(x_{t}, y_{\varnothing}, t)\) 指向 \(p(x)\)
  • \(y\) 非空,则 \(v^{y} = f_{\theta}(x_{t}, y, t)\) 指向 \(p(x \mid y)\)
  • 考虑进行线性组合,有 \(v^{\text{cfg}} = (1 + w)v^{y} - wv^{\varnothing}\),其让结果更加偏向 \(p(x \mid y)\),其中 \(w\) 为超参数。 于是在采样时,使用 \(v^{\text{cfg}}\) 进行迭代。

于是采样时,有:

1
2
3
4
5
6
7
y = user_input()
sample = torch.randn(x_shape)
for t in torch.linspace(1, 0, num_steps):
vy = model(sample, y, t)
v0 = model(sample, y_null, t)
v = (1 + w) * vy - w * v0
sample = sample - v / num_steps

该方法在实际中十分常用,以获得高质量输出。

最优预测

在原始的整流流中,显然当 \(t = 1\) 时,其全为噪声,最优的 \(v\) 指向数据分布的均值;且当 \(t = 0\) 时候,其无噪声,最优的 \(v\) 指向噪声分布的均值。故在这两个值时,问题已于解决。 而在两者之间时,\(x_{t}\) 可由多种的 \((x, z)\) 生成,故需解决该期望问题,并确定最优预测方向,以整合所有可能经过 \(x_{t}\)\((x, z)\)。显然该问题更难解决。

而当 \(t\)\([0, 1]\) 均匀采样时,其对所有噪声程度赋予了同等重要性,这显然不合理,所以考虑 采用不同的噪声调度。 其中较常见的有 逻辑正态采样(logic-normal sampling,其形状与高斯分布类似)。有时也会采用不对称噪声调度,其偏向某一方向,在处理高分辨率数据时较为重要(更高分辨率的图的相邻像素之间可能有更强的关联性,故根据数据中相关性的强弱,可能需要不同的噪声水平来破坏信息)。

这也引出了一个问题:扩散模型在高分辨率数据上工作较为困难。

Latent Diffusion Models(LDMs)

该种方法为当今扩散模型的最常见模式。

考虑训练编码器 + 解码器以提取隐表示,其将图片 \(H \times W \times 3\) 输入编码器,映射至隐空间 \(\frac{H}{D} \times \frac{W}{D} \times C\),然后输入解码器,恢复图像 \(H \times W \times 3\)。 其中常见设置为 \(D = 8, \ C = 16\)。编码器和解码器常用带注意力的 CNN 实现,不过最近也有使用 ViT 实现的。

接着,考虑在隐空间上训练扩散模型,即采样一张图,输入编码器得到隐表示,然后对其加入噪声,并训练扩散模型去噪。其中编码器需要冻结。

在完成训练后,随机在隐空间中采样,多次通过扩散模型去噪,得到干净样本,将其输入解码器,得到生成的图像。

对于训练编码器 + 解码器,通常采用 VAE。但 VAE 输出模糊,考虑改进,即在结尾添加 GAN。

综上,对于目前的 SOTA,即现代 LDM 流程为 VAE + GAN + Diffusion。

Diffusion Transformer(DiT)

使用常规的 Transformer Block 即可实现 Diffusion。其问题主要为如何插入条件信息(\(y\)\(t\))。 一般来说,会对噪声图片分成 patches 等,将 \(y\)\(t\) 进行 embedding,并将这些输入多层 DiT(即常规的 Transformer Block),然后通过 LayerNorm、Linear and Reshape,得到输出。

其有多种实现方式:

  • 预测缩放和偏移,并对 DiT 中的每一层之间都加入缩放与偏置以调整激活值,该种方法多为 \(t\) 的注入方式;
  • 考虑到 Transformer 可处理序列,故考虑直接将 \(t\)\(y\) 等塞入序列,然后让 Transformer 统一建模该数据序列(可通过在 DiT 中间加入 LayerNorm + 多头交叉注意力 + 残差连接实现,或者通过在 DiT 开头将 tokens 和数据序列拼接实现(称为联合注意力(Joint Attention)))。 在现代扩散模型中,对于 DiT,常常通过预测缩放与平移以注入 \(t\),并通过交叉注意力注入 \(y\) 和其他条件信息(有时也会用联合注意力)

Text-to-Image

其流程为将 text promt 输入预训练的文本编码器(多为 T5、CLIP,且通常被冻结)得到文本嵌入(text embeddings),并将文本嵌入和噪声隐向量一并输入 DiT(同时也会加入时间步长)迭代多次,得到干净的隐向量,最后将其输入 VAE 解码器,得到最终图像输出。

Text-to-Video

其与 Text-to-Image 几乎一致,唯一区别为噪声隐向量多了一个时间维度(即 \(t \times h \times w \times c\),通常为时空自编码器,即同时进行时间与空间下采样),得到干净的隐向量 \(t \times h \times w \times c\),输入解码器得到输出 \(T \times H \times W \times 3\)

该模型主要问题为由于序列长度过场,其训练成本极高。

蒸馏(Distillation)

Diffusion 的一大问题为其采样速度很慢,且模型可能较为庞大。 该问题可使用 蒸馏 进行解决,其可以某种方式修改模型,在尽可能保持样本质量的情况下,以更少步数生成优质样本。

广义扩散模型(Generalized Diffusion)

进行抽象化至更广义的扩散模型:

整流流(Rectified Flow) 广义扩散模型(Generalized Diffusion)
采样真实数据 \(x \sim p_{\text{data}}\),采样噪声 \(z \sim p_{\text{noise}}\) 采样真实数据 \(x \sim p_{\text{data}}\),采样噪声 \(z \sim p_{\text{noise}}\)
采样时间步 \(t \sim p_{t}\) 采样时间步 \(\boldsymbol{t} \sim p_{t}\)
构造含噪样本 \(x_t = (1-t)x + tz\) 构造含噪样本 \(x_t = \boldsymbol{a(t)}x + \boldsymbol{b(t)}z\)
真实标签(速度场)\(v_{\text{gt}} = z - x\) 真实标签 \(y_{\text{gt}} = \boldsymbol{c(t)}x + \boldsymbol{d(t)}z\)
模型预测速度场 \(v_{\text{pred}} = f_{\theta}(x_{t}, t)\) 模型预测 \(y_{\text{pred}} = f_{\theta}(x_{t}, t)\)
计算 loss \(\|v_{\text{gt}} - v_{\text{pred}}\|_{2}^{2}\) 计算 loss \(\|y_{\text{gt}} - y_{\text{pred}}\|_{2}^{2}\)

方差保持(Variance Preserving,VP)

其取: \[ \begin{align*} a(t) &= \sqrt{ \sigma(t) } \\ b(t) &= \sqrt{ 1 - \sigma(t) } \end{align*} \]

其中,若 \(x\)\(z\) 相互独立且方差均为 \(1\),则含噪样本 \(x_{t}\) 的方差也恒为 \(1\)。 其将两个超参数合并为单一的噪声调度。

方差爆炸(Variance Exploding,VE)

其取: \[ \begin{align*} a(t) &= 1 \\ b(t) &= \sigma(t) \end{align*} \]

目标函数

其也有多种不同取法:

  • x-prediction:\(y_{\text{gt}} = x\)
  • \(\varepsilon\)-prediction:\(y_{\text{gt}} = z\)
  • v-prediction:\(y_{\text{gt}} = b(t)z - a(t)x\)

数学形式化框架

通常,选取这些函数需要遵循数学原理,即通过特定的 特定的数学形式化框架 确定:

  • Diffusion 为 隐变量模型(Latent Variable Model),即对干净的 \(x_{0}\),其需推断与隐变量 \(x_{t}\) 相关,故其与 VAE 类似,考虑使用类似的数学技巧,即最大化变分下界;
  • Diffusion 建模了得分函数,即给定分布 \(p(x)\),存在得分函数 \(s(x) = \frac{ \partial }{ \partial x } \log p(x)\),其为指向高概率密度区的向量场,而 Diffusion 学习了一系列不同噪声程度的得分函数;
  • Diffusion 求解随机微分方程(SDE),即其为以下微分方程的数值求解器(其中数据为 \(\boldsymbol{x}\),时间为 \(t\),噪声为 \(\boldsymbol{w}\),在该视角下,梯度下降等同于前向欧拉积分器,可考虑使用其他积分器求解): \[ \mathrm{d}\boldsymbol{x} = f(\boldsymbol{x}, t) \, \mathrm{d}t + g(t) \, \mathrm{d}\boldsymbol{w}. \]

这些多视角可参考:Perspectives on diffusion – Sander Dieleman

自回归模型

可以考虑对自回归模型做与 LDM 相同的事情,即使用编码器 -> 自回归模型 -> 解码器结构。

在现代生成模型中,除了 Diffusion,另一种核心方法为在离散 VAE 计算得到的离散隐变量上训练自回归模型。


Lecture 15: 3D Vision

3D 表示方式

其有多种方式表示几何结构,分为显式表示和隐式表示:

  • 显式:
    • 点云;
    • 多边形网格;
    • 细分曲面、NURBS;
    • ……
  • 隐式:
    • 水平集;
    • 代数曲面;
    • 距离函数;
    • ……

每种方法都有其独特的适配任务或几何类型等。

对于表示方式,需要考虑:

  • 存储;
  • 创建新形状(例如通过语言或图像进行创建);
  • 操作(编辑、简化、平滑、滤波、修复等);
  • 渲染(即如何将三维物体渲染成二维图片);
  • 动画等。

点云(Point Clouds)

其为最简单的表示方式:只存储点,不存储连接性。 直接使用 \(3 \times n\) 存储,其中每个点为 \((x, y, z)\),可能附带表面法向量。这些带有方向信息的点称为 面元(surfels)。

在渲染时,光源需要与表面互动,此时法向量即可起作用。

点云通常是三维传感器的原始数据格式。不过得到图像可能带有噪声,且对多张图像需要进行配准。

显然,其相当灵活,可容易地表示任何图形,且对大型数据集有利,但其难以绘制欠采样区。 且其难以进行简化或细分,难以实现平滑渲染,且没有拓扑信息。

多边形网格(Polygonal Meshes)

其仍以点的形式进行存储,但其也存储了点之间的连接方式,以得到表面等等。该方法为所有图形引擎表达三维对象的最常用做法。

显然其更复杂,且每个面可能含有不同个数的点,即其含有可变的维度,故如何将其与神经网络结合是一个挑战。

多边形网络可通过非常复杂的网格来捕捉所有细节,且其可自然地支持细分(通过增加网格)、简化(通过减少网格)、正则化(例如让所有的面转化成大小相同的小三角形,以得到更高质量,便于处理)。

参数化表示(Parametric Representation)

上述的点云和多边形网络均为非参数化表示。

参数化表示即直接用解析几何中的参数方程进行表示,其可以相对低维的形式进行操作。 例如使用贝塞尔曲线和贝塞尔曲面等,可在只使用少量点的情况下,构造灵活且平滑的曲面。

参数化表示可较为简单地实现细分等操作。

显式表示

上述三种表示均为显式表示,其显式地给出了所有的点,故对其进行采样十分容易。 不过相应地,显式表示很难判断某点是否在该对象内部或外部。

隐式表示

考虑对点进行分类。即考虑位于物体表面上地点会满足某种特定关系,即 \(f(x, y, z) = 0\)。进一步,即考虑在物体上的点满足的约束(从某种角度来说,即在解析几何中使用一个方程进行表示,不过该方程所对应的函数可能极其复杂,需要神经网络拟合)。 该种表示方式则称为 隐式表示,其不仅可表示几何结构,也可用来表示纹理、材质、外观等等。

显然,隐式表示更难以进行采样,不过其可更容易地判断某点是否在物体内部或外部。 且隐式表示易于进行组合,例如对于 \(A\)\(B\),可进行逻辑计算 \(A \cup B\)\(A \cap B\)\(A \setminus B\) 等(直接进行数值计算即可),于是可进行组合以创建复杂形状(该方法在工业设计,例如 CAD 中很常见)。

距离函数

距离函数可给出空间中任意点到物体的最小距离(可以是带符号距离,且数值本身有意义)。

隐式表示可以通过距离函数将两物体相加,甚至通过调整距离让两个物体平滑地逐渐融合在一起(通过插值实现)。

距离函数可任意组合,并创建相当复杂的形态,并展现出相当的表达能力(尽管可能组合并不容易)。

水平集方法(Level Set Methods)

尽管隐式曲线有很多很好的性质,但其很难以解析形式表达复杂物体。 于是考虑建立一个网格,然后再网格内预采样(计算函数值,或是否在物体内,或与物体表面的距离等)。于是可以非参数化的形式保留隐式表达。

表面依然是容易找到的,只需寻找 \(f(\boldsymbol{x}) = 0\) 的点即可(即对网格内的点通过该函数进行预查询,以将参数化的隐式表达转为非参的)。 其也能提供更直接的控制(例如控制纹理)。

并对该网格,可进行可视化,其在 CT、MRI 等医疗数据中有广泛应用。

体素(Voxels)

考虑对预采样网格中的函数值分正负,然后分别对正数赋为 \(1\)(在物体外部),对负数赋为 \(0\)(在物体内部),于是得到二值化处理的结果,称为 体素(其类似于三维矩阵,且值只有 \(0\)\(1\) 表示是否在物体内)。

从另一种角度来看,体素就相当于三维下的像素。且由于该种直观表现,体素是第一个直接应用于深度学习的三维表现形式(只需将 CNN 拓展至三维即可)。

数据集

在深度学习之前,常用的数据集为:普林斯顿形状基准数据集(Princeton Shape Benchmark),其有 1814 个模型和 182 个分类,显然其模型格式过少,故在机器学习种很少用。

之后则出现了一些可用的数据集:

  • ShapeNet:其为三维物体的大型数据集(类似于 ImageNet,实际上每种类别的模型数量并不一致,最多的是椅子和车);
  • ModelNet:已被 ShapeNet 整合;
  • ShapeNetCore:即 ShapeNet 的小型子类,只取了 55 种类别。

在这之后,出现了更大的数据集:Objaverse 和 Objaverse-XL。

不仅如此,还有一些真实数据集,部分通过 3D 扫描制成,例如 Redwood 数据集。 近些年,也有更大型的真实数据集,例如 CO3D(其为物体的 \(360^{\circ}\) 视频的数据集,用于三维重建)。

另外,也有基于部件的数据集,其尝试标注物体部件极其对应关系和层次结构,例如 PartNet 标注了部件及其语义和运动信息。

还有针对三维场景的数据集(比如房间结构),例如 ScanNet,以及更近的 ARKitScenes、ScanNet++ 等。

整体来说,3D 数据集的数据量(尤其是 3D 场景)都明显比图像数据集更小。

任务

对于 3D,我们常常关注以下任务:

  • 生成模型:学习(条件)形状先验,完成形状生成、补全及几何数据处理等;
  • 判别模型:学习形状描述子,完成形状分类、分割、视角估计等;
  • 3D 与 2D 数据的联合建模:考虑利用大规模 2D 数据集与良好的预训练模型的先验知识;微分投影 / 反投影,可微分 / 神经渲染实现三维与二维的连接等;
  • 视觉之外的多模态数据联合建模等(例如文本)。

Multi-View CNN

对 3D 物体进行分类,不考虑对 3D 进行建模,直接考虑在多个视角中对该物体拍照,则可将其转化为 2D 问题,则只需对每个视角执行 CNN,然后通过池化融合结果即可。

该方法在物体分类中效果显著,且可充分利用 2D 图像模型的资料,可使用预训练的特征。 不过该方法需要进行投影操作,并不适用于嘈杂或不完整的输入(如点云)。

该方法为解决 3D 问题的最初方法,后来的方法则更多地深入3D 本身。 但由于现在图像和视频模型都非常强大,该方法也趋于更加流行。

3D 卷积深度信念网络(3D Conv Deep Belief Networks,CDBN)

将像素切换至体素是自然的。即只需考虑将 2D CNN 改为 3D CNN。

其中,3D 卷积深度信念网络即为一种该方法实现的生成模型,且其支持根据标签的条件生成。 作为生成网络,其自然也支持分类。

3D-GANs

同样地,进行拓展,也可用 GAN 通过生成体素来生成 3D 物体。

进一步,在 3D-GANs 基础上,可拓展出 视觉物体网络(Visual Object Networks)。 其使用 GAN 生成三维形状后,将其投影至 2D,得到 3D 物体的深度图,于是用循环网络将深度图转为彩色图像。此时分析 loss 时,不仅可看 3D 物体,也可看 2D 图像,以此同时得到更加真实的 3D 物体和 2D 图像生成。

且对该方法,我们分别得到了形状、视角、纹理的隐向量,我们可分别控制这些向量,得到不同的形状、视角、纹理,以及做插值等,甚至可以将一辆车的纹理转移至另一辆车上。

八叉树(Octree)

体素有显著缺点:运行速度慢(需要预先采样),且存在大量无效工作(不少采样点为空或在物体内,其并没有提供可用信息)。

考虑改进,可用 八叉树,其改进了体素存储,将体素分为不同尺寸(即将空间划为不同区域,且在接近表面时投入更多资源,以更精细的尺度进行表示;而在空区域或物体内部时,则可用巨大体素)。

即考虑递归地分割空间,其中在不同空间中的体素可得到不同尺寸。这使其显著降低存储空间,进一步扩展规模。

且八叉树同样可以与体素类似地生成物体,且由于更高效地空间表示,其生成物体分辨率可更高。

PointNet

考虑对点云进行操作。其核心思想有:点具有 置换不变性(Point Permutation Invariance),即点云是一系列无序的点的集合;且点具有 采样不变性(Sampling Invariance),即模型输出应反映底层几何形状的特征,而非受采样方式影响的结果。

对于置换不变性,即考虑使用对称函数(Symmetric Functions): \[ f(x_{1}, x_{2}, \cdots, x_{n}) \equiv f(x_{\pi_{1}}, x_{\pi_{2}}, \cdots, x_{\pi_{n}}), \quad x_{i} \in \mathbb{R}^{D}. \] 例如取最大值或相加等进行融合。

于是考虑对点计算嵌入,然后使用对称函数进行聚合,对聚合的结果再通过几层网络(例如 MLP)进行处理,最后得到分类结果: \[ f(x_{1}, x_{2}, \cdots, x_{n}) = \gamma \circ g(h(x_{1}), h(x_{2}), \cdots, h(x_{n})). \]

Graph NNs

由于点可轻易地转化成图节点,邻里关系可转化成边,故可考虑使用 图神经网络(Graph NNs)处理点云。

点云的距离度量

有两种方法度量点云间的距离:

  • Chamfer 距离:即对两个点云 \(S_{1}, S_{2} \subseteq \mathbb{R}^{3}\),定义距离: \[ d_{CD}(S_{1}, S_{2}) = \sum_{x \in S_{1}} \min_{y \in S_{2}} \|x - y\|_{2} + \sum_{y \in S_{2}} \min_{x \in S_{1}} \|x - y\|_{2}. \]
  • Earth Mover 距离:即对两个点云 \(S_{1}, S_{2} \subseteq \mathbb{R}^{3}\) 满足大小相同 \(s = |S_{1}| = |S_{2}|\),定义距离(其中 \(\phi \colon S_{1} \to S_{2}\) 为双射): \[ d_{EMD}(S_{1}, S_{2}) = \min_{\phi \colon S_{1} \to S_{2}} \sum_{x \in S_{1}} \|x - \phi(x)\|_{2}. \] 且这两种距离均可微。

AtlasNet

考虑对于隐形状表示,考虑在二维平面上采样点,输入 MLP,得到其在三维中对应的点。即神经网络学习参数化表示中的从二维转化至三维的函数。

不过可能用单次变换表示整个物体较为困难,可考虑用多个小型神经网络,然后将输出的形状进行整合得到最终形状。

该方法基于参数化表示的思想,故可得到相较于点云和体素更加光滑的输出。

深度隐式函数(Deep Implicit Functions)

考虑不直接对 3D 物体进行建模,而是直接用一个神经网络隐式地表示一个 3D 物体,即输入点的坐标,输出该点是否在物体内,甚至与表面的距离、该点的密度、颜色、辐射值等等。该种神经网络称为 深度隐式函数

进一步,可考虑用小的神经网络表示物体的不同部分,然后组合起来表示一个完整的复杂形状。且通过深度隐式函数,我们可以得到更丰富的信息。

神经辐射场(NeRF)

即考虑建模深度隐式函数,然后有: \[ (x, y, z, \theta, \phi) \stackrel{F_{\Theta}}\longmapsto (RGB, \sigma).\] 即输入坐标和相机角度,输出颜色值和密度值。

考虑直接在一系列 3D 物体上训练,由于有 ground truth(简称 g.t.,即地面实况,为“绝对正确的参考值”),可由 3D 物体本身进行监督。 但考虑在 2D 图像上进行训练(即为 NeRF),则需与体渲染函数结合,且该体渲染函数需可微。

有渲染模型,对于射线 \(\boldsymbol{r}(t) = \boldsymbol{o} + t\boldsymbol{d}\),有: \[ \boldsymbol{c} \approx \sum_{i=1}^{n} T_{i}\alpha_{i}\boldsymbol{c}_{i}. \] 其中 \(T_{i}\) 为权重,\(\alpha_{i}\) 为密度(可视为点的不透明度),\(\boldsymbol{c}_{i}\) 为颜色,且可计算光线被阻挡的程度: \[ T_{i} = \prod_{j=1}^{i-1} (1 - \alpha_{j}). \] 显然该渲染模型对 \(\alpha\)\(\boldsymbol{c}\) 是可微的。该模型将几何、颜色与密度等转化成了辐射值和外观。

于是其可在 2D 图像上进行训练,且同时关注几何形状和外观。

生成模型

可考虑最终直接训练一个神经网络表示辐射场和密度以表示 3D 物体,且同样可应用类似 GAN 渲染的框架,同时得到 3D 物体和 2D 图片。 其同样支持可控性操作,如改变相机视角、物体身份等等。

而由于通过 NeRF,可直接通过图片学习,故其可学习的类别更加广泛(不需拘泥于有 3D 模型的物体),且输出更加真实。例如 Pi-GAN。

高斯溅射(Gaussian Splatting)

尽管如此,NeRF 仍有缺点:其需在三维空间大量采样(类似于水平集需采样密集的点)以创建神经网络,故其速度很慢。 可发现与体素类似,NeRF 采样密集的点,其中不少点是浪费的。

考虑只采样有物体的位置,可使用 高斯溅射。 其依然使用隐式函数,但点的表示方式已在三维高斯体中(类似于点云,不过每个“点”为团块,即空间中的某个区域)。 故当发射射线时,由于知道团块的位置,无需持续采样,而只需观察团块的位置,并根据它们的半径,只采样有物体的区域,以此大幅度提升渲染效率。

高斯溅射的渲染质量可与 NeRF 相当,但其渲染速度显著更快。

元素结构

物体几何不仅包括元素几何,还包括元素结构(例如椅子不仅有多个木板组成,木板之间也存在结构关系(例如对称性、重复性等),这里前者为元素几何,后者为元素结构)。

考虑将物体视为一系列简单几何体,有多种表示元素结构的方法:

  • 分段几何(Segmented Geometry);
  • 部件集(Part Sets);
  • 关系图(Relationship Graphs);
  • 层级结构(Hierarchies);
  • 层级图(Hierarchical Graphs);
  • 程序式表示(Programs)。

现在已有应用于其的深度学习方法,例如将物体呈现为不同部分,并用简单几何体或隐式函数等表示后进行组合;或者将 3D 物体适配层级结构并生成等;或者近几年趋势的,例如使用 LLM 输出程序式表示,然后用隐式函数等处理几何细节等。


Lecture 16: Vision and Language

基础模型(Foundation Models)

最近几年的趋势为 基础模型,即预训练一个可涵盖多种任务的模型,然后再根据需求适配具体任务(例如 GPT 即为基础模型)。 基础模型一大优势为,其可通过少量数据(甚至可能无需训练数据)即可完成对具体需求的适配。

基础模型有许多种类,例如有针对语言的、针对图像分类的、针对多模态的、将多个基础模型链起来等等的。

对于基础模型,其通常具有对广泛任务的 鲁棒性,可能有大量参数、大量训练数据、采用自监督学习等等。

CLIP

考虑 SimCLR,其倾向于将相同类别的聚在一起,并远离不同类别。 对于基础模型,我们则希望对于数据集中没见过的图,也能与所属类别聚在一起,甚至对于多模态,能将相关的文字描述与所属类别聚在一起(例如对于真实图像的猫狗分类,将简笔画的猫和对猫的文字描述与猫的图像聚在一起)。

对于 SimCLR,其利用对图像的分别两次变换,生成相同类别的两张图片。考虑转为 CLIP,其考虑对图片变换生成一张新的图像,但同时用该图像生成一段文字描述,这样则将图片和文字聚在一块。

其与 SimCLR 类似,故也有类似的互补对称 loss: \[ \sum_{i=1}^{n} -\log\left( \frac{e^{\langle u_{i}, v_{i} \rangle}}{\sum_{j=1}^{n} e^{\langle u_{i}, v_{j} \rangle}} \right) + \sum_{i=1}^{n} -\log\left( \frac{e^{\langle u_{i}, v_{i} \rangle}}{\sum_{j=1}^{n} e^{\langle u_{j}, v_{i} \rangle}} \right). \]

故 CLIP 可只通过附有描述的图片进行训练,而这种数据大量存在于互联网中,故模型规模可相当大。

完成训练后,取出编码器,在后面加入线性层或解码器等,即可完成图像分类、图像检测、语义分割等下游任务。 实践表明,就算只加入一层线性分类器,其效果已十分显著。

对于语言模型,其训练为自动补全任务。但其在预训练后,应用于下游任务时,均可视为自动补全任务,故无需再训练。 但对于 CLIP,其没有自动补全过程,故无法预训练后直接使用。

为解决该问题,考虑利用文本编码器,以引导模型泛化到任意下游分类任务。 即考虑使用 CLIP 计算出图像向量,然后用文本编码器计算出所有分类的文本向量,然后用 1-NN 算法计算出距离图像向量最近的文本向量,即图片与该种分类有最高的相似度。

显然单个单词可能得不到足够高质量的向量,考虑使用短语(例如 A photo of a planeA photo of a [category] 等),究其原因为训练数据来源于网络,其通常不会出现单个单词。该种改动有显著效果(在 ImageNet 上提高 1.3%)。 更进一步,可考虑采用多个短语(例如 A photo of a dogA drawing of a dog 等等),然后对每个类别的所有文本向量取平均向量,然后在进行 1-NN 算法。此可得在 ImageNet 上 5% 的改善。

由于训练数据来源与互联网,其有海量类别,从而推断出更多结构化信息,增强了表示能力,且互联网本身就有远超任何数据集的数据量,故其能更好地适配有些许差异的新任务。 故其展现了就算对于未经训练的数据,其也能有良好的适配性(例如就算不在 ImageNet 上进行训练,CLIP 在 ImageNet 上也有相当的等同于 ResNet 的准确率,且在另外没见过的数据集上仍能保持等同的高准确率)。

将零样本(zero-shot)与线性探测(linear probe)进行对比,在有的数据集线性探测效果更好,有的数据集上反而零样本效果更好。这意味着训练出的图片编码器的强大的对下游任务的广泛适配性。

究其原因,在于 CLIP 具有远超之前方法的参数量(且采用了 ViT),使用了来自互联网的远超之前方法的训练数据量。

CoCa

其为 CLIP 的变体,其考虑在 CLIP 末尾增加一个解码器,输入从图像解码器得到的图像特征,然后输出该图像的描述,并用交叉熵损失计算描述的 loss。 相较于分类,描述所用信息更多,更能促使模型学习更多信息,从而习得更强的特征。

实践表明,CoCa 相较于 CLIP,有更进一步显著的效果提升。 甚至该种基础模型的效果能超过监督模型。

CLIP 的优势

  • 由于为简单的对比学习,其易于训练,且推理速度极快;
  • 可将整个数据集嵌入某种表示,然后只需对其进行检索即可分类,进一步,其可适用于搜索与检索等任务;
  • 开放词汇能力(Open-vocabulary),即输入任何文字描述均可检索正确图像,故可零样本泛化;
  • 其可与其他模型链式组合(CuPL)。

CLIP 的劣势

CLIP 无法区分两张图片:一张是草地上有一个马克杯(there is a mug in some grass),另一张是一个马克杯里面种了草(there is some grass in a mug)。 换句话来说,CLIP 缺乏组合性概念,且大量实验说明了 CLIP 存在大量的局限性。

究其原因,CLIP 的学习高度依赖 batch size,若 batch size 不足,其他批次元素则无法为模型提供有效监督。 例如若批次过小,只有猫和卡车,那模型只会认识到这是猫,而批次足够大,包含多种动物时,其才能学习更好的特征。 但无论如何增大批次,CLIP 并不能保证能学到优质表达,其只能依赖于训练数据的随机性。

而对 batch 进行考虑,试图使用足够强的负样本,实则并不会学到语义相关的大量内容(原因目前不明),从而导致在不同数据集和环境中泛化能力显著变差。

另一个缺点为,图像级别的描述文本并不能提供足够强的监督信号,例如图片中的位置信息,若文本未指出时,则会在 CLIP 中缺失。

还有缺点为,无论数据集多大,其仍无法涵盖所有我们关注的重要信息。故需考虑进行数据过滤,而对 CLIP 在互联网中寻找最佳训练数据则为一个前沿课题。

LLaVA

LLaVA 为最早的 多模态语言模型(multimodal language models)之一。

考虑语言模型,其总是做下一个 token 的预测,即自动补全。该种过程对适应新任务极其有用。 于是考虑对于图像模型,是否同样地可输入图像,然后进行类似自回归地推理。即 视觉语言模型(Vision-Language Models)或 多模态模型(Multimodal Models)。

文本模型为 Transformer,则可考虑在输入文本之前加入额外上下文,将图片加入对话。故需要考虑对图像分成 token,然后将 token 输入语言模型,随后接着文本输入,以自动补全剩余文本。

LLaVA 则考虑使用 CLIP 的编码器将图片转为 token。即考虑将图片分为 patch,并额外加入 CLS,将这些输入 CLIP 的 ViT,则可得到一系列的 token 和一个 CLS token。 对于分类问题,只需要 CLS token,其受监督,但这也意味着另外的 token 并未受到监督(且实验表明这些 token 并没有什么用)。 于是考虑回退一层,则这一层得到的 token 会用于生成最终的 CLS token,故这些 token 是有用的。于是考虑将这些倒数第二层的 token 用于基于 Transformer 的语言模型。

于是可将图片输入预训练的 CLIP 编码器,从中提取大量特征,并将这些特征输入线性层,其将 CLIP 的输出转化为 LLM 能理解的输入,得到 LLM 的输入 token。于是将这些 token 输入 LLM,于是可生成关于该图片的对话。

Flamingo

其与 LLaVA 类似,但其改动为并不使用线性层,而是将编码器生成的特征输入 LLM 中的每一层,然后文本输入时就只用一个 <image> 进行指代。

对于 LLM 的每一层,其具体的改动为在每一层之前加入 门控交叉注意力(Gated Cross-Attention),且在图像编码器之后加入 接收采样器(Perceiver Resampler),即对图像表示进行下采样,以得到更小的维度和固定数量的 token。 其中,所有原先的 LLM 和图像编码器均被冻结,只有接收采样器和门控交叉注意力会受训练。

对于门控交叉注意力,其会查看图像特征,并判断哪些对 LLM 有用,决定保留哪些图像特征。其结构如下:

  1. 交叉注意力:\(Q\) 为前一层输出,\(K\)\(V\) 为图像的输入,以关注图像特征;
  2. tanh 门控(tanh gating):决定哪些部分保留,哪些部分抛弃;
  3. 从 1 开头进行残差连接;
  4. 全连接层:对表示进行调整;
  5. tanh 门控:决定保留部分;
  6. 从 4 开头进行残差连接。

其给予每层能关注图像特定部分的能力,从而赋予了模型大量决定何时如何关注视觉特征的能力。

而对于训练,其将大量不同图像进行拼接组合。在一段话中,会用 <image> 标注新图片出现的位置,用 <eos> 标注文本结束的位置。故得到一个长序列,其为图文交替的数据。 在描述单张图像时,显然我们不希望模型看到全部的上下文,而只关注当前的图像,故其会使用掩码。于是在生成对于图像描述时,只会看到对应和之前的图像。不过模型可看到所有已生成内容的上下文。

通过该种架构即可实现多图像或多对话处理。 且其可进行 上下文学习(in-context learning),这也体现了从语言模型带来的广泛的少样本学习甚至零样本学习的能力,且效果显著(甚至只要下游任务能转化成问答过程,其就有可能解决)。

Segment Anything Model(SAM)

其尝试对分割任务建立基础模型。即允许在图像中指出感兴趣的对象与类别,希望能对其输出掩码。 对其,有两点需要泛化,一为分割的类别多样,二为能精准输出用户关心的内容。

考虑用户关心的内容,其仅简单地输入文本是不够的(比如会出现指代不清等问题)。 故对于 SAM,其有图形编码器,以输入图片,和 prompt 编码器,以编码文本、点或者边界框等。接着将两个编码器的输出一并输入一个轻量级的掩码解码器(其架构类似于图像分割的解码器),以得到掩码。

不过对于输入,其仍有可能产生歧义(例如点的位置剪刀的一个柄,则可能分割的为剪刀的一个柄、剪刀的两个柄、剪刀整体等等),我们并不希望模型因歧义而收到惩罚。 于是考虑输出多种不同粒度的掩码,并取与目标最相近的掩码进行比较并计算 loss,此时其他掩码则不会受惩罚。于是最终,模型可生成各种类型的掩码,用户可选用其中最合适的。

考虑训练数据,大多数针对分割的数据集都很小,于是需要扩展现有分割数据集的规模(对该模型,其对数据集做了大幅度扩展,且由于互联网中对其的数据质量不佳,需要主动收集数据)。 为了扩大数据量,SAM 采用了循环策略。即最初用标注过的数据进行训练,接着用训练过的模型标注更多数据,并对模型生成的分割结果进行人工修正,然后重复这一流程。

CuPL(CUstomized Prompts via Language models)

若需让 CLIP 对没见过的概念进行分类,可考虑使用 链式操作(Chaining)。其即将两个模型链起来,以解决单个模型难以解决的问题:

  1. 使用 LLM(例如 GPT)对概念做解释;
  2. 通过这些解释让 CLIP 进行分类。

综上,链式操作的核心即为结合一个模型的优势,并于另一个模型的能力相结合,以获得全新能力。其赋予了 CLIP 对全新的细化的数据集的强大能力。

链式操作的方法在当今十分流行。可考虑将语言模型与其他海量的专用视觉模型的输出链起来,以得到新能力。

VisProg(visual programming)

对于输入的任何图像和任何问题,考虑生成一个程序以获得答案,且该程序可对其他模型进行调用。 且由于 GPT 具有上下文学习的能力,其甚至只需告诉它怎么用,即可扩展至其他原本没见过的模型。

虽说其能激活海量好的能力,但其需要大量计算资源,其需调用 GPT 的 API,且需将每个单独的模型加载至内存中,并依次运行。故现在有课题为,能否将这些能力浓缩至单个模型,或者如何有效衔接这些流程。

且其依然可能出现幻觉问题,一种方案为收集与所需推理类型的相关数据,另一种更好的方法是采用针对于点的验证机制,以验证输出是否可信。该方向也为现在活跃的课题。


Lecture 17: Robot Learning

机器人学习与其他学习有一个显著的不同之处,其必须与现实世界进行物理交互。 于是做出的动作会改变现实世界,且现实世界会给出新的观测或奖励反馈。

于是学习的目标为通过环境反馈,生成一系列动作序列,以最大化奖励或最小化成本等。 该领域,尤其在近几年,在学术界和工业界都十分火热。

问题建模

其有智能体(Agent),其被给定任务 \(g\),可为人类的语言指令、衡量智能体执行任务效果的函数等。 智能体将从物理世界获取状态信息或环境数据 \(s_{t}\),并决定采取的动作 \(a_{t}\)。该动作将作用于物理世界,将得到反馈的状态 \(s_{t + 1}\) 和奖励反馈 \(r_{t}\)(其评估任务表现)输入智能体,以决定下一个动作。 于是问题关键为如何定义目标(Goal)\(g\)、状态(State)\(s\)、动作(Action)\(a\)、奖励(Reward)\(r\),以及目标函数等等。

相较于 CV 多为通过输入的高维数据学习环境的表征,机器人的问题本质上多为解决有物理世界约束的优化问题。即针对问题构造目标函数,然后通过生成动作序列以解决该优化问题。 其中,机器人问题是广义的,不仅可为物理上的机器人,也可为 AI 玩游戏,甚至为对话模型(例如 ChatGPT 在回答完成后会有“是否对对话满意”的选项框)等等。

机器人感知

状态 \(s\) 为 agent 从物理世界中感知的信息,我们需从这些高维数据中进行提炼或应用结构化知识,以让机器人进行下游决策。于是我们需要解决如何理解现实世界的问题。

而现实世界的信息是非结构化且混乱的:机器人得到的数据可能是不完整的,例如被遮挡,甚至传感器的错误信息。不完美的动作可能导致任务失败,进一步导致了环境的意外的变化。环境本身也是可变的,且其并非全由刚性物体组成,而含有可变形的物体,且存在其他 agent(如人类、宠物等)更进一步扰乱环境信息。

于是为了解决这些问题,我们通常不会仅使用相机输入,而是使用尽可能多的传感器以采样多种有用信息,例如同时采样触觉信息、音频信息、深度信息等等。 因此我们需要设计一个系统,以整合这些传感器,并让这些信息从不同角度进行互补并协同工作(例如音频告诉物理接触情况,触觉告诉是否抓稳,视觉告诉环境的宏观信息等等)。 这些传感器的协同工作对于需要在物理世界中运行的机器人至关重要。

且对于机器人视觉,其相较于 CV,其需要理解动作的效果,和在环境中的可用性,如主动做出动作,以更好地感知并理解环境(例如拆开积木以感知这是多个物体而不是一个物体)。

换句话来说,机器人视觉是 具身的(embodied)、主动的(active)、环境情景化的(environmentally situated):

  • 具身化:机器人拥有实体身体,能够直接感知世界。它们的行为是与世界互动动态过程的一部分,并且自身的感知会获得即时反馈;
  • 主动性:机器人是主动的感知者。它清楚自己为何要进行感知,会自主选择要感知的对象,并决定如何、何时、在何处完成感知行为;
  • 情境化:机器人处于真实世界的具体场景中。它们不依赖抽象的描述,而是直接根据世界的 “此时此地” 信息来调整自身行为。

机器人存在感知与动作循环(Perception-Action Loop)。其中部分感知需与任务和下游决策系统协同设计,以专注相关区域或任务,从而形成最紧密的感知与动作循环。

强化学习(Reinforcement learning)

考虑让机器人尽可能广泛地与环境互动,以收集所有经验数据进行试错学习,从而让机器人理解哪些动作可获得更高或更低的奖励,并引导 agent 向更高奖励动作进行调整。这即为 强化学习 的思想。

其于监督学习存在明显的区别:

  • 环境充满了不确定性和随机性,即对相同的动作可能会对环境产生不同的改变,从而导致奖励也是随机的,即相同的动作可能会导致不同的奖励;
  • 奖励可能延迟,即最终的奖励可能与开头的动作有重大关系,故需要考虑如何正确地分配贡献。其为十分棘手且重要地问题;
  • 由于涉及环境,该系统不可微,故得到梯度十分棘手(例如大量采样以进行梯度零阶估计等);
  • 场景并非平稳,即环境会随着 agent 的动作而改变,故之前的动作会影响之后的决策。这也增加了问题的复杂性。

对于强化学习,其允许 agent 进行广泛的世界探索与交互,使其有可能发现超越人类的策略。

附带的,强化学习带来了 AlphaGo Zero 等成就,且由于 AlphaGo Zero 为 AlphaGo 的简化版本,有一个感性的结论,称为 Rich Sutton 提出的苦涩教训(a bitter lesson from the Rich Sutton): 最简单的方案往往能最好地适配规模化,从而充分利用规模效应,以发挥规模化带来的力量。 且把方法做得更简单,由于能更好地适配用来做大规模扩展的基础设施,可能反而能带来更好的性能。

对于 Model-Free RL,有以下缺点:

  • 其通过试错学习,且需要大量与现实世界的交互;
  • 存在安全顾虑;
  • 可解释性十分有限,故做错时难以纠正。

相比于 RL,人类对环境有非常直观的理解,能预判执行特定动作后的环境变化。这个预测能力赋予了人类能规划行为以达成目标的能力,且该种预测能力源自现实世界中的物理交互和日常经验。

模型学习与基于模型的规划(Model learning & model-based planning)

对于训练,需要有模拟工具,通常选用 Isaac Gym 或 Isaac Sim,其为一系列刚体的模拟,且机器人通常以接触类似于多边形的物体进行模拟。我们通常会对其完全地随机化(随机化摩擦系数、环境中的集合形状、物理参数等),于是可以假设真实世界即为该种随机化模拟分布中的一个点。以此可使机器人的策略更加鲁棒,且具有泛化性。 实践表明该种假设是正确的,能使策略在真实世界中可靠且鲁棒。 对于运动控制领域,模拟不必非常完美,只要能充分地随机化,就有很大可能在真实环境中鲁棒。而对于操作领域,模拟需要多高的精度,以及模拟和真实世界的差距有多大,目前仍为一个课题。

人类不仅可试错学期,且在过程中构建了自己的内部模型。 于是可考虑可否通过机器人与环境的交互中学习模型,然后利用该模型让机器人进行更好的物理交互。 换句话来说,我们可否考虑学习并近似真实的物理世界,且如何让这个虚拟的物理世界知道机器人的动作,并决定在真实世界中所做的动作。

若已经习得这个模型,给定状态 \(s_{t}\) 和动作 \(t\),则可预测环境的下一状态 \(s_{t + 1}\),即计算 \(P(s_{t + 1} \mid s_{t}, a_{t})\)。 该种预测为一个前向模型,于是若给定当前状态和目标状态,考虑进行规划,可进行动作的初始操作,然后模型预测状态序列的演变,然后考虑模型结果与目标状态的距离,则可进行反向传播等对整个动作序列进行优化,以得到更接近目标的动作序列。

不过模型可能不够准确,故我们通常只执行初始动作,然后从真实环境中获取新状态,并用梯度下降等方法重新优化动作序列。 对于采样和梯度下降,可用 GPU 并行处理,以得到相当高效的大规模采样和动作序列的优化。

考虑如何正确且有效地表示状态 \(s_{t}\),且如何让模型在 \(s_{t}\) 上进行学习,目前已有许多研究和方法:

  • 像素动态:深度视觉前瞻(Deep Visual Foresight),仅用二维图像进行状态表示,并学习像素动态,即做动作后图片将如何改变;
  • 关键点动态:即使用关键点作为环境表示进行学习;
  • 粒子动态:对于更高自由度的物体,考虑用粒子集表示物体

严格来说,这种直接学习模型,然后用模型进行规划的方法,并不能称为强化学习,不过该方法也可称为 基于模型的强化学习(model-based reinforcement learning)或 基于模型的规划(model-based planning)等。

模仿学习(Imitation learning)

考虑用已有的环境演化数据进行监督学习,然后用习得的模型进行基于模型的规划。 进一步考虑,能否对策略也通过监督学习进行训练,即为 模仿学习。 其考虑能否使用数据集来展示一项任务是如何完成的,并用该数据集进行策略(即 agent 做的事)的训练。

模仿学习为能获取在真实物理世界中执行任务的策略的最高效的方式。而为使策略更加有效且鲁棒,专家示范数据的迭代式采集是必要的,以处理意外情况。

行为克隆(Behavior Cloning,BC)

即学习从观察 \(o\) 映射至动作 \(a\) 的映射 \(\pi_{\theta}(a_{t} \mid o_{t})\)。 其有一个关键问题为 级联误差(cascading error),即对于序列决策问题,误差会随着时间累积并被放大,即开头的微小偏差会在累计与放大中导致最后的结果与目标差距显著。

专家示范数据的迭代式采集

若想要模仿学习有效,通常遵循该流程: 首先需要有专家收集的的示范数据,接着用该数据进行监督学习以训练策略,并在真实环境中测试策略,观察失败案例,然后收集额外数据或提供修正行为,使数据集不仅包含初始示范,还包含能将错误策略修回典型轨迹或仍能完成任务的轨迹的修正行为,最后进行相同步骤的迭代。

逆强化学习(Inverse Reinforcement Learning,IRL)

对于模仿学习,任务常常没有明确的定义,其通常隐含在示范数据中。

故考虑 逆强化学习,即从示范中(即从环境和行为中)总结出奖励函数,并利用该奖励进行通常的强化学习。

隐式行为克隆(Implicit Behavior Cloning,IBC)

考虑借鉴能量模型的思想(其为一种生成模型),直接通过观察 \(o\) 和动作 \(a\) 的预测分数 \(\arg\max_{a \in \mathcal{A}} E_{\theta}(o, a)\),并用这种基于能量的模型进行推理,以得到预测动作 \(\hat{a}\)

其可使机器人处理多模态的示范,或处理优化曲面并非足够平滑的场景。

扩散策略(Diffusion Policies)

机器人学习领域近年来的一些重大成功都得益于该工作。 考虑利用 diffusion 作为策略函数,以继承 diffusion 的优势和特性。 该策略展现了非常多样化的功能,使模型能实现许多精细动作,如操作任务(例如简单地做饭)。

机器人基础模型(Robotic foundation models)

该领域为目前机器人学习的热潮,且较为复杂。

对于机器人基础模型,其不存在显式的状态或状态转移函数的表示,且其仍然是将状态 \(s\) 和目标 \(g\) 映射到动作 \(a\) 的策略。

考虑一般的基础模型,其输出不一定总是最优,但其始终会生成合理的结果。 扩展至机器人基础模型,其合成的动作不一定始终是最优的动作,但整体的轨迹始终是优雅(即动作应平滑连续而非摇晃)且合理(即机器人会遵循人给出的语言指令)的,以在真实世界中执行。

其有多种名称,例如 视觉语言动作模型(Vision-Language-Action Models,VLAs)、大型行为模型(Large behavior models,LBMs)等等,不过其均为同一概念:接收观察结果和语言指令等任务形式,并生成能能在多场景广泛使用的动作的策略。

Pi-Zero by Physical Intelligence

其为一种机器人基础模型。

其拥有大量学术数据和自建数据组成的数据集,涵盖了不同机器人执行在真实世界中执行的实用任务。

其利用数据集进行预训练,且这个预训练从一个已预训练的 视觉语言模型(Vision-Language Model)开始(其可自然地迁移语义知识),然后通过 协同微调(Co-finetuning),结合动作预测目标和视觉回答的适配目标,即可保留模型中的语义知识,与此同时也能预测机器人动作。

然后进行 后训练(Post-training,其受 LLM 的启发,即有基础模型,其可提供合理的基准性能,若想让其在特定任务中表现优秀,则需收集特定任务的数据,然后在该数据上进行微调,以满足特定任务的性能要求)。

其有三个不同的类别评估整个系统:

  • 直接使用基础模型,其已足够应对某些简单的预训练见过的该分布内数据;
  • 若任务稍微复杂一点,可通过后训练,让基础模型进一步提升该分布内任务的表现;
  • 若为没见过的任务,则需要收集特定任务后进行后训练,以得到更好的效果。

该模型从预训练的视觉语言模型开始,已有大量的语义知识被编码,故其天然具有一些泛化能力,且基础模型已经有相当可观的语义泛化能力。从而通过在机器人数据上进行微调,即可确保不仅在语义层面泛化,也可在动作层面泛化。

尚存挑战

机器人学习模型的评估

其为目前公认的主要挑战之一。

可在现实世界进行评估,但进行该种评估成本高昂,结果易受噪声干扰(微小的环境差异可能就会导致显著的结果差异)。 且实际上,训练的 loss 与真实世界中的成功率相关性很弱。这也是监督学习与序列决策问题的重要区别。序列决策问题中,loss 只反映这一步的预测如何,而非反映该模型的性能如何,故其很多时候并不能反映策略在长周期任务中的表现。

这些问题导致了很难制定,甚至难以近似地进行策略表现的衡量,且我们必须依赖真实环境的评估。

另一种方法为在虚拟环境中进行评估。显然仿真与真实有差距(例如如何准确模拟刚体、可形变的物体、衣物等)。 资产问题(即大规模泛化和生成资产(即环境与物体等))也为其主要问题。 数字化真实世界、程序化生成逼真多样的物体等等也较为困难。 同时,也需要考虑模拟与现实的相关性。

所以说,机器人学习目前需要一个 ImageNet in Embodied AI 作为基准以测量机器人的进步。

基础世界模型(Foundation World Models)

目前,人们正在大规模采集 动作条件化(action-conditioned) 的机器人交互数据,以训练基础策略。这些数据蕴含了大量动态知识,故可考虑在策略学习之外的领域利用它们。

于是考虑利用这些收集的数据,来训练 基础世界模型,并探讨其与基础策略如何协同作用。 换句话来说,基础世界模型即为基于动作条件的未来预测。

目前该方向已有些许探索,且有一些可能要考虑特性,例如是否需要 3D、是否需要结构先验、学习与物理规律的比例、其与真实物理世界的关联等等。