AI绘画能力的起源:通俗理解VAE、扩散模型DDPM、ViT/Swin transformer

news2024/11/24 4:34:20

前言

2018年我写过一篇博客,叫:《一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD》,该文相当于梳理了2019年之前CV领域的典型视觉模型,比如

  • 2014 R-CNN
  • 2015 Fast R-CNN、Faster R-CNN
  • 2016 YOLO、SSD
  • 2017 Mask R-CNN、YOLOv2
  • 2018 YOLOv3

随着2019 CenterNet的发布,特别是2020发布的DETR(End-to-End Object Detection with Transformers)之后,自此CV迎来了生成式下的多模态时代

  • 2020年
    5月 DETR
    6月 DDPM(即众人口中常说的扩散模型diffusion model)
    10月 DDIM、Vision Transformer
  • 2021年
    1月 CLIP、DALL·E
    3月 Swin Transformer
    11月 MAE、Swin Transformer V2
  • 2022年
    1月 BLIP
    4月 DALL·E 2
    8月 Stable Diffusion、BEiT-3、Midjourney V3
  • 2023年
    1月 BLIP2
    3月 Visual ChatGPT、GPT-4、Midjourney V5
    4月 SAM(Segment Anything Model)

但看这些模型接二连三的横空出世,都不用说最后爆火的GPT4,便可知不少CV同学被卷的不行

说到GPT4,便不得不提ChatGPT,实在是太火了,改变了很多行业,使得国内外绝大部分公司的产品、服务都值得用LLM全部升级一遍(比如微软的365 Copilot、阿里所有产品、金山WPS等等)

而GPT4相比GPT3.5或GPT3最本质的改进就是增加了多模态的能力,使得ChatGPT很快就能支持图片的输入形式,从而达到图生文和文生图的效果,而AI绘画随着去年stable diffusion和Midjourney的推出,使得文生图火爆异常,各种游戏的角色设计、网上店铺的商品/页面设计都用上了AI绘画这样的工具,更有不少朋友利用AI绘画取得了不少的创收,省时省力还能赚钱,真香

但面对这么香的技术,其背后的一系列原理到底是什么呢,本文特从头开始,不只是简单的讲一下扩散模型的原理,而是在反复研读相关论文之后,准备把20年起相关的CV多模态模型全部梳理一遍,从VE、VAE、到ViT/Swin transformer、CLIP/BLIP,再到stable diffusion、GPT4,尽可能写透彻每一个模型的原理,就当2020年之后的CV视觉发展史了

过程中会尽可能写透彻每一个模型的原理,举个最简单的例子,网上介绍VAE的文章都太数学化(更怕那种表面正确其实关键的公式是错的误导人),如果更边推导边分析背后的理论意义(怎么来的 出发点是什么 为什么要这么做 这么做的意义是什么),则会更好理解,这就跟变介绍原理边coding实现 会更好理解、理解更深 一个道理

第一部分 编码器VE与变分自编码器VAE

1.1 AE:编码器(数据X压缩为低维表示z)-解码器(低维表示恢复为原始数据\hat{X})架构

自编码器(Autoencoder,简称AE)是一种无监督学习的神经网络,用于学习输入数据的压缩表示。具体而言,可以将其分为两个部分:编码器和解码器

  • 编码器:编码器是一个神经网络,负责将输入数据X(如图像、文本等)压缩为一个低维表示z,且表示为z = g(X)

  • 解码器:解码器是另一个神经网络,负责将编码器生成的低维表示恢复为原始数据\hat{X},且表示为\hat{X} = f(z)

从而最终完成这么一个过程:X \rightarrow z \rightarrow \hat{X},而其训练目标即是最小化输入数据X与解码器重建数据\hat{X}之间的差异,所以自编码器常用的一个损失函数为l = || X - \hat{X} || ^2

这个自编码的意义在于

  1. 模型训练结束后,我们就可以认为编码z囊括了输入数据X的大部分信息,也因此我们可以直接利用z表达原始数据,从而达到数据降维的目的
  2. 解码器只需要输入某些低维向量z,就能够输出高维的图片数据\hat{X},那我们能否把解码器模型直接当做生成模型,在低维空间中随机生成某些向量z,再喂给解码器f(z)来生成图片呢?

对于第二点,理论上可以这么做,但绝大多数随机生成的z,f(z)只会生成一些没有意义的噪声,之所以如此,原因在于没有显性的对z的分布p(z)进行建模,我们并不知道哪些z能够生成有用的图片。而且我们用来训练f(z)的数据是有限的,f可能只会对极有限的z有响应。而整个低维空间又是一个比较大的空间,如果只在这个空间上随机采样的话,我们自然不能指望总能恰好采样到能够生成有用的图片的z

