Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

这篇具有很好参考价值的文章主要介绍了Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS)

系列文章

  • Stable Diffusion 原理介绍与源码分析(一、总览)

前言(与正文无关,可忽略)

发现标题越起越奇怪了…

本文继续介绍 Stable Diffusion 框架的实现。在之前的文章 Stable Diffusion 原理介绍与源码分析(一、总览) 中,我介绍了 Stable Diffusion 文生图框架的整体结构,如下图,并简要描述了其各个重要组成模块:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

其中红框中的 UNetModel 已经在上篇文章中介绍过,只需要记住它被用来预估图像的噪声,并且可以保持输入输出的大小不变(我就是这么进行粗浅的记忆的🤣)。而本文则会将目光移向采样阶段,即上图蓝框中的内容,简要介绍扩散模型使用 DDPM、DDIM、PLMS 等算法通过迭代去除噪声,从而生成图像的潜在空间(latent space)表示。

另外需要注意的是,我其实在文章(一)中也进行过说明,我将以伪代码的形式对源码进行分析,这可以刨除大量无关的细节,直达本质,也特别方便后续回顾。

目前 ChatGPT 大火,它能够在一定程度上辅助我们写代码,我们只需要准确描述自己的意图,剩下的工作让它完成就好。(以后和公司谈薪时,对代码进行 Ctrl-C & Ctrl-V 只值 1% 的工资,知道 Ctrl-C & Ctrl-V 哪些 code 值剩下的 99%,哈哈🤣)

总览

本文对 Stable Diffusion 主要使用的如 DDPM、DDIM、PLMS 等算法进行分析,详解其代码实现。

源码地址:Stable Diffusion

DDPM

对原理进行朴素回顾

DDPM (Denoising Diffusion Probabilistic Models)算法之前在 扩散模型 (Diffusion Model) 简要介绍与源码分析 介绍过,推导有些复杂,这里就用朴素的大白话描述一下我觉得最重要的几个公式,然后分析代码实现,核心是理清楚推导的逻辑链。

首先扩散模型的整个思路是先在图像上不断的加噪,从而对图像进行破坏,然后再对破坏后的图像进行不断的去噪,最后恢复出原始图像。这个过程可以用如下公式描述:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

现在的一个问题是如何求逆向阶段的分布,也就是如果给定了一张加噪的图像,我们如何才能求得它前一时刻没有被破坏的那么严重的图像。经过数学高手们的一顿推导,发现两个重要结论:1. 逆向过程也服从高斯分布;2. 在知晓初始干净图像的情况下,我们能通过贝叶斯公式将逆向过程转换成前向过程,从而算出逆向过程的分布; 在公式上体现如下:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

算出逆向过程的分布后,我们就可以训练一个模型,去尽力拟合这个分布,那么模型预估出来的结果也应该服从高斯分布:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

现在逆向过程的分布有了(可以理解为 label),模型的预估分布也有了,就差一个 Loss 函数,而经过数学高手的又一顿推导,发现 Loss 居然是计算两个分布的 KL 散度,而且还是两个高斯分布的 KL 散度!朴素的说,KL 散度可以用来描述两个分布之间的差距。不得不感慨,数学就是这么神奇,左推右推,最后能得到一个美妙的结果:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

多元高斯分布的 KL 散度是有闭式解的,详见维基百科:https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence#Multivariate_normal_distributions,具体公式如下:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

最后得到训练过程和采样过程分别如下:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

下面进行代码分析。

DDPM 代码分析

再次提醒,我对源码进行了抽象,以伪代码的形式呈现。详细列出每行代码完全没有必要,太多的细节会淹没真正重要的信息。另外注意两点:1. 在实现上,我保持类名、函数名和源码一致,这样就可以方便快速了解类或者函数的功能;2. 函数尽量按调用顺序进行组织;

Stable Diffusion 对 DDPM 的实现源码地址:https://github.com/CompVis/stable-diffusion/blob/main/ldm/models/diffusion/ddpm.py

  • 训练阶段:
Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

不客气的说,非常简洁。PyTorch 中 forward() 函数是入口,输出噪声之间的 Loss;

  • 采样阶段:

