Zreo-TTS — 基于声学/语义 latents 的扩散模型工作

我们通常所说的语音token是离散的。如果使用对应码本中的embedding来表示语音的话,它也可以是连续的低维度的latent变量。既然是低维度的连续latent变量,那图像合成领域中大火的LDM(latent diffusion model,其实就是stable diffsion 1&2采用的模型)模型自然也可以用到语音的合成上。这方面的经典工作有很多,比如说:NaturalSpeech 2&3、AudioLDM 2、VoiceLDM。但这里面只有NaturalSpeech2用到了语音离散化部分提及的声学/语义token,NaturalSpeech3的属性分解形式的VQ更像是另一种形式的RVQ。

NaturalSpeech 2

NaturalSpeech 2基本上就是VALL-E的连续版本。它用的latent也是来自Encodec,对其中不同层次的latent做了求和,然后将其作为扩散模型的训练目标。值得注意地是,扩散模型和FastSpeech2一样也用了时长和音高作为合成的先验条件。这一点也被后来的RALL-E采用。该工作中的扩散模型采用WaveNet实现,同时预测不加噪的latent和后验均值,和图像合成领域的扩散模型在实现方式上还是有所不同的。

NaturalSpeech 3

NaturalSpeech 3,还是非自回归的,而且非自回归的正统性味道更加浓厚,借用了不少FastSpeech2和megatts1&2的设计思想。像megatts 1&2一样,同样采用(自)监督信号对语音token编码的内容做了限制,而不再像是VALL-E/NaturalSpeech2那样一把抓。相应地,语音token化的方法也用VQ就行。具体而言,文章将语音信号分解为时长、内容、韵律和细节四个部分,然后每个部分用离散化的扩散模型来建模。不过,原文使用GRL来促进语音属性的分解,这一点的靠谱程度存疑。尝试过文章的FACodec,但效果很差。三级扩散模型级联的结构,预测起来似乎也非常麻烦。

AudioLDM 2

  • AudioLDM2 :https://arxiv.org/abs/2308.05734
  • Code:https://audioldm.github.io/audioldm2/
  • 核心思想是引入一种新的“音频语言”(LOA),它是表示音频剪辑语义信息的向量序列。 这种方法使我们能够将人类可理解的信息转换为 LOA,并合成以 LOA 为条件的音频表示。具体来说,我们利用基于 GPT 的语言模型(Radford等人,2019)将调节信息转换为 AudioMAE 特征。 GPT的输入条件很灵活,包括文本、音频、图像、视频等的表示。然后,我们使用潜在扩散模型(Rombach等人,2022)基于AudioMAE 功能。 潜在扩散模型可以以自监督的方式进行优化,从而允许使用大规模未标记的音频数据进行预训练。 我们的语言建模方法使我们能够利用语言模型的最新进展(Zhao等人,2023),同时缓解先前音频自回归模型中出现的高推理计算成本和错误累积等挑战(Zeghidour 等人,2021;Agostinelli 等人,2023)。 这是由于连续 AudioMAE 特征的长度较短,它也比以前使用的离散标记提供了更丰富的表示能力(Lam 等人,2023;Borsos 等人,2023;Agostinelli 等人,2023) 。
AudioLDM 2 架构概述。 AudioMAE 功能是连接音频语义语言模型阶段 (GPT-2) 和语义重建阶段(潜在扩散模型)的代理。 概率切换器使用地面真值 AudioMAE (Pgt) 和 GPT-2 生成的 AudioMAE 特征 (Ppred) 作为条件来控制潜在扩散模型的概率。 AudioMAE 和潜在扩散模型都是使用音频数据进行自我监督预训练的。

VoiceLDM

VoiceLDM 概述。VoiceLDM 使用大量真实音频数据进行训练。 textcont在数据准备期间通过使用 Whisper(一种自动语音识别 (ASR) 模型)处理音频而生成。textdesc 仅在推理期间使用。带有锁定图标的模块表示它在训练期间被冻结。

 VoiceLDM,这是一种旨在生成准确遵循两种不同自然语言文本提示的音频的模型:描述提示和内容提示。前者提供有关音频的整体环境上下文的信息,而后者则传达语言内容。为了实现这一目标,我们采用了基于潜在扩散模型的文本到音频 (TTA) 模型,并扩展了其功能以将额外的内容提示作为条件输入。通过利用预先训练的对比语言音频预训练 (CLAP) 和 Whisper,VoiceLDM 可以在大量真实音频上进行训练,而无需手动注释或转录。此外,我们采用双无分类器指导来进一步增强 VoiceLDM 的可控性。

AE、VAE、VQ-VAE、GAN、Diffusion-生成模型系列

深度生成模型应用于图像、音频、视频合成和自然语言处理等不同领域。随着深度学习技术的快速发展,近年来出现了不同的深度生成模型。这导致了越来越多的兴趣,比较和评估这些模型的性能和适用性,以不同的领域。在本文中,我们旨在提供深度生成模型的全面比较,包括扩散模型,生成对抗网络(GAN)和变分自动编码器(VAE)。我将回顾它们的基本原则、优点和缺点。我的目标是提供对这些模型之间的差异和相似性的清晰理解,以指导研究人员和实践者为他们的特定应用选择最合适的深度生成模型。

GAN学习生成类似于训练数据集的新数据。它由两个神经网络,一个生成器和一个判别器组成。生成器接受从正态分布中采样的随机值并生成合成样本,而判别器尝试区分真实的和生成的样本。生成器被训练为产生可以欺骗判别器的真实输出,而 判别器 被训练为正确区分真实的和生成的数据。图1的最上面一行显示了它的工作方案。

AE包含一个编码器和一个解码器。在训练时,输入图像x会被编码成一个较短的向量z,再被解码回另一幅长得差不多的图像。网络的学习目标是让重建出来的图像和原图像尽可能相似。注意该模型只能做图像压缩,无法完成图像的生成任务。AE的编码器编码出来的向量空间是不规整的。也就是说,解码器只认识经编码器编出来的向量,而不认识其他的向量。如果你把自己随机生成出来的向量输入给解码器,解码器是生成不出有意义的图片的。AE不能够随机生成图片,所以它不能很好地完成图像生成任务,只能起到把图像压缩的作用。

VAE由编码器和解码器组成。编码器将高维输入数据映射成低维表示,而解码器试图通过将该表示映射回其原始形式来重构原始高维输入数据。编码器通过预测平均值和标准偏差向量来输出潜码的正态分布作为低维表示。图1的中间行演示了它的工作。

扩散模型包括正向扩散和反向扩散过程。前向扩散是一种马尔可夫链,它逐渐向输入数据中添加噪声,直到获得白噪声。这不是一个可以学习的过程,通常需要1000个步骤。逆扩散过程的目的是将正向过程逐步反向,去除噪声以恢复原始数据。使用可训练的神经网络来实现反向扩散过程。图1的最下面一行显示了这一点。

