nptel-dlcv-merge-4

NPTEL 深度学习计算机视觉笔记(五)

  • \(\sigma(X_t, t)\) 是扩散系数,代表每个时间步的随机波动或噪声。

  • \(dW_t\) 是维纳过程的增量。

SDE用于描述通常具有噪声的系统的动态,例如金融市场、物理过程和生物系统。

DDPM的基础

DDPM基于随机微分方程,用于对具有随机扰动的系统进行建模。

如前所述,扩散模型具有前向扩散过程,该过程在马尔可夫链中向数据添加噪声,这意味着当前步骤的噪声被添加到前一步骤刚刚产生的数据本身。因此,在后续时间步向数据添加噪声会逐渐降低作为前向扩散过程输入的信号或图像的质量。

它还具有反向扩散过程,这是一个可学习的马尔可夫链,用于对数据进行去噪,从而从噪声中重建原始信号。通常使用的训练目标是最大化反向过程仅从噪声生成原始数据的似然。

简单来说,你可以这样看待DDPM:你从一个给定的数据点 \(x_0\) 开始,不断添加噪声,经过 \(x_1\),一直加到 \(x_T\),此时 \(x_T\) 就只是高斯噪声。然后在反向过程中,你从高斯噪声中采样一个样本开始,不断向后进行,直到仅从噪声中重建出你的原始样本。

DDPM的成功取决于我们如何设计这个前向扩散过程和反向扩散过程。

前向扩散过程

前向扩散过程通常由一系列高斯转移定义。这意味着从给定的数据点 \(x_0\)(一张图像)开始,你在每个时间步添加高斯噪声。

这可以参数化为一个条件分布 \(q(x_t | x_{t-1})\),它是一个正态分布:

\[ q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t} x_{t-1}, \beta_t I) \]

其中 \(\beta_t\) 是在给定步骤 \(t\) 添加的噪声的方差。

你可能会好奇为什么会有 \(\sqrt{1-\beta_t}\) 和 \(\beta_t\) 这样的项。这相当直接:经过多个时间步后,我们希望最终得到一个以0为中心、方差为 \(I\) 的标准正态分布。为了达到这个目的,我们理想地希望 \(\beta_t\) 趋近于1,并且 \(x_{t-1}\) 的系数在多个时间步后趋近于0。以这种方式选择系数会自动导致数据成分在后续时间步中减少,而噪声成分增加,直到最终得到高斯噪声本身。

这个条件分布可以共同写成一个联合分布 \(q(x_1, x_2, ..., x_T | x_0)\),记作 \(q(x_{1:T} | x_0)\),它可以写成各个条件分布 \(q(x_t | x_{t-1})\) 的乘积,其中 \(t\) 从1到大写的 \(T\)。这就是我们正式定义前向扩散过程的方式。

在扩散过程中(不限于深度学习),通常由扩散核定义,它给出了你在给定时间步测量的实体与该实体演化中任何其他时间步之间的联系。在这种情况下,扩散核由 \(q(x_t | x_0)\) 给出,可以写成一个高斯分布:

\[ q(x_t | x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t} x_0, (1-\bar{\alpha}_t)I) \]

其中:

  • \(\alpha_t = 1 - \beta_t\)。

  • \(\bar{\alpha}_t = \prod_{s=1}^{t} \alpha_s = \prod_{s=1}^{t} (1-\beta_s)\)。

\(\beta_t\) 可以看作是我们添加到数据中的噪声的度量,而 \(\alpha_t\) 可以看作是保留因子,即保留了多少原始图像。当你在顶部看到一条横线时,那就是 \(\bar{\alpha}_t\),指的是多个 \(\alpha_t\) 的乘积。

我们这样写出 \(\alpha\) 的原因如下:你可以写出 \(x_t = \sqrt{\alpha_t} x_{t-1} + \sqrt{1-\alpha_t} \epsilon_{t-1}\),其中 \(\epsilon_{t-1}\) 是从高斯分布中采样的噪声。如果递归地代入,最终会得到 \(x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1-\bar{\alpha}_t} \epsilon\),其中 \(\epsilon\) 是第一个时间步添加的噪声。这是因为合并两个高斯分布时,方差会相加。

这意味着当你从扩散核采样时,你有 \(x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1-\bar{\alpha}_t} \epsilon\),其中 \(\epsilon\) 来自标准正态分布。当 \(t\) 趋近于 \(T\) 时,\(\bar{\alpha}_t\) 趋近于0,这意味着 \(x_t\) 变成了来自标准正态或高斯分布本身的样本。

现在,让我们看看分布在前向扩散过程中是如何演化的。时间 \(t\) 的分布 \(q(x_t)\) 可以表示为联合分布 \(q(x_0, x_t)\) 在 \(x_0\) 上的积分。这个联合分布可以进一步分解为 \(q(x_t | x_0) q(x_0)\)。这个分解反映了通过 \(q(x_0)\) 的输入数据分布和扩散核 \(q(x_t | x_0)\) 的组合。

因此,你可以将整个前向过程视为通过扩散核的单个步骤,你可以使用这个扩散核条件概率表达式从原始数据访问你在任何给定时间步的 \(x_t\)。

反向扩散过程

反向扩散过程定义为 \(p_\theta(x_{t-1} | x_t)\),它也是一个高斯分布,均值为 \(\mu_\theta(x_t, t)\),方差为 \(\sigma_\theta^2(x_t, t)\)。当我们使用 \(\mu_\theta\) 和 \(\sigma_\theta\) 时,这暗示了这两者都是由某些权重或系数 \(\theta\) 参数化的学习函数。

这意味着这个反向过程通过去噪从 \(x_t\) 重建 \(x_{t-1}\),在其步骤中使用一些学习到的模型。有了这个设置,你的反向过程的联合分布 \(p_\theta(x_{0:T})\) 可以写成 \(p(x_T)\)(你开始的地方)乘以所有可能条件概率 \(p_\theta(x_{t-1} | x_t)\) 的乘积。

在反向过程中,你从噪声开始,在每个时间步不断去噪一点,重复大约50到1000次,最终得到你开始时的数据。这就成为了生成过程。

当我们谈论反向扩散时,我们所说的去噪函数指的是 \(\mu_\theta\),它是你反向过程中条件分布的高斯均值。这个 \(\mu_\theta\) 由下式给出:

\[ \mu_\theta(x_t, t) = \frac{1}{\sqrt{1-\beta_t}} \left( x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}} \epsilon_\theta(x_t, t) \right) \]

这里 \(\epsilon_\theta\) 是反向过程中神经网络的输出。

这个去噪函数旨在从噪声观察中重建原始数据。你可以将反向过程视为:在每一步,你估计在前向过程中该时间步可能添加了什么噪声,然后减去该噪声。通过迭代重复的减法,从噪声开始,最终去噪并走向干净的数据 \(x_0\)。

因此,准确的噪声预测变得非常关键。这意味着反向过程中神经网络的工作就是预测噪声本身。一旦获得噪声,你只需在每个时间步从数据中减去它,并继续在反向过程中向后进行,直到生成图像。

让我们看看这个去噪函数 \(\mu_\theta\) 是如何得出的。从前向扩散过程开始:\(x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1-\bar{\alpha}_t} \epsilon\)。重新排列项以用其他变量表示 \(x_0\),你会得到 \(x_0 = \frac{1}{\sqrt{\bar{\alpha}_t}} (x_t - \sqrt{1-\bar{\alpha}_t} \epsilon)\)。

