【原创】万字长文讲解AI绘画基本技术原理

news2024/11/14 16:25:18

作者:黑夜路人

时间:2023年4月12日

AIGC是什么

AIGC - AI Generated Content (AI生成内容),对应我们的过去的主要是 UGC(User Generated Content)和 PGC(Professional user Generated Content)。

AIGC就是说所有输出内容是通过AI机器人来生成产出相关内容,主要区别是过去主要是普通用户和某一领域专业用户(人)生产内容,AIGC主要是依赖于人工智能(非人类)生成内容,这个就是AIGC的核心意思。

(版权认定:UGC和PGC是有版权概念的,版权归属于负责生成内容的人,AIGC目前美国法规认为是没有版权概念的,就是内容不属于调用的人,也不属于这个AI机器,所以没有版权归属这件事。)

AIGC可以生成什么内容

目前AIGC主要可以生成文本内容和图片内容(目前视频生成有一些产品,但是没有文本和图片生成这么成熟),所以我们主要集中在文本和图片的AIGC的介绍。

AIGC在文本内容方面,主要可以通过 Q&A (提问回答)得形式进行互动,能够按照人类想要的“提问”生产输出符合人类预期的内容。

一般我们可以把AI当做一个全知全能的“高级人类”,以“文本AIGC”来抡,你可以向它提出问题(Prompt),然后它做出相应回答。所有提问和回答都可以涉及到方方面面,包括不限于  百科知识/创意文案/小说剧本/代码编程/翻译转换/论文编写/教育教学/指导建议/聊天陪伴 等等等等场景不一而足,场景都需要你去想,可以理解它是一个拥有全地球知识的“百晓生”,什么都可以问它或者跟它交流。

比如我们用大名鼎鼎的 ChatGPT 来进行提问:

对于“图片AIGC”来说,你可能脑子里有无数创意,但是自己不会绘画,无法把脑子里的Idea变成实实在在的图片,那么,“图片AIGC”能够帮助你按照你脑子想要的东西,你告诉它,然后它能够帮助你通过图片绘画的形式给你画出来,让你一下子把自己的“创意”变成了图片现实。

比如我们用非常好用的“图片AIGC” 工具 Midjourney 来画画:

  

AIGC基本工作原理

AIGC底层主要依赖的是AI技术,AI技术本质主要是让机器拥有像人类一样的智能(Artificial Intelligence),所以就需要让机器能够像人类一些学习和思考,所以目前大部分实现AI的底层技术叫做“机器学习”(Machine Learnin)技术。

机器学习技术主要有很多应用场景,比如现在非常常用的包括 人脸识别(手机解锁/支付宝支付/门禁解锁等)、语音识别(小爱同学/小度/Siri)、美颜换脸(主播美颜/美颜相机)、地图导航、气象预测、搜索引擎、NLP(自然语言处理)、自动驾驶、机器人控制、AIGC 等等。

今天重点学习了解一下关于AIGC中图片生成技术,也就是图片的AIGC。目前国内外比较主流的图片AIGC产品包括 OpenAI DALL.E、Google Imagen、Stable Diffusion、MidJourney、Disco Diffusion 等等。目前主流应用比较广泛的主要包括 Stable Diffusion、MidJourney 产品。它们这些产品的工作原理大同小异,下面主要是以Stable Diffusion 这个产品为例子,简单概要的学习一下AI图片生成底层主要技术原理。

机器如何进行学习

机器学习可以简单理解为是模拟人类学习的过程,我们来看一下机器是如何模拟人类学习的。

我们再看看所谓的“机器学习”:

对于人类学习来说,我们看到的事物和遇到的事物就是我们的“资料”(语料),然后我们通过“学习总结归纳”(学习算法),最后变成了“知识经验智慧”(模型),然后遇到事情的时候我们就会调用这些“知识经验方法论”做出相应的反应决策动作(预测推理);

对于机器学习来说,给它输入大量的“语料”(看到遇到的事物),然后通过机器学习算法(总结归纳抽取相似点),最后形成了“模型”(知识经验方法论),然后再遇到一些需要判断决策的时候,我们就会把要判断决策的事物给“模型”,然后就会告诉我们输出结果(推理推测结果);

从抽象层来说,我们会发现,本质来说,“人类学习”和“机器学习”内在本质是比较像的。

我们来看一个计算机里概要的机器学习的过程:

里面核心步骤就是:“训练数据 ➜ 训练算法 ➜ 模型 ➜ 预测 ➜ 输出结果”,其中最终产出物是“模型”(Model,模型文件),然后主要是前置的“训练模型”和后置的“模型预测”,然后产生对应结果。

上面这个过程我们我们可以简单理解为:“模型”就是一只小狗,饲养员就是那个“训练算法”,饲养员在场下对那个小狗通过一些指令和奖惩措施进行反复训练(训练算法),小狗就会学会一些技能(模型),一旦学会了,小狗就可以出去表演,表演的过程就是预测。

所以我们会看到,里面如果“模型”中的特征(知识经验)越多,最终在“预测”阶段就越准确,如果模型越小,或者中间的特征数据越少,可能最终预测结果准确率会降低。(类似一个人遇到的事情越多,总结的经验就越多,俗话说的“人生没有白走的路没有白踩的坑” 大概就是这个逻辑)

