首页 > 其他分享 >大白话扩散模型(无公式版)

大白话扩散模型(无公式版)

时间:2024-03-24 13:34:29浏览次数:24  
标签:alphas noise 大白话 公式 噪声 前向 扩散 cum 图片

背景

传统的图像生成模型有GAN,VAE等,但是存在模式坍缩,即生成图片缺乏多样性,这是因为模型本身结构导致的。而扩散模型拥有训练稳定,保持图像多样性等特点,逐渐成为现在AIGC领域的主流。

扩散模型

正如其名,该方法是从自然界的扩散现象(热力学第二定律、熵增)得到启发,认为任意我们想要的图片可以由随机噪声经过一系列采样步骤后得到,把对这个过程进行定义和建模就称为扩散模型。虽然原始论文涉及到的知识包括随机分布,马尔科夫链等,而且推导过程极其复杂,但本文不会深入去推导相关的公式,而是把重心放在思考这个过程以及对其中发现的一些问题进行探讨。

前向过程

前向过程其实就是一些假设。给定一张原始的图片,不断地往这张图片加正态分布的噪声,最终这张图片会变成正态分布噪声。

  • 为什么老有这个正态分布出现?其他分布不行吗?

统计学上有个中心极限定理,在特定条件下,大量统计独立的随机变量的和的分布趋于正态分布。依据这一定理的结论,其它概率分布能够用正态分布作为近似。这就降低了很多随机过程的计算难度

  • 那这个前向过程的作用是啥呢?

如果在假设的条件下,能够得到最终的噪声图片,那么反过来从噪声中也能得到想要的“原始图片”,即我就能从随机噪声生成任意图片,这里就与GAN是一样的。这就是下面的反向过程推导了。

  • 噪声是怎么加的?

前向过程加噪声是先小后大,因为一开始图片质量很高,加很小的噪声就发生很大的变化,而越后面的图片含有噪声越多,失真越严重,必须加更大的噪声才能引起较大变化。如果玩过文生图的话就能发现,选择了一定的采样步数后,前几步图片变化非常大,从模糊的噪声逐渐出现轮廓,后面几步基本不变,只是一些细节发生了变化。

  • 前向过程的最终结论

前向推导出加噪声过程可由$x_0$直接得到,那在训练过程就不必保存中间的过程变量,不需要一步步迭代,节省中间变量占用的内存。相当于前向过程是一个公式,时间复杂度是$O(1)$,整个模型的时间复杂度只取决于反向过程。

反向过程

反向过程其实就是在前面定义的基础上,本来想直接求解$q(x_{t-1}|x_t)$的。但是发现走不通,这样是完全求不出来的。而$q(x_{t-1}|x_t,x_0)$这个是有办法求解的(经过贝叶斯公式一系列变换),但是这样需要假设我们知道$x_0$的情况才行。因此需要加上$x_0$,然后我们用来进行训练一个模型,拟合训练数据的分布之后,就可以预测出$q(x_{t-1}|x_t)$,即对任意噪声图片的任意时刻,我都能预测出前一时刻该图片的样子,不管准不准。问题建模成$p_\theta(x_{t-1}|x_t)$来求解,$\theta$就是求解的参数,实际上就是代表模型对$x_0$的预测能力

训练与采样

算法2的采样中,$\epsilon_\theta(x_t,t)$表示的即是模型预测出来$t$时候加上的噪声,结合如下代码更容易理解。

betas = torch.linspace(start=0.0001, end=0.02, steps=1000)
alphas = 1 - betas
alphas_cum = torch.cumprod(alphas, 0)
alphas_cum_s = torch.sqrt(alphas_cum)
alphas_cum_sm = torch.sqrt(1 - alphas_cum)

# 扩散损失计算
def diffusion_loss(model, x0, t, noise):
    # 根据公式计算 xt
    xt = alphas_cum_s[t] * x0 + alphas_cum_sm[t] * noise
    # 模型预测噪声
    predicted_noise = model(xt, t)
    # 计算Loss
    return mse_loss(predicted_noise, noise)