AE 自编码器

自编码器是一种无监督学习技术,它使用神经网络来寻找给定数据分布的非线性潜在表示。神经网络由两部分组成:编码网络(encoder) z=f(x) 和解码网络(decoder) ^x=g(z) 。

从模型图中可以很明显的看出,对于AutoEncoder模型,采取的是无监督训练的方式,对于输入的x经过一个Encoder层后得到一个特征向量z,再将该向量z通过一个Decoder层得到最终输出x%20%E2%80%99,通过最小化重构模型的输入x和模型的输出x%E2%80%99的误差作为损失函数训练模型得到一个较好的关于输入x的特征向量z,模型设计的初衷的获得一个对应于源数据x的一个低维特征向量z,在获得此向量的基础上可以应用在很多分类任务上,但是AE模型并不适用于生成任务。

尽管AE已经可以获得较好的向量表示,在还原任务上可以做出较好的效果,但其并不是一个生成式模型,这是因为对于一个生成模型而言,他一般需要满足两个条件限制:

1.生成模型的编码器和解码器是可以分离开的;

2.对于固定维度下任意采样出的编码,解码器都能产生一张真实且清晰的图片。

AE模型并不满足第二点的条件,举个例子来说,对于输入的全月图和半月图,通过对AE模型的训练可以很好的完成还原任务,但是我们对于二者特征向量中取一个点,对于一个正常的生成模型而言,应该生成一个介于全月和半月之间的图片。然而,对于真实的AE而言,它生成的结果要么是乱码要么就是异常模糊的图片。为什么会发生这种情况呢?因为模型在训练的时候并没有显性对中间变量z的分布p(z)进行建模,在模型训练时所采用的f(z)是有限的,而对于z所处的空间存在大量f(z)外的点而言模型是并不理解的,如果像该例子随机在全月和半月中采样一个点,大概率得到不能够生成有效图片的点。

变分自编码器 (VAE)

https://zhuanlan.zhihu.com/p/34998569

在 VAE 中,encoder不再直接输出 隐向量z,而是输出 隐向量z的分布 的 均值μ 与 标准差σ,再从这个分布中采样得到 隐向量z。

AE 将输入encode成隐空间里的单个点,而 VAE 则是将输入encode成隐空间里的分布(distribution)。

从encode单个点变成encode一个分布,这样就不太容易有空隙(gap)了。但是,训练过程中,为了尽可能减小 reconstruction loss,模型会学成:均值μ 相差很远,标准差σ 很小。这样一来,VAE 就跟 普通的AE 差不多了,仍然容易有空隙。而我们希望学到的 隐空间Z 是连续、稠密、聚在一团而又能很好分开(distinct)不同标签的。

为了避免这个问题,就在损失函数中加入了KL loss。这样,loss = reconstruction loss + KL loss。 KL loss 是 方差为μ,标准差为σ的分布N(μ, σ²) 与 标准正态分布N(0, 1) 的 KL散度(KL散度可以衡量两个概率分布之间的距离)。加入了 KL loss 后,隐空间Z 就会呈正态分布聚在一团。

VQ-VAE:向量量化

量化自编码器

VQ-VAE 与 VAE 的主要区别是:VAE 想学到 连续(continuous)的隐空间,而 VQ-VAE 想学到 离散(discrete)的隐空间。

VQ-VAE 通过向网络添加离散的 codebook 组件来扩展标准自编码器。codebook 是与相应索引关联的向量列表。它用于量化自编码器的瓶颈;将编码器网络的输出与 codebook 的所有向量进行比较,并将欧氏距离最接近的 codebook 向量喂给解码器。

这个 argminargmin 操作有点令人担忧,因为它相对于编码器是不可微分的。但在实践中,可以通过这样的方式将 decoder 的梯度直接传递给 encoder (encoder 和 codebook 向量的梯度设置为1,其他 codebook 向量梯度设置为0)。

然后,解码器的任务是重构来自该量化矢量的输入,就像在标准自编码器公式中那样。

生成多个codes

当解码器只能接受一组 codebook 向量作为输入时,人们怎么能指望它产生大量多样化的图像呢?

我们需要为每个训练点提供一个唯一的离散值,以便能够重建所有数据。如果情况确实如此,那么模型难道不会通过将每个训练点映射到不同的离散 code 来记住数据吗?

如果编码器只输出一个矢量,这的确会成为问题,但在实际的 VQ-VAE 中,编码器通常会产生一系列矢量。例如,对于图像,编码器可能会输出一个32×32 的矢量网格,每个网格都被量化,然后将整个网格送到解码器。所有向量都被量化为相同的 codebook,因此离散值的数量不会改变,但是通过输出多个codes,我们能够成倍地增加解码器可以构造的数据点的数量。

例如,假设我们正在处理图像,我们有一个尺寸为512的密码本,我们的编码器输出一个 32×32 的矢量网格。在这种情况下,我们的解码器可以输出 51232×32=29216 个不同图像!

当然,模型仍然可以记住训练数据,但是通过编码器中嵌入正确的归纳偏差(即对图像使用conv-net)和使用正确的隐变量结构(即用于图像的 32×32 网格),模型应该能够学习到一个很好地表示数据的离散空间。

VQ-VAE使用了如下方式关联编码器的输出与解码器的输入:假设嵌入空间已经训练完毕,对于编码器的每个输出向量ze(x),找出它在嵌入空间里的最近邻zq(x),把ze(x)替换成zq(x)作为解码器的输入。

学习 Codebook

就像编码器和解码器网络一样,codebook 通过梯度下降来学习的。理想情况下,我们的编码器将输出一个接近学习到的 codebook 向量。这里本质上存在一个双向问题:学习与编码器输出对齐的 codebook 向量和学习与codebook 向量对齐的编码器输出。

这两个问题可以通过向损失函数添加项来解决。整个VQ-VAE 损失函数是:

在这里,我们使用与上一节中相同的符号,sg[x]sg[x] 代表“停止梯度”。

第一项是标准的重构损失;第二项是 codebook 对齐损失,其目标是使所选的 codebook 矢量尽可能接近编码器输出。编码器输出有一个停止梯度运算符,因为这项仅用于更新 codebook。第三项与第二项类似,但它将停止梯度放在 codebook 向量上,因为它旨在更新编码器输出,让其尽可能接近 codebook 向量。这项称为codebook 损失,其对总体损失的重要性由超参数 ββ 调整。当然,如果有多个,则最后两项在模型的每个量化向量输出上取平均值。

这个损失函数基本上完成了我们对 VQ-VAE 的描述。

