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

背景

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

扩散模型

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

前向过程

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

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

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

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

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

  • 噪声是怎么加的?

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

  • 前向过程的最终结论

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

反向过程

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

训练与采样

在这里插入图片描述

算法2的采样中, ϵ θ ( x t , t ) \epsilon_\theta(x_t,t) ϵθ(xt,t)表示的即是模型预测出来 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):# 根据公式计算 xtxt = alphas_cum_s[t] * x0 + alphas_cum_sm[t] * noise# 模型预测噪声predicted_noise = model(xt, t)# 计算Lossreturn 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()

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

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

相关文章

Google ScreenAI代表了一款先进的视觉语言模型,专为用户界面(UI)和视觉情境下的语言理解而设计

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

政安晨:【深度学习部署】—— TensorFlow Extended(TFX)介绍

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 前言 TensorFlow Extended(TFX&a…

深入了解Redis的过期策略和内存淘汰机制

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起进步&am…

mysql基础2多表查询

多表查询 多表关系: 一对多 案例: 部门 与 员工的关系 关系: 一个部门对应多个员工,一个员工对应一个部门 实现: 在多的一方建立外键,指向一的一方的主键 多对多 案例: 学生 与 课程的关系 关系: 一个学生可以选修多门课程,一门课程也可以…

RuleApp资源社区,知识付费社区,可对接typecho的小程序APP

强大的文章/社区/自媒体客户端,支持打包为安卓,苹果,小程序。包括文章模块,用户模块,支付模块,聊天模块,商城模块等基础功能,包含VIP会员,付费阅读等收费体系&#xff0c…

AttributeError: ‘_MSDataLoaderIter‘ object has no attribute ‘_put_indices‘

问题描述 复现代码过程中遇到错误:AttributeError: _MSDataLoaderIter object has no attribute _put_indices 解决方案 出错的原因是代码中使用了不存在的属性"_put_indices"。这个错误可能与你使用的版本不兼容有关。在pytorch1.x版本中,&q…

Django Ajax

【一】Json 【1】介绍 JSON(javascript object otaition)是一种轻量级的数据交换格式JSON使用了Javascript的一部分语法来定义其数据格式,但Json是独立于语言的Json采用完全独立于语言的文本格式,使得Json成为理想的数据交互语言…

react native 键盘事件

在做修改密码功能是发现他的键盘第一次调起之后然后收起键盘焦点不会消失而且键盘也不会再调起来了 我门线引入需要的组件 import { StyleSheet, View, TextInput, Keyboard, TouchableWithoutFeedback, } from react-native; import React, {useEffect, useState, useRef} fr…

[Halcon学习笔记]在Qt上实现Halcon窗口的字体设置颜色设置等功能

1、 Halcon字体大小设置在Qt上的实现 在之前介绍过Halcon窗口显示文字字体的尺寸和样式,具体详细介绍可回看 (一)Halcon窗口界面上显示文字的字体尺寸、样式修改 当时介绍的设定方法 //Win下QString Font_win "-Arial-10-*-1-*-*-1-&q…

MySQL学习笔记------SQL(2)

ziduanSQL DML 全称为:Data Manipulation Language,用来对数据库中表的数据记录进行增删改操作 插入数据 添加数据(INSERT) 给指定字段添加数据:INSERT INTO 表名(字段名1,字段名2,......…

【PyQt】19-数据操作

数据表 前言一、显示二维表数据(QTableView控件)扩展知识---MVC模式1.1 代码1.2 运行结果 二、显示列数据(QListView控件)2.1 代码2.2 运行结果2.3 扩展---列表控件(QListWidget)运行结果 总结 前言 一、显…

STM32使用滴答定时器实现delayms

在STM32上使用SysTick实现jiffies(时间戳)并且实现delay_ms 代码实现: volatile uint32_t jiffies 0; // 用于记录系统运行的jiffies数 void SysTick_Handler(void) {/* 每次SysTick中断,jiffies增加 */jiffies; }uint32_t tick…

unity无法使用道路生成插件Road Architect(ctrl和shift无法标点)

切换一下布局就行了。 附:Road Architect教学地址

游戏引擎中的地形系统

一、地形的几何 1.1 高度图 记录不同定点的高度,对每个网格/顶点应用高度、材质等信息,我们每个顶点可以根据高度改变位移 但是这种方法是不适用于开放世界的。很难直接画出几百万公里的场景 1.2 自适应网格细分 当fov越来越窄的时候,网格…

JavaEE企业级分布式高级架构师课程

教程介绍 本课程主要面向1-5年及以上工作经验的Java工程师,大纲由IT界知名大牛 — 廖雪峰老师亲自打造,由来自一线大型互联网公司架构师、技术总监授课,内容涵盖深入spring5设计模式/高级web MVC开发/高级数据库设计与开发/高级响应式web开发…

深度学习pytorch——GPU加速(持续更新)

使用 .to(device),以前使用 .cuda() ,但是现在基本不使用了。 代码示例: 查看电脑GPU运行情况: 使用Ctrl Shift ESC快捷键:

目标检测上的diffusion

1 Title DiffusionDet: Diffusion Model for Object Detection(Shoufa Chen,Peize Sun,Yibing Song,Ping Luo)【ICCV 2023】 2 Conclusion This study proposes DiffusionDet, a new framework that formulates object detection as a denoisin…

吴恩达2022机器学习专项课程(一) 3.3 成本函数的公式

问题预览 模型的参数(w和b)有什么作用?不同的w和b对线性回归模型有什么影响?训练集里的y和线性回归模型预测的y(y帽)的区别是什么?成本函数的作用是什么?成本函数的公式是什么&…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(六)—— 二元分类

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战演绎 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 这篇文章咱们将深度学习应用到另一个常见任务…

STM32学习笔记(6_1)- TIM定时器定时功能原理

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。 最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com 现在开…