图片生成核心模型 - Diffusion Model

以为图片生成领域来说,最近几年有四大主流生成模型:生成对抗模型(GAN)、变分自动编码器(VAE)、流模型(Flow based Model)、扩散模型(Diffusion Model)等,基本主要都是基于深度学习为训练方式的模型。从2022年开始,主要爆火的图片生成模型是Diffusion Model(扩散模型)为主。

(几种主流图片处理的模型对比图)

目前主流国内外靠谱的图片生成技术主要基本都是基于Diffusion Model(扩散模型)来进行的实现,包括不限于 Stable Diffusion、MidJourney、OpenAI DALL.E、Disco Diffusion、Google Imagen 等主流产品,但是实际技术在处理方面又各有区别,也导致会有不同的表现形态,核心一方面是底层模型训练的图片语料不同,另外一个方面是一些算法方面的微调区别。

Diffusion 是用一种非稳态的生成模型,核心就是通过不停去除噪音期望获得好结果的生成模型。早期的扩散模型在AI绘画中效果不好,而且单张图生成需要10-15分钟,后来英国一个公司叫做 Stability AI对模型进行了改进,把图片生成稳定性和质量都大幅提高,图片生成速度提高了100倍,意味着以前需要10-15分钟(600-900秒)现在只需要6-10秒就可以生成一张图(我自己实测在RTX4050-6G显卡下面大概生成一张图平均10秒左右)。然后这个公司把这种稳态的Diffusion模型叫做:“Stable Diffusion”,然后Stable Diffusion模型形态基本影响了包括 MidJourney 等AI艺术绘画产品。

在Stable Diffusion(稳定扩散模型)出现之前,是有一个稳定扩散模型 (Latent Diffusion) ,Latent diffusion其实是说的Latent difusion论文中的text2image模型,Latent diffusion更准确地说是一种基于Latent的扩散模型架构,所以Stable diffusion本质上也属于Latent diffusion,因为Stable Diffusion开发这模型的背后公司叫Stability Al,所以叫做 Stable Diffusion。

当然 Stable Diffusion 还有很多改进,Stable Diffusion 对比 Latent Diffusion 主要改进包括:

(1) 训练数据:Latent diffusion%是采用laion-400M数据训练的,而Stable diffusion是在laion-2B.en数据集上训练的,明显后者用了更多的训练数据,而且后者也采用了数据筛选来提升数据质量,比如去掉有水印的图像以及选择美学评分较高的图像。

(2) text-encoder:Latent diffusion采用一个随机初始化的transformer来编码text,而Stable difusion采用一个预训练好的CLIP text encoder来编码text,预训练的text model往往要优于从零开始训练的模型

(3) 训练尺寸:Latent diffusion只是在256x256分辨率上训练,而Stable diffusion先在256x256分辨率上预训练,然后再在512x512分辨率 上Finetune。

总结来说:Stable diffusion使用了更好的text encoder在更大的数据集上训练,并且能生成更高分辨率图像,所以目前图片生成中实际应用来说 Stable Diffusion更适合。

我们对Stable Diffusion来简单了解,它主要的算法工作架构大概是这样的:

中间核心架构图是参考论文《High-Resolution Image Synthesis with Latent Diffusion Models》中的图,外面我增加了虚线框把核心模块做了标注。

Stable Diffusion 使用工作流程

我们在看一下图片AIGC的基本用户操作交互过程:

输入提示词(Prompt) -> 点击“生成”(或者命令执行imagine)-> 图片从 10%~100%刷新(从模糊到清晰) -> 图片完全生成。

详细文字生成图片步骤可以简单看做这么几步:

第一步,Prompt Encoder过程(Text Encoder)

模型将潜在空间的随机种子和文本提示词(Prompt)同时作为输入,然后使用潜在空间的种子生成大小为64×64的随机潜在图像表示,通过CLIP的文本编码器将输入的文本提示转换为大小为77×768的文本嵌入。

第二步,使用U-Net进行Diffusion过程

使用经过修改,含注意力机制的U-Net,在接受文本嵌入作为注意力机制计算对象的同时迭代地对随机潜在图像表示进行去噪。 U-Net 的输出是噪声的残差,用于通过scheduler 程序算法计算去噪的潜在图像表示。 scheduler 算法根据先前的噪声表示和预测的噪声残差计算预测的去噪图像表示。去噪过程重复约50-100次,这样可以逐步检索更好的潜在图像表示。

许多不同的 scheduler 算法可以用于这个计算,每一个都有它的优点和缺点。对于Stable Diffusion,可以使用包括 PNDM scheduler、DDIM scheduler+PLMS、K-LMS scheduler等。

第三步,潜在图片通过VAE进行解码

一旦上面步骤完成,潜在图像表示就会由变分自编码器的解码器部分进行解码,输出图片,步骤完成。

(上面三个步骤的主要工作流程图)

Stable Diffusion 底层工作机制