按顺序阅读,核心在 p_sample 函数中,使用重参数技巧生成样本:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

针对 DDPM 的改进

下面简单介绍 DDIM 和 PLMS算法,它们均是对 DDPM 算法的改进。DDPM 在采样阶段需要迭代很多次(比如 1000)才能得到一个比较好的效果,而 DDIM、PLMS 算法则尝试使用较少的迭代次数来加速采样过程。下图是 DDIM 论文中给出的实验结果分析:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

其中第一行(绿线…)是 DDIM 的结果,最后一行是 DDPM 的实验结果,使用 FID 来评估生成图像的质量,该值越小,表示结果越好;S 为迭代次数,只看红框中的 CIFAR10 数据集上的效果,可以发现随着迭代次数的增加,FID 越小,生成图像质量越好;另外可以注意到 DDIM 迭代到第 50 次左右时,就几乎能达到 DDPM 迭代到 1000 次的效果 (4.67 vs. 3.17);

DDIM

DDIM 将图像的采样过程定义为非马尔科夫链:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

并重新推导了图像的生成公式:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

其中 σ t \sigma_t σt 定义如下:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

根据推导,如果系数 η = 1 \eta = 1 η=1, 那么此时采样过程和 DDPM 相同;而当系数 η = 0 \eta = 0 η=0 时,即为 DDIM 算法的采样过程,注意到此时均方差为 0,图像的生成过程是确定的。另外需要注意在 DDIM paper 的公式中, α t \alpha_t αt 以及 β t \beta_t βt 等的含义和 DDPM 论文中不同,它们被重新定义了…

Stable Diffusion 中,DDIM 的源码实现位于:https://github.com/CompVis/stable-diffusion/blob/main/ldm/models/diffusion/ddim.py

伪代码如下(DDIM 默认只迭代 50 步):

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

PLMS

没有详细进行公式推导,平时加班就已经很辛苦了: 逃避虽然可耻,但是有用 …

论文中给出采样过程的公式如下:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

伪代码如下:

Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)

资源汇总

  • Stable Diffusion: https://github.com/CompVis/stable-diffusion
  • DDPM 相关资料
    • 论文:Denoising Diffusion Probabilistic Models | https://arxiv.org/abs/2006.11239
    • 代码:tf version: https://github.com/hojonathanho/diffusion | pytorch version: https://github.com/lucidrains/denoising-diffusion-pytorch
  • DDIM 相关资料
    • 论文:Denoising Diffusion Implicit Models | https://arxiv.org/abs/2010.02502
    • 代码:https://github.com/ermongroup/ddim
  • PNDM/PLMS 相关资料
    • 论文:Pseudo Numerical Methods for Diffusion Models on Manifolds | https://openreview.net/forum?id=PlKWVd2yBkY
    • 代码:https://github.com/luping-liu/PNDM

小结

本文对 Stable Diffusion 使用的如 DDPM、DDIM、PLMS 等算法进行了简要分析,用伪代码的形式介绍了其实现过程。

逃避了对 DDIM 和 PLMS 中的公式推导,虽然可耻,但真的有用。。。。最后附上一张 AI 产出的 Image,让疲劳的眼睛休息下:

(对了,可以在微信中搜索 “珍妮的算法之路” 或者 “world4458” 关注我的微信公众号, 及时获取最新原创技术文章更新。。。)文章来源地址https://www.toymoban.com/news/detail-408530.html