有问题自然便得探索对应的解决方案,而VAE(自变分编码器,Variational Autoencoders)则是在AE的基础上,显性的对z的分布p(z)进行建模(比如符合某种常见的概率分布),使得自编码器成为一个合格的生成模型

1.2 Variational AutoEncoder (VAE)

1.2.1 VAE:标数据的分布\hat{X}和目标分布X尽量接近

VAE和GAN一样,都是从隐变量Z生成目标数据,具体而言,先用某种分布随机生成一组隐变量Z = \left \{ Z_1,Z_2,\cdots ,Z_k \right \}(假设隐变量服从正态分布),然后这个Z隐变量经过一个生成器生成一组数据\hat{X} = \left \{ \hat{X_1},\hat{X_2},\cdots ,\hat{X_k} \right \},具体如下图所示(本1.2节的部分图来自苏建林):

而VAE和GAN都希望这组生成数据的分布\hat{X}和目标分布X尽量接近,看似美好,但有两个问题

  • 一方面,“尽量接近”并没有一个确定的关于\hat{X} 和 X的相似度的评判标准,比如KL散度便不行,原因在于KL散度是针对两个已知的概率分布求相似度的,而 \hat{X}和 X 的概率分布目前都是未知(只有采样数据 没有分布表达式)
  • 二方面,经过采样出来的每一个Z_k,不一定对应着每一个原来的X_k,故最后没法直接最小化D^2(X_k,\hat{X_k})

实际是怎么做的呢,事实上,与自动编码器由编码器与解码器两部分构成相似,VAE利用两个神经网络建立两个概率密度分布模型:

  • 一个用于原始输入数据X=\{X_1,...,X_k\}的变分推断,生成隐变量Z的变分概率分布p(Z|X_k),称为推断网络
    而VAE的核心就是,我们不仅假设 p(Z)是正态分布,而且假设每个p(Z|X_k) 也是正态分布。什么意思呢?即针对每个采样点X_k获得一个专属于它和 Z 的一个正态分布p(Z|X_k)
    换言之,有 k 个 X sample,就有k个正态分布 p(Z|X_k),毕竟没有任何两个采样点是完全一致的,而后面要训练一个生成器 \hat{X_k}=f(Z),希望能够把从分布 p(Z|X_k)采样出来的一个 Z_k 还原为 X_k,而如果p(Z)中采样一个 Z_k,没法知道这个 Z_k 对应于真实的 X_k 呢?现在 p(Z|X_k) 专属于X_k,我们有理由说从这个分布采样出来的 Z_k 可以还原到对应的X_k 中去

    而如何确定这 k 个正态分布呢,众所周知,确定一个正太分布只需确定其均值u和方差\sigma ^2 即可,故可通过已知的X_k 和 假设Z 去确定均值和方差
    具体可以构建两个神经网络\mu _k = f_1(X_k)log \sigma _{k}^{2} = f_2(X_k)去计算。值得一提的是,选择拟合log \sigma _{k}^{2}而不是直接拟合\sigma _{k}^{2},是因为\sigma _{k}^{2}总是非负的,需要加激活函数处理,而拟合log \sigma _{k}^{2}不需要加激活函数,因为它可正可负
  • 另一个根据生成的隐变量Z的变分概率分布p(Z),还原生成原始数据的近似概率分布p(\hat{X}|Z),称为生成网络 
    因为已经学到了这 k 个正态分布,那可以直接从专属分布p(Z|X_k)中采样一个Z_k出来,然后经过一个生成器得到\hat{X_k} = f(Z_k),那接下来只需要最小化方差 D^2(X_k,\hat{X_k}) 就行

仔细理解的时候有没有发现一个问题?为什么在文章最开头,我们强调了没法直接比较 X 与 \hat{X} 的分布,而在这里,我们认为可以直接比较这俩?注意,这里的 Z_k 是专属于或针对于X_k的隐变量,那么和 \hat{X_k}本身就有对应关系,因此右边的蓝色方框内的“生成器”,是一一对应的生成。

另外,大家可以看到,均值和方差的计算本质上都是encoder。也就是说,VAE其实利用了两个encoder去分别学习均值和方差

1.2.2 VAE的Variational到底是个啥