这样,我们可以完整地训练一个 VQ-VAE,能够重构一组不同的图像,这些图像与下图中的原始图像不同。我们还可以训练 VQ-VAE 来重构其他模态,如音频或视频。

优化编码器和解码器

为了优化编码器和解码器,我们先来制订一下VQ-VAE的整体优化目标。由于VQ-VAE其实是一个AE,误差函数里应该只有原图像和目标图像的重建误差。

VQ-VAE使用了一种叫做”straight-through estimator”的技术来完成梯度复制。这种技术是说,前向传播和反向传播的计算可以不对应。你可以为一个运算随意设计求梯度的方法。基于这一技术,VQ-VAE使用了一种叫做sg(stop gradient,停止梯度)的运算:

也就是说,前向传播时,sg里的值不变;反向传播时,sg按值为0求导,即此次计算无梯度。(反向传播其实不会用到式子的值,只会用到式子的梯度。反向传播用到的loss值是在前向传播中算的)。

GAN

GAN(Generative Adversarial Network)是一种由生成器和判别器组成的对抗性模型。生成器试图生成与真实数据相似的数据,而判别器则试图区分真实数据和生成器生成的数据。两个模型通过对抗训练来提高自己的性能,最终生成器可以生成高质量的数据。

Diffusion

Diffusion Models是一种基于概率的生成模型,它通过模拟数据的扩散过程来生成新的数据。这种模型的核心思想是将已有的数据视为初始状态,然后通过不断迭代的扩散过程,逐步生成新的数据。Diffusion Models的优势在于其理论基础较为严密,其背后的数学推导和概率理论较为深入。这使得Diffusion Models在一些特定的数据生成任务上具有较好的表现。

相比GAN来说,扩散模型训练更稳定,而且能够生成更多样的样本,OpenAI的论文Diffusion Models Beat GANs on Image Synthesis也证明了扩散模型能够超越GAN。简单来说,扩散模型包含两个过程:前向扩散过程反向生成过程,前向扩散过程是对一张图像逐渐添加高斯噪音直至变成随机噪音,而反向生成过程是去噪音过程,我们将从一个随机噪音开始逐渐去噪音直至生成一张图像,这也是我们要求解或者训练的部分。

扩散模型包括两个过程:前向过程(forward process)反向过程(reverse process),其中前向过程又称为扩散过程(diffusion process),如下图所示。无论是前向过程还是反向过程都是一个参数化的马尔可夫链(Markov chain),其中反向过程可以用来生成数据,这里我们将通过变分推断来进行建模和求解。

模型设计:

可以选择采用AutoEncoder架构来作为噪音预测模型。DDPM所采用的模型是一个基于residual block和attention block的U-Net模型。如下所示:

U-Net属于encoder-decoder架构,其中encoder分成不同的stages,每个stage都包含下采样模块来降低特征的空间大小(H和W),然后decoder和encoder相反,是将encoder压缩的特征逐渐恢复。U-Net在decoder模块中还引入了skip connection,即concat了encoder中间得到的同维度特征,这有利于网络优化。DDPM所采用的U-Net每个stage包含2个residual block,而且部分stage还加入了self-attention模块增加网络的全局建模能力。 另外,扩散模型其实需要的是T个噪音预测模型,实际处理时,我们可以增加一个time embedding(类似transformer中的position embedding)来将timestep编码到网络中,从而只需要训练一个共享的U-Net模型。具体地,DDPM在各个residual block都引入了time embedding,如上图所示。

扩散模型DiT:纯Transformer架构替换传统的U-Net主干

DiT原文: https://arxiv.org/abs/2212.09748 Code:https://github.com/facebookresearch/DiT Huggingface:https://huggingface.co/spaces/wpeebles/DiT

DiT扩散模型,出自谢赛宁与Sora研发之一威廉·皮波尔斯合著的一篇论文《Scalable diffusion models with transformers》,它不仅将 Transformer 成功应用到了扩散模型上,还深入探究了transformer架构在扩散模型上的scalability能力。

核心思想:提出了一种新的(可扩展)扩散模型架构,称为 DiT,该架构使用 Transformer 替换了传统的 U-Net 主干。

扩散模型大部分是采用UNet架构来进行建模,UNet可以实现输出和输入一样维度,所以天然适合扩散模型。扩散模型使用的UNet除了包含基于残差的卷积模块,同时也往往采用self-attention。自从ViT之后,transformer架构已经大量应用在图像任务上,随着扩散模型的流行,也已经有工作尝试采用transformer架构来对扩散模型建模,这篇文章我们将介绍Meta的工作DiTScalable Diffusion Models with Transformers,它是完全基于transformer架构的扩散模型,这个工作不仅将transformer成功应用在扩散模型,还探究了transformer架构在扩散模型上的scalability能力其中最大的模型DiT-XL/2在ImageNet 256×256的类别条件生成上达到了SOTA(FID为2.27)

DiT基本沿用了ViT的设计,如下图所示,首先采用一个patch embedding来将输入进行patch化,即得到一系列的tokens。其中patch size属于一个超参数,它直接决定了tokens的数量,这会影响模型的计算量。DiT的patch size共选择了三种设置:𝑝=2,4,8。注意token化之后,这里还要加上positional embeddings,这里采用非学习的sin-cosine位置编码。

将输入token化之后,就可以像ViT那样接transformer blocks了。但是对于扩散模型来说,往往还需要在网络中嵌入额外的条件信息,这里的条件包括timesteps以及类别标签(如果是文生图就是文本,但是DiT这里并没有涉及)。要说明的一点是,无论是timesteps还是类别标签,都可以采用一个embedding来进行编码。DiT共设计了四种方案来实现两个额外embeddings的嵌入,具体如下:

  1. In-context conditioning:将两个embeddings看成两个tokens合并在输入的tokens中,这种处理方式有点类似ViT中的cls token,实现起来比较简单,也不基本上不额外引入计算量。
  2. Cross-attention block:将两个embeddings拼接成一个数量为2的序列,然后在transformer block中插入一个cross attention,条件embeddings作为cross attention的key和value;这种方式也是目前文生图模型所采用的方式,它需要额外引入15%的Gflops。
  3. Adaptive layer norm (adaLN) block:采用adaLN,这里是将time embedding和class embedding相加,然后来回归scale和shift两个参数,这种方式也基本不增加计算量。
  4. adaLN-Zero block:采用zero初始化的adaLN,这里是将adaLN的linear层参数初始化为zero,这样网络初始化时transformer block的残差模块就是一个identity函数;另外一点是,这里除了在LN之后回归scale和shift,还在每个残差模块结束之前回归一个scale,如上图所示。

论文对四种方案进行了对比试验,发现采用adaLN-Zero效果是最好的,所以DiT默认都采用这种方式来嵌入条件embeddings。

