《扩散模型 从原理到实战》Hugging Face (一)

news2024/11/17 12:55:11

文章目录

  • 前言
  • 第一章 扩散模型简介
    • 1.1 扩散模型的原理
      • 1.1.1 生成模型
      • 1.1.2 扩散过程


前言

Hugging Face最近出版了第一本中文书籍《扩散模型 从原理到实战》,其中内容关于扩散模型(Diffusion Model),和AIGC相关的内容较多(Hugging Face的Diffusion课程链接:https://github.com/huggingface/diffusion-models-class)。在这里,记录一下学习过程。
文章内容自用,如有侵权请及时与我联系


第一章 扩散模型简介

扩散模型(Diffusion Model)是一类十分先进的基于扩散思想的深度学习生成模型。生成模型除了扩散模型之外,还有出现较早的VAE(Varitational Auto-Encoder,变分自编码器)和GAN(Generative Adversarial Net, 生成对抗网络)等。虽然它们与扩散模型也有一些渊源,不过这并不在本书的讨论范围之内。同时本书也不会深入介绍扩散模型背后复杂的数学原理。即便如此,你依然可以基于本书介绍的内容学会通过相关代码来生成精美图像。

1.1 扩散模型的原理

扩散模型是一类生成模型,他运用物理热力学中的扩散思想,主要包括前向扩散和反向扩散两个过程。本节将介绍扩散模型的原理,其中不包含复杂的数学推导。

1.1.1 生成模型

在深度学习中,生成模型的目标是根据给定的样本(训练数据)生成新样本。首先给定一批训练数据X,假设其服从某种复杂的真实分布p(x),则给定的训练数据可视为从该分布中才养的观测样本x。如果能够从这些观测样本中估计出训练数据的真实分布,不就可以从该分布中源源不断地采样出新的样本了么?生成模型实际上就是这么做的,它的作用是估计训练数据的真实分布,并将其假定为q(x)。在深度学习中,这个过程称为拟合网络。

那么问题来了,怎么才能知道估计的分布q(x)和这是的分布p(x)的差距大不大呢?一种简单的思路是要求所有的训练数据采样自q(x)的概率最大。这种思路实际上来自统计学中最大似然估计的思想,它也是生成模型的基本思想之一,因此生成模型的学习目标就是对训练数据的分布进行建模。

1.1.2 扩散过程

最大似然估计思想已经在一些模型(如VAE)上应用并取得了不错的效果。扩散模型可看作一个更深层的VAE。扩散模型的表达能力更加丰富,而且其核心在于扩散过程。

扩散的思想来自物理学中的非平衡热力学分支。非平衡热力学专门研究某些不处于热力学平衡中的物理系统,其中最为典型的研究案例是一滴墨水在水中扩散的过程。在扩散开始之前,这地墨水会在水中的某个地方形成一个大的斑点,我们可以认为这是这滴墨水的初始状态,但要描述该初始状态的概率分布则很困难,因为这个概率分布非常复杂。随着扩散过程的进行,这滴墨水随着时间的推移逐步扩散到水中,水的颜色也逐渐变成这滴墨水的颜色。此时,墨水分子的概率分布将变得更加简单和均匀,这样我们就可以很轻松地用数学公式来描述其中的概率分布了。

在这种情况下,非平衡热力学就派上用场了,它可以描述这滴墨水随时间推移的扩散过程中每一个“时间”步(旨在将连续的时间过程离散化)状态的概率分布。若能够想到办法把这个过程反过来,就可以从简单的分布中逐步推断出复杂的分布。

公认最早的扩散模型DDPM(Denosising Diffusion Probabilisitic Model)的扩散原理就由此而来,不过仅有上述条件依然很难从简单的分布倒推出复杂的分布。DDPM还做了一些假设,例如假设扩散过程是马尔可夫过程(即每个时间步状态的概率分布仅由上一个时间步状态的概率分布加上当前时间步的高斯噪声得到),以及假设扩散过程的逆过程是高斯分布。

1)前向过程
前向过程是给数据添加噪声的过程。假设给定一批训练数据,数据分布为x0~q(x0),其中,0表示初始状态,即还没有开始扩散。如前所述,将前向加噪声的过程分为离散的多个时间步T,在每一个时间步t,给上一个时间步t-1的数据xt-1添加高斯噪声,从而生成带有噪声(简称“带噪”)的数据xt,同时数据xt也会被送入下一个时间步t+1以继续添加噪声。其中,噪声的方差是由一个位于区间(0,1)的固定值βt 确定的,均值则是由固定值βt和当前时刻“带噪”的数据分布确定。在反复迭代和加噪(即添加噪声)T次之后,只要T足够大,根据马尔科夫链的性质,最终就可以得到纯随机噪声分布的数据,即类似稳定墨水系统的状态。