这里还有一个非常重要的问题:由于我们通过最小化D^2(X_k,\hat{X_k})来训练右边的生成器,最终模型会逐渐使得 X_k 和\hat{X_k}趋于一致。但是注意,因为 Z_k是重新随机采样过的,而不是直接通过均值和方差encoder学出来的,这个生成器的输入 Z是有噪声的

  1. 仔细思考一下,这个噪声的大小其实就用方差来度量。为了使得分布的学习尽量接近,我们希望噪声越小越好,所以我们会尽量使得方差趋于 0
  2. 但是方差不能为 0,因为我们还想要给模型一些训练难度。如果方差为 0,模型永远只需要学习高斯分布的均值,这样就丢失了随机性,VAE就变成AE了……这就是为什么VAE要在AE前面加一个Variational:我们希望方差能够持续存在,从而带来噪声!
  3. 那如何解决这个问题呢?其实保证有方差就行,但是VAE给出了一个优雅的答案:不仅需要保证有方差,还要让所有 p(Z|X)趋于标准正态分布N(0,1),根据定义可知

    P(Z) = \sum_{X}^{} p(Z|X)p(X) = \sum_{X}^{} N(0,1)p(X) = N(0,1)\sum_{X}p(X) = N(0,1)

    这个式子的关键意义在于告诉我吗:如果所有p(Z|X)都趋于N(0,1),那么我们可以保证p(Z)也趋于N(0,1),从而实现先验的假设,这样就形成了一个闭环!那怎么让所有p(Z|X)趋于N(0,1)呢?还是老套路:加loss
    到此为止,我们可以把VAE进一步画成:

现在我们来回顾一下VAE到底做了啥。VAE在AE的基础上

  • 一方面,对均值的encoder添加高斯噪声(正态分布的随机采样),使得decoder(即生成器)有噪声鲁棒性
  • 二方面,为了防止噪声消失,将所有p(Z|X)趋近于标准正态分布,将encoder的均值尽量降为 0,而将方差尽量保持住

这样一来,当decoder训练的不好的时候,整个体系就可以降低噪声;当decoder逐渐拟合的时候,就会增加噪声

第二部分 扩散模型DDPM:Denoising Diffusion Probabilistic Models

2020年,UC Berkeley等人的Jonathan Ho等人通过论文《Denoising Diffusion Probabilistic Models》正式提出DDPM

在写本文之前,我反复看了网上很多阐述DDPM的文章,实话说,一开始看到那种一上来就一堆公式的,起初确实看不下去,虽然后来 慢慢的都看得下去了,但如果对于一个初次接触DDPM的初学者来说,一上来一堆公式确实容易把人绕晕,但如果没有公式,则又没法透彻理解背后的算法步骤,两相权衡,本文将侧重算法每一步的剖析,而公式更多为解释算法原理而服务,说白了,侧重原理 其次公式,毕竟原理透彻了,公式也就自然而然的能写出来了

首先,明确DDPM的目标:作为一个生成式模型,其目标是从随机噪声直接生成图片,换言之,首先训练一个噪声估计模型,然后将输入随机噪声还原成图片),相当于就两个关键,一个是训练过程,一个是推理过程

  1. 训练过程:随机生成噪声\epsilon,经过T步将噪声扩散到输入原始图片x_0中,破坏后的图片x_t,学习破坏图片的预估噪声\epsilon _\theta (x_t,t),用L2 loss约束与\epsilon原始输入噪声的距离
  2. 推理过程就输入噪声,经过预估噪声模型还原成图片

2.1 前向过程:通过高斯噪音随机加噪,相当于给图片打马赛克

前向过程(forward process)又称为扩散过程(diffusion process),简单理解就是对原始图片�0 通过逐步加高斯噪声变成 �� ,从而达到破坏图片的目的,如下图

DDPM的前向过程

用公式表示就是

(1)��=����−1+1−����−1

其中 {��}�=1� 是预先设定好的超参数,被称为Noise schedule,通常是一些列很小的值。 ��−1∼�(0,1) 是高斯噪声。由公式(1)迭代推导,可以直接得出 �0 到 �� 的公式(详细过程可见[2]),如下,

(2)��=��¯�0+1−��¯�

其中 ��¯=∏���� ,这是随Noise schedule设定好的超参数, �∼�(0,1) 也是一个高斯噪声。公式(1)或(2)就可以用来描述前向过程了,(1)用于将一张图片逐步破坏,(2)用于一步到位破坏。

2.2 反向过程(去噪)

反向过程就是通过估测噪声,多次迭代逐渐将被破坏的 �� 恢复成 �0 ,如下图

DDPM的反向过程

用公式表示就是

由于公式(2)中的真实噪声 � 在复原过程中不允许使用,因此DDPM的关键就是训练一个由 �� 和 � 估测噪声的模型 ��(��,�) ,其中 � 就是模型的训练参数, �� 也是一个高斯噪声 ��∼�(0,1) ,用于表示估测与实际的差距。在DDPM中,使用U-Net作为估测噪声的模型。