我们把上面使用流程整理一下,这些步骤可以梳理出来核心操作流程主要是这三步,然后映射成为我们对应模块为:

Step 1. 输入提示词,解析提示词:文本图片编码器 - CLIP

Step 2. 从图片库(模型)中拉取适合提示词的模型:基于U-Net的Diffusion过程(U-Net基础上的DDPM+DDIM+PLMS)

Step 3. 图片输入输出的处理转换:VAE

如果涉及到这核心三个步骤,那么这些各个带着英文大写字母都主要是哪些依赖的算法模型等,我们概要介绍一下:

(1) 文图匹配过程 Text Encoder : CLIP - Contrastive Language-Image Pre-training

是一种基于对比文本-图像对的预训练方法或者模型,CLIP是一种基于对比学习的多模态模型。CLIP的训练数据是文本-图像对,主要是一张图像和它对应的文本描述,这里希望通过对比学习,模型能够学习到文本-图像对的匹配关系。

CLIP的英文全称是Contrastive Language-Image Pre-training,是一种基于对比文本-图像对的预训练方法或者模型。互联网上较容易搜集到大量成对的文本和图像,对于任何一个图像文本对而言,文本其实可以认为是图像的标签。CLIP是一种基于对比学习的多模态模型(文本+图像),与CV中的一些对比学习方法如moco和simclr不同的是,CLIP的训练数据是文本-图像对:一张图像和它对应的文本描述,这里希望通过对比学习,模型能够学习到文本-图像对的匹配关系。如下图所示,CLIP包括两个模型:Text Encoder和Image Encoder,其中Text Encoder用来提取文本的特征,可以采用NLP中常用的text transformer模型;而Image Encoder用来提取图像的特征,可以采用常用CNN模型或者vision transformer。(一句话简单说:就是把文字和图片放到一个矩阵空间里,用来解决文本到图片的映射和相似性交集,方便通过文本找到对应图像的分布模型)

(CLIP的工作过程)

我们看上图,我们观察 Contrastive pre-training的过程,这里对提取的文本特征和图像特征进行对比学习。对于一个包含N个文本-图像对的训练batch,将 N 个文本特征和 N 个图像特征两两组合,CLIP模型会预测出 N^2个可能的文本-图像对的相似度,这里的相似度直接计算文本特征和图像特征的余弦相似性(cosine similarity),即上图所示的矩阵。这里共有 N 个正样本,即真正属于一对的文本和图像(矩阵中的对角线元素),而剩余的 N^2 - N 个文本-图像对为负样本,那么CLIP的训练目标就是最大 N 个正样本的相似度,同时最小化 N^2 - N 个负样本的相似度,这个就是大概训练环节的工作原理。

(2) 图片生成过程:基于UNet 的 Diffusion Process(DDPM等)

这是图片AIGC中最复杂关键的过程,主要需要解决的就是按照抽象的图像分布模型或者是噪点,然后把原始图片合成出来。以Stable Diffusion来说,主要是基于Diffusion Model的思路实现包括 DDPM(Denoising Diffusion Probabilistic Models,去噪扩散概率模型)。DDPM就是通过对数据不断加噪成为真实噪声,和从真实噪声不断去噪还原成原始数据的过程中,学习到去噪的过程,进而就能对真实噪声进行随机采样,还原(生成)成各式各样的数据了。

作为最关键的过程,简单说扩散模型(Diffusion Model)的整个思路简单来说是先在图像上不断的加噪,从而对图像进行破坏,然后再对破坏后的图像进行不断的去噪,最后恢复出原始图像。DDPM是一种Diffusion模型的实现,是采用从高斯噪音中逐步依照一定条件 “采样” 特殊的分布,随着“采样”轮次的增加最终得到生成的图片/语音 。 换句话说,Diffusion Model 的合成过程是通过一次次迭代在噪声中提取出所需要的图像/音频,随着迭代步数的增加,合成质量也在越来越好 。

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

扩散过程(前向过程)是指的对数据逐渐增加高斯噪音直至数据变成随机噪音的过程。

扩散过程是将数据噪音化,那么反向过程就是一个去噪的过程,如果我们知道反向过程的每一步的真实分布,那么从一个随机噪音开始,逐渐去噪就能生成一个真实的样本,所以反向过程也就是生成数据的过程。

那么扩散模型的核心就在于训练噪音预测模型,由于噪音和原始数据是同维度的,所以我们可以选择采用AutoEncoder架构来作为噪音预测模型。DDPM所采用的模型是一个基于residual block和attention block的U-Net模型。

整个扩散过程是指的对数据逐渐增加高斯噪音直至数据变成随机噪音的过程。对于扩散模型,我们往往称不同step的方差设定为variance schedule或者noise schedule,通常情况下,越后面的step会采用更大的方差,在一个设计好的variance schedule下,的如果扩散步数足够大,那么最终得到的就完全丢失了原始数据而变成了一个随机噪音。 扩散过程的每一步都生成一个带噪音的数据,整个扩散过程也就是一个马尔卡夫链。扩散过程往往是固定的,即采用一个预先定义好的variance schedule,比如DDPM就采用一个线性的variance schedule。

( Diffusion Model 的前向和逆向过程)