虽然DiT发现adaLN-Zero效果是最好的,但是这种方式只适合这种只有类别信息的简单条件嵌入,因为只需要引入一个class embedding;但是对于文生图来说,其条件往往是序列的text embeddings,采用cross-attention方案可能是更合适的。 由于对输入进行了token化,所以在网络的最后还需要一个decoder来恢复输入的原始维度,DiT采用一个简单的linear层来实现,直接将每个token映射为𝑝×𝑝×2𝐶的tensor,然后再进行reshape来得到和原始输入空间维度一样的输出,但是特征维度大小是原来的2倍,分别用来预测噪音和方差。

注意这里先进行LayerNorm,同时也引入了zero adaLN,并且decoder的linear层也采用zero初始化。 仿照ViT,DiT也设计了4种不同规模的模型,分别是DiT-S、DiT-B、DiT-L和DiT-XL,其中最大的模型DiT-XL参数量为675M,计算量Gflops为29.1(256×256图像,patch size=4时)。

在具体性能上,最大的模型DiT-XL/2采用classifier free guidance可以在class-conditional image generation on ImageNet 256×256任务上实现当时的sota。

虽然DiT看起来不错,但是只在ImageNet上生成做了实验,并没有扩展到大规模的文生图模型。而且在DiT之前,其实也有基于transformer架构的扩散模型研究工作,比如U-ViT,目前也已经有将transformer应用在大规模文生图(基于扩散模型)的工作,比如UniDiffuser,但是其实都没有受到太大的关注。目前主流的文生图模型还是采用基于UNet,UNet本身也混合了卷积和attention,它的优势一方面是高效,另外一方面是不需要位置编码比较容易实现变尺度的生成,这些对具体落地应用都是比较重要的。

条件控制扩散模型

参考:https://www.zhangzhenhu.com/aigc/Guidance.html

无论是 DDPM 还是 DDIM,这些扩散模型在生成图片时,都是输入一个随机高斯噪声数据, 然后逐步的产出一张有意的真实图片。这个过程中每一步都是一个随机过程,所以每次执行产出的图片都不一样, 生成的图像多样性非常好。 但这也是一个缺点:生成的图像不可控,无法控制这个生成过程并令其生成我们想要的图像内容

鉴于此,很多研究中在如何控制图像生成过程方面提出了很多有效的方案。 直觉的讲,我们可以在扩散过程中引入额外的信息来指导或者说控制整个扩散模型, 假设这个额外的信息为 y,它可以是一段文本、一张图片或者图像的类别标签。 引入 y 之后的模型就变成了一个以 y 为条件的条件概率分布。

自然而然地,接下来就需要探讨,引入y 之后对前向扩散过程和逆向采用过程分别有什么影响,需要做出什么调整。 首先看下对前向扩散过程的影响,先说结论:引入 y 之后,对前向扩散过程没有任何影响。 其实,从直觉上讲,前向扩散过程是对原始图片加噪声,直至变成纯噪声,这个过程显然与 y没有任何关系。 但做研究要严谨,还是需要给出数学证明的。 证明过程在论文 1 中已经给出。

条件扩散模型的前向过程与非条件扩散模型的前向过程完全一样

1、classifier guidance

OpenAI 的团队在 2021 年发表一篇论文 1 : A. Diffusion models beat gans on image synthesis ,在这篇论文中,提出一种利用图片类别标签指导图像生成的方案,称为 classifier guidance, 通过这种改进使扩散模型生成图像的质量大幅提升,并在 IS 和 FID 评分上超过了 GAN 模型, 所以你看论文的名字,简单直接。

论文的源码在: https://github.com/openai/guided-diffusion 。

实际上这篇论文做了很多改进,比如对UNET也做了改进。但这里我们只关注 guidance 部分。 原论文的推导过程比较繁杂,这里我们采用另一篇文章 2 的推导方案, 直接从 score function 的角度去理解。

虽然引入 classifier guidance 效果很明显,但缺点也很明显:

  1. 需要额外一个分类器模型,极大增加了成本,包括训练成本和采样成本。
  2. 分类器的类别毕竟是有限集,不能涵盖全部情况,对于没有覆盖的标签类别会很不友好

后来《More Control for Free! Image Synthesis with Semantic Diffusion Guidance》推广了“Classifier”的概念,使得它也可以按图、按文来生成。Classifier-Guidance方案的训练成本比较低(熟悉NLP的读者可能还会想起与之很相似的PPLM模型),但是推断成本会高些,而且控制细节上通常没那么到位。

2、Classifier-free guidance

引导函数的方法存在一些问题:1)额外的计算量比较多;2)引导函数和扩散模型分别进行训练,不利于进一步扩增模型规模,不能够通过联合训练获得更好的效果。

  • 提出了一个等价的结构替换了外部的classifier,从而可以直接使用一个扩散模型来做条件生成任务。

实际做法只是改变了模型输入的内容,有conditional(随机高斯噪声+引导信息的embedding)和unconditional两种采样输入。两种输入都会被送到同一个diffusion model,从而让其能够具有无条件和有条件生成的能力。

3、CLIP Guidance

Radford, A., Kim, J. W., Hallacy, C., Ramesh, A., Goh, G., Agarwal, S., Sastry, G., Askell, A., Mishkin, P., Clark, J., Krueger, G., and Sutskever, I. Learning transferable visual models from natural language supervision. arXiv:2103.00020, 2021

Prafulla Dhariwal and Alex Nichol. Diffusion models beat gans on image synthesis. 2021. arXiv:2105.05233.[2](1,2)

Calvin Luo. Understanding diffusion models: a unified perspective. 2022. arXiv:2208.11970.[3]

Jonathan Ho and Tim Salimans. Classifier-free diffusion guidance. 2022. arXiv:2207.12598.[4]

Alex Nichol, Prafulla Dhariwal, Aditya Ramesh, Pranav Shyam, Pamela Mishkin, Bob McGrew, Ilya Sutskever, and Mark Chen. Glide: towards photorealistic image generation and editing with text-guided diffusion models. 2022. arXiv:2112.10741.[5]

Aditya Ramesh, Prafulla Dhariwal, Alex Nichol, Casey Chu, and Mark Chen. Hierarchical text-conditional image generation with clip latents. 2022. arXiv:2204.06125.[6]

Chitwan Saharia, William Chan, Saurabh Saxena, Lala Li, Jay Whang, Emily Denton, Seyed Kamyar Seyed Ghasemipour, Burcu Karagol Ayan, S. Sara Mahdavi, Rapha Gontijo Lopes, Tim Salimans, Jonathan Ho, David J Fleet, and Mohammad Norouzi. Photorealistic text-to-image diffusion models with deep language understanding. 2022. arXiv:2205.11487.

