扩散模型(Diffusion Model)

news2024/11/24 14:57:46

         扩散模型(diffusion model)是一种运用了物理热力学扩散思想的生成模型。扩散模型有很多不同的变形,本文主要介绍最知名的去噪扩散概率模型(Denoising Diffusion Probabilistic Model,DDPM)。如今比较成功的用扩散模型做的图像生成的系统,比如DALL-E、谷歌的Imagen、Stable Diffusion 基本上都是用类似的方法来作为其扩散模型。

        接下来介绍下扩散模型运作方法。我们来看它是怎么生成一张图片的。如图1所示,在 生成图片的第一步,要去采样一个都是噪声的图片,就是从高斯分布里面采样出一个向量。这 个向量里面有的数字,这个向量的维度跟要生成的图片大小是一模一样的。假设要生成一张 256×256 的图片,从正态分布采样出来的向量的维度就要是256×256,就把采样到的256×256 的向量排成一张图片。接下来就有一个去噪的模块,去噪的网络。输入一张都是噪声的图,输 出它就会把噪声滤掉一点,就可能看到有一个猫的形状,再做去噪,猫的形状就逐渐出来。去 噪越做越多,期待最终就看到一张清晰的图片,去噪的次数是事先定好的。通常会给每一个 去噪的步骤一个编号,产生最终图片的那个编号比较小。一开始从完全都是噪声的输入开始, 做去噪的编号比较大,所以这边就从1999一直排到2,排到1,这个从噪声到图片的步骤称 为逆过程(reverse process)。在概念上,其实就像是米开朗基罗说的:“塑像就在石头里,我只 是把不需要的部分去掉”,扩散模型做的事情是相同的。

图1 扩散模型生成图片的过程

        接下来呢就要讲这个去噪的模型。这边是把同一个去噪的模型反复进行使用,但是因为 在这边每一个状况,输入的图片差异非常大,在这个状况输入的东西就是一个纯噪声。在这 个状况输入的东西噪声非常小,它已经非常接近完整的图。所以如果是同一个模型,它可能 不一定能够真的做得很好。所以这个去噪的模型,除了“吃”要被去噪的那张图片以外,还会多 “吃”一个输入,该输入代表现在噪声严重的程度,如图2 所示。1000 代表刚开始去噪的时 候,这个时候噪声的严重程度很大。1代表说现在去噪的步骤快结束了,这个是最后一步去噪 的步骤。显然噪声很小,这个去噪的模型希望它可以根据我们现在输入在第几个步骤的信息 做出不同的回应。这个是去噪的模型,所以确实只有用一个去噪的模型。但是这个去噪的模型 会“吃”一个额外的数字,告诉它说现在是在去噪的哪一个步骤。

图2 扩散模型进行去噪时需要结合具体步数

        去噪的模型里面实际内部做的事情是什么呢? 如图3 所示,在去噪的模组里面有一个 噪声预测器(noise predictor),其会预测图片里面的噪声。这个噪声预测器就“吃”这个要被 去噪的图片,跟“吃”一个噪声现在严重的程度,也就是我们现在进行到去噪的第几个步骤的代 号,就输出一张噪声的图。它就是预测说在这张图片里面噪声应该长什么样子,再把它输出的噪声去剪掉这个要被去噪的图片,就产生去噪以后的结果,所以这边去噪的模型并不是输入 一张有噪声的图片。输出就直接是去噪后的图片,它其实是产生一个这个输入的图片的噪声, 再把噪声扣掉输入的图片来达到去噪的效果。

图3 扩散模型去噪模块内部结构

        接下来的问题就是怎么训练这个噪声预测器呢?一个去噪的模型是根据一个噪声的图片 和去噪的步数的ID,产生去噪的结果。去噪的模型里面是一个噪声预测器,它是要“吃”这张 图片“吃”一个 ID,产生一个预测出来的噪声。但是要产生出一个预测出来的噪声,需要有标 准答案。在训练网络的时候,要有成对的数据才能够训练。需要告诉噪声预测器这张图片里面 的噪声长什么样子,它才能够学习怎么把噪声输出来。如何制造出这样子的数据呢。噪声预测 器的训练数据是人为创造的,怎么创造呢?创造方法如图4所示,从数据集里面拿一张图片 出来,随机从高斯分布里面采样一组噪声出来加上去,产生有点噪声的图像,能再采样一次 再得到更噪声的图片,以此类推,最后整张图片就看不出来原来是什么东西。加噪音的过程 称为前向过程,也称为扩散过程。做完这个扩散过程以后,就有噪声预测器的训练数据了。对 噪声预测器,其训练数据就是这一张加完噪声的图片跟现在是第几次加噪声,是网络的输入, 而加入的这个噪声就是网络应该要预测的输出,就是网络输出的标准答案。