扩散模型很大的过程在于噪音的采样,模型采样需要从纯噪声图片出发,一步一步不断地去噪,最终得到清晰的图片。在这个过程中,模型必须串行地计算至少 50 到 100 步才可以获得较高质量的图片,这导致生成一张图片需要的时间是其它深度生成模型的 50 到 100 倍,极大地限制了模型的部署和落地。

这些采样过程,映射到Stable Diffusion程序里主要就是一个个 Scheduler,在 Stable Diffusion 中 Scheduler(调度)的主要作用是按照当前生成噪音是第几步(Step)然后输出生成图片噪声的系数,它简单计算公式是:( 图像噪声 = 随机生成噪声 * scheduler输出的系数 )。scheduler会在在计算系数时候接受了包括当前生成噪声第几个step等参数作为输入,然后生成返回相应系数。

在采样频次和速度的驱动要求下,扩散模型很重要的是加噪和去噪的采样方案,新旧里面都包含很多种类型,其中关键的是采样过程,包括 PNDM、DDIM、PLMS 、K-LMS、DPM-Solver 等等,从最新版版本来看,主要采样是包括 DDPM、DDIM、PLMS、DPM-Solver 等几个方式。

DDPM(Denoising Diffusion Probabilistic Model),因为传统“扩散模型”是通过朗之万方程从能量模型的采样也有很大的不确定性,得到的往往是带有噪声的采样结果。所以很长时间以来,这种传统路径的扩散模型只是在比较低分辨率的图像上做实验。2020年所提出的DDPM(Denoising Diffusion Probabilistic Model)是一个新的起点、新的篇章。DDPM叫“渐变扩散模型”更为准确一些,DDPM的数学框架其实在ICML2015的论文《Deep Unsupervised Learning using Nonequilibrium Thermodynamics》就已经完成了,但DDPM是首次将它在高分辨率图像生成上调试出来了,从而引导出了后面图片生成的火热,DDPM 默认采用的是线性的加噪采样方案 (linear schedule)。

PNDM是一个新的适用于扩散模型的类数值方法,这一方法既不需要重新训练模型,也对模型结构和超参数没有额外的限制,仅仅通过修改迭代公式,将扩散模型无任何精度损失加速 20 倍,迭代 50 步就可以达到原来 1000 步的 FID 结果。

DDIM(Denoising Diffusion Implicit Models,去噪扩散隐式模型),DDIM和DDPM有相同的训练目标,但是它不再限制扩散过程必须是一个马尔卡夫链,这使得DDIM可以采用更小的采样步数来加速生成过程,DDIM的另外是一个特点是从一个随机噪音生成样本的过程是一个确定的过程。

PLMS (Pseudo Linear Multi-Step method,伪线性多步方法) 主要是基于diffusion model的原理采样下一步的图片,主要是逐步重建图片的反向去噪过程,对于每一步的图片都应用相应更新diffusion过程的各个参数生成下一步图片,主要是一个类似于线性的采样方法。

DPM-Solver(Diffusion Process Model Solver,扩散处理模型求解器)是清华大学朱军教授带领的TSAIL团队所提出的,一种针对于扩散模型特殊设计的高效求解器:该算法无需任何额外训练,同时适用于离散时间与连续时间的扩散模型,可以在 20 到 25 步内几乎收敛,并且只用 10 到 15 步也能获得非常高质量的采样。在 Stable Diffusion 上,25 步的 DPM-Solver 就可以获得优于 50 步 PNDM 的采样质量,因此采样速度直接翻倍。

(3) 图片生成训练网络:UNet(U形状的神经网络训练模型)

我们看上面的内容知道,扩散模型的核心就在于训练噪音预测模型,由于噪音和原始数据是同维度的,所以Stable Diffusion选择采用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。

(U-Net模型在前向扩散过程的训练使用,中间紫色部分)

Unet是2015年《U-Net: Convolutional Networks for Biomedical Image Segmentation》提出的模型。UNet就是一个语义分割模型,其主要执行过程与其它语义分割模型类似,首先利用卷积进行下采样,然后提取出一层又一层的特征,利用这一层又一层的特征,其再进行上采样,最后得出一个每个像素点对应其种类的图像。Unet中网络层越深得到的特征图,有着更大的视野域,浅层卷积关注纹理特征,深层网络关注本质的那种特征,所以深层浅层特征都是有格子的意义的;另外一点是通过反卷积得到的更大的尺寸的特征图的边缘,是缺少信息的,毕竟每一次下采样提炼特征的同时,也必然会损失一些边缘特征,而失去的特征并不能从上采样中找回,因此通过特征的拼接,来实现边缘特征的一个找回。

(U-Net的工作结构)

Unet 是最常用比较简单的一种分割模型了,它简单、高效、易懂、容易构建、可以从小数据集中训练,在 Diffusion Model 中是非常简单好用的。

(4) 输入输出图片编解码 :VAE (Variational Auto Encoder, 变分自编码器)

VAE 由编码器(Encoder)和解码器(Decoder)两部分组成。编码器用于将图像转换为低维潜在表示,该表示将用作U-Net模型的输入。 相反,解码器将潜在数据表示转换回图像。