2.3 如何训练(获得噪声估计模型)

上文提到,DDPM的关键是训练 ��(��,�) 模型,使其预测的 �^ 与真实用于破坏的 � 相近,用L2距离刻画相近程度就好,因此我们的Loss就是如下公式。

训练过程如下图描述

DDPM训练过程

用原论文中的伪代码表示也很容易理解。

论文中的训练伪代码

这里有读者会有疑问,在训练过程中 ��(��,�) 表示的是从t到t-1时刻的噪声,而却用0到t的真实噪声 � 进行拟合,会不会有些不妥呢? 我的理解是0到t的真实噪声 � 只是指导方向,方向大概正确即可,后续用于生成时也不要求恢复出原图,只要能生成一个可看的图片即可,所以这样做是可以的。

2.4 如何使用(生成图片)

在得到噪声估测模型 ��(��,�) 后,想要生成模型就很简单了。从N(0,1)中随机生成一个噪声作为 �� ,然后再用该模型逐步从估测噪声,并用去噪公式逐渐恢复到 �0 即可,见如下伪代码。

论文中生成的伪代码

贴一些论文里生成的图片看一看,效果还是很惊艳的(论文实验的超参数T=1000, ��=1−0.02�� )。

//待更..怪我不一小心把本文发布出去了,本来一直在草稿里要修改个把星期的..

参考文献与推荐阅读

  1. 变分自编码器(一):原来是这么一回事
  2. ..
  3. 关于VAE的几篇文章:一文理解变分自编码器(VAE)、机器学习方法—优雅的模型(一):变分自编码器(VAE)、
  4. 苏剑林关于扩散模型的几篇文章:(一):DDPM = 拆楼 + 建楼、(二):DDPM = 自回归式VAE
  5. 知乎上关于扩散模型的几篇文章:全网最简单的扩散模型DDPM教程、
  6. 怎么理解今年 CV 比较火的扩散模型(DDPM)?
  7. 扩散模型是如何工作的:从0开始的数学原理
  8. What are Diffusion Models?

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

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

相关文章

Linux命令集(Linux网络连接管理命令--ifconfig指令篇)

Linux命令集(Linux网络连接管理命令--ifconfig指令篇) Linux网络连接管理命令集(ifconfig指令篇)1. ifconfig(interface configuration)1. 信息显示2. 接口配置 Linux网络连接管理命令集(ifconfig指令篇) 如…

C++Primer第五版【阅读笔记】

CPrimer第五版 阅读笔记 第1章开始1.1 编写一个简单的C程序1.1.1 编译、运行程序 1.2 初识输入输出1.3 注释简介1.4 控制流1.4.1 while语句1.4.2 for语句1.4.3 读取数量不定的输入数据1.4.4 if语句 1.5 类简介1.5.1 Sales_item 类1.5.2 初识成员函数 1.6 书店程序第一章小结 第…

【Linux入门】linux指令(1)