去噪扩散隐式模型(Denoising Diffusion Implicit Models,DDIM)

Paper: https://arxiv.org/abs/2010.02502

Code: https://github.com/ermongroup/ddim

摘自:扩散模型之DDIM

在 DDPM 中,生成过程被定义为马尔可夫扩散过程的反向过程,在逆向采样过程的每一步,模型预测噪声

DDIM 的作者发现,扩散过程并不是必须遵循马尔科夫链, 在之后的基于分数的扩散模型以及基于随机微分等式的理论都有相同的结论。 基于此,DDIM 的作者重新定义了扩散过程和逆过程,并提出了一种新的采样技巧, 可以大幅减少采样的步骤,极大的提高了图像生成的效率,代价是牺牲了一定的多样性, 图像质量略微下降,但在可接受的范围内。

对于扩散模型来说,一个最大的缺点是需要设置较长的扩散步数才能得到好的效果,这导致了生成样本的速度较慢,比如扩散步数为1000的话,那么生成一个样本就要模型推理1000次。这篇文章我们将介绍另外一种扩散模型DDIMDenoising Diffusion Implicit Models),DDIM和DDPM有相同的训练目标,但是它不再限制扩散过程必须是一个马尔卡夫链,这使得DDIM可以采用更小的采样步数来加速生成过程,DDIM的另外是一个特点是从一个随机噪音生成样本的过程是一个确定的过程(中间没有加入随机噪音)。

前提条件:1.马尔可夫过程。2.微小噪声变化。

步骤一:在DDPM中我们基于初始图像状态以及最终高斯噪声状态,通过贝叶斯公式以及多元高斯分布的散度公式,可以计算出每一步骤的逆向分布。之后继续重复上述对逆向分布的求解步骤,最终实现从纯高斯噪声,恢复到原始图片的步骤。

步骤二:模型优化部分通过最小化分布的交叉熵,预测出模型逆向分布的均值和方差,将其带入步骤一中的推理过程即可。

文章中存在的一个核心问题是:由于1.每个步骤都是马尔可夫链。2.每次加特征的均值和方差都需要控制在很小的范围下。因此我们不得不每一步都进行逆向的推理和运算,导致模型整体耗时很长。本文核心针对耗时问题进行优化,一句话总结:在满足DDPM中逆向推理的条件下,找到一种用 xt  x0 表达 xt−1 且能能大幅减少计算量的推理方式。

代码实现:

DDIM和DDPM的训练过程一样,所以可以直接在DDPM的基础上加一个新的生成方法(这里主要参考了DDIM官方代码以及diffusers库),具体代码如下所示:

class GaussianDiffusion:
    def __init__(self, timesteps=1000, beta_schedule='linear'):
     pass

    # ...
        
 # use ddim to sample
    @torch.no_grad()
    def ddim_sample(
        self,
        model,
        image_size,
        batch_size=8,
        channels=3,
        ddim_timesteps=50,
        ddim_discr_method="uniform",
        ddim_eta=0.0,
        clip_denoised=True):
        # make ddim timestep sequence
        if ddim_discr_method == 'uniform':
            c = self.timesteps // ddim_timesteps
            ddim_timestep_seq = np.asarray(list(range(0, self.timesteps, c)))
        elif ddim_discr_method == 'quad':
            ddim_timestep_seq = (
                (np.linspace(0, np.sqrt(self.timesteps * .8), ddim_timesteps)) ** 2
            ).astype(int)
        else:
            raise NotImplementedError(f'There is no ddim discretization method called "{ddim_discr_method}"')
        # add one to get the final alpha values right (the ones from first scale to data during sampling)
        ddim_timestep_seq = ddim_timestep_seq + 1
        # previous sequence
        ddim_timestep_prev_seq = np.append(np.array([0]), ddim_timestep_seq[:-1])
        
        device = next(model.parameters()).device
        # start from pure noise (for each example in the batch)
        sample_img = torch.randn((batch_size, channels, image_size, image_size), device=device)
        for i in tqdm(reversed(range(0, ddim_timesteps)), desc='sampling loop time step', total=ddim_timesteps):
            t = torch.full((batch_size,), ddim_timestep_seq[i], device=device, dtype=torch.long)
            prev_t = torch.full((batch_size,), ddim_timestep_prev_seq[i], device=device, dtype=torch.long)
            
            # 1. get current and previous alpha_cumprod
            alpha_cumprod_t = self._extract(self.alphas_cumprod, t, sample_img.shape)
            alpha_cumprod_t_prev = self._extract(self.alphas_cumprod, prev_t, sample_img.shape)
    
            # 2. predict noise using model
            pred_noise = model(sample_img, t)
            
            # 3. get the predicted x_0
            pred_x0 = (sample_img - torch.sqrt((1. - alpha_cumprod_t)) * pred_noise) / torch.sqrt(alpha_cumprod_t)
            if clip_denoised:
                pred_x0 = torch.clamp(pred_x0, min=-1., max=1.)
            
            # 4. compute variance: "sigma_t(η)" -> see formula (16)
            # σ_t = sqrt((1 − α_t−1)/(1 − α_t)) * sqrt(1 − α_t/α_t−1)
            sigmas_t = ddim_eta * torch.sqrt(
                (1 - alpha_cumprod_t_prev) / (1 - alpha_cumprod_t) * (1 - alpha_cumprod_t / alpha_cumprod_t_prev))
            
            # 5. compute "direction pointing to x_t" of formula (12)
            pred_dir_xt = torch.sqrt(1 - alpha_cumprod_t_prev - sigmas_t**2) * pred_noise
            
            # 6. compute x_{t-1} of formula (12)
            x_prev = torch.sqrt(alpha_cumprod_t_prev) * pred_x0 + pred_dir_xt + sigmas_t * torch.randn_like(sample_img)

            sample_img = x_prev
            
        return sample_img.cpu().numpy()

这里以MNIST数据集为例,训练的扩散步数为500,直接采用DDPM(即推理500次)生成的样本如下所示:

同样的模型,我们采用DDIM来加速生成过程,这里DDIM的采样步数为50,其生成的样本质量和500步的DDPM相当:

完整的代码示例见https://github.com/xiaohu2015/nngen

其它:重建和插值

如果从直观上看,DDIM的加速方式非常简单,直接采样一个子序列,其实论文DDPM+也采用了类似的方式来加速。另外DDIM和其它扩散模型的一个较大的区别是其生成过程是确定性的。

stable diffusion:潜在扩散模型

参考:

1、https://zhuanlan.zhihu.com/p/573984443

2、https://zhangzhenhu.github.io/blog/aigc

3、 https://zhuanlan.zhihu.com/p/599160988

扩散概率模型(diffusion probabilistic models)