在潜在 Diffusion Model 训练期间,Encoder用于获取前向扩散过程图像的潜在表示,在每一步应用越来越多的噪声。在推理过程中,反向扩散过程中产生的去噪潜后通过VAE Decoder转换回图像,实际推理过程中只需要VAE Decoder。

(VAE在Diffusion Process中的过程)

VAE也是深度生成模型的一种形式,是由 Kingma 于 2014 年提出的基于变分贝叶斯(VB, Variational Bayes)推断的生成式网络结构。与传统的自编码器通过数值的方式描述潜在空间不同,它以概率的方式描述对潜在空间的观察,在数据生成方面表现出了巨大的应用价值。VAE一经提出就迅速获得了深度生成模型领域广泛的关注,并和生成对抗网络(Generative Adversarial Networks,GAN)被视为无监督式学习领域最具研究价值的方法之一,在深度生成模型领域得到越来越多的应用。

自动编码器(AE, Auto Encoder),自动编码器是一种无监督学习方法,它的原理很简单:先将高维的原始数据映射到一个低维特征空间,然后从低维特征学习重建原始的数据。一个AE模型包含两部分网络。包括 Encoder,主要是将原始的高维数据映射到低维特征空间,这个特征维度一般比原始数据维度要小,这样就起到压缩或者降维的目的,这个低维特征也往往成为中间隐含特征(latent representation)和 Decoder,基于压缩后的低维特征来重建原始数据。

VAE(Variational Auto Encoder)虽然名字里也带有自动编码器(Auto Encoder),但这主要是因为VAE和AE有着类似的结构,即encoder和decoder这样的架构设计。实际上,VAE和AE在建模方面存在很大的区别,从本质上讲,VAE是一种基于变分推断(Variational Inference, Variational Bayesian methods)的概率模型(Probabilistic Model),它属于生成模型(当然也是无监督模型)。VAE是在Autoencoder(AE)的基础上让图像编码的潜在向量服从高斯分布从而实现图像的生成,优化了数据对数似然的下界,VAE在图像生成上是可并行的,速度提高了,不过VAE也存在着生成图像模糊的问题。

(VAE核心工作原理)

Diffusion Model底层数学原理

Diffusion Model 的核心思想是:

先在训练数据中不断加入噪声,然后在逆向过程中从噪声中逐步恢复信号。它与其他生成模型从根本上的不同;

Diffusion Model 将图像生成过程分拆为N (e.g. N=1000)个小的“去噪”的步骤,模型通过这些“小步”逐步去除噪声,积小胜为大胜,最终生成高质量的Sample。

DDPM整个思路的扩散模型的灵感来自于非平衡热力学启发的隐变量模型(在非平衡热力学中,朗之万方程的求解可以得到“涨落耗散关系”),在 Diffusion Model 中定义了一个扩散步骤的马尔可夫链(当前状态只与上一时刻的状态有关),慢慢地向真实数据中添加随机噪声(前向过程),然后学习反向扩散过程(逆扩散过程),从噪声中构建所需的数据样本。

看上图,扩散模型的前向过程是不含可学习参数的,随着 t 不断增大,最终分布变成各向独立的高斯分布。我们在前向过程中逐步加入一个小的高斯噪声,一共加入 T 步,从而产生了一系列加噪的样本 。

Diffusion首次出现在ICML2015的论文《Deep Unsupervised Learning using Nonequilibrium Thermodynamics》,当时作者完成了整体框架和数学推导式子,但是真正应用于cv,nlp的任务还是DDPM,其首次将它在高分辨率图像生成上调试,与UNet网络高度契合,让众人看到了Diffusion在视觉方面的潜力,目前该模型也逐步扩展到nlp,RL,ML等领域,但让它大放异彩主要是在图片生成领域,包括我们上面提到的 Stable Diffusion、MidJourney、OpenAI DALL.E、Disco Diffusion、Google Imagen 等图片生成产品。

Diffusion Model 底层数学物理理论思想支撑主要是“马尔科夫链”(Markov Chain)、朗之万方程(Langevin equation,朗之万公式),以及高斯分布(Gaussian Distribution,正态分布)和 KL 散值 等基本公式原理 。

图像生成的过程可以主要理解为把噪点去掉推导成为原始图片过程,在图片加噪过程中,类似于非平衡热力学中物质从高浓度区域向低浓度区域转移,直到均匀分布;类似于在一杯清水里加入了一滴色素,然后整个色素会逐步通过类似于 布朗运动(Brownian movement)的方式遍布整个清水,最后达到了看起来均匀分布的样子。(朗之万方程)

让图片变模糊建模的过程可以理解为,每张图的下一张比上一张模糊一点点(符合高斯分布的噪点),然后每张图变成下一张的样子主要是依赖于上一张。(马尔科夫链)

在逆扩散过程中,马尔科夫过程表示为由连续条件高斯分布下的累积变换组成。有了总体的优化策略,还要看每个像素的计算方式,在逆扩散过程结束时,我们希望得到一张生成好的图像,因此需要设计一种方法,使得图像上每个像素值都满足离散的对数似然,所以会同步高斯分布下面结合KL散度。