# 训练过程
for i in len(data_loader):
    # 从数据集读取一个 batch 的真实图片
    x0 = next(data_loader)
    # 采样时间步
    t = torch.randint(0, 1000, (batch_size,))
    # 生成高斯噪声
    noise = torch.randn_like(x_0)
    loss = diffusion_loss(model, x0, t, noise)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

标签:alphas,noise,大白话,公式,噪声,前向,扩散,cum,图片
From: https://www.cnblogs.com/deeplearningmachine/p/18092326

相关文章

  • 线性递推公式的矩阵快速幂技巧
    快速幂顾名思义,快速幂是指快速求解幂运算的技巧。正常求\(a^n\)的值需要执行n次相乘操作,而快速幂能在\(log_2n\)时间复杂度内完成。以求\(a^{27}\)为例,27=1+2+8+16,根据乘法结合律可得\(a^{27}=a^1*a^2*a^8*a^{16}\),即只需要指数转化为二进制并且求得对应位是1的幂再累计......
  • java:欧拉公式e^ix==cosx+i*sinx 用Math类中的方法输出90°以内的欧拉函数数值,保留四位
    publicclassMain{//本题的要求:e^ix==cosx+i*sinxdoubleb,c;chari;publicstaticvoidmain(String[]args){for(doublej=0;j<90;j++){//用循环依次整出0-90度doublesum=0;//temp是e^ix;doublea=j;a=Math.toRadi......
  • 【软考】关系代数篇(基础操作、关系公式、各种连接)
    【软考】关系代数篇一、关系代数简介二、五个基本运算1、选择(Selection):2、投影(Projection):3、连接(Join):4、并(Union):5、差(Difference):三、其他操作和表达式以及结果集1、笛卡尔积(CartesianProduct):2、交集(Intersection):3、除法(Division):4、自然连接(NaturalJoin):5、全连接(FullO......
  • 无穷乘积,Wallis公式以及String公式
    鉴于这学期我从来没听过的高数课没讲无穷乘积,所以我想把这坨给补上(无穷乘积类比于级数的定义,设\(p_1,p_2,\cdots,p_n,\cdots\)是无穷可列个实数,则称它们的“积”为无穷乘积\[p_1\cdotp_2\cdot…\cdotp_n\cdot…\]记为\[\prod_{n=1}^{\infty}p_i\]类似地,定义无穷乘......
  • 基本数据公式
          ......
  • 二维数组_细菌的繁殖与扩散
    任务描述在边长为9的正方形培养皿中,正中心位置有m个细菌。假设细菌的寿命仅一天,但每天可繁殖10个后代,而且这10个后代,有两个分布在原来的单元格中,其余的均匀分布在其四周相邻的八个单元格中。求经过n(1≤n≤4)天后,细菌在培养皿中的分布情况。输入格式:输入为两个整数,第一个整......
  • GEE高阶案例——利用eemont进行ee.Number对象类的运算(加减成熟运算公式)
    本教程的主要目的是利用eemont包对数字对象进行分析 代码!pipinstalleemont!pipinstallgeemapimportee,eemont,geemapimportgeemap.colormapsascm进行EE验证 验证并初始化地球引擎和地球地图。 Map=geemap.Map()让我们定义一些ee.Number对象作为近......
  • 卡尔曼滤波公式推导(自用)
    自用笔记。(仅适用于线性系统)1.引入预测概念 2.引入数据融合概念  3.引入协方差矩阵  4.卡尔曼增益推导5.公式使用顺序  ......
  • YUV与RGB转换公式(BT601、BT709、BT2020)
    1、在图像处理中经常需要对图像数据进行转换,最常见的莫过于YUV2RGB。并且这个转化在不同的标准下有不同的转化公式。2、如果公式不匹配,则会导致转换后的图像效果有偏差。3、full_range下Y\U\V的取值范围都为[0,255];limit_range(也叫part_range)下Y的取值范围为[16,235],UV的......
  • 怎样选出绩优股?绩优股选股公式+人工复选(十步排雷)
    原始知识来源: https://xueqiu.com/9561240987/170507893 根据知识内容,自写指标,初选ROE优质企业。F10查看ROE: 十步排雷:排雷第1步:非金融行业要排除掉资产负债比率超过50%的或超过行业平均水平的,或者加权净资产收益率逐年降低,资产负债比率逐年走高的。为什么金融行业需要区......