对于反向过程,我们理想地希望从 \(x_t\) 预测 \(x_{t-1}\)。\(x_{t-1}\) 的前向过程由 \(x_{t-1} = \sqrt{\bar{\alpha}_{t-1}} x_0 + \sqrt{1-\bar{\alpha}_{t-1}} \epsilon'\) 给出。将 \(x_0\) 的表达式代入 \(x_{t-1}\) 的表达式,经过推导,最终得到去噪函数 \(\mu_\theta(x_t, t)\) 的形式,其中 \(\epsilon_\theta\) 是神经网络对噪声的估计。

训练神经网络

现在,如何训练反向过程中的这个神经网络?在讨论这个问题之前,你可能会问:为什么在DDPM中需要所有这些神经网络?

原因是,从前向过程来看,从 \(x_{t-1}\) 到 \(x_t\) 由条件分布 \(q(x_t | x_{t-1})\) 给出,一旦你有了 \(\beta_t\) 或 \(\alpha_t\),这部分就是明确定义的。然而,反向过程 \(q(x_{t-1} | x_t)\) 对我们来说是未知的。我们无法得到它,所以我们将用 \(p_\theta(x_{t-1} | x_t)\) 来表示它,并尝试通过神经网络来近似,从而使用反向过程从噪声中生成样本。

训练整个DDPM的目标显然应该是最大化数据在反向扩散过程下的对数似然。这意味着你理想地希望最大化关于参数 \(\theta\) 的期望:\(\mathbb{E}_{q(x_{0:T})} [\log p_\theta(x_{0:T})]\)。

目标函数应该鼓励模型从噪声中准确重建原始数据,这将是你的对数似然本身。在这种情况下,你的对数似然可以分解为条件对数似然之和。这个目标的负对数似然通常被最小化,你可以使用随机梯度下降来最大化你的对数似然或最小化你的负对数似然。

在反向过程中,它由一个参数为 \(\theta\) 的神经网络参数化,该网络也通过随机梯度下降进行优化。神经网络在每个时间步试图预测在前向过程中对应图像在该时间步添加的噪声是什么。一旦神经网络预测出噪声,你就可以从高斯分布的样本中减去该噪声,并通过反向过程继续前进,直到生成你的数据点。

使用的损失函数如下:训练损失是加权平方误差和。平方误差表示你的 \(\mu_\theta\)(特定时间步的均值)减去应该是数据点或过程本身开始的总体均值。

由于 \(\mu_\theta\) 的定义,这个表达式可以简化。因为 \(\mu_\theta\) 可以用 \(\beta\)、\(\alpha\) 和 \(\epsilon_\theta\) 来表示,而 \(\beta\) 是我们在前向和反向过程的每个时间步添加特定噪声时选择的,所以你最终真正训练神经网络的是你的 \(\epsilon_\theta\),而不是 \(\mu_\theta\) 本身。

因此,训练神经网络的最终损失变成了这样:\(L = \mathbb{E}_{t, x_0, \epsilon} [\|\epsilon - \epsilon_\theta(x_t, t)\|^2]\),其中 \(\epsilon\) 是在等效前向过程中前向时间步会添加的噪声,\(\epsilon_\theta\) 是由参数为 \(\theta\) 的神经网络预测的 \(\epsilon\)。你还会看到权重 \(w_t\),它定义了你想在每个时间步如何加权这个特定的误差项。预测每个时间步 \(\epsilon\) 的神经网络在扩散过程的每一步都是相同的,所以你可以选择改变这个权重,以决定在任何给定时间步你想如何加权平方误差和。

从DDPM中采样

在训练完扩散模型后,当你想生成新样本时,你只需从标准正态分布中采样一个样本 \(x_T\)。然后你得到 \(x_{t-1}\),它由一个正态分布给出,均值为 \(\mu_\theta(x_t, t)\),方差为 \(\sigma_\theta^2(x_t, t)\),这两者都来自神经网络对 \(\epsilon_\theta\) 的预测。参数 \(\mu_\theta\) 和 \(\sigma_\theta\) 在训练阶段根据我们刚刚讨论过的 \(\epsilon\) 学习得到。你代入这些值,得到 \(x_{t-1}\) 的表达式,并不断重复这个过程,直到得到你的原始 \(x_0\)。因此,你迭代地去噪,直到达到 \(x_0\)。

生成样本的质量取决于你的反向过程学习得如何,即神经网络学习预测噪声以建模数据分布的能力如何。方差调度也可以在采样过程中进行调整,以控制多样性和保真度之间的权衡。如果你有很高的方差,你可能能够从单个噪声样本中生成多样化的样本集,但也可能导致你真正想要捕获的内容的保真度下降。因此,更高的方差可能会增加多样性但降低保真度,必须谨慎选择。

采样过程本质上是随机的,因为由于从高斯分布中采样,在每个时间步都引入了随机性。这可以导致生成各种样本,捕捉到雷达分布的多样性。

参数 \(\beta\) 和 \(\alpha\) 的选择

DDPM和扩散模型的一个重要组成部分是如何选择 \(\beta\) 和 \(\alpha\) 的值。

\(\beta_t\) 控制前向扩散过程每个步骤的噪声水平。它通常被选择为逐渐增加:在开始时你不添加太多噪声,但随着你进入后面的时间步,你采用更高的噪声值。

\(\alpha_t\) 如前所述,可以设置为捕获保留率,即 \(\beta_t\) 的补数,它通常逐渐减少,反映了噪声水平的增加。

\(\alpha\) 的累积乘积表示前向过程中 \(x_0\) 和任何随机样本 \(x_t\) 之间的总体保留率。这意味着你的 \(\beta\) 和 \(\alpha\) 值的调度可以捕捉模型捕获复杂数据分布的能力与训练稳定性之间的权衡。因此,仔细选择 \(\alpha\) 和 \(\beta\) 值成为扩散模型本身的一个重要组成部分。

总结

本节课我们一起学习了扩散模型,特别是去噪扩散概率模型的基本原理。我们从生成模型的背景出发,介绍了扩散模型的前向和反向过程,深入探讨了其数学基础,包括高斯分布、随机过程、马尔可夫链、维纳过程和随机微分方程。我们详细解释了前向扩散过程如何通过逐步添加噪声将数据转化为纯高斯噪声,以及反向过程如何通过学习去噪来从噪声生成数据。我们还讨论了训练DDPM的目标函数和采样过程。理解这些基础是掌握现代强大图像生成模型的关键。

120:扩散模型和DDPM介绍 - 第二部分

在本节课中,我们将继续学习扩散模型和去噪扩散概率模型。我们将深入探讨DDPM的概率建模方法、其与变分推断的联系,并介绍另一种生成模型——基于分数的模型。最后,我们将比较不同生成模型的优劣,并讨论DDPM的实际应用与挑战。

🧠 DDPM的变分推断视角

上一节我们介绍了DDPM的基本概念。本节中我们来看看DDPM如何通过变分推断来建模反向扩散过程。

DDPM通过变分推断来公式化并实现损失函数。这部分推导与变分自编码器类似。我们的目标是近似后验分布 p(xₜ | x₀) 或联合分布 p(x₁:T | x₀)。我们用一个易于处理的分布 q(x₁:T | x₀) 来近似它。

在这种情况下,变分下界由以下期望给出:

ELBO = E_q[log p_θ(x₀:T) / q(x₁:T | x₀)]

这个下界可以分解为数据似然、先验和一个KL散度项。KL散度项通常被用作训练模型的损失函数。

以下是其推导过程:

  1. 从证据下界开始:ELBO = E_q[log p_θ(x₀:T) / q(x₁:T | x₀)]。

  2. 将 p_θ(x₀:T) 展开为各条件概率的乘积:p(x_T) ∏ p_θ(x_{t-1} | x_t)。

  3. 将其代入ELBO项,并利用对数的性质分离各项。

  4. 最终可以得到一个包含 E_q[log p(x_T)] 和一系列KL散度项的和式。

具体而言,第二项可以写成 q(x_t | x_{t-1}) 与 p_θ(x_{t-1} | x_t) 之间的KL散度。

变分推断的核心思想是:为了最大化某个函数 f(x),我们转而最大化另一个始终小于等于 f(x) 的函数 g(x)。通过最大化 g(x),f(x) 也会在此过程中被最大化。这就是我们在此处使用的关键思想。

我们最终通过最大化负KL散度(或最小化KL散度)来最大化ELBO。直观地说,我们正在尝试匹配前向过程和反向过程。训练扩散模型的目标是让反向过程猜测前向过程中添加的噪声,并从样本中减去该噪声,并迭代进行此操作。这个KL散度试图对齐前向和反向过程。

为了最大化ELBO,我们最小化KL散度项,这有助于实现这种对齐。这种学习通常使用随机梯度下降法进行,SGD是处理KL散度的常用方法。

🔗 与基于分数的模型的联系

理解扩散模型或DDPM的另一种方式是通过基于分数的模型这一替代生成方法。

基于分数的模型在过去被用于学习一个分数函数。该函数是数据分布对数密度的梯度。例如,分数 s(x) 可以写为:

s(x) = ∇_x log p(x)

这个分数函数告诉我们距离原始数据分布有多近。它捕获了数据密度最陡上升的方向和幅度。这些基于分数的模型被用于训练生成模型,它们给出一个由神经网络参数化的分数函数,记为 s_θ(x)。

基于分数的模型很有用,因为它允许我们捕获复杂的数据分布,而无需显式建模数据是如何生成的密度函数。你只需检查生成的数据是否保持特定的分数,这有助于你理解模型生成的数据是否与原始分布相似。

另一个例子是生成对抗网络。GAN并不显式建模原始数据的概率密度函数。你只需生成数据并检查它们是否足够好以匹配原始数据。虽然GAN不是分数函数,但你可以以类似的精神来考虑基于分数的生成模型,它们也不显式建模原始分布的密度。

基于分数的模型通常通过最小化神经网络估计的分数与真实分数之间的差异来训练。使用的损失函数通常基于这两个分数函数之间的费舍尔散度。在实践中,真实分数是未知的,因此用一些扰动样本来替代,这些样本用于估计或学习分数函数 s_θ(x)。这种使用损失函数的训练策略最终利用了分数函数通过其对数密度的梯度来表征数据分布的能力。

🤝 DDPM与基于分数的模型的关系

那么,这与DDPM有何联系?DDPM和基于分数的模型都试图通过扩散过程对数据进行去噪。

在DDPM中,我们在前几页看到的每个扩散步骤的去噪函数 μ_θ,可以被解释为该时间步下噪声分布的扰动数据分布的分数函数。可以说,反向过程中每个时间步的 μ_θ 都在试图给出一个分数,以衡量你在该特定时间步捕获等效前向过程分布的程度。

这种联系表明,训练DDPM也可以被视为在每个时间步学习一个隐式的分数函数,该函数指导反向扩散过程。因此,DDPM和基于分数模型之间的这种联系常被用来强调分数函数在捕获数据分布底层结构从而生成新样本方面的重要性。

在基于分数的模型中,你最终需要积分一个由学习到的分数函数驱动的随机微分方程:

dx = s_θ(x) dt + √2 dw

其中 w 是维纳过程。

这个SDE是一个连续时间的扩散过程,它逐渐将噪声转化为来自目标分布的样本。人们可以将我们的DDPM视为此类SDE或基于分数模型的离散时间对应物。

重申一下,这种基于分数模型的方法可以被视为一个连续时间的扩散过程。而在DDPM中,我们有一个离散时间的对应物,我们在离散的时间步上观察噪声分布在反向过程中如何演化。与基于分数的模型非常相似,无论是基于分数的模型还是DDPM,其有效性都取决于学习到的分数函数在捕获数据分布方面的准确性。

🚀 DDPM的应用与挑战

DDPM在过去几年中已成功应用于各个领域。例如图像生成,你可能见过DALL-E 2或Stable Diffusion等流行示例,扩散模型已显示出生成非常高质量样本的能力。DDPM也被用于通过训练适当的数据来合成音频甚至分子结构。

那么,扩散模型是深度生成模型的最佳解决方案吗?并非如此,它们确实存在局限性。你能想到DDPM可能有哪些局限性吗?

以下是几个挑战:

  1. 训练和采样的计算成本:反向过程必须经过多个时间步骤才能生成最终的输出图像。这本质上是一个缓慢的过程,并且计算量可能很大。

  2. 对噪声调度敏感:正如我们之前提到的,噪声调度 β_t、α_t 的选择会显著影响模型性能。这意味着模型对这些值的选择非常敏感,这是另一个局限性。

  3. 模式崩溃:有时,在高维空间中确保生成样本的多样性并避免模式崩溃也可能很困难。

什么是模式崩溃?回想一下我们在GAN中讨论的内容,如果你有一个具有多个模式的原始数据分布,理想情况下,你希望你的扩散模型或任何其他生成模型能够生成来自任何这些模式的样本。然而,一些生成模型存在崩溃到特定模式的局限性,只生成与该特定模式对应的一般图像或数据样本,这是一个局限性。

⚖️ 生成模型对比

一般来说,如果我们要将DDPM/扩散模型与其他生成模型进行比较,可以从三个因素来评估:

  1. 采样速度:生成速度要快。

  2. 模式覆盖:确保收敛并代表不同的模式。

  3. 生成质量:生成样本质量要高。

你能想到GAN、VAE和扩散模型在这三个方面的表现如何吗?分析这一点很有趣。

  • GAN:生成高质量样本,但受模式崩溃困扰。

  • VAE:由于其概率性质,提供更好的模式覆盖,但不能提供高质量的生成样本。

  • DDPM:提供高质量样本和良好的模式覆盖,但其去噪过程本质上很慢。

因此,可以说DDPM和扩散过程具有高质量样本和良好的模式覆盖。GAN具有高质量样本和快速采样。变分自编码器具有快速采样和模式覆盖,但没有高质量样本。因此,它们各自都有其局限性作为权衡的一部分。

💡 训练扩散模型的实用考虑

总结一下训练扩散模型时的实际考虑因素:

  • 需要仔细调整超参数,尤其是噪声调度和学习率。

  • 用于预测每一步噪声的神经网络架构选择也至关重要。更大的模型通常能带来更好的性能,但也会导致更大的内存占用和计算开销。

  • 从DDPM中采样本质上可能是计算密集型的,因为你必须从噪声中采样,并在多次迭代中不断去噪,才能得到原始数据分布的样本。这可能很耗时。可以使用子采样或从粗到细的采样等技术来加速此过程。

  • 最终,DDPM的实现应受益于并行化和硬件加速,以改善其计算效率。

📚 推荐阅读

本节课推荐的作业是Lillian Weng关于扩散模型的博客,以及YouTube上一个关于CPR的教程讲座,它可以为你提供更多关于任何你可能没有理解的内容的信息。

本节课中,我们一起学习了DDPM的变分推断推导,理解了其与基于分数的生成模型的深刻联系,并比较了DDPM与其他主流生成模型(如GAN和VAE)在采样速度、模式覆盖和生成质量等方面的优劣。我们还探讨了DDPM的实际应用、面临的挑战以及训练时的注意事项。

121:分类器与无分类器扩散指导

概述

在本节课中,我们将学习如何控制扩散模型,使其生成特定类别的图像。我们将探讨两种主要方法:分类器指导和无分类器指导。这两种技术允许我们引导原本随机的生成过程,朝着我们期望的类别方向进行。


从无条件生成到条件生成

上一节我们介绍了标准的扩散模型,它们专注于无条件生成。这意味着模型从噪声开始,逐步生成一张来自原始数据分布的图像。这种方法适合生成多样化的图像,但无法保证输出属于某个特定类别,因为扩散过程本身具有固有的随机性。

因此,我们提出的问题是:能否引导生成过程朝向一个特定的类别?这正是本课要解决的问题。


分类器指导生成

为了引导生成,一种在2021年提出的方法称为分类器指导生成。其核心思想是:在反向去噪过程中,利用一个分类器的梯度信息来扰动轨迹,使其偏向某个特定类别。

以下是实现步骤:

  1. 训练一个噪声图像分类器:首先,你需要训练一个能够对带噪图像进行分类的模型。输入是图像及其多个加噪版本,目标是预测图像的类别标签。

  2. 在采样时使用分类器:假设你的DDPM模型已经训练好。在采样生成时,你从一个噪声样本开始,逐步预测并移除前向过程中添加的噪声。关键的一步是,在每一步,你利用冻结的分类器输出的梯度来调整预测的噪声。

具体来说,分类器输出的是条件概率的对数 log p(y | x_t)。我们计算这个量对输入 x_t 的梯度,并乘以一个常数 γ(称为指导尺度)。这个梯度项被用来调整神经网络预测的噪声,使其更符合目标类别。

核心公式推导

在反向扩散过程中,我们原本学习的是 p_θ(x_{t-1} | x_t)。现在,我们希望学习的是 p_θ(x_{t-1} | x_t, y)。

根据贝叶斯定理和对数运算,我们可以得到用于指导的梯度更新公式:

新噪声 = 旧噪声 - γ * σ_t * ∇_{x_t} log p_φ(y | x_t)

其中:

  • 旧噪声:标准DDPM模型预测的噪声 ε_θ(x_t, t)。

  • γ:指导尺度,控制类别引导的强度。

  • σ_t:与时间步 t 相关的噪声标准差。

  • ∇_{x_t} log p_φ(y | x_t):分类器 φ 输出的条件概率对带噪图像 x_t 的梯度。

指导尺度 γ 的作用

从概率角度理解,γ 的作用类似于对条件分布 p(y | x_t) 进行温度调节。当 γ > 1 时,我们放大了条件信号,使得生成过程更倾向于选择最可能的类别,从而将概率质量从不太可能的类别转移到目标类别。

算法流程

以下是结合了分类器指导的DDPM采样过程:

  1. 从标准正态分布采样初始噪声 x_T。

  2. 对于 t = T, ..., 1:

    • 使用DDPM网络预测噪声:ε_θ(x_t, t)。

    • 计算分类器梯度:g = ∇_{x_t} log p_φ(y | x_t)。

    • 计算指导后的噪声:ε̂ = ε_θ(x_t, t) - γ * σ_t * g。

    • 使用 ε̂ 按照DDPM的更新规则计算 x_{t-1}。

  3. 得到最终生成图像 x_0。

效果示例

研究表明,这种方法能显著提升目标类别的生成质量。例如,在生成“彭布罗克威尔士柯基犬”类别的图像时,设置 γ=10(强引导)比 γ=1(弱引导)能产生更多、更清晰的该类图像。


分类器指导的局限性

尽管分类器指导方法有效,但它存在一些局限性:

  • 需要额外的分类器:必须单独训练一个能够处理不同噪声水平图像的分类器网络,这增加了训练成本和复杂度。

  • 梯度可能不完美:分类器产生的梯度信号可能不准确,尤其是在高噪声水平下,这可能导致生成过程偏离正确方向。

  • 推理依赖分类器:在生成(推理)阶段仍然需要运行分类器来计算梯度,增加了计算开销。


无分类器指导生成

为了克服上述限制,2021年提出了无分类器指导生成。其核心思想是:让扩散模型自身具备指导能力,从而无需外部分类器。

实现原理

该方法通过训练一个条件扩散模型来实现,并在训练中引入条件丢弃。

  1. 训练阶段:

    • 大部分时间,模型以类别标签 y 为条件进行训练(即学习 ε_θ(x_t, t, y))。

    • 以一定概率(例如10%),随机将条件信息 y 替换为一个特殊的“空”标签(如 ∅),此时模型学习的是无条件生成 ε_θ(x_t, t, ∅)。

    • 这样,一个单一的神经网络同时学会了条件生成和无条件生成。

  2. 推导与公式:

    根据贝叶斯规则,可以推导出条件噪声预测与无条件噪声预测之间的关系。最终,用于指导的噪声更新公式变为:

    ε̂ = ε_θ(x_t, t, ∅) + γ * (ε_θ(x_t, t, y) - ε_θ(x_t, t, ∅))

    或者等价地:

    ε̂ = ε_θ(x_t, t, y) + (γ - 1) * (ε_θ(x_t, t, y) - ε_θ(x_t, t, ∅))

    其中:

    • ε_θ(x_t, t, y):以类别 y 为条件预测的噪声。

    • ε_θ(x_t, t, ∅):无条件(“空”条件)预测的噪声。

    • γ:指导尺度。当 γ=1 时,退化为普通条件生成;γ>1 时,增强类别特性。

算法优势

无分类器指导具有明显优势:

  • 无需外部分类器:指导信号来自生成模型自身,消除了训练和运行额外分类器的需求。

  • 梯度更鲁棒:扩散模型本身在训练时已经接触了各种噪声水平的图像,因此其提供的梯度可能比专门分类器更稳定。

  • 实现简单:仅需在训练时引入简单的条件丢弃,即可用一个模型实现两种功能。

  • 效果更好:实验表明,即使 γ=1,无分类器指导也能生成符合目标类别的图像,而分类器指导在 γ=1 时效果不佳。


总结

本节课我们一起学习了控制扩散模型生成特定类别图像的两种指导技术。

  • 分类器指导:利用一个预先训练的噪声图像分类器的梯度,在采样过程中扰动噪声预测,引导生成方向。其核心公式为 ε̂ = ε_θ(x_t, t) - γ * σ_t * ∇ log p_φ(y | x_t)。

  • 无分类器指导:通过条件丢弃技术训练一个同时掌握条件生成和无条件生成的扩散模型,在采样时通过组合两者的输出来实现引导。其核心公式为 ε̂ = ε_θ(x_t, t, ∅) + γ * (ε_θ(x_t, t, y) - ε_θ(x_t, t, ∅))。

无分类器指导因其无需额外模型、实现简单且效果出色,已成为当前更主流和实用的方法。这两种技术为我们提供了强大的工具,使扩散模型从纯粹的无条件生成器,变成了可控的图像合成系统。

122:对比学习和面部理解历史 - 第一部分

在本节课中,我们将学习人脸识别这一计算机视觉核心任务的发展历史,特别是深度学习时代之前的算法演进和基础概念。我们将了解人脸识别的基本流程、关键挑战以及两种主要的应用任务:验证与识别。

人脸识别作为生物识别技术的一部分,几十年来一直是极其重要的计算机视觉任务。它在安全、金融、医疗保健以及社会和金融的各个方面都有应用。

无约束人脸识别,即在自然场景中识别人脸,是一个非常具有挑战性的问题。这是因为存在光照变化、遮挡、姿态或对齐差异、表情变化等诸多因素。

人脸识别并非新话题,由于其重要性,它已经存在了几十年。从算法角度看,最早的人脸识别研究始于20世纪60年代Woodrow Bledsoe的工作。随后在70年代出现了Takeo Kanade的方法。90年代出现了早期人脸识别中最流行的算法之一——特征脸,它以略有不同的方式重新利用了主成分分析来进行人脸识别。之后出现了各种使用局部特征分析进行人脸识别的方法,以及弹性束图匹配。当然,还有Viola-Jones的人脸检测器,它是人脸识别系统的重要组成部分。我们之前讨论过的局部二值模式等手工特征被广泛用于人脸分析任务。在21世纪第一个十年的末期,出现了用于人脸分析任务的稀疏特征表示。当然,自2014年起,基于深度神经网络的人脸识别方法开始兴起,这也将是本讲座的重点。

从硬件角度看,相机始于1915年,数码相机在90年代出现。随后,人脸识别转向了监控摄像头、智能手机摄像头。在21世纪第一个十年的末期,出现了基于Kinect的设备(如Xbox上的微软Kinect)和Google Glass这类设备。2011年,三星Galaxy在智能手机上实现了面部解锁功能。之后出现了RGBD相机,以及最近能够进行人脸识别的随身相机。所有这些发展都在一篇名为《50年生物识别研究:成就、挑战与机遇》的近期文章中得到了很好的记录。如果有时间,建议阅读。

当深度学习被用于人脸识别时,一个标准的流程如下图所示。首先从输入图像开始。第一步是进行人脸检测,因为需要从图像中分离出人脸。人脸检测完成后,在将裁剪后的人脸用于识别任务之前,需要进行一些预处理。第一个任务是将人脸对齐到一组预定义的几何标准上。第二个任务是可选的,取决于具体应用,即检查图像是欺骗性的(如照片)还是真实的活体。如果检查结果是欺骗性的,则流程在此结束;如果不是,则进入下一阶段。下一阶段可以看作是面部处理,有两种类型:一对多和一对一,具体取决于应用需求。当然,预处理任务也是可选的,取决于特定应用是否需要。在所有处理步骤之后获得训练数据,将其提供给卷积神经网络进行特征提取。最后,使用不同类型的损失函数(如欧几里得距离或角度距离等)来训练CNN。在测试时,测试图像经过类似的处理流程。处理后的测试数据被提取特征,最后通过各种方法(如与阈值匹配、进行最近邻匹配,或如我们将看到的进行度量学习或稀疏表示)来匹配该人脸的最终嵌入表示。我们将在接下来的几张幻灯片中看到其中一些方法。

广义上说,要在自然场景中部署人脸识别系统,它是检测、对齐和匹配的结合。正如我们将看到的,匹配也有多种类型。谈到人脸,关键组成部分包括面部处理(可以进行一对多的数据增强或一对一的归一化)、通过网络架构进行的深度特征提取及相应的损失函数,以及最后使用各种不同方法匹配这些嵌入、特征或表示。

我们刚才提到的预处理步骤是什么?可以执行一对多的数据增强,这是我们之前讨论过的标准数据增强。通过以不同方式改变人脸图像,可以生成许多图像块或图像。例如,通过以不同方式旋转人脸图像,可以在一定程度上模拟人的不同姿态。这种增强可以帮助人脸识别系统更加鲁棒。另一方面,也可能希望通过将多张人脸图像归一化到一个标准模型上来获得一个人的单一规范视图。例如,你可能有一个人的所有这些不同图像,从光照角度看有变化,从姿态角度看也有变化。如何获得这些图像?这些可能是在不同时间点获得的,或者是在单个视频序列中作为帧获得的(比如一个人说话时头部在移动,你捕获了所有这些帧),然后将所有这些帧归一化为一个单一的正面视图,用于进一步处理。这个领域的许多工作(本课程可能无法深入探讨)也涉及使用3D模型进行人脸识别的思想。这种归一化方法有助于在姿态、光照、表情和背景变化的情况下保持身份不变性,因为一旦对这些因素进行了归一化,你就可能得到一个CNN在执行识别任务时表现更好的规范图像。

那么,多年来用于人脸识别的网络架构有哪些?在本讲座中,我们将重点关注深度学习时代的人脸识别。在过去几年中,每个阶段用于人脸识别的架构都反映了当时CNN的发展。如果你看下面的时间线,2012年是AlexNet。因此,DeepFace(这是使用新一代CNN进行人脸识别的首批全面努力之一)使用AlexNet作为其主要骨干架构。随后是2015年的FaceNet,它使用了GoogleNet。2015年的VGG Face使用了VGGNet。2017年一个名为SphereFace的网络使用了ResNet。2017年一个名为VGGFace2的网络使用了Squeeze-and-Excitation Net。更全面的列表可以在这里看到,这张表格来自一篇名为《深度人脸识别:综述》的论文。你可以看到,所有这些不同方法的主干架构主要是过去几年中成功的流行架构。虽然有一些偏差,研究人员对架构进行了轻微修改,但在很大程度上,近年来人脸识别架构的主干一直是AlexNet、VGG、ResNet等等。

整个人脸识别领域从应用角度可以大致分为两种所需的任务:验证和识别。在这两种情况下,通常是架构的最后阶段发生变化。你有一张图像,进行检测和对齐,得到一个裁剪良好且对齐的图像。然后使用一个深度CNN特征提取网络,获得特征表示,然后将其传递给验证系统或识别系统。

什么是人脸识别?人脸识别是将给定的输入图像分配给数据库中的人名或身份的任务。这是一对多的匹配,因此你有一张给定的图像,必须将此图像与数据库中的多个身份进行匹配以找到最接近的匹配。所以这个任务与我们迄今为止一直在讨论的分类任务(如ImageNet)非常相似,即给定一张图像,与一千个不同的类别进行匹配,找出应该分配给该图像的类别。这通常被表述为一个K+1多类分类问题,其中如果人脸来自数据库外部,则有一个额外的类别。所以输入是人脸图像,输出是身份类别或人脸ID。在这种情况下使用的损失函数是什么?是我们一直使用的标准softmax和交叉熵损失。因此,你有一个最后的线性层,其参数是主体的表示,交叉熵可以由这个公式给出,其中这里的x是倒数第二层的表示,在其之上有一些权重,这些权重在最后一层给出最终输出,然后应用softmax激活函数和交叉熵损失。这里提醒一下,这些值也被称为逻辑值。在应用softmax激活函数之前,神经网络的输出集也被称为神经网络的逻辑值。通常,当你使用softmax和交叉熵损失时,在应用softmax之前获得的嵌入看起来像椭圆,其中类间方差很大,因为这不是交叉熵损失的重点,但你有良好的类内方差,可以使用此损失分离这些类别。

现在来看验证任务。验证任务是验证两张图像是否属于同一身份。这是一个一对一的匹配任务。给定一张输入图像和一个人声称拥有的身份,此任务必须确定输入图像是否属于该身份。你可以想象这个场景在移民环境中,一个人向移民官员出示护照,官员查看你的脸以检查脸部是否与护照上的图像和身份匹配。这是一对一的匹配。移民官员不是将你的图像与身份数据库进行比较,而只是验证你是否是你声称的那个人。所以,在这种情况下,你的输入是一张人脸图像和人脸ID,这与识别设置不同。输出是一个二元分类问题,状态是匹配或不匹配。从图示上讲,你有一张图像。你有一个卷积神经网络,得到一个特征表示。你有一个面部数据库,根据该人声称的身份从中挑选出一个身份,然后使用一个相似性度量来检查这两个图像之间的相似性,并做出匹配或不匹配的二元决策。

也可以将识别作为验证任务来执行。这是如何完成的?现在你可以取一张测试图像。通过卷积神经网络获取特征表示,然后对于数据库中的每个身份,检查是否匹配或不匹配。这将使识别任务成为一个验证任务。为什么要讨论这个,为什么这有用?这消除了在向数据库添加新人脸类别时需要重新训练模型的需求。因此,如果你的数据库中有一千人并且已经训练了CNN,如果添加了一个新人,你必须重新训练你的CNN,因为最后一层的神经元数量现在会增加一个。然而,如果我们将其视为验证问题,我们只需要神经网络的表示,并且可以使用其他相似性度量来完成与每个新身份的匹配,这使得这种方法具有可扩展性。然而,识别可能涉及多个验证步骤,这意味着如果管道中的任何地方存在错误,现在可能会被放大,因为你现在要经过多个验证步骤进行比较。在这种情况下,目标是开发一个非常准确和高效的验证系统,以便它也可以有效地用于识别。

最早的验证努力之一是1994年的孪生网络。这最初是为签名验证任务提出的。因此,某家银行在其记录中有一个人的签名,如果一个人在特定日期访问银行并再次签名,银行必须检查签名是否与记录上的签名匹配,这个任务就是签名验证。因此,孪生网络(顾名思义,它来自连体双胞胎)中提出的架构是让相同的CNN架构复制两次,其中当前给定的签名通过相同的CNN,记录上的签名也通过相同的CNN。你得到两个不同的表示F1和F2。必须有一个距离度量来检查这两个表示有多接近,然后将其传递给二元分类器以给出匹配或不匹配的决策。因此,这种方法的一个重要启示是:必须以尊重用于比较这两个特征的距离度量的方式来学习表示。我们现在将看到,这种设置在过去的几年里已经在许多方面得到了改进。

本节课中,我们一起学习了人脸识别的基本概念、发展历史以及核心任务(验证与识别)的定义和区别。我们了解了从早期算法到深度学习方法的演进,以及标准人脸识别流程中的关键步骤,如检测、对齐、预处理和匹配。我们还探讨了将识别任务转化为验证任务的思路及其优势。下一节,我们将深入探讨用于人脸识别的具体深度学习架构和损失函数。

123:对比学习与人脸理解历史 - 第二部分

概述

在本节课中,我们将学习人脸识别领域在深度学习时代早期的一些关键方法,特别是围绕对比学习和度量学习思想发展出的各种损失函数。我们将从DeepFace开始,逐步了解如何通过设计特定的损失函数来学习更具判别性的人脸特征表示。

DeepFace:早期的人脸识别系统

在AlexNet取得成功后,近年来最早的努力之一是2014年CVPR上发表的DeepFace。

DeepFace首先执行了一个预处理步骤,包括人脸定位、关键点检测和对齐,以获得人脸的正面裁剪图像。左侧的图像展示了获得正面裁剪所涉及的步骤。

给定输入图像,第一步是检测人脸并从图像中裁剪出人脸区域。

然后在2D裁剪图上检测大约67个面部关键点,并对它们进行三角剖分。

这67个关键点是面部不同的标记点,例如鼻尖、眼角、嘴角等。已有方法可以完成此任务。

完成此步骤后,这些点被投射到一个3D模型上,该特定的人脸图像被投影到这个3D模型上。

然后,该3D模型被归一化为一个带有对应关键点的2D人脸图像,最终转换为图像的正面裁剪。

最后,由于我们现在有了同一个人脸的3D模型,我们还可以生成同一个人的其他姿态图像。

因此,我们在步骤1中讨论的正面裁剪就是图像G。与图像B相比,可以看到图像G的归一化效果相当好。

这个正面裁剪被传递给深度CNN模型,即深度CNN架构,使用标准的softmax和交叉熵损失,通过K路softmax来区分K个不同的类别。

DeepFace的验证部分

对于验证部分,DeepFace使用了一种类似孪生网络的方法。

从识别任务中学到的表示被冻结用于验证,因此这些架构参数是固定的。

给定一张人脸图像I和记录中该人声称对应的图像,我们得到两个表示F1和F2,即G(I1)和G(I2)。

然后训练网络的其余部分,方法是取F1和F2之间的绝对差值,接着是一个全连接层,最后通过sigmoid激活函数得到最终的二元决策。

因此,在这种特定场景中引入的距离是 |F1 - F2| * α,其中α是在该特定层中学到的权重。

最终输出是匹配或不匹配,即相同或不同。

DeepFace提出的这种方法,源自90年代的孪生网络思想,后来在多个方面得到了扩展。其中一个主要思想是使用所谓的对比损失。

对比损失与度量学习

对比损失是一种基于机器学习中度量学习范式来训练神经网络的损失函数。

机器学习中的度量学习方法试图学习一个距离度量,而不是使用欧几里得距离度量或余弦距离度量。

因此,同样的思想现在被用来为你想使用这些表示的任务学习具有区分性的特征表示。

在人脸验证场景中,我们的目标是将输入映射到一个嵌入空间,其中点之间的距离对应于语义相似性。

欧几里得距离可以做到这一点,但如果我们能学习一个更有效地做到这一点的距离,那将更有用,这也是大多数这些方法试图做的。已有各种公式,如成对对比损失、排序损失、三元组损失等。我们将在本讲座的剩余部分看到其中一些。

成对对比损失来自Hadsell等人2006年的一项工作,其中引入了一种学习对复杂变换不变的映射的方法。

正如我们刚才所说,其思想是让相似的点在嵌入流形上彼此靠近,因此你从CNN输出得到的这种表示也被称为嵌入。

如果我们现在假设这些是低维嵌入,通常这些嵌入的维度低于图像本身。图像可能是200x200,而嵌入可能只是一个1000维或4000维的向量。

我们理想地希望,对于相似的实体,这些位于例如1000维或4000维流形上的嵌入彼此相似;对于不相似的实体,则彼此远离。

因此,我们的目标是以这样的方式学习神经网络权重W:给定输入x1和x2,距离 Gw(x1) - Gw(x2) 近似于输入的语义相似性。让我们看看这是如何完成的。

以下是该算法的总体思想:

给定训练数据,首先识别彼此相似的样本集,并将它们放入一个集合中,例如给定输入X的S(X)。我们识别与Xi相似的样本Xj。

在人脸验证上下文中,这可能是同一个人的其他照片。

我们还设定Yij,给定Xi和Xj,如果这些点相似,则Yij为0;同样地,识别不相似的点,这可能是两个不同人的图像,此时设定标签Yij等于1。

现在,训练时我们想做什么?对于训练集中的每一对(Xi, Xj):

  • 如果Yij等于0,意味着它们是相似的图像,我们则更新W以减小距离 Gw(Xi) - Gw(Xj)。

  • 如果Yij等于1,即不相似的图像,我们则希望增加这个距离Dw。

现在让我们看看如何使用单个损失函数来实现这一点。

给定x1和x2为一对高维输入向量。

令y为一个二元标签,如果x1和x2相似则为0,否则为1。

那么成对对比损失 L_contrastive 定义为:

L_contrastive = (1 - y)/2 * Dw^2 + y/2 * max(0, m - Dw)^2

第一项,如你所见,仅在y等于0时激活;第二项仅在y等于1时激活。

当y等于0时,图像相似。因此你最小化Dw^2,这正是我们想要做的。

当y等于1时,输入是不相似的图像。那么你最小化 max(0, m - Dw)^2。

让我们分析一下:m是一个用户定义的边界,你希望不相似的图像在流形中至少被这个数值(例如10个单位或20个单位)隔开。

这个公式表明,如果Dw^2大于m,那么第二项将变为负数,max函数将取0,这意味着无需操作,因为不相似图像之间的距离已经大于用户定义的边界m,所以这一项会消失。

然而,如果Dw^2小于m,在这种情况下,你将最小化 m - Dw^2,这相当于最大化Dw^2,即这些不相似图像之间的距离。

DeepID2:结合识别与验证

这个思想被用于后续的网络DeepID2,该网络于2014年在NIPS上提出。

DeepID2类似于DeepFace,训练一个深度CNN来联合执行识别和验证。可以认为,识别任务增加了人际差异(试图将不同身份的图像或嵌入分开),而验证任务通过将同一身份的特征或嵌入聚集在一起来减少个人内部差异。

以下是其实现方式:

在DeepID2中,交叉熵损失用于识别参数,成对对比损失用于学习验证参数。因此,你有对应于识别模块权重的θ_ID,以及对应于验证模块的θ_verification。

识别损失由交叉熵给出,其中θ_ID是softmax层的参数,即用于识别的最后一层参数。类似地,成对对比损失中,验证损失参数由θ_ver给出。

但DeepID2使用了一种略有不同的方式来学习整个流程,让我们看看这个算法:

假设从训练数据中采样两个训练样本Xi和Xj。现在,你有F,它是Xi经过基础骨干CNN的输出;Fj是Xj经过同一骨干CNN的输出。这个骨干CNN由权重θ_C参数化。

现在,识别参数θ_ID的梯度由以下给出:∂L_identification(F, Li; θ_ID)/∂θ_ID + ∂L_identification(Fj, Lj; θ_ID)/∂θ_ID。在这种情况下,你对F和Fj都使用交叉熵损失。

类似地,验证参数的梯度由某个用于加权的系数λ乘以 ∂L_verification(Fi, Fj, Yij; θ_verification)/∂θ_verification 给出,其中验证损失由成对对比损失给出。我们知道,在这种特定情况下,如果身份相同,则Yij设为1;如果身份不同,则Yij设为-1。

然后,类似地,关于嵌入Fi和Fj(CNN的输出)的梯度由以下给出:∂Fi = ∂L_identification/∂Fi + ∂L_verification/∂Fi,∂Fj 同理。

最终,整个CNN参数θ_C的梯度由以下给出:∂Fi * ∂CNN(Xi)/∂θ_C + ∂Fj * ∂CNN(Xj)/∂θ_C。

你确保CNN的权重更新首先使用Xi和Xj输出的梯度进行更新,然后相同的权重在应用于Xi和Xj的两个CNN架构之间共享。

总结一下,θ_ID和θ_verification通过各自的目标分别更新,但θ_C(在分支到验证和识别之前的基础骨干CNN的权重)则通过识别和验证目标的加权贡献进行训练。这使得骨干网络能够同时学习良好的人际特征和个人内部特征。

FaceNet与三元组损失

随后出现了FaceNet,于2015年CVPR上开发。它基于一个前提:现有的人脸识别架构,包括DeepFace和DeepID2,通常学习整个神经网络,然后使用其中一个倒数第二层(称为瓶颈层)的嵌入来进行最终的匹配决策。

这种方法有问题吗?FaceNet声称有,它存在间接性问题。

因为我们不知道来自中间层或倒数第二层(即瓶颈层)的那些嵌入在后续任务中能用于什么。并且因为它没有针对这些嵌入将用于的后续任务进行明确训练,所以可能效率低下。

因此,FaceNet试图确保其目标是输出一个好的表示,而没有基于学习到的表示进行单独考虑的分类等进一步目标。

事实上,FaceNet使用一种称为三元组损失函数的新损失函数来学习128维的嵌入,该函数如今在深度学习的多个设置中被广泛使用。

以下是三元组损失的思想:它是对比损失的扩展。对比损失使用相似和不相似的样本,而三元组损失使用一个三元组。

三元组由什么组成?一个锚点、一个正样本点和一个负样本点。

给定任何输入(现在对我们来说是锚点),我们有一个与锚点身份相同的正样本点,以及一个与锚点身份不同的负样本点。

我们现在尝试在通过损失函数学习时使用所有这三个点,我们的目标显然是确保锚点与负样本之间的距离至少比锚点与正样本之间的距离多出某个边界。

我们如何使用损失函数来实现这一点?我们有一个三元组约束,规定:||f(x_a) - f(x_p)||^2 + α < ||f(x_a) - f(x_n)||^2。

我们是在说,锚点到负样本的距离必须至少比锚点到正样本Xp的距离多出一个边界α(α是一个正数)。

你可以这样可视化:你有一个作为输入给CNN模型的锚点图像,在你的数据集中有该锚点图像的正例,也有该锚点图像的负例。

首先确保在通过CNN架构获得表示后(所有这三个输入使用相同的CNN架构,与之前非常相似),你对这些表示进行归一化,使得每个表示的 ||f(x)|| = 1,即归一化你得到的向量表示。

现在,这相当于这些点中的每一个都位于一个单位超球面或单位球上,在你所考虑的128维空间中。

你现在的目标是构建θ或神经网络的权重,给定所有这些三元组,以确保 ||f(x_a) - f(x_p)||^2 + α < ||f(x_a) - f(x_n)||^2,其中α是边界。

这是通过使用三元组损失来实现的,其定义为:L_triplet = max(0, ||f(x_a) - f(x_p)||^2 - ||f(x_a) - f(x_n)||^2 + α)。

很容易看出,这将试图确保在锚点到负样本的距离与锚点到正样本的距离之间至少存在一个边界α。

这里的一个问题是,给定一个锚点图像,如何选择这些三元组?你可能有所谓的简单三元组,其中正样本和负样本非常明确。然而,简单三元组可能并不真正促进学习,它们可能无法让网络学习到有区分性的特征。

因此,选择最初违反三元组约束的三元组可能很重要,这样网络才能学习,并最终可能随着时间的推移改变三元组的性质。

你可以首先选择所谓的困难三元组。给定你将要用于训练神经网络的一小批三元组样本,你可以只选择困难正样本和困难负样本。

什么是困难正样本?即 ||f(X_a) - f(X_p)|| 最大化的那些样本,到正样本距离最大的样本就是困难正样本。

而锚点到负样本距离最小的样本就是困难负样本。

因此,我们在给定的小批量中选择这类样本作为困难三元组来训练网络。

FaceNet实际上使用在线三元组采样,从每个小批量中采样困难正样本和负样本。

不过这里有一个问题:如果你在早期选择非常困难的负样本,可能会出现坏的局部最小值,训练可能会崩溃。因此,想法是在初始阶段选择半困难负样本,然后在训练后期转向更困难的负样本。

如何选择半困难负样本?我们理想地希望选择位于边界α内的负样本。因此,我们想从这类样本开始,它不一定是最小距离,但我们想选择一个在边界内的负样本。

你如何选择这样的半困难样本?你可以选择满足 ||f(x_a) - f(x_p)||^2 < ||f(x_a) - f(x_n)||^2 的样本(忽略我们之前提到的α),这样你最终可能会选择在初始训练时位于边界内的样本。

角Softmax损失及其他改进

进一步讨论三元组损失。2017年,有一种称为角Softmax损失的方法,旨在提高人脸识别和验证的性能,它也可以用于其他领域。

以下图表说明了其总体思想:

如果你有一个原始的softmax损失,并考虑在应用softmax损失之前神经网络的嵌入(即应用softmax激活函数和之后的交叉熵损失之前的倒数第二层的嵌入),你可能得到类似这样的嵌入,其中所有黄色点属于一个类别,所有粉红色或紫色点属于另一个类别。

可以看到,如果你现在对这些向量进行归一化并获得单位范数,使用这两个类别之间的余弦距离来区分身份可能会有点困难,因为有些地方黄色和紫色点几乎重叠。

这可以通过使用改进的softmax损失来改善,即在获得这些嵌入之前对权重向量进行归一化。我们很快就会看到正式的定义。

这项特定工作提出了角softmax,它增强了正类嵌入和负类嵌入之间的区别,这样你就可以使用余弦距离度量来有效地区分身份或获得身份之间的相似性。

为什么这在上下文中很重要?请记住,对于大多数这些识别或验证方法,最后一步是使用距离度量进行匹配,而一个可用于匹配的距离度量是余弦相似度或这些表示之间的角度。

现在我们看看这些改进的softmax损失的不同定义。

原始的softmax损失可以写成:L = -log(e^{z_{yi}} / Σ_j e^{z_j}),其中 z_{yi} 本应是神经网络的逻辑值,但这些逻辑值可以写成 W_{yi} * x_i + b_{yi},其中x是应用softmax之前层的激活值。

这就是你对softmax的定义。现在,你可以将这里的点积 W * x 写成 ||W|| * ||x|| * cos(θ_{yi})(这是点积的定义)加上偏置 b_{yi}。记住我们看的是Y标签,所以下标是 b_{yi}。

这是你的标准softmax损失。

改进的softmax损失定义如下:在神经网络的倒数第二层之后,应用softmax之前,对你获得的权重进行归一化。因此,在这种情况下,权重W1、W2(连接到最后层的每个神经元都有不同的权重)的范数现在都归一化为1。你的softmax损失变成这里的第一项,||W|| 变为1,并且它还确保偏置变为0,这也是操作的一部分。因此,你的新改进损失看起来像这样,其中 ||W|| 变为1,偏置变为0,这些都是在应用softmax之前执行的操作。

角softmax损失扩展了这一点。它扩展了这个概念,使对应于正类的角度按因子M缩放,而对应于所有其他类的角度不按相同的M值缩放(M是一个正常数)。

这确保了正类与其余类之间的角度进一步分离。请记住,最终的匹配(检查一个特征是否属于一个类别而非另一个类别)将由 cos(θ_i) > cos(θ_j) 给出,此时你会说这个点属于第i个标签而不是第j个标签。

通过进行角softmax,我们确保现在有 cos(m * θ_i),它可能大于 cos(θ_j)。我们试图确保对于正类,余弦值可以进一步远离与其他类角度的余弦值。这就是角softmax的主要思想。

以下是来自同一论文的另一可视化:softmax决策边界可以由 (W1 - W2) * x + (b1 - b2) 给出,取两个不同类别的激活值(记住在最后一层你会有多个类别,我们考虑两个类别W1和W2,这是你的softmax决策边界)。

在这里你可以看到,当你有softmax决策边界时,你以这种方式分离这两个类别。在改进的softmax边界中,你对权重进行归一化,因此所有点都位于一个单位球上。你现在试图确保得到这样的分离:属于正类的点位于球的一侧,属于负类的点位于球的另一侧。

这稍微好一点,因为在之前的softmax方法中,你不知道这两个球可能在哪里重叠。你现在试图确保它们位于同一个球的不同侧。

但改进的Softmax在球上类别相遇的点附近仍然存在问题。角Softmax试图通过让W1位于球一侧的更远弧上,而W2位于球另一侧的更远弧上,来确保这种分离进一步最大化。这种进一步的分离有助于在最后一步实现更好的分类。

其他损失函数:中心损失、L2 Softmax、环损失等

过去几年,还有其他改进这些损失函数的想法,其中许多已用于人脸分析领域。

中心损失是2016年提出的另一种方法。它是添加到交叉熵损失中的一个损失项,除了标准的交叉熵损失外,我们还为每个类别标签获得一个质心。对于一个属于特定类别的点,我们还最小化该表示到该数据点所属特定类别的质心的距离。

这些质心也在学习过程中在线更新。随着你在不同的迭代中持续训练,你根据每次训练迭代中的表示获得这些质心,在该迭代中,我们试图确保表示接近该特定类别的质心。

右侧的图表显示,当你改变系数λ(它加权你到质心的距离程度)时,你可以看到,最初当λ值很小时,你得到相对于质心的某种分离;随着你给λ越来越多的权重,你会看到特定类别的所有嵌入最终都接近质心(这些质心由每个类别中的白点表示)。当你想最终决定是否与某个身份匹配或匹配与不匹配时,这允许类别之间有良好的分离。

L2 Softmax是另一项改进。它试图确保在Softmax之前的特征的L2范数位于固定半径α的某个超球面上。这种方法不是将特征归一化以确保它们具有单位范数,而是试图确保它们具有特定的范数α。

这种方法背后的直觉来自他们的观察:具有高L2范数的特征容易分类,而具有低L2范数的特征(因为它们可能接近原点)可能更难分类。当点更接近原点时,它们可能看起来更接近彼此;当点具有高L2范数时,它们离原点更远,因此可能更容易分离。

在这种情况下,优化结果变成:你最小化交叉熵损失,使得在应用softmax之前得到的表示确保 ||f(x_i)|| = 预定义的α。

这在2018年的环损失中得到了进一步改进。这是一个与L2 Softmax非常相似的想法,然而,即使在这种情况下,你也是最小化交叉熵损失,使得 ||f(X)|| = 某个范数R。

但与L2 Softmax的区别在于,在这种特定情况下,你还将R作为训练过程的一部分来学习。因此,除了学习神经网络的权重外,神经网络还决定L2范数值应该是多少。这被称为环损失,因为你试图将Softmax层之前的特征表示投影到一个环上,该环的半径也由神经网络决定。

基于这些方法,出现了一系列努力:

  • CosFace(2018年提出)为人脸识别提出了基于大边界的余弦损失。

  • UniformFace(2019年提出)提出了均匀损失来学习均匀分布的表示,以便充分利用整个特征空间,而不是只关注原点周围的一个球。

  • RegFace(2019年再次提出)提出了显式正则化来显式增大不同实体之间的角度距离。

  • GroupFace(2020年最近提出)使用多个组感知表示来提高嵌入质量。

  • CurricularFace(同样是2020年的近期工作)提出了自适应课程学习,以调整不同训练阶段中简单和困难样本的相对重要性。

课程学习是训练深度神经网络的一个方面,最初你让模型接触简单的训练样本,然后逐渐增加训练样本的难度,以帮助神经网络更好地学习。我们在三元组挖掘中看到了这一点,我们说让我们从半困难负样本开始,然后再处理困难负样本。这种称为CurricularFace的方法进一步提出了自适应课程学习损失。

闭集与开集人脸识别

总结本讲座,人脸识别也有所谓的闭集和开集设置。

在闭集设置中,你有一组预先给定的身份,你必须将输入图像与之匹配。可以使用Softmax加交叉熵损失、中心损失、L2损失、环损失、角Softmax损失等来实现闭集人脸识别。

另一方面,在开集人脸识别中,可能会遇到不在你数据库中的人,神经网络必须至少能说这个人不属于数据库,是当前系统未知的。

你使用什么样的损失函数来训练这样的网络?有一种称为双边界对比损失的方法可以重新用于实现这一点,甚至三元组损失也可以用于实现开集人脸识别。更多细节,你可以查看名为《Deep Face Recognition: A Survey》的著作。

总结

本节课中,我们一起学习了人脸识别中对比学习和度量学习的发展历程。我们从DeepFace的预处理和孪生网络结构开始,深入探讨了成对对比损失的核心思想及其数学形式。接着,我们了解了DeepID2如何结合识别与验证任务。然后,重点学习了FaceNet引入的三元组损失,以及如何通过困难样本挖掘来提升性能。之后,我们探讨了角Softmax、中心损失、L2 Softmax、环损失等一系列改进的损失函数,它们旨在学习在嵌入空间中更具判别性和良好几何特性的特征表示。最后,我们简要区分了闭集与开集人脸识别设置。这些损失函数的设计是推动深度学习人脸识别性能不断提升的关键因素之一。

124:自监督学习与SimCLR

概述

在本节课中,我们将要学习自监督学习这一热门主题。我们将了解其基本概念、常见的预训练任务,并重点介绍基于对比学习的代表性方法,特别是SimCLR框架。


什么是自监督学习?🤔

自监督学习是无监督学习的一种变体。其核心思想是:在没有显式标注或类别标签的数据中,通过数据本身来构造标签,从而在无标签数据上诱导出一个监督学习模型。

具体而言,我们设计一些被称为预训练任务或辅助任务的监督任务。通过这些任务,模型可以学习到有意义的数据表示。这使得模型能够为后续的下游任务(如分类、语义分割等)做好更充分的准备。


为什么需要自监督学习?💡

我们知道,深度监督学习在拥有大量标注数据时效果很好。然而,现实世界中存在海量的无标签数据。自监督学习旨在利用这些无标签数据。其灵感来源于人类的学习方式:人类并非通过完全监督来学习一切,而是通过观察、预测和自我反馈来学习。


常见的自监督预训练任务

以下是几种在计算机视觉领域流行的自监督预训练任务示例。

图像修复 🖼️

图像修复任务的目标是遮挡或移除图像的某一部分,然后要求网络完成图像。这不需要外部标签。

在2016年CVPR发表的Context Encoders工作中,使用了一个编码器-解码器框架来执行图像修复。其损失函数结合了L2重建损失和对抗损失,以生成更逼真的修复结果。

核心公式:

总损失 = L2损失(预测图像, 真实图像) + 对抗损失(预测图像)

拼图游戏 🧩

该任务的目标是教会模型理解图像由多个部分组成,并学习物体及其空间排列的映射。具体做法是让神经网络解决一个九宫格拼图。

实现方式:将图像分成9个图块并随机打乱,神经网络需要预测出正确的排列顺序索引。这是一个分类问题,使用交叉熵损失进行训练。

核心代码逻辑:

# 假设有9个打乱的图块 patches
predicted_permutation_index = model(patches)
loss = cross_entropy_loss(predicted_permutation_index, true_permutation_index)

预测旋转角度 🔄

给定一张图像,对其执行多种旋转(如0°,90°,180°,270°)。然后,使用同一个CNN模型来预测所应用的旋转角度。这有助于网络学习图像特征和物体属性。

核心公式:

设 G 为旋转变换函数,F 为CNN模型。

模型输出:p = F(G(image)),即对旋转类别的概率分布。

损失:loss = CrossEntropy(p, true_rotation_label)

图像着色 🎨

该任务的目标是输入一张灰度图像,预测其彩色版本。训练数据本身是彩色图像,我们取其灰度版本作为输入。

为了实现更锐利的着色效果,该方法通常将输出颜色空间(如LAB空间中的AB通道)量化为多个区间(例如313个),从而将回归问题转化为分类问题。

核心思路:

输入:灰度通道 L

输出:量化后的颜色通道 AB 的类别概率分布

损失:交叉熵损失


对比学习与SimCLR

近年来,自监督学习领域被基于对比学习的方法所主导。其总体目标是通过对比正样本和负样本来学习表示。

对比学习基本思想

目标是学习一个编码器,使得图像与其相似样本之间的相似度得分,大于该图像与负样本之间的相似度得分。

如果我们有类别标签,正负样本很容易定义(如三元组损失)。但在无监督设置下,我们需要从数据本身构造正负样本。

一种通用的损失函数形式是带有温度参数的Softmax损失:

核心公式:

L = -log( exp(sim(q, k+) / τ) / Σ_{i=0}^{K} exp(sim(q, k_i) / τ) )

其中,sim 是相似度函数,τ 是温度超参数。

温度参数 τ 的作用:

  • τ > 1:软化Softmax分布,概率更分散。

  • τ < 1:锐化Softmax分布,概率更集中。

SimCLR 框架详解 🚀

SimCLR(A Simple Framework for Contrastive Learning of Visual Representations)是一个经典的对比学习框架。其核心思想是:最大化同一数据样本的不同增强视图之间的一致性。

工作流程:

  1. 数据增强:对于一个批次中的每张图像,应用两种不同的随机增强(如裁剪、颜色抖动、模糊等),得到两个视图。

  2. 特征提取:使用一个基础编码器网络 f(·)(如ResNet)提取两个视图的特征表示 h_i 和 h_j。

  3. 投影头:使用一个小的MLP投影头 g(·) 将特征映射到对比损失空间,得到 z_i = g(h_i) 和 z_j = g(h_j)。

  4. 对比损失:对于一对正样本 (z_i, z_j),批次内的其他 2(N-1) 个增强样本均视为负样本。使用归一化温度缩放交叉熵损失(NT-Xent)进行优化。

SimCLR 损失函数(对于正样本对 (i, j)):

l_{i,j} = -log( exp(sim(z_i, z_j) / τ) / Σ_{k=1}^{2N} 1_{[k≠i]} exp(sim(z_i, z_k) / τ) )

总损失是所有正样本对损失的平均值。

SimCLR 的关键要素:

  • 强大的数据增强:组合使用裁剪、颜色失真、高斯模糊等是成功的关键。

  • 非线性投影头:在表征层后使用MLP投影头可以改善所学表征的质量。

  • 大批次训练:需要较大的批次大小以提供足够的负样本进行对比。

与其他方法的对比

  • MoCo (Momentum Contrast):通过维护一个动态的字典队列来提供大量负样本,解耦了批次大小与负样本数量。其“动量编码器”的更新方式带来了更稳定的表征。

  • SimCLR vs. MoCo:

    • SimCLR 优势:结构简单,使用了更强的数据增强和投影头。

    • SimCLR 劣势:负样本数量受限于批次大小。

    • MoCo 优势:通过字典队列可以提供更多负样本,有利于学习。

  • BYOL (Bootstrap Your Own Latent):一种不需要负样本的方法。它使用两个网络(在线网络和目标网络),通过让在线网络预测目标网络对同一图像不同增强视图的输出进行学习,完全避免了负样本对比。


总结

本节课我们一起学习了自监督学习。我们从其基本定义和动机出发,介绍了图像修复、拼图、旋转预测等着色等多种经典的预训练任务。随后,我们深入探讨了基于对比学习的现代方法,重点剖析了SimCLR框架的原理、损失函数和关键组件,并将其与MoCo、BYOL等方法进行了对比。自监督学习通过巧妙利用数据本身构造监督信号,为在无标签数据上学习通用、强大的视觉表征提供了有效途径。

课后阅读建议:

  1. 阅读Lillian Weng关于自监督表征学习的优秀文章。

  2. 了解MoCo V2是如何结合MoCo和SimCLR优点的。

125:视觉语言模型 - 介绍和历史 👁️🗨️📖

在本节课中,我们将要学习一个当代热门主题——视觉语言模型。我们将了解其基本概念、发展历史,以及它如何将视觉与语言理解结合起来,实现更自然的人机交互。

概述

上一节我们探讨了计算机视觉的传统任务。本节中,我们来看看视觉语言模型。计算机视觉传统上专注于物体分类、检测、实例分割和语义分割等任务。这些任务对现实应用产生了重大影响。然而,它们输出的是类别标签、边界框或生成的图像。它们缺乏一个元素,即通过文本以有机和自然的方式与人类交流。

视觉与语言的早期结合

此前已有将语言融入计算机视觉任务的努力。在我们早期课程探讨的主题中,我们看到了图像描述。该任务接收一张图像,并提供关于该图像的文本描述。还有视觉问答。给定一张图像和一个问题,模型需要回答关于图像的问题。这些任务已经存在数年。

近年来,出现了更多此类任务。一个例子是文本到图像生成。得益于当代生成模型的成功,我们现在有了相当不错的文本到图像生成能力。或者还有在过去一年左右出现的文本到视频检索。

自然语言处理的视角

从自然语言处理的角度看,其标准任务包括搜索引擎、垃圾邮件过滤、机器翻译、情感分析等。这些任务也有其固有的局限性。虽然它们擅长分析和生成文本,但它们显然无法处理视觉线索。它们也无法根据现实世界的视觉参考来验证解释,尤其是在存在语言歧义时。

语言模型的发展

语言模型始于理解和生成文本的目标。近年来,它们主要基于Transformer架构。其尝试是从原始文本中学习。这些语言模型在过去几年演变成了大型语言模型。关键区别在于,LLMs在非常大的数据集上进行预训练。它们通常拥有非常多的参数,数量级达到数十亿或数千亿。用于训练LLMs的数据集是基于网络的文本数据集。

最流行的LLM例子是GPT。其每一步的输入是一个词序列或句子。目标输出是同一个句子,但向右移动了一个词元。GPT如何训练?训练此类大型语言模型的一个关键方面是通过自监督学习。模型从原始文本和句子中学习,目标序列向右移动一个词元。这使其能够掌握词之间的关系以进行准确的输出预测。

这被称为自回归模型。每个生成的词元都被添加到输入序列中,形成下一步的输入。GPT LLM模型与早期模型的一个关键区别是,GPT模型严格从左到右学习上下文。BERT是一种早期的语言模型,它使用双向方法,同时利用从左到右和从右到左的上下文。

其他流行的LLMs

以下是近年来流行的其他一些LLMs:

  • LaMDA:由Google开发,在1.56万亿词的公共对话数据上训练。它最初为Bard聊天机器人提供支持。

  • LLaMA:由Meta开发,这是一个相对较小的模型,参数约70亿。但它的准确度几乎与GPT-3相当。

  • BLOOM:一个开源的多语言模型,在46种自然语言和13种编程语言的数据上训练。

  • Galactica:同样由Meta开发,用于推理科学知识。

  • Codex:为GitHub Copilot提供支持的模型,精通十多种编程语言。

  • PaLM-E:由Google开发,更侧重于机器人任务。

  • Chinchilla:由Google DeepMind开发,旨在简化下游利用,因为其推理和微调所需的计算能力显著降低。

这些LLMs的应用包括代码生成、内容生成、文案写作、对话工具、教育工具等。但它们也有一些局限性。它们规模大、训练计算密集、可能存在偏见。最常被指出的局限性之一是,LLMs有时会产生幻觉,让用户相信给定的输出是真实的。

视觉语言模型的必要性

现在,让我们尝试通过结合视觉和语言模型来看看我们的方向。视觉系统是人类感知和理解世界的基础。然而,正如我们之前所见,这些视觉模型缺乏与人类进行有机交流的能力。人类如何交流?大多数情况下,物体之间及其在场景中位置的复杂关系是用人类语言或文本来描述的。

视觉语言模型试图通过共同理解两种模态来弥合视觉和语言之间的鸿沟。这是人脑非常擅长的一种能力。VLM的输出可以通过提供不同类型的提示来修改。可以提供边界框作为提示来分割图像。可以通过询问关于图像或视频的问题来进行交互式对话。甚至可以通过语言指令来操纵机器人的行为。

视觉语言模型的任务

以下是此类视觉语言模型能够解决的一些任务:

  • 图像检索:从自然语言文本中检索图像。

  • 短语定位:从输入图像和自然文本中执行物体检测。

  • 视觉问答:从输入图像和自然语言问题中寻找答案。

  • 图像描述:为给定图像生成描述。

  • 仇恨言论检测:从可能涉及文本和图像组合的社交媒体内容中检测仇恨言论。

此时可能会问一个问题:这些都是我们已经用其他深度学习模型见过的任务。那么,为什么我们需要重新发明轮子,并称一种能够执行相同任务的新模型类型为视觉语言模型呢?存在一个关键区别,那就是我们将在后续课程中讨论的这些视觉语言模型,可以在不知道或没有任何关于它将与用户交互的标签的图像的情况下完成所有这些任务。因此,它可以以零样本的方式完成许多这些任务,这与我们过去看到的模型有显著不同。

过去我们看到的任何模型,这类任务都需要大量精心策划、标注的数据来进行模型的监督学习。而在我们将要看到的视觉语言模型中,你会注意到这类任务可以针对全新的图像,甚至是我们没有图像的文本来完成。

本模块内容预告

在本模块中,你将看到哪些主题?在紧接着的下一讲中,我们将看到VLM领域最流行的模型之一,即CLIP。它代表对比语言-图像预训练。在某种意义上,这是使视觉语言任务能够以我们刚才谈到的零样本方式扩展的关键模型。这是一张来自CLIP论文的图片,我们将在下一讲中详细讨论。

除了CLIP,我们还将看到CLIP的变体,包括像BLIP这样的模型。我们还将看到所谓的多模态大型语言模型,有时也称为大型多模态模型,例如GPT-4,它也能以跨模态的方式在图像和文本之间进行推理。

总结

本节课中,我们一起学习了视觉语言模型的基本概念和发展脉络。我们回顾了传统计算机视觉和自然语言处理的局限性,探讨了大型语言模型的发展,并理解了将视觉与语言结合以创建更强大、更通用模型的必要性。视觉语言模型能够以零样本的方式处理多种跨模态任务,这标志着人工智能向更自然、更全面理解世界迈出了重要一步。下一讲,我们将深入探讨实现这一目标的关键模型——CLIP。

126:CLIP - 锚定拐点 🚀

在本节课中,我们将讨论CLIP模型,它被认为是视觉-语言模型成功道路上的一个锚定拐点。

概述

CLIP模型为视觉模型提供了一种利用文本进行监督的机制。它通过对比学习,将图像与其标题配对,使用一种非常简洁的方法,在多个数据集上超越了全监督学习的基线模型,并且正如我们在上一讲中提到的,它还能作为零样本分类器使用。

CLIP模型简介

CLIP模型在论文《从自然语言监督中学习可迁移的视觉模型》中被提出,该论文发表于ICML 2021会议,由Alec Radford领导的多位作者共同完成。开发该模型的OpenAI官方链接提供了大量有用信息,建议查阅。

回想一下我们之前关于人脸处理任务的CNN模型讲座,我们曾讨论过对比学习以及三元组损失等概念。三元组损失的目标是最小化锚点与正样本(相似样本)之间的距离,同时最大化锚点与负样本(不相似样本)之间的距离。

CLIP的核心思想

CLIP遵循了类似但更可扩展的逻辑。它旨在学习图像和文本的表征,使得匹配的图像-文本对之间的相似度最大化,而不匹配的对之间的相似度最小化。

以下是CLIP模型训练的整体思路:

  • 输入包括图像和文本。例如,一张狗的图片和对应的标题“胡椒,一只澳洲牧羊犬”。

  • 图像和文本分别通过对应的编码器(图像编码器和文本编码器)进行处理。

  • 在训练过程中,这两个编码器的参数会被微调(而非从头训练)。图像编码器可以是ResNet或视觉变换器,文本编码器可以是文本变换器。

  • 得到图像和文本的嵌入向量后,可以将它们组织成一个矩阵。我们的目标是,对于匹配的图像和文本(如I1和T1),我们希望最大化它们的点积(衡量相似度);对于不匹配的对(如I2和T1),我们希望最小化点积。

损失函数与实现

让我们看看这是如何具体实现的。假设 M_i 是第i个图像样本对应的标签的一热编码向量。Y_i^I 是第i个图像样本的余弦相似度向量(即矩阵中的一行)。

我们希望最小化交叉熵损失,使得余弦相似度向量 Y_i^I 与匹配的文本标签的一热编码向量 M_i 尽可能一致。换句话说,我们希望矩阵的每一行(对应一个图像)都接近一个一热向量,其中匹配文本的位置为1。

类似地,对于文本样本,我们也有对应的损失。T_i 是第i个文本样本对应的一热编码标签向量(跨所有图像)。Y_i^T 是第i个文本样本的余弦相似度向量(即矩阵中的一列)。我们希望每一列也匹配一个一热向量。

用于训练文本编码器和图像编码器的总体损失是这两个损失函数的平均值。

CLIP的伪代码展示了其实现的简洁性:

  1. 分别通过图像编码器和文本编码器得到嵌入向量 I_f 和 T_f。

  2. 通过权重矩阵变换并归一化这些嵌入。

  3. 计算所有图像嵌入和文本嵌入之间的两两余弦相似度作为逻辑值,并使用一个指数缩放因子进行放大。

  4. 最后,对我们刚才提到的行向量和列向量实现交叉熵损失。

# 伪代码示意
I_f = image_encoder(image)  # 图像嵌入
T_f = text_encoder(text)    # 文本嵌入
logits = scale_factor * cosine_similarity(I_f, T_f.T)  # 计算相似度矩阵
loss = (cross_entropy_loss(logits, image_labels) + cross_entropy_loss(logits.T, text_labels)) / 2

CLIP的零样本学习能力

CLIP如何用于我们一直声称的零样本学习呢?首先,快速回顾一下零样本学习的含义:与监督学习不同,零样本学习中模型只在已见类别的数据上训练,但需要在测试时对未见类别进行分类。

传统的纯监督图像分类模型受限于固定的输出标签空间,在推理时缺乏对新标签的泛化能力。CLIP通过以下方式处理零样本分类:

  1. 训练好图像编码器和文本编码器后,可以从标签文本创建数据集分类器。

  2. 对于一张新图像和一个新的文本标签(例如训练时未见的“狗”),可以构建提示“一张狗的照片”。

  3. 将图像通过训练好的图像编码器,将文本提示通过训练好的文本编码器。

  4. 计算图像嵌入与所有文本嵌入的余弦相似度(点积)。

  5. 具有最高相似度的文本标签即被预测为该图像的类别。

这种“魔法”之所以能发生,是因为图像编码器和文本编码器在大量数据上学习了高质量的嵌入,即使对于未见过的类别,也能将图像和文本映射到同一个空间,使得正确的匹配自动发生。

训练数据与模型设计

显然,这要求模型最初在大量数据上进行训练。CLIP的作者创建了名为WebImageText(WIT)的数据集,该数据集包含从互联网各种公开来源收集的4亿个图像-文本对,这是其成功的关键。

在模型设计方面,有以下考虑:

  • 视觉编码器:尝试了ResNet系列和Vision Transformer系列模型。

  • 文本编码器:使用了类似GPT的标准变换器改编版。

  • 优化:使用Adam优化器,温度缩放因子为0.007,批量大小为32,768,训练32个周期。

最大的ResNet模型在592个V100 GPU上训练了约18天,最大的ViT模型在256个V100 GPU上训练了约12天。

实验结果

基于这种简洁的方法,CLIP报告了一些令人印象深刻的结果:

零样本迁移性能:在涵盖27个数据集的评估套件中,零样本CLIP分类器在16个数据集上超越了在ResNet50特征上训练的全监督线性分类器。这表明CLIP对于通用任务效果很好,但在卫星图像等特定领域任务上表现不佳,需要微调。

线性探测性能:在CLIP图像特征表示上训练的线性分类器,在多个基准测试中显著优于EfficientNet等基线模型,包括ViT。随着模型容量(每图像GFLOPs)增加,CLIP性能提升更明显。

少样本学习性能:CLIP的零样本性能已经很高。即使为其他模型提供每个未见类别16个样本,在CLIP特征上构建的线性分类器仍然显著优于任何其他基线。

分布偏移的鲁棒性:CLIP展现出强大的鲁棒性。例如,在包含“香蕉”类别的多个自然分布偏移数据集上,零样本CLIP的性能保持稳定,而仅在ImageNet上训练的ResNet101模型性能则随着分布偏移增大而下降。

总结

本节课我们一起学习了CLIP模型。它通过在大规模图像-文本对上进行对比学习,统一了图像和文本的表征空间。其核心在于最大化匹配对的相似度,最小化不匹配对的相似度。CLIP的简洁架构使其易于实现,而其强大的零样本、少样本学习能力以及对分布偏移的鲁棒性,源于在超大规模数据集(WIT,4亿对)上的训练。这些特性使其成为视觉-语言模型发展中的一个重要里程碑。


注:更多关于CLIP模型的细节,请参阅其原始论文和OpenAI官方网站。如需了解代码实现,也可查看Hugging Face的相关链接。

127:超越CLIP - BLIP、BLIP-2和CoCA

在本节课中,我们将学习几种扩展并超越CLIP的视觉语言模型。我们将探讨它们的架构组件,以及它们是如何被整合在一起的。

概述

我们将首先回顾CLIP模型的局限性,然后详细介绍BLIP、BLIP-2和CoCA这三个模型。这些模型在架构设计、训练目标和数据处理方面都做出了重要改进,旨在解决CLIP的不足,并在视觉语言理解和生成任务上取得更好的效果。

CLIP的局限性

如果审视CLIP模型,可以发现几个它可能失效的局限性。

首先,CLIP的目标是学习良好的图像-语言联合表示。然而,这种编码器模型可能不容易迁移到文本生成任务,例如根据给定图像生成描述。

第二个局限来自数据层面。CLIP使用网络抓取的图文对数据来构建模型。我们将要讨论的后续工作之一BLIP指出,这种嘈杂的网络抓取数据对于视觉语言学习可能并非完全最优。

以下是几个网络抓取文本和使用BLIP训练的模型生成文本的示例。请注意,对于一张图片,网络抓取的文本可能是“在桑德布里奇我们租的海滩别墅度过的一周”。从网络抓取数据的问题有几个:人们可能写了一篇文章并附上了一张图片,因此文本可能不完全对应图片,而是围绕图片的故事。有时,抓取过程还会引入浏览器上用于无障碍访问的替代文本,这些文本有时可能与图片不完全匹配,甚至可能是出于营销或搜索引擎优化的目的而编写的。因此,这些嘈杂的网络抓取文本可能不完全有助于学习良好的视觉语言表示,这是这些后续模型之一的观点。

BLIP:统一视觉语言理解与生成

那么,我们该怎么做呢?这就是BLIP发挥作用的地方。

BLIP代表Bootstrapping Language-Image Pretraining for Unified Vision-Language Understanding and Generation,这篇论文发表于2022年的ICML。他们的目标是解决CLIP中的模型问题。

他们的整个模型由四个组件构成:

  1. VIT图像编码器

  2. BERT文本编码器

  3. 基于图像的文本编码器

  4. 基于图像的文本解码器

系统的输入是一张被分割成块的图像,以及对应的文本描述。

模型架构详解

给定一张被分割成块的图像,通过一个标准的、包含N个Transformer块的VIT编码器,我们得到图像嵌入作为该编码器的输出。这里的VIT具有标准的自注意力模块和前馈模块。

在下一个模块中,我们有BERT文本编码器,我们向其提供与图像对应的文本描述(例如来自嘈杂的网络抓取文本),以及一个[CLS]标记。请记住,每当向Transformer提供[CLS]标记时,它有助于成为Transformer的输出标记,最终可以从中获得分类标签。因此,他们有[CLS]标记,并得到BERT文本编码器的输出。这里使用了图像-文本对比损失,我们稍后会讨论这是如何实现的。这个BERT文本编码器具有双向自注意力,这意味着自注意力作用于句子中给定标记的两侧。这里没有交叉注意力组件,因为此时没有图像输入到文本编码器中,所以只有Transformer中稍后的前馈层,最终得到Transformer输出的嵌入。

图像-文本对比损失 用于匹配预期匹配的图像-文本对的表示,并推开不匹配的图像-文本对的表示。这意味着在一个批次中提供正样本对和负样本对,以计算图像-文本对比损失。这与许多其他对齐图像和文本嵌入的方法类似。

接下来是第三个模块:基于图像的文本编码器。它接收相同的文本描述作为输入,以及一个名为[Encode]的标记。但这次,他们还把来自VIT的图像嵌入作为文本编码器的附加输入,这就是为什么它被称为“基于图像”的文本编码器。这里有一个图像-文本匹配损失。这个基于图像的文本编码器再次具有一个双向自注意力层,然后是一个交叉注意力层(用于测量图像标记和文本标记之间的注意力),接着又是一个前馈层。该模块的输出通过图像-文本匹配损失进行匹配,该损失试图学习图像-文本多模态表示,以获得更好的图像与语言对齐。

图像-文本匹配损失 的实现方式是输出一个单一的分类结果,判断图像和文本是否匹配。与对比损失检查正负样本对不同,在这种情况下,它是一个简单的图像-文本是否匹配的分类任务,可以假设为标准交叉熵或二元交叉熵损失。

最后,作为最后一个模块,我们有基于图像的文本解码器。这里再次将描述作为输入标记提供,以及一个名为[Decode]的标记。这个基于图像的文本解码器具有一个略有不同的自注意力模块,称为因果自注意力模块,这在许多语言模型中很常见。自注意力只作用于前面的标记,而不作用于任何后面的标记。因此,后面的标记被屏蔽,任何标记t的自注意力仅取决于该序列中所有小于t的标记。这样做是为了让模型以自回归的方式学习预测文本,即仅通过查看前面的文本来预测下一个词。显然,你可以想象这个模块的输出是什么:给定图像,输出文本描述。在第四个模块中,图像嵌入再次被提供以与文本标记一起进行“接地”。因此,该模块的目的是在给定图像的情况下生成文本描述,并优化交叉熵损失,该损失以标准的自回归方式训练模型以最大化文本的可能性。

以上就是BLIP整合在一起的不同模块。

数据清洗与增强

除此之外,BLIP还指出了嘈杂的网络抓取文本在学习良好视觉语言表示方面的次优问题,并对此采取了措施。他们为此引入了一个相当强大的处理流程。

他们引入了一个称为Captioner and Filter的模块。该模块包含两个网络。模型首先考虑这些网络抓取的文本,例如,像这样一张图片从网上抓取的文本可能是“日落公园的蓝天面包店,面包店通常会在网站上放出他们的菜单图片”。他们有一个过滤器来判断这是否是此类图像的合适描述。这个过滤器是单独在人工标注的数据集上学习的。他们还学习了一个专门的描述生成模块,给定这张图像,生成一个合成描述。这就是我们在前面幻灯片中看到的描述,现在写着“顶部有绿色糖霜和巧克力糖屑的巧克力蛋糕”。同一个过滤器将这个描述判定为这张特定图像的有效描述。

以下是构建这些描述生成模块和过滤模块的具体步骤:

  1. 他们首先使用网络抓取的数据集和人工标注的数据集来训练他们的模型,该模型称为多模态编码器-解码器。

  2. 一旦有了多模态编码器-解码器的初始版本,就用它来训练一个过滤模块。该过滤模块是一个基于图像的文本编码器,接收所有人工标注的图文对作为输入,并使用图像-文本对比损失和图像-文本匹配损失进行训练。这个过滤器学习查看图文对并判断它们是否良好。

  3. 有了这个过滤器后,他们处理网络抓取的图文对,只有通过过滤模块的“好”样本被保留下来。

  4. 同时,他们使用相同的人工标注数据训练一个描述生成模块(同样是一个基于图像的文本解码器)。基于这个描述生成模块,他们现在获取网络抓取的图像并生成一批合成描述。于是,现在有了网络抓取图像和生成的合成数据。

  5. 这些数据现在被用来再次精炼过滤器,同时也得到网络抓取图像与合成数据的配对。

  6. 最终,经过过滤的优质网络抓取数据、合成文本数据以及人工标注数据共同形成了一个新的数据集。

  7. 这个新数据集被用来输入并精炼他们整体的多模态编码器-解码器模型,从而在最后得到一个更好的模型。

因此,他们不仅从架构上与CLIP不同,还通过这种方法改进了数据流水线以获得更好的结果。这个最终的多模态编码器-解码器模型被用于各种下游任务,如图像描述生成等。

BLIP-2:使用冻结骨干模型

接下来是BLIP-2,它发表于2023年的ICML。

BLIP-2代表Bootstrapping Language-Image Pretraining with Frozen Image Encoders and Large Language Models。其动机是,我们通常希望使用冻结的预训练视觉模型或语言模型。不幸的是,在此之前的所有方法都试图进行大规模模型的端到端微调或训练,这可能非常昂贵甚至难以实现。BLIP-2的主要关注点是如何提出一种方法来使用冻结的视觉和语言任务骨干模型,这是他们的目标,并提出了一种有趣的方法来实现这一点。

当使用冻结的骨干模型时,显然可能会引入模态鸿沟,因为你不是在微调视觉编码器或文本编码器来对齐嵌入,而是冻结了它们。因此,BLIP-2引入了一个想法来克服这个问题,同时不需要显式地精炼骨干图像或文本模型。

他们的整体流程分为两部分:

  1. 视觉与语言表示学习:这部分实际上尝试使用冻结的骨干,并找到一种方法来对齐表示。

  2. 视觉语言生成学习:这部分生成文本。

以下是其工作原理:在视觉与语言表示学习模块中,给定图像和文本,将图像输入到一个冻结的图像编码器(图中图标表示该模块被冻结)。图像编码器的输出被提供给一个Q-Former,这是BLIP-2框架中的贡献,也称为查询Transformer。它有一组可学习的查询标记,与文本一起作为输入提供。在另一侧,从视觉语言生成学习的角度来看,他们有一个同样是冻结的大型语言模型,接收Q-Former的输出,并为提供给图像编码器的图像写出描述。

Q-Former详解

在表示学习组件中,给定一张被分割成块的图像,它进入冻结的图像编码器。在Q-Former内部,有两种Transformer块。第一个Transformer块有一个自注意力模块、一个交叉注意力模块和一个前馈层。它还接收一组可学习的查询标记。可学习查询标记指的是在经验研究中,他们尝试了多达32个标记。这些标记是向量,预先初始化为某些值,但当模型学习时,也会通过反向传播更新这些标记,这就是我们所说的可学习查询。这些标记作为输入提供,在交叉注意力层中,这些查询标记和图像标记之间存在交叉注意力,其输出被提供给一个前馈层。在另一侧,有一个文本编码器,它再次具有自注意力模块和前馈模块,那里没有交叉注意力,因为在该特定模块中除了文本没有其他输入。这里也有一个图像-文本对比学习损失。

你看到的这三个损失(或对应损失的任务)——图像-文本匹配、图像-文本对比学习和基于图像的文本生成——与BLIP非常相似,并使用相同的损失函数。但这里还有一些不同之处,即注意力有三种不同的类型。通过颜色可以看出,这个Transformer和另一个Transformer中的前馈层是不同的,它们的权重不同,执行不同的任务。交叉注意力显然只存在于这个Transformer中。然而,自注意力权重在两个Transformer之间是共享的,但以一种略微独特的方式共享。他们以三种不同的方式使用这种注意力,分别用于图像-文本匹配、图像-文本对比学习和基于图像的文本生成这三个任务。

以下是注意力掩码的细节:给定Q个查询标记和T个文本标记,阴影块被屏蔽,非阴影块未被屏蔽。

  • 双向自注意力掩码:用于图像-文本匹配。允许查询标记和文本标记完全双向相互匹配。

  • 多模态因果自注意力掩码:用于基于图像的文本生成任务。他们使用因果自注意力,这意味着图像可以看到所有图像标记(因为图像部分没有因果性),文本也可以看到所有图像标记,但文本只能看到前面的文本标记,而不能看到后面的文本标记。后面的文本标记被屏蔽,因为与BLIP类似,他们使用因果自注意力,以便能够以自回归的方式生成文本,只查看迄今为止已看到的文本标记。

  • 单模态自注意力掩码:用于图像-文本对比学习。可以清楚地看到,图像标记只能看到图像标记,文本标记只能看到文本标记,因此被称为单模态自注意力掩码。

以上就是构成BLIP-2视觉与语言表示学习整体框架的内容。

生成学习模块

一旦在Q-Former中完成这些,Q-Former的输出标记就进入生成模块。在生成学习模块中,他们考虑了两种不同的方法。

  1. Q-Former的输出标记(请注意,Q-Former的输出标记数量与可学习查询标记的数量相同)通过一个全连接层,作为输入提供给一个冻结的LLM解码器。在这个实验中,他们使用OPT LLM来研究他们的方法。然后,这个LLM解码器为图像输出文本,例如“一只戴着太阳镜的猫”。

  2. 在生成模块中,他们还测试了一个变体,其中Q-Former的输出查询标记再次通过一个全连接层,然后首先作为查询和前缀文本提供给一个LLM编码器。然后,LLM编码器将其转发给一个LLM解码器。例如,给定前缀文本“一只猫”,模型输出“戴着太阳镜”。为此,他们使用Flan-T5编码器-解码器模型进行研究。

这就是BLIP-2的整体架构。

CoCA:对比描述生成器

我们将在本讲座中讨论的第三个视觉语言模型是CoCA。

CoCA代表Contrastive Captioners,这篇论文的标题是“对比描述生成器是图像-文本基础模型”,发表于2022年的《机器学习研究汇刊》。

CoCA模型的目标是统一不同的范式,即他们试图引入一种方法,将单编码器模型、双编码器模型以及编码器-解码器范式结合在一起,以获得能够解决各种任务的基础模型。因此,他们理想地希望训练一个包含所有这些方法功能的图像-文本基础模型。

他们的方法相当简单:他们有一个图像编码器,一个单模态文本解码器(请注意,他们从单编码器-解码器类模型开始,这是他们议程的一部分)。然后,他们使用单模态文本解码器的输出进行交叉注意力,构建一个多模态文本解码器。他们使用两种损失函数来训练这样的整体模型:对比损失和描述生成损失。

以下是其架构的更多细节:在预训练阶段,他们有一张图像和相应的描述,因此有这些图文对。他们还使用正负样本对,因为他们在方法中使用了对比损失。图像通过图像编码器,文本通过单模态文本解码器以及一个用于对比损失的[CLS]标记。图像编码器输出一组标记,以及一个用于对比损失的标记;文本解码器也输出一个[CLS]标记。对比损失由图像到文本和文本到图像两部分组成。他们使用标准的softmax形式的对比损失方程来比较正样本对(希望增加相似性)和负样本对(希望减少相似性)。

如前所述,从图像编码器获得的所有标记与文本解码器的输出进行交叉注意力,从而产生多模态文本解码器,该解码器也输出模型最终生成的描述。为了使用描述生成损失来训练描述生成任务,他们使用标准的自回归损失函数,试图最小化给定图像输入x和t之前所有标记的条件下,y_t的对数概率。这是一个标准的自回归损失。这些是他们用来构建框架的组件,他们训练模型的最终损失是对比损失和描述生成损失的加权组合。

他们展示了这种方法如何用于我们讨论过的不同范式:单编码器、双编码器和编码器-解码器。在预训练过程之后,整个方法现在可以用于多个下游任务。它可以用于视觉分类或图像分类下游任务;可以用于跨模态对齐任务;还可以将所有组件放在一起,然后使用描述生成损失进行训练。因此,可以通过同一种方法服务于多种目的。

总结

在本节课中,我们一起学习了三种超越CLIP的视觉语言模型:BLIP、BLIP-2和CoCA。

  • BLIP 通过引入多任务学习框架(结合理解与生成任务)和创新的数据清洗流程(Captioner and Filter),解决了CLIP在生成任务和数据噪声方面的局限性。

  • BLIP-2 专注于高效性,提出了Q-Former这一轻量级查询Transformer,成功桥接了冻结的预训练视觉编码器和大型语言模型,实现了强大的零样本生成能力,同时大幅降低了训练成本。

  • CoCA 则旨在统一多种视觉语言范式,通过一个结合了对比损失和描述生成损失的简单架构,使单个模型能够同时胜任分类、检索和生成等多种下游任务。

这些模型代表了视觉语言领域从单一对比学习到多任务统一、从全参数微调到高效利用冻结大模型的重要发展路径。

128:从VLM到多模态LLM 🚀

在本节课中,我们将超越视觉语言模型,探讨更近期的当代模型——多模态大语言模型。这些模型有时也被称为MLM或LMM。虽然这些缩写可能令人困惑,但它们通常指代多模态大语言模型或大型多模态模型。我们将尝试涵盖几种不同的模型,如Lava、Video-ChatGPT、GPT-4V和Gemini 1.5。请注意,关于Gemini 1.5,我们目前只有初步信息。

概述

上一节我们介绍了多种视觉语言模型。本节中,我们将探讨它们与多模态大语言模型的关键区别。核心差异在于,在多模态大语言模型中,我们不修改大语言模型本身,而是专注于如何将图像或视频作为额外的输入标记提供给大语言模型。相比之下,在CLIP和BLIP等模型中,我们尝试在架构内部对齐图像和文本。

Lava:语言与视觉助手 🖼️

Lava是此背景下首个成功的图像-文本对话模型。它通过指令微调整合了视觉和语言模型,其目标是微调给大语言模型的指令,而大语言模型本身保持不变。

Lava利用GPT-4生成其多模态指令遵循数据。其指令微调(也称为视觉指令微调)采用两阶段流程。

两阶段流程

以下是Lava训练的两个主要阶段:

  1. 特征对齐预训练阶段:在此阶段,模型使用图像-文本对进行特征对齐。视觉编码器和LLM的权重被冻结,仅更新投影矩阵 W。目标是学习最佳的图像标记,使其能与LLM的词嵌入一起作为输入。

    • 公式:H_v = W * Z_v,其中 Z_v 是视觉编码器输出的特征,W 是待学习的投影矩阵,H_v 是投影后的视觉标记。
  2. 端到端微调阶段:在此阶段,模型使用多模态指令数据进行端到端微调。更新投影层和LLM的预训练权重,但保持视觉编码器权重冻结。

数据生成

为了训练模型,他们使用COCO数据集生成三种指令遵循数据:

以下是生成的三种数据类型:

  • 对话:生成单轮或多轮问答。

  • 详细描述:要求模型对图像场景进行详细描述。

  • 复杂推理:提出需要多步推理的问题。

通过这种方法训练的Lava模型在多项任务上展现出强大的性能,特别是在零样本泛化到新领域方面,显著优于BLIP-2和Open Flamingo等模型。

Video-ChatGPT:视频理解模型 🎥

从图像扩展到视频领域,Video-ChatGPT是一个专注于详细视频理解的多模态大语言模型。其目标是与视频生成有意义的对话。

模型架构

Video-ChatGPT将大语言模型与预训练的视觉编码器结合,以获取时空视频表征。其处理流程如下:

  1. 视觉编码:使用ViT-L/14编码器处理视频帧,得到帧级特征。

  2. 时空池化:

    • 时间池化:对帧级特征在时间维度上进行平均,得到表征全局时间信息的特征 T_i。

    • 空间池化:对帧级特征在空间维度上进行平均,得到表征每帧空间信息的特征 Z_s。

  3. 特征融合:将 T_i 和 Z_s 拼接,形成最终的视频级特征 V_i。

  4. 投影与输入:通过一个线性层 G 将 V_i 投影到语言解码器的嵌入空间,生成视觉标记 Q_v。这些视觉标记与文本查询一起输入到大语言模型中。

数据与训练

他们通过人工辅助和半自动标注,策划了约10万个高质量的视频-指令对,涵盖了广泛的概念。在微调过程中,他们使用特定的提示格式,例如“用户指令:[视频标记] 助手:”,以帮助模型理解输入包含视频。

评估显示,Video-ChatGPT能够有效回答关于视频内容的多种问题,例如描述活动、计数物体等。

向闭源模型的转变与影响 🔒

在介绍了Lava和Video-ChatGPT之后,我们来看更近期的模型如GPT-4V和Gemini 1.5。值得注意的是,过去几个月出现了一个趋势:转向闭源模型。

这一转变有利有弊:

优点:

  • 保护公司的知识产权和专有技术。

  • 可能降低模型被攻击的安全风险。

缺点:

  • 透明度与信任问题:模型工作原理不公开,可能引发质疑。

  • 可复现性挑战:其他研究者难以复现结果。

  • 创新限制:学术界和小团队难以在这些基础模型上构建新应用。

  • 可访问性障碍:可能导致技术和专业知识获取的不平等。

尽管存在这些担忧,目前许多领先模型如GPT-4V和Gemini 1.5都未公开其架构细节。

GPT-4V 与 Gemini 1.5 的应用示例 ✨

由于无法深入探讨其架构,我们仅能展示这些模型的应用能力。

GPT-4V 的能力

GPT-4V具备广泛的多模态能力:

以下是其主要功能示例:

  • 物体识别:准确识别并描述图像中的物体。

  • 文本转录:从图像中提取手写或印刷文本。

  • 图表理解:从条形图、曲线图等图形内容中提取数据并总结。

  • 多条件处理:分析不同条件下的图像。

  • 教育辅助:将图表和视觉辅助工具转化为详细的文字解释。

  • 代码生成:将流程图等视觉结构解释为代码。

  • 设计理解:分解设计元素并提供文本见解。

Gemini 1.5 的突破:超长上下文

Gemini 1.5的一个显著特点是其超长的上下文窗口,支持高达1000万标记的输入。这意味着:

以下是其上下文容量的具体体现:

  • 可以输入长达1小时的视频、11小时的音频、3万行代码或70万单词作为提示上下文。

  • 例如,可以将整个代码库作为上下文附加到问题中,让模型在代码中定位特定功能。

  • 另一个例子是,将语法书和词典作为上下文输入,要求模型进行特定语言的翻译。

这种能力为复杂任务的理解和处理打开了新的大门。

总结

本节课中,我们一起学习了从视觉语言模型到多模态大语言模型的发展。我们探讨了Lava和Video-ChatGPT的架构与训练方法,分析了当前模型闭源化的趋势及其影响,并了解了GPT-4V和Gemini 1.5等先进模型的应用能力。多模态大语言模型通过将视觉信息作为标记输入大语言模型,正在推动人工智能在理解和交互方面迈向新的高度。

129:课程总结与前沿展望 🎓

在本节课中,我们将对为期12周的课程进行总结,并展望一些未能在课程中深入探讨的重要主题以及计算机视觉领域的新兴方向和应用。

课程回顾与展望

经过12周的讲座学习,希望各位已从中汲取了有价值的知识。现在,我们来到本课程的总结部分。在最后的这几分钟里,我将分享一些本课程未能涵盖的主题,并介绍一些值得关注的计算机视觉新兴领域和应用。

有限监督学习 📊

上一节我们回顾了课程核心,本节中我们来看看一个我们本周早些时候简要提及,但具有多面性和多维度的重要主题:有限监督学习。

在标准的监督学习设置中,你有一个训练集,训练一个学习器,得到一个模型,该模型用于测试集。现在,你可以将此范式适配到其他几种范式中,其中一些我们已经见过,一些尚未涉及。

以下是几种有限监督学习的范式:

  • 多任务学习:在这种设置中,你使用来自多个不同任务的数据训练一个模型,学习一个单一的模型,使其在测试时能够对图像中的所有任务进行分类。例如,给定一张人脸图像,你可能希望使用单一模型识别人的身份、表情、姿态等,这就属于多任务学习。

  • 迁移学习:我们在课程早期已经见过。你拥有源域数据并训练了一个模型,然后利用该模型的知识,在另一个目标数据集上训练一个不同的模型,使其在目标域上表现良好。微调是深度学习计算机视觉中最常用和首选的方法之一,但也有其他方法可用于迁移学习。

  • 领域自适应:这是迁移学习的一个变体或泛化。在源域中,你不一定学习一个模型,而是直接使用源数据来训练一个在目标域上执行的模型。从图示上看,领域自适应与多任务学习相似,但存在细微差别。在多任务学习中,目标是在测试时在每个任务上都表现良好;而在领域自适应中,目标仅在目标域上表现良好,源域仅用于提供来自另一个领域的适应或额外信息。

  • K样本学习:这是少样本或零样本学习的泛化。我们有一组拥有大量数据的类别,以及一组只有k个样本(k可以是0)的类别。我们需要训练一个模型,使其在所有类别上都表现良好。我们在此看到了一些方法的示例。

  • 持续学习:近年来变得流行。与多任务学习类似,你同样有多个任务,唯一的区别在于任务可能随时间不断增量式地到来,任务的范围可能不受限制。你需要训练一个模型,使其适用于迄今为止见过的所有任务。这在你无法访问先前任务数据时尤其具有挑战性。

  • 领域泛化:可以将其视为领域自适应的扩展。在这种情况下,你有多个域(例如源域和目标域),你训练一个模型,但该模型现在必须在第三个或不同的域上工作。这就是我们称之为领域泛化的原因。

所有这些在计算机视觉的深度学习中都是非常当代的主题,旨在超越我们通常理解的、可以通过工程化网络并以全面方式训练和评估来解决的监督学习。

强化学习与计算机视觉的交集 🤖

另一个本课程范围未能涵盖的重要主题是强化学习与计算机视觉的交集。

强化学习是一种机器学习范式,类似于监督学习和无监督学习,其中智能体采取行动并与环境交互,以最大化潜在的延迟奖励。这通常被建模为马尔可夫决策过程。

强化学习在计算机视觉中何处使用?我们已经看到几个例子。我们看到了强化学习的使用,至少在硬注意力中简要提及过。在无法进行反向传播的情况下,我们说过使用基于强化学习的算法。我们刚刚看到的神经架构搜索也使用了基于强化学习的方法来搜索架构。

以下是强化学习在视觉中的一些应用用例:

  • 游戏:例如,在Atari游戏中自动玩游戏,需要理解屏幕上的视觉元素,并使用强化学习给出智能体为获得特定奖励而必须采取的一系列动作。

  • 视觉巡视:使用强化学习来移动电机,以实现特定目的(如捕捉图像)。

  • 视觉跟踪:也可以使用强化学习来完成。

还有更多应用,但以上是强化学习在视觉中的一些示例用例。

其他当代主题与方法 🌐

更广泛地说,其他在方法方面的当代主题包括:

  • 自我中心视觉:相机放置在穿越环境的人身上,而非作为监控摄像头或网络摄像头。问题涉及如何使用相机数据流来看待个体周围的世界。例如,基于像谷歌眼镜这样的可穿戴设备,或为视障人士开发技术,问题必须从该个体的自我中心视角来看待。

  • 具身视觉:与自我中心视觉相似,我们讨论嵌入人体内的视觉技术。还有视觉感知与机器人技术的交叉,这是一个非常有用和当代的主题。

  • 高光谱图像分析:试图理解不同光谱的图像,例如紫外线图像或红外图像等。我们目前讨论的许多方法可以直接应用于高光谱图像,可能只是输入通道数量的差异。然而,研究可见光及以外光谱的图像对于夜间视觉、天文学等许多领域是重要的研究领域。

  • 增强现实与虚拟现实的计算机视觉:虽然过去可能用于娱乐行业的游戏,但如今对于任何类型的远程交互(无论是教学、教育还是简单的家庭互动)也变得重要起来。在增强现实和虚拟现实环境中进行计算机视觉正成为一个重要主题。

  • 公平、可解释和可信的模型:这仍然是一个非常重要的主题。我们看到了解释CNN决策的各种方法,但可以更进一步,讨论这些模型的公平性,消除数据中可能存在的任何偏见,并帮助人类在这些模型上建立信任。

新兴应用领域 🚀

一些近年来非常流行并受到广泛关注的应用包括:

  • 自主导航视觉:自动驾驶汽车,这是一个非常重要的主题,工业界投入了大量资金,如Uber、特斯拉、谷歌等公司都在这个方向上投入了大量精力。

  • 无人机图像视觉:无人机在从安防到灾难管理的各种任务中变得越来越流行。如何理解来自无人机的图像成为一项重要任务。

  • 全季节视觉:许多可用的数据集都基于日光场景。如何使这些任务在恶劣天气和光照条件下工作,成为视觉应用的一个非常普遍的背景。

  • 医疗保健和生物医学成像视觉:继续是一个重要主题。

  • 农业视觉:在过去几年中获得了很大关注,利用深度学习和计算机视觉模型进行精准农业,理解植物表型,喷洒农药,了解一块土地的收成等。

  • 时尚与零售视觉:尝试使用虚拟试穿来看一个人穿某件衣服的效果,或者像亚马逊Go那样在购物环境中使用计算机视觉来自动化购物体验,是视觉应用的一个重要维度。

  • 体育视觉:一个具有巨大商业利益的应用。在许多不同的体育项目中,计算机视觉正被用于理解人体生物力学(可能用于康复)、理解足球场上的策略、分析特定球员的动作(无论是针对对手还是该球员的教练)等。

总结与致谢

让我重申,计算机视觉远比我们在本课程中涵盖的主题更广泛。回想本课程的第一讲,我们说过可以将计算机视觉分为三个部分:基于学习的视觉、基于几何的视觉和基于物理的视觉。在很大程度上,本课程我们专注于基于学习的视觉。如果你想了解更多关于基于几何的视觉或基于物理的视觉,可以回顾并重新访问提供的链接。

借此机会,我要感谢所有资源,包括公开可用的深度学习和计算机视觉课程,它们无疑启发并帮助创建了本课程的内容。虽然本课程的内容是独立创建的,但肯定受到了不同来源的影响,内容也进行了改编和借鉴。我们感谢所有这些来源,如果材料中有任何错误,我们将乐意接受您的建议并在未来改进。

最后,感谢你们每一位参与本课程,希望你们通过讲座、测验和作业从本课程中学到了有价值的东西。祝你们学习愉快,并希望你们有机会在这个领域做更多的事情。谢谢。


本节课中我们一起学习了计算机视觉深度学习课程的总结,并展望了包括有限监督学习、强化学习交叉应用、以及多个新兴前沿领域(如自我中心视觉、AR/VR视觉、公平性模型)和实际应用(如自动驾驶、农业、体育分析)。我们认识到计算机视觉领域广阔,本课程主要聚焦于基于学习的视觉,鼓励大家继续探索基于几何和物理的视觉等其他分支。

posted @ 2026-10-17 13:17  绝不原创的飞龙  阅读(7)  评论(0)    收藏  举报