KL 散度是一种不对称统计距离度量,用于衡量一个概率分布 P 与另外一个概率分布 Q 的差异程度。之所以在Diffusion Model想根据 KL 散度来求解 

,是因为根据 Diffusion Models 的定义马尔可夫链中的转移分布属于高斯分布,而 KL 散度则可以用来计算2个高斯分布之间的差异距离。现在所有 KL 散度都是在高斯概率分布之间进行比较, 这意味着可以使用闭包表达式,而不是采样的蒙特卡洛估计方式来精确计算变分上界。

(1) 朗之万方程(Langevin equation)

朗之万方程(朗之万公式)是法国物理学家Paul Langevin(保罗·朗之万)在1908年发现的一个描述自由度的子集的时间演化的随机微分方程描述,主要描述了布朗运动的过程;即由于与流体分子的碰撞,布朗运动粒子平均运动位置离原点(初始点)距离的平方和时间成正比。是对扩散运动的一个直观解释,随着时间推移,粒子跑的越来越“散”。

通过郎之万方程,我们可以求得粒子的分布,通过模拟动力学来采样分布,可以精确模拟粒子在势能以及热涨落中运动,捕捉粒子的位置,作为样本,就会得到想要的分布(玻尔兹曼分布)。简单说,使用朗之万动力学可以加速采样过程。

除了 Diffusion Model的数学原理,其实每个模块都涉及到各种相关底层数学模型和算法原理,就不一一介绍了。

(2) 高斯分布(Gaussian Distribution,正态分布)

高斯分布(Gaussian Distribution),也叫作 正态分布(Normal Distribution),也称常态分布,是一个常见的连续概率分布。

正态分布(高斯分布)概念是由法国数学家棣莫弗(Abraham de Moivre)于1733年首次提出的,他是在求二项分布的渐近公式中得到发现了它,后由德国数学家高斯(Johann Carl Friedrich Gauss)在研究测量误差时从另一个角度导出了它,高斯这项工作对后世的影响极大,他使正态分布同时有了“高斯分布”的名称。正态分布(高斯分布)是一个在数学、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。高斯分布被誉为"上帝的分布", 其强悍的建模能力和优美的数学性质使得高斯分布在现实中得到广泛的应用。

在  Diffusion Models 的扩散过程和逆扩散过程,也就是扩散过程中,人工添加一点点噪声直到数据为纯高斯噪声;逆扩散过程学习逆转后的分布,逐步地恢复样本数据。

在逆扩散过程中,马尔科夫过程表示为由连续条件高斯分布下的累积变换组成。有了总体的优化策略,还要看每个像素的计算方式,在逆扩散过程结束时,我们希望得到一张生成好的图像,因此需要设计一种方法,使得图像上每个像素值都满足离散的对数似然,所以会同步高斯分布下面结合KL散度。

KL 散度是一种不对称统计距离度量,用于衡量一个概率分布 P 与另外一个概率分布 Q 的差异程度。之所以在Diffusion Model想根据 KL 散度来求解 

,是因为根据 Diffusion Models 的定义马尔可夫链中的转移分布属于高斯分布,而 KL 散度则可以用来计算2个高斯分布之间的差异距离。现在所有 KL 散度都是在高斯概率分布之间进行比较, 这意味着可以使用闭包表达式,而不是采样的蒙特卡洛估计方式来精确计算变分上界。

(3) 马尔科夫链(Markov Chain,马尔科夫模型)

“马尔科夫链”是俄国数学家 Andrey Andreyevich Markov(安德烈·安德烈耶维奇·马尔科夫) 研究并提出一个用数学方法就能解释自然变化的一般规律模型,被命名为马尔科夫链(Markov Chain)。马尔科夫链为状态空间中经过从一个状态到另一个状态的转换的随机过程,该过程要求具备“无记忆性 ”,即下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关,马尔科夫链认为过去所有的信息都被保存在了现在的状态下了。马尔科夫链在机器学习中的应用,自然语音处理研究让机器“听懂”人类的语言,马尔科夫模型就解决了,比如声学模型中 利用 HMM(Hidden Markov Model,隐形马尔科夫模型) 建模,比如语言模型N-Gram,它假设第 n 个词的出现只与前面 N-1 个词相关,而与其它任何词都不相关 ,整句出现的概率就是各个词出现概率的乘积。

数学上理解马尔科夫链就是:数学中具有马尔可夫性质的离散时间随机过程。描述了一种状态序列,其每个状态值只取决于该状态值的前面的有限个状态,与再之前的状态无关。可以大白话简单理解马尔科夫链,比如说某个人过去很失败,自暴自弃,如果用马尔科夫链的鸡汤告诉对方就是:“你的未来只与你现在有关,而无关你的过去,所以,你就不要纠结你曾经是多么的失败了,从现在开始吧,必将改变(决定)你的未来。”

Stable Diffusion 原理简单结论