【Linux入门】linux指令(1) 目录 【Linux入门】linux指令(1)操作系统登录服务器Linux下的基本指令ls指令pwd指令Linux路径分割符 /cd指令touch指令mkdir指令(重要)rmdir指令&&rm指令(重…

4.30下周美联储携非农来袭黄金多空该如何布局?

近期有哪些消息面影响黄金走势?下周黄金多空该如何研判? ​黄金消息面解析:周五(4月28日)当周金价维持震荡交投,金价基本持稳于2000美元下方。支撑和打压金价的因素参半。经济衰退的担忧,以及避险情绪支持金价&#x…

Fabric.js 讲解官方demo:Stickman

theme: smartblue 本文简介 戴尬猴,我是德育处主任 Fabric.js 官网有很多有趣的Demo,不仅可以帮助我们了解其功能,还可以为我们提供创意灵感。其中,Stickman是一个非常有趣的例子。 先看看效果图 从上图可以看出,在拖拽…

【SpringBoot2】二:基础入门---自动配置原理(SpringBoot特点+容器功能)

文章目录 1.SpringBoot特点1.1 依赖管理1.2 自动配置 2.容器功能2.1 组件添加2.1.1Configuration2.1.2 Bean、Component、Controller、Service、Repository2.1.3 ComponentScan、Import2.1.4 Conditional 2.2 原生配置引入ImportResource2.3 配置绑定2.3.1 Component Configur…

如何保障网络安全

网络安全是一个涵盖范围广、深入浅出的话题。随着互联网在现代社会中扮演的重要角色日益突出,网络安全问题成为各个领域所关注的焦点。在此,我们将从以下几个方面来阐述网络安全的重要性,并讨论几种保障网络安全的方式。 一、网络安全的重要性…

K8s(1.20.15版本)部署(3master+2node)

1.准备工作 准备五台centos 7的虚拟机(每台虚拟机分配2核2G,存储使用20G硬盘,必须2核不然报错):如下图机器的分配情况: IP节点名称节点类型10.10.10.11k8s-master11master10.10.10.12k8s-master12master1…

解决centos8下域名raw.githubusercontent.com解析错误

在win10环境下执行命令 D:\test>ping raw.githubusercontent.com Ping 请求找不到主机 raw.githubusercontent.com。请检查该名称,然后重试。 解决很简单,把ipv6的DNS服务器设为240c::6666就行了,改完后执行命令 D:\test>ping raw.g…

C语言函数大全-- s 开头的函数(2)

C语言函数大全 本篇介绍C语言函数大全-- s 开头的函数(2) 1. setlinestyle 1.1 函数说明 函数声明函数功能void setlinestyle( int linestyle, unsigned upattern, int thickness );设置当前绘图窗口的线条样式、线型模式和线条宽度 参数&#xff1a…

SQL中去除重复数据的几种方法,我一次性都告你​

使用SQL对数据进行提取和分析时,我们经常会遇到数据重复的场景,需要我们对数据进行去重后分析。 以某电商公司的销售报表为例,常见的去重方法我们用到distinct 或者group by 语句, 今天介绍一种新的方法,利用窗口函数…

不得不说的行为型模式-命令模式

目录 命令模式: 代码实例: 下面是面试中可能遇到的问题: 命令模式: 命令模式(Command Pattern)是一种行为型设计模式,它允许将请求封装成对象,从而让你能够用不同的请求对客户端进行参数化,对…

Guitar Pro8苹果mac最新版本下载安装教程

Guitar Pro是一款专业的吉他制谱软件,现在已更新至Guitar Pro8,新增了支持添加音频轨道、支持嵌套连音符、直观的效果器视图、让指法一目了然的音阶示意图等实用新功能。下面我们来看Guitar Pro8 Mac如何安装。 guitar pro是一款专业的吉他学习软件&…

Linux内核(十四)Input 子系统详解 I —— 子系统介绍以及相关结构体解析

文章目录 概述input 子系统框架input 子系统相关结构体介绍input_dev结构体input_handler结构体input_handle结构体Evdev事件相关结构体input_event结构体(标准按键编码信息)设备相关信息结构体 概述 input子系统就是管理输入的子系统,和Lin…

HTML中的常用标签

HTML中的常用标签 🔎注释标签🔎标题标签🔎段落标签🔎换行标签🔎格式化标签🔎图片标签🔎超链接标签🔎表格标签合并单元格 🔎列表标签无序列表有序列表自定义列表 &#x1…

新手如何快速学会Python?

在本文中,我们将介绍如何有效地学习 Python 。你应该知道「数据科学」是用于解决、探究问题并从数据中提取有价值信息的科学。 为了有效地做到这一点,你需要整理数据集、训练机器学习模型、可视化结果等等。 这是学习 Python 的最佳时机。 事实上&#x…

【五一创作】数据可视化之美 ( 三 ) - 动图展示 ( Python Matlab )

1 Introduction 在我们科研学习、工作生产中,将数据完美展现出来尤为重要。 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。 …

[创新工具和方法论]-01- DOE课程基础知识

文章目录 1.DOE实验设计的介绍1.1 什么是实验设计DOE?1.2 DOE的优势有哪些?1.3 如何开展DoE研究?步骤 2.DOE实验培训3.数据分析步骤4.实验的随机化5.偏差6.R方 相关系数假设检验 7.三因子二水平全因子设计 1.DOE实验设计的介绍 实验设计是一种安排实验和分析实验数…

【网络进阶】服务器模型Reactor与Proactor

文章目录 1. Reactor模型2. Proactor模型3. 同步IO模拟Proactor模型 在高并发编程和网络连接的消息处理中,通常可分为两个阶段:等待消息就绪和消息处理。当使用默认的阻塞套接字时(例如每个线程专门处理一个连接),这两…

Ubantu docker学习笔记(八)私有仓库

文章目录 一、建立HTTPS链接1.在仓库服务器上获取TLS证书1.1 生成证书颁发机构证书1.2 生成服务器证书1.3 利用证书运行仓库容器 2.让私有仓库支持HTTPS3.客户端端配置 二、基本身份验证三、对外隐藏仓库服务器3.1 在服务器端3.2 在客户端进行 四、仓库可视化 在前面的学习中&a…