接下来,我们用简单的公式描述一下上述过程。从时间步t-1到时间步t的单步扩散加噪声的数学表达式:
在这里插入图片描述

最终的噪声分布数学表达式如下:
在这里插入图片描述

2)反向过程
前向过程是将数据噪声化的过程,反向过程则是“去噪”的过程,即从随机噪声中迭代恢复出清晰数据的过程。

要从采样自高斯噪声的数据xt~N(0,I)的一个随机噪声中恢复出原始数据x0,就需要知道反向过程中每一步的图像分布状态转移。类似地,DDPM也将反向过程定义为一个马尔科夫链,只不过这个马尔科夫链是由一系列用神经网络参数化的高斯分布组成的,也就是需要训练的扩散模型。

从时间步t到时间步t-1的单步反向“去噪”过程的数学表达式如下:
在这里插入图片描述

由于反向过程的每一步都是参数化的高斯分布,因此可以分别求高分分布的均值和方差。这里略去根据贝叶斯公式推导的过程,最终得到时间步t-1的高斯分布q(xt-1|xt, x0)的均值和方差的数学表达式如下:
在这里插入图片描述
在这里插入图片描述

可以看出,方差是一个定量(扩散过程参数固定),而均值是一个依赖于x0和xt的函数,因此需要使用扩散模型来优化参数。

3)优化目标

扩散模型预测的是噪声残差,即要求后向过程中预测的噪声分布与前向过程中施加的噪声分布之间的“距离”最小。

下面我们从另一个角度来看看扩散模型。如果把中间产生的变量看成隐变量的话,那么扩散模型其实是一种包含T个隐变量的模型,因此可以看成更深层次的VAE,而VAE的损失函数可以使用变分推断来得到变分下界(variational lower bound)。至于具体过程,本书不做过多的公式推导,感兴趣的读者可以参考DDPM原文。

扩散模型的最终优化目标的数学表达式如下:

在这里插入图片描述

可以看出,在训练DDPM时,只要用一个简单的MSE(Mean Squared Error, 均方误差)损失来最小化前向过程施加的噪声分布和后向过程预测的噪声分布,就能实现最终的优化目标。

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

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

相关文章

Search Ads Toggle有效推广:结合IPIDEA代理IP的TikTok营销策略

TikTok 本月22日推出了一个搜索广告切换(Search Ads Toggle)的新功能,这个功能对于广告商来说,更容易触达有明确搜索意向的目标受众。谷歌有研究显示,现在的年轻用户群体更倾向于把Tik Tok这样的社交媒体软件当做搜索引擎来使用,比…

Redis问题集合(三)在Redis容器里设置键值对

前言 前提是已经拉取了Redis镜像并创建了对应的容器做个记录,方便后续查看 步骤 查看Redis容器的ID:docker ps -a 进入容器:docker exec -it 容器ID /bin/bash进入redis命令行:redis-cli输入密码:auth 配置密码 查看…

L1-033 出生年(Python实现) 测试点全过

题目 以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不…

使用EF Core更新与修改生产数据库

使用EF Core的Code First,在设计阶段,直接使用Database.EnsureCreated()和EnsureDeleted()可以快速删除、更新最新的数据结构。由于没有什么数据,删除的风险非常低。但是对于已经投入生产的数据库,这个方法就绝对不可行了。 考虑…

vue3学习源码笔记(小白入门系列)------ 组件是如何渲染成dom挂载到指定位置的?

文章目录 os准备组件如何被挂载到页面上第一步 createApp 做了哪些工作?ensureRendererbaseCreateRenderercreateAppAPImountrenderpatchprocessComponentprocessElement 总结 os 学习一下vue3 源码,顺便记录分享下 使用vitest 插件调试源码 辅助阅读 …

0825|C++day5 运算符重载+静态成员+类的基础【Xmind+实例】

一、运算符重载 实例&#xff1a;&#xff08;赋值运算符、自增自减运算符、插入提取运算符&#xff09; #include <iostream>using namespace std;class Person {friend Person & operator(Person &L,const Person &R);friend Person & operator(Perso…

RabbitMQ 集群

clustering 最开始我们介绍了如何安装及运行 RabbitMQ 服务&#xff0c;不过这些是单机版的&#xff0c;无法满足目前真实应用的要求。如果 RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况&#xff0c;该怎么办&#xff1f;单台 RabbitMQ服务器可以满足每秒 100…

DDR与PCIe:高性能SoC的双引擎

SoC芯片无处不在&#xff0c;小到家电控制的MCU&#xff0c;大到手机芯片&#xff0c;我们都会接触到。如今大部分芯片设计公司都在开发SoC芯片&#xff0c;一颗SoC芯片可以集成越来越多的功能&#xff0c;俨然它已成为IC设计业界的焦点。 高性能、高速、高带宽的互联和存储的…