Diffusion Model 与常规过去的GAN、VAE、Flow 等常见的生成模型的机制不同,Denoising Diffusion Probabilistic Model (以下简称 Diffusion Model) 不再是通过一个“限制”(比如种类,风格等等)的输入,逐步添加信息,最终得到生成的图片/ 语音。 而是采用从高斯噪音中逐步依照一定条件 “采样” 特殊的分布,随着“采样”轮次的增加最终得到生成的图片/语音 。 换句话说,Diffusion Model 的合成过程是通过一次次迭代在噪声中提取出所需要的图像/音频,随着迭代步数的增加,合成质量也在越来越好 。

这种机制的好处是显而易见的,合成质量和合成速度之间变得可控了。当时间宽裕时可以通过高轮次的迭代获得高质量的合成样本,同时较低轮次的快速合成也可以得到没有明显瑕疵的合成样本。而高低轮次迭代之间完全不需要重新训练模型,只用手动调整一些轮次相关的参数。

这听起来有点匪夷所思,但其背后有着极强的数学逻辑支撑。这些数学主要就是上面讲的马尔科夫链和朗之万公式,真的,只能说基础数学和物理太强大。

里面不论应用的Diffusion Model还是Unet网络,里面关键的思路,基本都是2014-2015年以后提出的模型,然后在图片生成模型领域大放异彩,特别是2022年以后,各种基于Diffusion Model的图片生成产品各放异彩,才涌现了 Midjourney、Stable Diffusion等优秀产品。

以上任何一个知识单独拎出来都是N篇论文,只是非常概要介绍一下图片AIGC背后的实现原理,知其然也简单知其所以然,作为一个深入学习的索引入口。可以认为 Stable Diffusion 等产品基本是过去各种数学和深度学习的各种集大成者,站在巨人的肩膀上,各种技术的融合,才产生了这么优秀的图片AIGC产品。

以上只是简单概要了解一下以为Diffusion Model的图片AIGC技术概要原理。最后简单用科学家的话总结,高斯说:“数学是科学之王”,考特说:“数学是人类智慧皇冠上最灿烂的明珠”。

如果想要了解更多细节,可以参考相关论文和开源代码,论文和源码面前,了无秘密。

可以参考实现主要算法模型的论文:

Latent Diffusion:https://arxiv.org/abs/2112.10752

Diffusion:https://arxiv.org/abs/1503.03585

PNDM:https://arxiv.org/abs/2202.09778

DDPM:https://arxiv.org/abs/2006.11239

CLIP:https://arxiv.org/abs/2103.00020

VAE:https://arxiv.org/abs/1312.6114

一些参考的开源代码和数据:

https://github.com/openai/CLIP

https://github.com/mlfoundations/open_clip

GitHub - Stability-AI/stablediffusion: High-Resolution Image Synthesis with Latent Diffusion Models

stabilityai/sd-vae-ft-mse-original · Hugging Face

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言数据结构——树形结构之树和二叉树

前言 二叉树有什么用? 二叉树应用非常广泛。 在操作系统源程序中,树和森林被用来构造文件系统。我们看到的window和linux等文件管理系统都是树型结构。在编译系统中,如C编译器源代码中,二叉树的中序遍历形式被用来存放C 语言中的…

如何从阿里云盘下载大文件到自己的电脑或者租赁的服务器中?

首先进入阿里云盘的github项目处,里面有详细的说明,入口:https://github.com/tickstep/aliyunpan Ubuntu挂载阿里云盘作为自己的硬盘 如果你是Ubuntu系统的话,直接在使用apt命令在电脑安装阿里云盘即可,命令如下&…

Oracle基础部分二(伪列/表、单个函数、空值处理、行列转换、分析函数、集合运算)

Oracle基础部分二(伪列/表、单个函数、空值处理、行列转换、分析函数、集合运算)1 伪列、伪表1.1 伪列1.2 伪表2 单个函数2.1 常用字符串函数2.1.1 length() 询指定字符的长度2.1.2 substr() 用于截取字符串2.1.3 concat() 用于字符串拼接2.2 常用数值函…

生成树端口选举

所有交换机运行RSTP,SW1优先级4096,SW2优先级4096,SW3优先级8192,SW1的G0/0/1、G0/0/2接口通过手动模式加入Eth-Trunk 1,SW1的G0/0/3、G0/0/4接口通过手动模式加入Eth-Trunk 2,SW2的G0/0/1、G0/0/2接口通过手动模式加入Eth-Trunk 1,SW3的G0/0/1、G0/0/2接口通过手动模式…

【Unity VR开发】结合VRTK4.0:攀爬功能

语录: 不要因为开心消失了而感到难过,宇宙正在努力为你准备下一场惊喜,你要给宇宙一点时间。 前言: 攀爬是虚拟现实中一种有趣的运动,可以使用定制的可交互预制体轻松创建这种机制来处理攀爬动作,以及处理用…

ICRA 2023 | 具身感知中学习探索信息丰富的轨迹和样本

我们正在见证感知模型的巨大进步,特别是在大规模互联网图像上训练的模型。 然而如何有效地将这些感知模型推广到具身环境的研究还远远不够,这些研究将有助于推进各种相关应用(例如家用机器人)的发展。为了使用尽可能少的标注&…

RabbitMQ 安装体验