图4 扩散模型的前向过程

        所以在做完这个扩散过程以后,就有训练数据了。噪声预测器看到这张图,看到第二个步骤,输入2这个数字,要输出是什么,标准答案就是一个长这个样子的噪声。接下来就跟 训练一般的网络一样训练下去就结束了。但是我们要的不只是生图而已。刚才只是从一个噪 声里面生出图,还没有考虑文字。如果要训练一个图像生成的模型,他是“吃”文字产生图片, 如图5 所示。其实还是需要图片跟文字成对的数据。ImageNet中每一张图片有一个类别的 标记,还不是那个图片的描述,不是像“一只在猫在雪里”这样图片的描述,它只是每一张图有 一个标记,它有100 万张图片。Midjourney、Stable Diffusion 或 DALL-E 的数据往往来自 于LAION,LAION 有 58.5 亿张的图片,所以难怪今天这一些模型可以产生这么好的结果, LAION 有一个搜索的Demo的平台,里面内容很全面,比如猫的图片,它不是只有猫的图片 跟英文文字的对应,还有跟中文、英文的对应。所以之所以图像生成模型不是只看得懂英文、 中文它大多数都看得懂,是因为它的训练数据里面也有中文跟其他的语言,里面有很多名人 的照片,随便一找就一大堆。因此Midjourney能画得出很多名人,是因为他就是知道名人的 模样。所以这个是需要准备的训练数据。有了这个文字跟图像成对的数据以后。

图 5 文生图示例

        如图6 所示,把文字加到去噪的模组就结束了。所以去噪的模组不是只看输入的图片 做去噪,它是根据输入的图片加上一段文字的描述去把噪声拿掉,所以在每一个步骤去噪的 模组都会有一个额外的输入。这个额外的输入就是,要它根据这段文字的描述产生什么样的 图片。这个去噪模块里面的噪声预测器要怎么改呢?直接把这段文字给噪声预测器就结束了, 要让噪声预测器多一个额外的输入也就是这段文字,如图7所示,就结束了。

图6  文生图的去噪过程

图7 去噪模块加文字描述

        训练的部分要怎么改呢,如图8所示,每一张图片都有一段文字,所以先把这张图片做 完扩散过程以后,在训练的时候,不只要给噪声预测器加入噪声后的图片,还有现在步骤的 ID,多给一个就是文字的输入。噪声预测器会根据这3样东西产生适当的噪声,产生要去消 掉的噪声,产生这个标准答案。

图 8 加入文字描述的前向过程

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

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

相关文章

极狐GitLab 17.3 重点功能解读

极狐GitLab 是 GitLab 在中国的发行版,可以私有化部署,对中文的支持非常友好,是专为中国程序员和企业推出的企业级一体化 DevOps 平台,一键就能安装成功。安装详情可以查看官网指南。 极狐GitLab 17.3 正式发布了多项与敏捷项目管…

波导阵列天线学习笔记4 一种用于毫米波通信的新型宽带双圆极化阵列天线

摘要: 在本文中,提出了一种新型的基于间隙波导毫米波双圆极化阵列天线。通过级联膜片极化器和十字转门OMT,简单的馈网被首次提出来实现双圆极化条件。通过膜片圆极化器可以在TE10和TE01模式之间实现90度的相位差,并且十字转门OMT被用于分别分…

【测试】——软件测试概念篇

📖 前言:在软件开发过程中,需求分析和测试用例的设计是确保软件质量的关键步骤。本文将简要介绍用户需求与软件需求的区别、测试用例的定义及其重要性,以及如何设计有效的测试用例。 目录 🕒 1. 什么是需求&#x1f55…

Flink 1.14.*中flatMap,filter等基本转换函数源码

这里以flatMap,filter为例,介绍Flink如果要实现这些基本转换需要实现哪些接口,Flink运行时调用这些实现类的入口,这些基本转换函数之间的类关系 一、创建基本转换函数需要实现类继承AbstractRichFunction并实现特性接口1、RichFla…

甲基化组学全流程生信分析教程

甲基化组学全流程分析和可视化教程 读取数据目录下的idat文件的甲基化全流程一键分析 功能简介 甲基化分析模块可以实现甲基化芯片450K, 870kEPIC数据的自动读取,可以读取idat文件,也可以读取beta甲基化矩阵文件甲基化数据的缺失值插值甲基化数据的质…

【ArcGIS/GeoScenePro】Portal和Server关系