1、 扩散概率模型(diffusion probabilistic model)

2、降噪扩散概率模型(Denoising diffusion probabilistic model,DDPM)

3、基于分数的解释(Score-based DDPM)

4、扩散模型的三种等价表示

5、改进降噪扩散概率模型(Improved Denoising Diffusion Probabilistic Models,IDDPM)

6. 参考文献

Jascha Sohl-Dickstein, Eric A. Weiss, Niru Maheswaranathan, and Surya Ganguli. Deep unsupervised learning using nonequilibrium thermodynamics. 2015. arXiv:1503.03585.2(1,2,3,4,5,6,7)

Calvin Luo. Understanding diffusion models: a unified perspective. 2022. arXiv:2208.11970.3(1,2,3,4)

Jonathan Ho, Ajay Jain, and Pieter Abbeel. Denoising diffusion probabilistic models. 2020. arXiv:2006.11239.4

Diederik P. Kingma, Tim Salimans, Ben Poole, and Jonathan Ho. Variational diffusion models. 2022. arXiv:2107.00630.5

Yang Song and Stefano Ermon. Generative modeling by estimating gradients of the data distribution. 2019. arXiv:1907.05600.

去噪扩散隐式模型(Denoising Diffusion Implicit Models,DDIM)

Jiaming Song, Chenlin Meng, and Stefano Ermon. Denoising diffusion implicit models. 2022. arXiv:2010.02502.

基于分数的生成模型

Yang Song and Stefano Ermon. Generative modeling by estimating gradients of the data distribution. 2019. arXiv:1907.05600.

Yang Song, Jascha Sohl-Dickstein, Diederik P. Kingma, Abhishek Kumar, Stefano Ermon, and Ben Poole. Score-based generative modeling through stochastic differential equations. 2021. arXiv:2011.13456.

Aapo Hyvärinen and Peter Dayan. Estimation of non-normalized statistical models by score matching. Journal of Machine Learning Research, 2005.

Yang Song and Stefano Ermon. Improved techniques for training score-based generative models. 2020. arXiv:2006.09011.

条件控制扩散模型

Prafulla Dhariwal and Alex Nichol. Diffusion models beat gans on image synthesis. 2021. arXiv:2105.05233.2(1,2)

Calvin Luo. Understanding diffusion models: a unified perspective. 2022. arXiv:2208.11970.3

Jonathan Ho and Tim Salimans. Classifier-free diffusion guidance. 2022. arXiv:2207.12598.4

Alex Nichol, Prafulla Dhariwal, Aditya Ramesh, Pranav Shyam, Pamela Mishkin, Bob McGrew, Ilya Sutskever, and Mark Chen. Glide: towards photorealistic image generation and editing with text-guided diffusion models. 2022. arXiv:2112.10741.5

Aditya Ramesh, Prafulla Dhariwal, Alex Nichol, Casey Chu, and Mark Chen. Hierarchical text-conditional image generation with clip latents. 2022. arXiv:2204.06125.6

Chitwan Saharia, William Chan, Saurabh Saxena, Lala Li, Jay Whang, Emily Denton, Seyed Kamyar Seyed Ghasemipour, Burcu Karagol Ayan, S. Sara Mahdavi, Rapha Gontijo Lopes, Tim Salimans, Jonathan Ho, David J Fleet, and Mohammad Norouzi. Photorealistic text-to-image diffusion models with deep language understanding. 2022. arXiv:2205.11487.

 稳定扩散模型(Stable diffusion model)


Robin Rombach, Andreas Blattmann, Dominik Lorenz, Patrick Esser, and Björn Ommer. High-resolution image synthesis with latent diffusion models. 2021. arXiv:2112.10752.

DDPM 模型在生成图像质量上效果已经非常好,但它也有个缺点, 那就是 尺寸是和图片一致的,元素和图片的像素是一一对应的, 所以称 DDPM 是像素(pixel)空间的生成模型。 我们知道一张图片的尺寸,如果想生成一张高尺寸的图像, 张量大小是非常大的,这就需要极大的显卡(硬件)资源,包括计算资源和显存资源。 同样的,它的训练成本也是高昂的。高昂的成本极大的限制了它在民用领用的发展

潜在扩散模型

2021年德国慕尼黑路德维希-马克西米利安大学计算机视觉和学习研究小组(原海德堡大学计算机视觉小组), 简称 CompVis 小组,发布了论文 High-Resolution Image Synthesis with Latent Diffusion Models 1,针对这个问题做了一些改进, 主要的改进点有:

  • 引入一个自编码器,先对原始对象进行压缩编码,编码后的向量再应用到扩散模型。
  • 通过在 UNET 中加入 Attention 机制,处理条件变量 

Diffusion Models从入门到放弃:必读的10篇经典论文

前言:diffusion models是现在人工智能领域最火的方向之一,并引爆了AIGC领域,一大批创业公司随之诞生。笔者2021年6月开始研究diffusion,见证了扩散模型从无人问津到炙手可热的过程,这些篇经典论文专栏里都详细介绍过原理、复现过代码。这篇博客以时间发展顺序,串讲一下从入门到精(放)通(弃)的10篇必读的经典论文。

摘自:https://zhuanlan.zhihu.com/p/595866176

1、DDPM奠基之作:《Denoising Diffusion Probabilistic Models》

推荐理由:本文是DDPM的奠基之作,是本领域最经典的论文之一。其实扩散模型并不是一个新的概念,这篇论文第一个给出了严谨的数学推导,可以复现的代码,完善了整个推理过程。后面diffusion models相关的论文基本都继承了前向加噪-反向降噪-训练这样的体系。所以强烈推荐初学者精读这篇论文!

博客地址Diffusion Models扩散模型与深度学习(数学原理和代码解读)

代码地址GitHub – lucidrains/denoising-diffusion-pytorch: Implementation of Denoising Diffusion Probabilistic Model in Pytorch

2、从DDPM到DDIM:《Denoising Diffusion Implicit Models》

推荐理由:作者使用简单的重参数化和混合学习目标来学习反向过程方差,该目标将VLB与DDPM的简化目标相结合。在混合目标下,所提出模型获得的对数似然比通过直接优化对数似然获得的对数似然更好,并发现后一个目标在训练期间具有更多的梯度噪声。最关键的是,原先的DDPM需要长达1000steps的推理步骤,而DDIM改善了反向扩散过程中的噪声水平,改变了xt递推公式,在更少的推理步骤(如100步)上取得了更好的结果。这项成果堪称革命性的,后面的大部分diffusion models论文(特别是运算量高的)都采用这一改进技术。

博客地址深入解读:从DDIM到Improved Denoising Diffusion Probabilistic Models

代码地址GitHub – ermongroup/ddim: Denoising Diffusion Implicit Models

