置顶|本站文章索引
生成式人工智能
Flow-based Models
笔记|Normalizing
Flow 理论与实现(一):基础理论
笔记|扩散模型(一八):Flow
Matching 理论详解
Diffusion Models:通用理论
笔记|扩散模型(一):DDPM
理论与实现
笔记|扩散模型(二):DDIM
理论与实现
笔记|扩散模型(三):Improved
DDPM 理论与实现
笔记|扩散模型(四):Classifier
Guidance 理论与实现
笔记|扩散模型(五):Classifier-Free
Guidance 理论与实现
笔记|扩散模型(一七):扩散模型中的
Velocity Prediction
Diffusion Models:文生图
笔记|扩散模型(六):DALL-E
理论与实现|自回归文生图
笔记|扩散模型(七):Latent
Diffusion Models(Stable Diffusion)理论与实现
笔记|扩散模型(八):DALL-E
2 (unCLIP) 理论与实现
笔记|扩散模型(九):Imagen
理论与实现
笔记|扩散模型(一〇):Dreamboo ...
笔记|扩散模型(一八):Flow Matching 理论详解
论文链接:Flow
Matching for Generative Modeling
在 Stable Diffusion 3 中,模型是通过 Flow Matching
的方法训练的。从这个方法的名字来看,就知道它和 Flow-based Model
有比较强的关联,因此在正式开始介绍这个方法之前先交代一些 Flow-based
Model 相关的背景知识。
Flow-based Models
Normalizing Flow
Normalizing Flow
是一种基于变换对概率分布进行建模的模型,其通过一系列离散且可逆的变换实现任意分布与先验分布(例如标准高斯分布)之间的相互转换。在
Normalizing Flow
训练完成后,就可以直接从高斯分布中进行采样,并通过逆变换得到原始分布中的样本,实现生成的过程。(有关
Normalizing Flow 的详细理论介绍可以移步我的这篇文章观看)
从这个角度看,Normalizing Flow 和 Diffusion Model
是有一些相通的,其做法的对比如下表所示。从表中可以看到,两者大致的过程是非常类似的,尽管依然有些地方不 ...
笔记|扩散模型(一七):扩散模型中的 Velocity Prediction
论文链接:Progressive
Distillation for Fast Sampling of Diffusion Models
近期在研究 Rectified Flow 时发现 diffusers 中一个相关的 PR(#5397)训练用到了
Velocity
Prediction,回想起之前某次面试还被问到了这个问题,决定来学习一下这究竟是什么东西。
对 CompVis 实现的 Stable Diffusion 代码比较熟悉的读者应该或多或少都在
scheduler 中读到过这样一段代码:
123456if self.parameterization == "eps": target = noiseelif self.parameterization == "x0": target = x_startelif self.parameterization == "v": target = self.get_v(x_start, noise, t)
这是在计算损失时,也就是 p_loss
函数中的几种 ...
笔记|扩散模型(一六):CogVideoX 论文解读|文生视频扩散模型
CogVideoX 是智谱近期发布的视频生成模型,和上一个工作 CogVideo
不同,这个方法是基于扩散模型实现的。从框架图来看,感觉 CogVideoX
同时吸取了 Sora 和 Stable Diffusion 3 的优势,不仅使用了 3D
VAE,还引入了双路 DiT 的架构。
具体来说,CogVideoX 主要进行了以下几个方面的工作:
使用 3D VAE 编码视频,有效地压缩视频维度、保证视频的连续性;
引入双路 DiT 分别对文本和视频进行编码,并用 3D attention
进行信息交换;
开发了一个视频标注的 pipeline,用于对视频给出准确的文本标注;
提出了一种渐进式训练方法和一种均匀采样方法。
CogVideoX
CogVideoX 的整体架构如下图所示,文本和视频分别经过文本编码器(这里是
T5)和 3D VAE
编码后输入主干网络。文本和视频分别经过一条支路,并在注意力部分进行交互。
3D Causal VAE
由于视频相比图像多了时序信息,所以需要对多出来的时间维度进行处理。先前的视频生成模型都采用
2D
VAE,这样会导致生成的视频在时间上连续 ...
笔记|扩散模型(一五):CogVideo 论文解读|文生视频大模型
论文链接:CogVideo:
Large-scale Pretraining for Text-to-Video Generation via
Transformers
官方实现:THUDM/CogVideo(由于目前的仓库里,CogVideo
相关的代码已经被替换为 CogVideoX 的代码,所以如果希望浏览 CogVideo
的代码,包含该方法代码最后一个 commit 为 5f914b7,也就是
这个链接)
和本系列中的 DALL-E 一样,虽然 CogVideo
也并非基于扩散模型的方法,但由于其后续工作 CogVideoX
是基于扩散模型的,所以这篇文章也放到扩散模型系列里。
CogVideo 是基于大规模预训练 Transformer
进行视频生成的工作,也是近期推出的 CogVideoX
的前身。相比于文生图任务,文生视频的主要难点在于两个方面:首先是数据更加稀缺,视频-文本配对数据比较少;其次是视频多了时序信息。
本模型基于文生图模型 CogView2 进行训练,在训练时使用了 5.4 M
视频-文本对数据。在训练时,文本条件是通过 in context
lea ...
笔记|扩散模型(一四):Textual Inversion 理论与实现
论文链接:An Image is
Worth One Word: Personalizing Text-to-Image Generation using Textual
Inversion
官方实现:rinongal/textual_inversion
非官方实现:huggingface/diffusers
Textual Inversion 也是对 diffusion model
进行微调的主要范式之一,从标题中 An Image is Worth One Word
可以猜测,这个方法也是类似 Dreambooth 用某个特别的 text token
来表示所要生成的物体。不过和 Dreambooth 不同的是,Textual Inversion
并不是在 prompt
中插入某个修饰词来表示主体或者风格,而是直接将主体学习为一个
token。这个方法比较特别的是它并不改变原始模型的权重,而只学习了一个额外的
embedding。
Textual Inversion
现有的工作已经证明了 diffusion model 的 text embedding
空间对图像的语义信息有一 ...
笔记|扩散模型(一三):DiT|Diffusion with Transformer
论文链接:Scalable
Diffusion Models with Transformers
官方实现:facebookresearch/DiT
Transformer
在许多领域都有很不错的表现,尤其是近期大语言模型的成功证明了 scaling law
在 NLP 领域的效果。Diffusion Transformer(DiT)把 transformer
架构引入了扩散模型中,并且试图用同样的 scaling
方法提升扩散模型的效果。DiT 提出后就受到了很多后续工作的
follow,例如比较有名的视频生成方法 sora 就采取了 DiT
作为扩散模型的架构。
Diffusion Transformer
在正式开始介绍 DiT 之前,需要先了解一下 DiT 使用的扩散模型架构。DiT
使用的是 latent diffusion,VAE 采用和 Stable Diffusion 相同的
KL-f8,并且使用了 Improved DDPM(详细介绍见这个链接),同时预测噪声的均值和方差。
Patchify
由于 DiT 使用了 latent diffusion,对于 \(256 ...
笔记|扩散模型(一二):U-ViT|Diffusion with Transformer
论文链接: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\)。作者选取了几种不同的实现方式进行 ...
笔记|扩散模型(一一):Stable Diffusion XL 理论与实现
论文链接:SDXL:
Improving Latent Diffusion Models for High-Resolution Image
Synthesis
官方实现:Stability-AI/generative-models
非官方实现:huggingface/diffusers
Stable Diffusion XL (SDXL) 是 Stablility AI 对 Stable Diffusion
进行改进的工作,主要通过一些工程化的手段提高了 SD 模型的生成能力。相比于
Stable Diffusion,SDXL
对模型架构、条件注入、训练策略等都进行了优化,并且还引入了一个额外的
refiner,用于对生成图像进行超分,得到高分辨率图像。
Stable Diffusion XL
模型架构改进
SDXL 对模型的 VAE、UNet 和 text encoder
都进行了改进,下面依次介绍一下。
VAE
相比于 Stable Diffusion,SDXL 对 VAE
模型进行了重新训练,训练时使用了更大的 batchsize(256,Stable Diffusion
...
笔记|LoRA 理论与实现|大模型轻量级微调
论文链接:LoRA:
Low-Rank Adaptation of Large Language Models
官方实现:microsoft/LoRA
非官方实现:huggingface/peft、huggingface/diffusers
这篇文章要介绍的是一种大模型/扩散模型的微调方法,叫做低秩适应(也就是
Low-Rank Adaptation,LoRA)。经常使用 stable diffusion webui
的读者应该对这个名词非常熟悉,通过给扩散模型加载不同的
lora,可以让扩散模型生成出不同风格的图像。现在也已经有很多平台(例如 civitai、tensorart 等)可以下载现成的
lora,可以看出 LoRA 的影响力还是比较大的。
LoRA 作为一种高效的参数微调(Parameter-Efficient
Fine-Tuning,PEFT)方法,最初是被用来微调 LLM
的,后来也被用来微调扩散模型。这种方法的主要思想是固定住预训练模型的参数,同时引入额外的可训练低秩分解模块,只训练额外引入的这部分参数,从而大大减小模型的微调成本。
与其他的 Peft 方法相比 ...