笔记|生成模型(十一):UIT和DiT架构详解
UIT
论文链接:All are
Worth Words: A ViT Backbone for Diffusion Models
官方实现:baofff/U-ViT
扩散模型自从被提出后,主干网络一直都是各种基于卷积的 UNet
的变体。而在其他领域,Transformer 架构则更加流行,尤其是由于 Transformer
多模态性能和缩放能力都很强,因此把 Transformer
架构用于扩散模型是很值得尝试的。这篇 U-ViT
的工作就是一个不错的尝试。
U-ViT 的设计
在开始具体的介绍之前,可以先看一下 U-ViT
整体的架构。可以看出其有几个主要的特点:
所有的元素,包括 latent、timestep、condition 等都以 token
的形式进行了 embedding;
类似于 UNet,在不同的 Transformer Block
层之间添加了长跳跃连接。
虽然理论上来说这两个点都比较简单,但作者进行了一系列实验来选择比较好的设计。
长跳跃连接的实现
将主分支和长跳跃连接分支的特征分别记为 \(h_m\) 和 \(h_s\)。作者选取了几种不同的实现 ...
笔记|生成模型(十):Classifier-Free Guidance 理论与实现
论文链接:Classifier-Free Diffusion
Guidance
上一篇文章我们学习了 Classifier
Guidance,这种方法通过引入一个额外的分类器,使用梯度引导的方式成功地实现了条件生成。虽然
Classifier Guidance 可以直接复用训练好的 diffusion
models,不过这种方法的问题是很明显的,首先需要额外训练一个分类器,而且这个分类器不仅仅分类一般的图像,还需要分类加噪后的图像,这会给方法带来比较大的额外开销;其次分类器训练完成后类别就固定下来了,如果希望生成新的类别就需要重新训练分类器。这篇文章学习的
Classifier-Free Guidance 则可以比较好地解决这些问题。
Classifier-Free Guidance
在 Classifier Guidance 中,从条件概率 \(p(\mathbf{x}_t|y)\) 出发,利用贝叶斯公式和
score function
推导出了以下公式,在下面的公式中,等号右侧的第一项已知,第二项则需要引入分类器进行计算。
\[
\nabla_{\mathbf{x}_t}\lo ...
笔记|生成模型(九):Classifier Guidance 理论与实现
转载自:Classifier-Free
Guidance 理论与实现 论文链接:Diffusion Models Beat GANs on
Image Synthesis*
在前边的几篇文章中我们已经学习了DDPM和DDIM,不过这些方法都只能进行无条件生成,而无法对生成过程进行控制。我们这次学习的不再是无条件生成,而是通过一定方式对生成过程进行控制,比较常见的有两种:Classifier
Guidance 与 Classifier-Free Guidance,本文首先介绍第一种。
一些工作背景
实际上 Classifier Guidance 是上边给出的论文工作中的一部分,虽然
Improved DDPM 已经比较有效地提升了 DDPM
的生成效果,但在一些大数据集上的效果仍然不如当时主流的生成模型 GAN。因此
OpenAI 在 Improved DDPM
的基础上继续进行了一些改进,主要是一些工程上的改进:
在模型的尺寸基本不变的前提下,提升模型的深度与宽度之比,相当于使用更深的模型;
增加多头注意力中 head 的数量;
使用多分辨率 attention,即 32x32、 ...
笔记|生成模型(八):SDE统一DDPM和SMLD
随机微分方程简介
首先介绍常微分方程和随机微分方程的基本知识,为后续讨论奠定基础。我们先从一个常微分方程(ODE)例子开始:
\[
\frac{\mathrm{d}x}{\mathrm{d}t}=f(x,t)\quad\mathrm{or}\quad\mathrm{d}x=f(x,t)\mathrm{d}t
\]
其中 \(f(x,t)\) 是关于 \(x\) 和 \(t\) 的函数,描述了 \(x\) 随时间的变化趋势,如下图左侧所示。
直观地讲,\(f(x,t)\)
对应于图中的青色箭头,确定某一时刻的 \(x(t)\) 后,沿着箭头方向可以找到下一时刻的
\(x(t+\Delta
t)\)。这个常微分方程的解析解为:
\[
x(t)=x(0)+\int_0^t f(x,\tau)\mathrm{d}\tau
\]
然而,实际应用中我们使用的 \(f(x,t)\)
通常是比较复杂的函数(如神经网络),求解析解往往不切实际。因此,通常采用迭代法求数值解:
\[
x(t+\Delta t)\approx x(t)+f(x(t),t)\Delta t
\]
在迭代过程中,每次沿箭头方向 ...
笔记|生成模型(七):Score-Based理论
Score-based 模型理论基础
生成模型通常从某个已有的概率分布中进行采样以生成样本。Score-based
模型的关键在于对概率分布的对数梯度,即 Score Function
的建模。为了学习这个对象,我们需要使用一种称为 score
matching 的技术,这是 Score-based 模型名称的由来。
Score Function
和 Score-based Models:什么是 Score?
核心思考出发点:在生成模型中,我们的目标是让模型学会真实数据的概率分布
\(p(x)\)。如果知道了这个分布,我们就能在概率高的地方采样,生成出逼真的图片。但真实分布极其复杂,直接建模
\(p(x)\)
非常困难(比如需要计算极其复杂的归一化常数 \(Z\))。
能不能换个思路? 我们不直接求概率的具体数值 \(p(x)\),而是求概率增加的方向!
就像你在爬山,你不需要知道整座山的海拔地图(绝对概率),你只需要知道站在当前位置,往哪个方向走最陡峭(梯度),顺着走就能爬到山顶(高概率区域,即真实的图片)。
这个“概率增加的方向”,在数学上就是对数概率的梯度,我们称之为
Score ...
笔记|生成模型(六):DDIM理论
论文链接:Denoising
Diffusion Implicit Models
在DDPM理论中我们进行了 DDPM
的理论推导以及给出了核心代码。但 DDPM
有一个非常明显的问题:采样过程很慢。因为 DDPM
的反向过程利用了马尔可夫假设,所以每次都必须在相邻的时间步之间进行去噪,而不能跳过中间步骤。原始论文使用了
1000 个时间步,所以我们在采样时也需要循环 1000
次去噪过程,这个过程是非常慢的。
为了加速 DDPM 的采样过程,DDIM 在不利用马尔可夫假设的情况下推导出了
diffusion 的反向过程,最终可以实现仅采样 20~100 步的情况下达到和 DDPM
采样 1000 步相近的生成效果,也就是提速 10~50 倍。这篇文章将对 DDIM
的理论进行讲解,并实现 DDIM 采样的代码。
DDPM 的反向过程
首先我们回顾一下 DDPM 反向过程的推导,为了推导出 \(q(\mathbf{x}_{t-1}|\mathbf{x}_t)\)
这个条件概率分布,DDPM
利用贝叶斯公式将其变成了先验分布的组合,并且通过向条件中加入 \(\mathbf{x}_0\ ...
笔记|生成模型(五):DDPM理论
论文链接:Denoising
Diffusion Probabilistic Models
之前我们讨论过,生成模型的目的是:给定从真实分布 \(P(x)\) 中采样的观测数据 \(x\),训练得到一个由参数 \(\theta\) 控制、能够逼近真实分布的模型 \(p_\theta(x)\),这个任务太难了,所以使用变分推断去逼近,即为从一个标准高斯分布出发,经过某种映射或推导得到真实分布。而这个“某种映射”,并不要求一步到位,可以分多步执行。其中一个影响最大的实现方式,就是扩散模型。
DDPM 核心思想:拆沙堡与建沙堡
核心思考出发点:在生成模型(如 GAN 或
VAE)中,我们总是试图让神经网络“一步到位”地从一堆随机噪声中变出一张高清图片。这就像是让一个没有经验的人,瞬间凭空捏造出一座精美的沙堡,难度极高,模型很容易崩溃(比如
GAN 的模式崩溃)。
能不能换个思路?
拆沙堡(前向加噪):我们先拿一座建好的精美沙堡(真实图片),每次从上面拿走一小撮沙子,并随机撒上一把散沙(加高斯噪声)。经过成千上万次这样微小的破坏,沙堡最终会变成一堆毫无规律的散沙(纯高斯噪声)。这个过程是 ...
杂谈|写作的目的
写作的目的
今天晚上,又坐在电脑前写点东西。
其实写作的目的挺简单的——就是怕忘。
每天都在知识的海里漂,从线性回归到扩散模型,从最早的神经网络到变分自编码器,脑子里装过的那些公式、推导、技巧,曾经烂熟于心的,现在有些已经开始模糊了。记忆真像潮水,退得悄无声息。
所以只能靠写,把那些散落在脑海深处的碎片捡回来,重新理一遍、咀嚼一遍、记下来。这样不仅能复习,还能让那些已经褪色的东西重新有点颜色。
还有一个原因——我不知道自己还能在这条路上走多久。
技术变得太快,新框架、新理论一波接一波。也许哪天我会因为各种原因离开,也许会被下一波浪潮淹没。
但不管怎样,我想留下点痕迹。这些文字,能记录我的思路,承载我的学习轨迹,见证我曾经在算法世界的摸索。哪怕有一天不再写代码、不再调参数,它们也会安静地躺在某个角落,证明我曾在这里认真走过。
笔记|生成模型(四):变分自编码器理论
自编码器(Autoencoder,
AE) VS 变分自编码器(Variational Autoencoder,VAE)
自编码器
如下图所示,自编码器分为编码器和解码器组成。编码器通过映射将原始高维空间的数据映射成一个特征向量(之前说过某种数据一般都是高维空间低维流形的形式存在,那存储和运算其实仅需要在低维流形上即可。关键在于如何表示出低维流形),即寻找输入数据的低维特征来压缩数据。而解码器通过映射将低维特征解码回我们能够看得懂的高纬数据。
用数学的定义表示为:
给定数据集 \(\mathcal{D} =
\{x^{(i)}\}_{i=1}^N\),编码器 \(f_\theta: \mathcal{X} \to \mathcal{Z}\)
和解码器 \(g_\phi: \mathcal{Z} \to
\mathcal{X}\)。这两个函数学习一个确定性映射,使得重构结果 \(\hat{x}\) 尽可能接近原始输入 \(x\):
\[
z = f_\theta(x), \quad \hat{x} = g_\phi(z)
\] 其中 \(x\)
是输入数据,z是低维特征(或中间变量), ...
笔记|生成模型(三):生成对抗理论
生成对抗网络(Generative
Adversarial Nets,GAN)
核心思想
生成对抗网络是一种基于对抗学习的深度生成模型,最早由Ian
Goodfellow于2014年在《Generative Adversarial
Nets》中提出,一经提出便成为了学术界研究的热点,也将生成模型的热度推向了另一个新的高峰。上节有讨论到,直接用图片做监督存带来均值灾难,我们又无法得到真实分布从而监督训练。因此,借助变分推断的思想做一个概率分布近似。从一个简单的已知分布(如标准高斯分布)出发,通过某种方式或手段,将其近似为真实数据的概率分布。GAN正是遵循这一理论,但实现过程中直接对齐分布是很难的,因为我们并不知道概率分布的函数形式,所以也无法得知它到底有几个参数。
所以可以换一个思想,既然无法得到概率分布函数的具体形式,没有参数,不好近似,那我就不去近似他了。对于两个分布而言,如果它们的大多数随机采样的样本概率都是对齐的,那不就说明这两个概率分布函数已经接近了吗。很好,你已经掌握了生成对抗网络的要领,试着自己实现一下吧。(-_-||)
网络架构
生成对抗网络采用双网络架构设计,由生成器( ...