SpringIoC基于注解配置

目录 一、Bean注解标记和扫描 (IoC) 二、组件&#xff08;Bean&#xff09;作用域和周期方法注解 三、Bean属性赋值&#xff1a;引用类型自动装配 (DI) 四、Bean属性赋值&#xff1a;基本类型属性赋值 (DI) 一、Bean注解标记和扫描 (IoC) 一、注解方式介绍 1.注解介绍 和…

不同版本.net引用同一个项目

项目文件.csproj文件内容如下&#xff1a; 重点是&#xff1a;不能有其他的 netstandard2;net40;net45;net46;net6 <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><TargetFrameworks>netstandard2;net40;net45;net46;net6</TargetFrame…

学习pytorch5 常用的transforms

常用的transforms 1. ToTensor()2. Normalize() 1. ToTensor() 2. Normalize() # 1. ToTensor 把PIL图片类型数据或ndarry numpy数据类型转换为tensor类型数据 from cv2 import imread from torchvision import transforms from torch.utils.tensorboard import SummaryWrit…

Java | IDEA中Netty运行多个client的方法

想要运行多个client但出现这种提示&#xff1a; 解决方法 1、打开IDEA&#xff0c;右上角找到下图&#xff0c;并点击 2、勾选

2023.8.26-2023.9.3 周报【3D+GAN+Diffusion基础知识+训练测试】

目录 学习目标 学习内容 学习时间 学习产出 学习目标 1. 3D方向的基础知识 2. 图像生成的基础知识&#xff08;GAN \ Diffusion&#xff09; 3. 训练测试GAN和Diffusion 学习内容 1. 斯坦福cv课程-3D &#xff08;网课含PPT&#xff09; 2. sjtu生成模型课件 3. ge…

截止到目前全国全量在营企业数量有多少?

企业是现代经济社会中最重要的参与主体&#xff0c;它的每一项行为都直接或者间接地关联社会经济总量的变化。 企业数量有什么作用&#xff1f; 谈到企业数量&#xff0c;我们会想到相关行业发展&#xff0c;就业岗位&#xff0c;经济发展等方面的关联。但其实早在13年&#…

限时 180 天,微软为 RHEL 9 和 Ubuntu 22.04 推出 SQL Server 2022 预览评估版

导读近日消息&#xff0c;微软公司今天发布新闻稿&#xff0c;宣布面向 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;9 和 Ubuntu 22.04 两大发行版&#xff0c;以预览模式推出 SQL Server 2022 评估版。 近日消息&#xff0c;微软公司今天发布新闻稿&#xff0c;宣布…

迅镭激光高功率激光切割设备中标中国机械500强露笑集团!

近日&#xff0c;迅镭激光与中国机械500强、中国民营企业制造业500强露笑集团达成战略合作&#xff0c;成功签约10套激光切割设备&#xff0c;其中包括5套GK系列高功率光纤激光切割机、2套GI系列高功率光纤激光切割机、3套光纤激光切管机&#xff0c;这些设备将用于露笑集团全资…

CSS概念

1、CSS与HTML结合方式 1.1 第一种方式 内联/行内样式 就是在我们的HTML标签上通过style属性来引用CSS代码。 优点:简单方便 &#xff1b; 缺点:只能对一个标签进行修饰。 1.2 第二种方式 内部样式 我们通过<style>标签来声明我们的CSS. 通常<style>标签我们推荐写在…

性能优化——分库分表

1、什么是分库分表 1.1、分表 将同一个库中的一张表&#xff08;比如SPU表&#xff09;按某种方式&#xff08;垂直拆分、水平拆分&#xff09;拆分成SPU1、SPU2、SPU3、SPU4…等若干张表&#xff0c;如下图所示&#xff1a; 1.2、分库 在表数据不变的情况下&#xff0c;对…

CPU的基本知识介绍

相信大家对CPU一定不陌生了,从小就耳濡目染了,不过想搞清楚CPU的工作原理,并不是一件简单的事情&#xff0c;毕竟迄今为止,CPU的制造仍然是人类科技的巅峰。下面我们以SIT测试为主&#xff0c;简单的介绍下CPU,至于其工作原理,就不在此做详述。 CPU(Central Processing Unit&a…

配置开启Hive远程连接

配置开启Hive远程连接 Hive远程连接默认方式远程连接Hive自定义身份验证类远程连接Hive权限问题额外说明 Hive远程连接 要配置Hive远程连接&#xff0c;首先确保HiveServer2已启动并监听指定的端口 hive/bin/hiveserver2检查 HiveServer2是否正在运行 # lsof -i:10000 COMMA…