简介 上图简化后 三层 最上面:应用层 中间(门户):连接应用层和服务器,对server上发布的服务进行管理、分享和权限分配 最低面:服务器 例如:桌面想用server里的服务数据资源,需要通过portal去请求 Enterprise = portal(中间)+server(最底面层) 具体的Enterpri…

Unity Foreach循环GC测试

关于网上讨论Foreach循环会不会产生GC的问题,不如自己实验一番,我用的Unity版本是2021.3.23f1c1版本。 测试代码如下: using System.Collections.Generic; using UnityEngine; using UnityEngine.Profiling;namespace Test {public class M…

sqli-labs靶场通关攻略(41-50)

Less-41 1、判断闭合方式 输入?id1 -- 必和成功 2、查看回显点 输入?id-1 union select 1,2,3 -- 得出回显点为2,3 3、查询数据库名 输入?id-1 union select 1,2,database() -- 4、查询数据库中的表名 输入?id-1 union select 1,2,group_concat(table_nam…

Notepad++回车不自动补全

问题 使用Notepad时,按回车经常自动补全,但我们希望回车进行换行,而不是自动补全,而且自动补全使用Tab进行补全足够了。下文介绍设置方法。 设置方法 打开Notepad,进入设置 - 首选项 - 自动完成,在插入选…

代码随想录Day 29|leetcode题目:134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 第八章 贪心算法 part03二、题目题目一:134. 加油站解题思路:暴力方法贪心算法(方法一)贪心算法(方法二) 题目二&#xff1a…

openEuler:日志管理

日志介绍 概述 系统日志是一系列用于记录系统操作和活动进行的文件,这些日志对于监控和排查系统问题非常重要,因为它们可以提供有关系统行为、应用活动和安全事件的见解。系统日志还可以成为识别 Linux 系统中潜在安全弱点和漏洞的重要信息来源。通过分…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-20 I2C MASTER控制器驱动设计

软件版本:VIVADO2021.1 操作系统:WIN10 64bit 硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台:米联客-MLK-H3-CZ08-7100开发板 板卡获取平台:https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…

pyautogui通过图像获取定位实现计算器自动计算

使用 pyautogui.locateCenterOnScreen 能够在屏幕上搜索给定图像的位置,并准确地返回该图像的中心点坐标。 🌿使用 pyautogui 实现计算器自动计算 准备工作,把计算器的按钮截图保存下来。例如: 计算“75”,实现代码如…

【网络】WebSocket协议详解

WebSocket协议详解 一 、WebSocket 诞生背景二、WebSocket 特点三、WebSocket 的握手环节四、WebSokect 的数据格式1、 第一个字节2、第二个字节3、Masking-key4、playload Data5、一些注意细节 WebSocket 的官方文档 WebSocket 的中文文档(非官方) 一 、WebSocket 诞生背景 在…

深度学习基础—简单的卷积神经网络

3.1.卷积层 下面以卷积神经网络的某一层为例,详解一下网络的结构。 假设当前位于l层,则输入6*6*3的彩色图片,有两个3*3*3的过滤器,卷积操作后将输出2个4*4的图片。如果把过滤器看成权重w,卷积这一步操作其实就是w*a&am…

消息称华为纯血鸿蒙部分应用采用虚拟机方案

华为预计在11月发布正式版纯血鸿蒙,为了能够适配更多的App,官方也是有了新的解决方案。报道中提到,纯血鸿蒙设备对有些还没上架的应用会使用虚拟机方案过渡。据悉,华为的虚拟机方案作为过渡措施,首先能确保用户在鸿蒙系…

概率论与编程的联系及数据科学应用

目录 引言 第一章 概率模拟与编程实现 1.1 随机数生成与蒙特卡罗模拟 1.1.2 蒙特卡罗模拟 第二章 统计建模与数据分析 2.1 统计模型实现 2.2 概率图模型 第三章 概率论在机器学习中的应用 3.1 随机森林与决策树 3.2 贝叶斯分类器 总结与展望 引言 在大数据和人工智…

学习node.js 十 redis的基本语法

redis Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,它提供了一个高效的键值存储解决方案,并支持多种数据结构,如字符串(Strings)、哈希(Hashes)、…

素数之和(c语言)

1./描述 //牛牛刚刚学了素数的定义:素数值指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数 //牛牛想知道在[l, r] 范围内全部素数的和 //输入描述: //输入两个正整数 l,r 表示闭区间范围 //输出描述: //…

sqli-labs靶场通关攻略 46-50

主页有sqli-labs靶场通关攻略 1-45 第四六关 less-46 步骤一:利用报错注入查询库 ?sort1 and updatexml(1,concat(0x7e,database(),0x7e),1) 步骤二:查询表名 ?sort1 and updatexml(1,concat(0x7e,(select group_concat(table_name)from informatio…