前言 RabbitMQ是一个开源的遵循 AMQP协议实现的基于 Erlang语言编写,即需要先安装部署Erlang环境再安装RabbitMQ环境。 一、Erlang下载安装 https://packagecloud.io/rabbitmq/erlang 上执行命令 此时,Erlang的rpm包下载完成,见下图。 wg…

Servlet/Web开发概述/Http响应

一、web开发概述 学习web开发,需要先安装一台web服务器,将开发好的web项目部署在web服务器中供外界访问. Web服务器是指驻留于因特网上某种类型计算机的程序,可以放置资源文件,别人可以访问、服务器可以做出响应: 可…

基于PCA与LDA的数据降维实践

基于PCA与LDA的数据降维实践 描述 数据降维(Dimension Reduction)是降低数据冗余、消除噪音数据的干扰、提取有效特征、提升模型的效率和准确性的有效途径, PCA(主成分分析)和LDA(线性判别分析&#xff0…

centos7怎么查看防火墙以及添加白名单

方法一:systemctl status firewalld 防火墙的开启、关闭、禁用命令 (1)设置开机启用防火墙:systemctl enable firewalld.service (2)设置开机禁用防火墙:systemctl disable firewalld.servic…

积化和差公式推导

积化和差公式是初等数学三角函数部分的一组恒等式,积化和差公式将两个三角函数值的积化为另两个三角函数值的和的常数倍,达到降次的作用。 基本上记不住这好几个哥们,不过幸运的是,利用诱导公式可以一式生万式子,记住一个就好了 式子1:sin⁡α∗cos⁡β1…

【3D建模工具】上海道宁与McNeel为您提供强大的专业3D造型软件

Rhino可以对 NURBS曲线、曲面、实体、 细分几何图形 (SubD)、点云和多边形网格 进行创建、编辑、分析、记录、 渲染、动画制作与转换 只要硬件条件允许 不受复杂度、阶数与尺寸大小的限制 Rhino 7使用SubD工具 可以建立有机形状 使用Rhino.Inside.Revit 做为Revit附加…

2023MathorCup数模A题思路数据代码论文【全网最全分享】

文章目录赛题思路赛题详情参赛建议(个人见解)选择队友及任务分配问题(重要程度:5星)2023MathorCup数模A题思路数据论文代码【最新】赛题思路 (赛题出来以后第一时间在CSDN分享) 最新进度在文章最下方卡片,…

kruskal重构树

一,定义 kruskal是求最小生成树的一种算法。最小生成树 但是这种结合并查集的特殊方法给了他许多特殊的性质。可以用于解决树上瓶颈边权之类的问题 结合这种算法而诞生的就是——kruskal重构树 二,建树思路及其性质 kruskal求最小生成树是将边权小的…

【超详细】小白初探FME--获取等时圈

在规划分析过程中,往往会涉及等时圈的概念。什么是等时圈呢?小编帮你百度过了,网上的说法是:等时圈是指从某点出发,以某种交通方式在特定时间内能到达的距离覆盖的范围。比如我们在规划设计中接触到的15分钟生活圈就是…

HTML5支持的视频文件格式和音频文件格式有哪些?

在 HTML5 标准中, 我们有了新的 <audio> 和 <video> 标签, 分别可以引入视频和音频文件的标签 那么这些标签又可以支持哪些文件格式呢 ? 格式支持 视频文件格式 MP4&#xff1a;MPEG-4 Part 14&#xff0c;支持H.264编码。几乎所有的浏览器都支持该格式。 Web…

springboot+netty+mqtt实现

具体实现前言MQTT协议概念组成部分实现mqtt协议测试其他前言 首先说明一下&#xff0c;netty实现并封装了mqtt协议&#xff0c;同时也为其写好了编解码器&#xff0c;但是再了解并搭建之前&#xff0c;尤其是还不了解netty和mqtt的同学&#xff0c;必须要清楚一件事&#xff1…

2023MathorCup数学建模比赛的思路汇总帖

更新时间【4.13 19&#xff1a;45】ABCD均已更新&#xff0c;选题指导已更新&#xff0c;速看&#xff01;后续会出各题详细思路及代码&#xff01; 这里是小云的2023MathorCup数学建模比赛的思路汇总帖&#xff0c;比赛开始后将实时更新~ 竞赛共4道题目&#xff08;A题、B题…

ELF 文件格式 ------- 符号表

1. 符号的数据结构 typedef struct elf64_sym {Elf64_Word st_name; /* 该符号的名字在字符串表中的起始下标 */unsigned char st_info; /* 该符号的类型以及作用域信息 */unsigned char st_other; /* 暂未使用 */Elf64_Half st_shndx; /* 该符号所在的 section 的下标&…

IDEA安装spotbugs插件替代findbugs插件

相信最近想在IDEA上安装findbugs插件的朋友&#xff0c;遇到与我一样的问题&#xff0c;findbugs与IDEA不兼容&#xff1a; https://plugins.jetbrains.com/plugin/3847-findbugs-idea 主要是FindBugs插件已经不更新了&#xff0c;它最新版本停留在2016年发布的1.0.1&#xff0…