3、第一波高潮!首次击败GANs:《Diffusion Models Beat GANs on Image Synthesis》

推荐理由:其实前面diffusion models也只是在生成领域小火了一把,并没有引起太多人的关注。主要原因有两点:一是扩散模型并没有太多数学理论上的创新;二是在生成指标上不如GANs。而这篇论文的出现把diffusion models的推向了第一波高潮!这篇论文有三个需要重点学习的地方:

一是在Unet基础上有了很多改进的小trick(不亏是OpenAI的作品),改进之后的Unet更能适配噪声,因此指标上也进步了很多:

如果看完这部分不妨反问自己这几个问题:模型结构是如何共享信息参数的?self-attention的作用是什么?预测噪声数据和预测真实数据有没有本质区别?为什么要分层设计?为什么一定要使用Unet结构?如果不清楚,欢迎看看我之前的博客:《为什么Diffusion Models钟爱U-net结构?》

二是classifier-guidance的引入,这段推导用了二阶泰勒展开,非常精彩!之后的很多论文将类别引导扩展到一般的条件引导上,包括后来大火的GLIDE。这在latent diffusion models没出来之前,是一项非常成功、被广泛使用的条件引导技术!

三是规范化的代码guided-diffusion。OpenAI的工匠精神,这份代码打磨得非常好,堪称工业级!后面很多顶会论文都是在这份代码的基础上改进的。如果想要学习diffusion models的代码,推荐以这份代码为基础。

博客地址击败GANs的新生成式模型:score-based model(diffusion model)原理、网络结构、应用、代码、实验、展望

代码地址GitHub – openai/guided-diffusion

4、条件分类器技术进一步发展:《Classifier-Free Diffusion Guidance》

推荐理由:我推荐的其他论文基本上都发表机器学习/计算机视觉顶会,而这篇文章虽然只发表于cvpr workshop,但是作者提出了一个新的分数估计函数:有条件分数函数和无条件分数函数的线性组合,平衡了有条件的分数函数和无条件分数函数。当然在论文中作者先论述了《Diffusion Models Beat GANs on Image Synthesis》中提出的分类器技术的问题:额外训练一个分类器,并且往往会造成多样性下降的特点。当然这个问题也是必然出现的,因为分类器就是在生成质量和生成多样性中间做平衡。之所以推荐这篇论文,因为这项技术被后来的论文广泛应用,简单有用,值得学习!

博客地址无分类器指导的Classifier-free Diffusion Models技术

代码地址https://github.com/lucidrains/classifier-free-guidance-pytorch

5、Image-to-Image经典之作《Palette: Image-to-Image Diffusion Models》

推荐理由:我不确定Palette是不是第一个实现diffusion models 图像翻译工作的,但是一定是第一个火起来让很多圈内人关注的!Palette从pix2pix GANs中获取灵感,能够实现图像着色、图像修复、图像剪裁恢复、图像解压缩(超分)等等任务,最大的意义在于让更多人看到了diffusion models在图像翻译领域的潜力。从cvpr 2021开始,海量的相关论文被发表。

博客地址用Diffusion Models实现image-to-image转换

代码地址https://github.com/Janspiry/Palette-Image-to-Image-Diffusion-Models

6、畅游多模态领域:GLIDE

推荐理由:经典的三篇text-to-image的论文:DALLE 2、Imagen、GLIDE。在上半年各领风骚,让text-to-image方向成为diffusion中最受关注的领域。这三篇论文最先推荐的GLIDE的原因是它最先放出完成代码和预训练模型。预训练模型很重要!因为text-to-image领域都是大模型,不放出模型的话,我们这些非大组(指能分到40块显卡以上的)研究者根本无法在这基础上自己做迁移学习。GLIDE的核心跨模态引导公式来自《Diffusion Models Beat GANs on Image Synthesis》中的分类器引导,不同的是,这篇文章并没有给出严谨的证明过程。但是实验结果表明确实取得了很好的效果,后面的研究者从中获得启示,把其他的多模态信息按照这种方法注入,也取得了非常惊艳的结果。

博客地址2021年度最火Diffusion Models:用于图像编辑和text引导图像生成的GLIDE

代码地址https://github.com/openai/glide-text2im/tree/main/glide_text2im

7、stable diffusion的原型:《High-Resolution Image Synthesis with Latent Diffusion Models》

推荐理由:全体起立!终于讲到stable diffusion models了!这篇论文发表在cvpr 2022上,当时就受到了很多研究者们的关注,但是谁也没想到,一年后以latent diffusion models会孵化出stable diffusion这样彻底火出圈的作品。这篇论文有两个关键点值得关注:一是用encoder-decoder放缩到latent域上操作,又回到了生成领域最经典的结构,在latent域(即z)上操作,这种方法在vae上也算常用。二是cross-attention的结构,这种方法早在2020年的论文handwriting diffusion上就用过,但是当时并没有引起广泛的注意。在这之后cross-attention成为多模态的一种常用方法,成为新的常用条件扩散模型。

博客地址详细解读Latent Diffusion Models:原理和代码

代码地址https://github.com/CompVis/latent-diffusion

8、高调进军视频领域:《Video Diffusion Models》

推荐理由:有位“诗人”曾经说过:站在风口上X都能飞。这篇论文出现的时候,diffusion models已经在图像、多模态、3D等领域大杀四方了。video生成很显然是下一个风口,这时候谷歌研究院的作品video diffusion models横空出世。这篇论文需要注意两个点:一是怎样引入时序信息的方法,很值得借鉴。二是梯度引导法是首次被提出,当时我写的博客中说如果好用肯定会很快流行。事实证明,谷歌出品必属精品,果然流行的一番!

Video Diffusion Models:基于扩散模型的视频生成_沉迷单车的追风少年的博客-CSDN博客

博客地址Video Diffusion Models:基于扩散模型的视频生成

代码地址https://github.com/lucidrains/video-diffusion-pytorch

9、了不起的attention:《Prompt-to-Prompt Image Editing with Cross Attention Control》

推荐理由:在今年的ICLR中,diffusion models超过图神经网络,成为投稿最多的主题。这几千篇投稿中,这篇论文取得了审稿人的一致accept好评。这篇文章沿用了latent diffusion models提出了cross-attention的结构,但是做了不少改进,特别需要注意的是可解释性问题,作者将QKV可视化,替换attention map达到控制的目的。这种控制技术相比于LDM更细腻,更有说服力。

博客地址【ICLR 2023】Diffusion Models扩散模型和Prompt Learning提示学习:prompt-to-prompt

代码地址https://github.com/bloc97/CrossAttentionControl

10、Unet已死,transformer当立!《Scalable Diffusion Models with Transformers》