到了这里,关于Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AI绘图之DDIM 与 DDPM

    DDPM:    去噪扩散概率模型 (DDPM) 在没有对抗训练的情况下实现了高质量的图像生成,但它们需要模拟马尔可夫链的许多步骤才能生成样本。 为了加速采样,我们提出了去噪扩散隐式模型 (DDIM),这是一类更有效的迭代隐式概率模型,其训练过程与 DDPM 相同。 在 DDPM 中,生成过

    2024年02月11日
    浏览(27)
  • DDIM原理及代码(Denoising diffusion implicit models)

    之前学习了 DDPM(DDPM原理与代码剖析)和 IDDPM(IDDPM原理和代码剖析), 这次又来学习另一种重要的扩散模型。它的采样速度比DDPM快很多(respacing),扩散过程不依赖马尔科夫链。 Denoising diffusion implicit models, ICLR 2021 摘选paper一些重要思想。 (1) 由于DDPM加噪基于马尔科夫链过程,那么

    2024年02月02日
    浏览(29)
  • Stable Diffusion核心算法DDPM解析

    DDPM:Denoising Diffusion Probabilistic Model,去噪扩散概率模型 本文参考:一个视频看懂扩散模型DDPM原理推导|AI绘画底层模型_哔哩哔哩_bilibili 从右往左为正向加噪过程,从左往右为逆向降噪过程。 在正向过程中不断加噪,经过T次之后得到,我们希望 这样在推理过程中,我们可以

    2024年02月12日
    浏览(25)
  • 一文速览扩散模型优化过程:从DDPM到条件生成模型Stable Diffusion

    目前AIGC可以说是整个人工智能领域的当红炸子鸡,而Diffusion Model(扩散模型)正是目前各项图像生成式应用的主要架构。本人并不主要研究图像生成领域,不过由于项目需要也对其进行过一些调研,故写下这篇文章进行分享与记录。本文会从最简单的扩散模型开始讲起,然后

    2024年02月09日
    浏览(44)
  • 生成式 AI - Diffusion 模型 (DDPM)原理解析(1)

    来自 论文《 Denoising Diffusion Probabilistic Model》(DDPM) 论文链接:https://arxiv.org/abs/2006.11239 Hung-yi Lee 课件整理 简单地介绍diffusion model 的基本概念,diffusion model有很多不同的变形,现在比较成功的使用diffusion model实现的图像生成的系统,比如阿里、Google的系统基本上都是用差不

    2024年03月13日
    浏览(51)
  • Fast.ai 的新课来了,给你详细介绍 Stable Diffusion 原理

    最近跟学生们学了个新词儿,叫做「双厨狂喜」。一般形容两个知名创作者合作出来的作品 ------ 例如视频或者直播等 ------ 很受大伙儿欢迎。 这次,告诉你一个好消息,fast.ai 要和 Huggingface, Stability.ai(Stable Diffusion 作者之一)等各方一起创作一门新课程,叫做 From Deep Learn

    2024年02月11日
    浏览(32)
  • 计算机视觉的应用20-图像生成模型(Stable Diffusion)的原理详解与相关项目介绍

    大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用20-图像生成模型:Stable Diffusion模型的原理详解与相关项目介绍。大家知道现在各个平台发的各种漂亮的女生,这些漂亮的图片是怎么生成的吗,其实它们底层原理就是用到了Stable Diffusion模型。 Stable Diffusion是一种基

    2024年04月12日
    浏览(35)
  • Stable Diffusion原理说明

    本文参考:深入浅出讲解Stable Diffusion原理,新手也能看明白 - 知乎 目录 1、Stable Diffusion能做什么? 2、扩散模型(Diffusion model) (1)前向扩散(Forward Diffusion) (2)反向扩散(Reverse Diffusion) (3)如何训练  3、Stable Diffusion Model (1)潜在扩散模型(Latent diffusion model) (

    2024年02月11日
    浏览(31)
  • Stable Diffusion的原理

    CSDN-markdown语法之怎样使用LaTeX语法编写数学公式 参考视频:【diffusion】扩散模型详解!原理+代码! 用一颗桃树为你讲清楚 知识点:AI绘图原理 Diffusion扩散模型 Windows深度学习环境搭建:Windows深度学习环境搭建 绘图的过程:逆向降噪的过程 例如将一个掉满花瓣的草地复原成

    2024年02月09日
    浏览(31)
  • stable diffusion原理

    隐空间是压缩数据的一个表示。数据压缩的目的是学习数据中较重要的信息。以编码器-解码器网络为例,首先使用全卷积神经网(FCN)络学习图片特征,我们将特征提取中对数据的降维看作一种有损压缩。但是由于解码器需要重建(reconstruct)数据,所以模型必须学习如何储存所有

    2024年02月01日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包