推荐理由:Unet本来是发源于医疗图像分割的backbone,后来pix2pix GANs开始引入到生成领域,diffusion models的研究者们一直想替换掉这个backbone,用更原生的方法。在语音领域、时间序列领域,早在2020年就有论文引入transformer作为backbone。不过笔者尝试将其引入到二维图像生成上,并没有取得好的效果。最近的一项研究成果成功用改进版本的transformer替换掉Unet,并取得了更好的效果。笔者最近复现了代码,大为震撼!我觉得这项研究生过会很快流行,强烈推荐!

博客地址:尚未写完,敬请期待哈哈

代码地址https://github.com/facebookrese

Improved DDPM

作者:Alex Nichol*, Prafulla Dhariwal*

关键词:diffusion model, fast sampling

论文:Improved Denoising Diffusion Probabilistic Models

知乎:https://zhuanlan.zhihu.com/p/557971459

摘要

去噪扩散概率模型(DDPM)是一类生成模型,最近已被证明能产生良好的样本。我们表明,通过一些简单的修改,DDPM也可以在保持高样本质量的同时实现具有竞争力的对数似然。此外,我们发现,反向扩散过程的学习方差允许以数量级更少的正向传递进行采样,样本质量差异可以忽略,这对于这些模型的实际部署非常重要。我们还使用精度和重新调用来比较DDPM和GANs覆盖目标分布的程度。最后,我们表明,这些模型的样本质量和似然性随模型容量和训练计算而平滑扩展,使其易于扩展。

贡献

  • 噪声机制更新,使用cosine
  • 引入了方差项的学习

方差学习

faster sampling

DDPM是一步一步的往上采样,这里有一个strided sampling schedule,也就是每次网上采样100步,参数都没变化。

Paper List

  1. (DDPM) Denoising Diffusion Probabilistic Models. NIPS 20. (Diffusion and deep-learning-based 图像生成开山之作)
  2. More Control for Free! Image Synthesis with Semantic Diffusion Guidance. arXiv 21. (对DDIM进行了推广,引入了一般形式的判别器引导)
  3. Denoising Diffusion Implicit Models. ICLR 21. (提出了一种新的sampling的方法,可以通过改变eta来skip一些step,进而达到加速sampling的目的)
  4. Improved denoising diffusion probabilistic models. ICML 21.
  5. Classifier-Free Diffusion Guidance. NIPSW 21. (引入了等价结构替代了分类器引导)
  6. GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models. ICML 22.
  7. Hierarchical Text-Conditional Image Generation with CLIP Latents. NIPS 22 在投. (DALL-E 2)
  8. Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding. NIPS 22 在投. (Imagen, SOTA)
  9. High-Resolution Image Synthesis with Latent Diffusion Models. CVPR 22. (隐空间LDM)

基于扩散模型的语义分割

论文标题:LABEL-EFFICIENT SEMANTIC SEGMENTATION WITH DIFFUSION MODELS

论文地址:https://arxiv.org/pdf/2112.03126.pdf

论文代码:https://github.com/yandex-research/ddpm-segmentation

摘要

  1. 背景介绍: 去噪扩散概率模型DDPM最近受到了很多研究关注,因为它们优于其他方法,如GAN,并且目前提供了最先进的生成性能。差分融合模型的优异性能使其在修复、超分辨率和语义编辑等应用中成为一个很有吸引力的工具。
  2. 研究方法: 作者为了证明扩散模型也可以作为语义分割的工具,特别是在标记数据稀缺的情况下。对于几个预先训练的扩散模型,作者研究了网络中执行逆扩散过程马尔可夫步骤的中间激活。结果表明这些激活有效地从输入图像中捕获语义信息,并且似乎是分割问题的出色像素级表示。基于这些观察结果,作者描述了一种简单的分割方法,即使只提供了少量的训练图像也可以使用。
  3. 实验结果: 提出的算法在多个数据集上显着优于现有的替代方法。

K-L散度(相对熵)

Kullback-Leibler Divergence,即K-L散度,是一种量化两种概率分布P和Q之间差异的方式,又叫相对熵。在概率学和统计学上,我们经常会使用一种更简单的、近似的分布来替代观察数据太复杂的分布。K-L散度能帮助我们度量使用一个分布来近似另一个分布时所损失的信息量。

数据的熵

K-L散度源于信息论。信息论主要研究如何量化数据中的信息。最重要的信息度量单位是Entropy,一般用H表示。分布的熵的公式如下:

上面对数没有确定底数,可以是2e10,等等。如果我们使用以2为底的对数计算H值的话,可以把这个值看作是编码信息所需要的最少二进制位个数bits。上面空间蠕虫的例子中,信息指的是根据观察所得的经验分布给出的蠕虫牙齿数量。计算可以得到原始数据概率分布的熵值为3.12 bits。这个值只是告诉我们编码蠕虫牙齿数量概率的信息需要的二进制位bit的位数。

可是熵值并没有给出压缩数据到最小熵值的方法,即如何编码数据才能达到最优(存储空间最优)。优化信息编码是一个非常有意思的主题,但并不是理解K-L散度所必须的。熵的主要作用是告诉我们最优编码信息方案的理论下界(存储空间),以及度量数据的信息量的一种方式。理解了熵,我们就知道有多少信息蕴含在数据之中,现在我们就可以计算当我们用一个带参数的概率分布来近似替代原始数据分布的时候,到底损失了多少信息。

K-L散度度量信息损失

只需要稍加修改熵H的计算公式就能得到K-L散度的计算公式。设p为观察得到的概率分布,q为另一分布来近似p,则pqK-L散度为:

entropy-p-q

显然,根据上面的公式,K-L散度其实是数据的原始分布p和近似分布q之间的对数差值的期望。如果继续用2为底的对数计算,则K-L散度值表示信息损失的二进制位数。下面公式以期望表达K-L散度:

一般,K-L散度以下面的书写方式更常见:

注:log a - log b = log (a/b)

OK,现在我们知道当用一个分布来近似另一个分布时如何计算信息损失量了

散度并非距离

很自然地,一些同学把K-L散度看作是不同分布之间距离的度量。这是不对的,因为从K-L散度的计算公式就可以看出它不符合对称性(距离度量应该满足对称性)。也就是说,用p近似q和用q近似p,二者所损失的信息并不是一样的。

如果你熟悉神经网络,你肯能已经猜到我们接下来要学习的内容。除去神经网络结构的细节信息不谈,整个神经网络模型其实是在构造一个参数数量巨大的函数(百万级,甚至更多),不妨记为f(x),通过设定目标函数,可以训练神经网络逼近非常复杂的真实函数g(x)。训练的关键是要设定目标函数,反馈给神经网络当前的表现如何。训练过程就是不断减小目标函数值的过程。