从VAE到Diffusion生成模型详解(1):VAE

news2024/12/26 10:34:03

文章目录

  • 1. 生成式模型简介
  • 2. PixelRNN/CNN
  • 3. VAE
    • 3.1 自编码器AE
    • 3.2 VAE基本原理
    • 3.3 VAE公式推导
  • 4. 参考

1. 生成式模型简介

什么是生成式模型

给定训练集,产生与训练集同分布的新样本。如下图所示,希望学习到一个模型 p m o d e l ( x ) p_{model}(x) pmodel(x),它与训练样本的分布 p d a t a ( x ) p_{data}(x) pdata(x)相近
在这里插入图片描述
从下图可以更形象的解释,假设除了问号以外的都是真实数据,模型学习到的分布为整个椭圆以内的区域,那么从椭圆内采样任意一点(如问号)都可以生成一张对应的图片。注意其他图案对应的是真实数据,但是真实数据有限,因此通过学习一个分布就能通过采样生成无限张图片
在这里插入图片描述
学习拟合真实样本的的分布过程,就是无监督学习中的密度估计问题。显式的密度估计直接求出 p model p_{\text {model}} pmodel的函数表达式,则可求出每个生成图像的概率;隐式的密度估计直接生成图片,无需定义表达式。

生成模型的分类

具体分类如下图所示,在本次系列文章中主要介绍PixelRNN/CNN、VAE、GAN、Diffusion
在这里插入图片描述

2. PixelRNN/CNN

PixelRNN
该模型是显式的密度求解。像语言模型一样,利用链式法则将图像的生成概率转变成每个像素生成概率的乘积,如下图所示,依次生成图像的每个像素

在这里插入图片描述
整个学习的过程就是最大化训练数据的似然,即在所有训练数据下找到一个模型使得上式概率最大。但是注意,训练数据分布是未知的(如果是高斯分布,只需直接找到 μ \mu μ δ \delta δ即可),分布可能很复杂,无法得知分布的表达式,这时可以使用神经网络来建模(神经网络理论上可拟合任意分布)

PixelRNN将像素生成看成一个序列生成的问题,利用RNN LSTM )的序列描述能力来生成新的像**,最大问题在于序列生成整张图片太慢了**

PixelCNN
pixelCNN依然是从图像左上角开始产生像素,基于已生成的像素,利用CNN 来生成新的像素。如下图所示在生成过程中只利用已生成的点,对未生成的点进行mask,不参加卷积运算。注意每次卷积操作输出都是一个256维向量,代表该点的每个像素值的概率
在这里插入图片描述
相对于pixelRNN,pixelCNN速度更快。但是依然是逐像素生成,整体仍然比较慢

3. VAE

3.1 自编码器AE

自编码器是一种无监督的特征学习,其目标是利用无标签数据找到一个有效的低维特征提取器。如下图所示,其目标就是对图片进行重构,使得重构后的图像与原图尽可能相似。
在这里插入图片描述
编码器用处
当自编码器训练好了后,就可以去掉解码器,并在特征 z z z后面接上分类等任务,进行有监督的微调学习。但是这种方式使用的仍然比较少,其效果不如直接在VGG上进行finetune。
解码器用处
图像生成任务:如下图所示,假设训练时特征 z z z为2维向量,那么就可在二维空间随机采样向量,送到解码器进行图像生成
在这里插入图片描述

3.2 VAE基本原理

** 为什么要变分自编码器VAE **
如下图我们期望AE能在B点处生成一个介于半月核满月之间的月亮,但是自编码器从未见过B处样本,因此无法生成我们期望的月亮,它只记住了A是满月,C是半月。
在这里插入图片描述
VAE基本原理
VAE的基本结构如下图所示,编码器的输出不是特征 z z z,而是一个分布(可以当作是一个均值为 m m m方差为 e x p ( δ ) exp(\delta) exp(δ)的高斯分布)。通过重参数化技巧:高斯分布采样得到解码器的输入 c = e x p ( δ ) e + m c=exp(\delta)e+m c=exp(δ)e+m
在这里插入图片描述
VAE的损失函数也相应的变化,不再仅仅是重构损失 ∣ ∣ x − x ^ ∣ ∣ 2 ||x-\hat x||^2 ∣∣xx^2,如果仅仅是重构损失,该模型会退化成自编码器。因此需要在重构损失后面再加上 ∑ i = 1 n ( e x p ( σ i ) − ( 1 + σ i ) + ( m i ) 2 ) \sum_{i=1}^{n}(e x p(\sigma_{i})-(1+\sigma_{i})+(m_{i})^{2}) i=1n(exp(σi)(1+σi)+(mi)2), 其中 m i 2 m_i^2 mi2是正则项,希望均值都尽可能小。而前面两项的函数图如下图所示,当 δ \delta δ为0时,同时让 m m m为0时整体最小,即让编码器输出是一个均值为0,方差为1的标准正态分布
在这里插入图片描述
再重新回过头来看为什么要VAE这个问题,由于VAE中有随机噪声的存在,如下图在A点处训练时既有可能生成满月,也有可能生成半月,这样最后推理时模型就学会了生成在满月和半月之间的形状。
在这里插入图片描述

3.3 VAE公式推导

高斯混合模型
在现实中很多分布非常复杂并非是高斯分布,通常都用多个高斯分布(高斯混合模型)来表示其分布。如下图所示,黑线分布 P ( x ) P(x) P(x)由多个高斯分布组成,其中 P ( m ) P(m) P(m)是选择到每个子高斯分布的概率, P ( x ∣ m ) P(x|m) P(xm)是在第m个高斯分布里产生x的概率。
在这里插入图片描述
对于VAE,如下图所示,最终的图像分布 P ( x ) P(x) P(x)可以看作是一个复杂的混合高斯分布,从标准正态分布中采样一个 z z z即可生成相应的图片,解码器的目的就是通过神经网络拟合 P ( x ) P(x) P(x)
在这里插入图片描述
那么VAE的训练过程可看作如下图所示,最大化所有观测样本的似然。注意到,求 P ( x ) P(x) P(x)时需要对 P ( z ) P(z) P(z)求积分,即要穷举连续变量 z z z,不易实现;因此需要求另一个分布 q ( z ∣ x ) q(z|x) q(zx),即通过给定样本获得 z z z,然后通过把 z z z送入解码器,最终通过神经网络获得图像的分布
在这里插入图片描述
极大似然估计过程如下图所示,(1)式中 ∫ z q ( z ∣ x ) d z = 1 \int_{z}q(z|x)d_z=1 zq(zx)dz=1,因此增加积分号对结果无影响。(2)式中使用了贝叶斯公式替换了 P ( x ) P(x) P(x)
在这里插入图片描述
由上图可知最大化 l o g P ( x ) logP(x) logP(x)可以近似看作最大化下界 L b L_b Lb即可, L b L_b Lb可进一步进行如下化简
在这里插入图片描述
结合前面说到的损失函数,对 L b L_b Lb的优化就相当于对前面提到的损失函数的优化,具体如下图所示
在这里插入图片描述
最后VAE的整体训练和应用如下图所示
在这里插入图片描述

4. 参考

计算机视觉与深度学习 北京邮电大学 鲁鹏

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

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

相关文章

22 分页控件

文章目录 界面设置初始化主对话框子页面初始化 页面1枚举窗口页面2枚举进程全部代码 界面设置 ui 设置 >创建CTablCtrl > 创建页控件(子窗口),style设置成为chlid 添加类 页面中加入listCtrl 控件 添加变量 分别添加初始化函数 初始化…

举例说明单层神经网络的工作原理

假设我们有一个简单的单层神经网络,用于解决一个简单的问题:根据一个人的年龄(x)来预测其收入(y)。在这个例子中,输入数据只有一个特征(年龄),因此我们可以用…

Can转以太网网关can协议转以太网协议

YC-ETH-CAN-2 是一款用来把 CAN 总线数据转为网口数据的设备。网口支持 TCP Sever、TCP Client、UDP Sever、UDP Client、UDP Broadcast 模式,可以通过软件配置和网页配置。 设备提供两路 CAN 接口,两路 CAN 可分别配置为不同的工作模式,独立…

[QT编程系列-4]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:信号、槽函数、对象之间的通信

目录 2. QT程序的运行框架 2.4 设计界面元素的行为:信号、槽函数、对象之间的通信 2.4.1 对象之间的通信 2.4.2 信号槽与消息队里区别 2.4.3 预定义信号与默认槽函数 2.4.4 预定义信号与默认槽函数:案例2 2.4.5 预定义信号与自定义槽函数&#xff…

【JVM系列】类加载机制和双亲委派机制(一)

使用java8 一、类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM。 package jvmdemo;public class Math {public static final int initData 666;public static User user new User();public int comput…

立创EDA(专业版)电路设计与制作快速入门

1.新建工程的时候 (要注意用版本控制,项目名,日期,版本) 2.原理图设计环境设置 3.电源转换电路 电源是一般是5v转3.3v电路 电源主要的可以选择LLDO来降压的或者是DCDC减压 这个电路主要是用LDO来降压的 AMS1117降…

操作系统Linux—day01

编程 网页 软件 网站项目 知识点: 前端页面:HTML css JavaScript JQuery VUE 数据库:Oracle MySQL 服务器:服务器的操作系统Linux Http://115.159.96.174:8090/EasyBuy/ www.baidu.com>http://180.101.49.12/ 后台技术…

【iOS】消息传递

Objective-C是一种动态语言,因此其很多行为是在运行时决定的。对于静态语言来说,函数的调用在编译时就已经确定。动态语言则不然,动态语言通过一些巧妙的机制使得函数的真实调用是在运行时决定的,即动态语言的特点是将一些决定性的…

2、常用基本命令-文件

Shell 可以看作是一个命令解释器,为我们提供了交互式的文本控制台界面。我们可以 通过终端控制台来输入命令,由 shell 进行解释并最终交给内核执行。 本章就将分类介绍 常用的基本 shell 命令。 7.1 帮助命令 7.1.1 man 获得帮助信息 1)基本…

大于100万行数据如何转换坐标、格网生成和裁剪、低格网数据提取

在工作过程中,对于100万以下的数据,我们一般使用EXCEL进行操作,但对于大于1百万行的数据,EXCEL也无能为力。此时,解决办法有三种:(1)拆分成几个小于100万的文件,再用EXCE…

机器学习原理

此次主要是由分类来引出 由于宝可梦的图片比较简洁,而数码宝贝的图片就显得比较复杂,我们计算出他们的轮廓,求出白色数量的多少。 e的函数会计算线条的复杂程度。当得出的线条的复杂程度,小于h。我们认为其是宝可梦,反…

Python(七)二进制

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

Mac非brew方式安装OpenResty教程

本文版本基于openresty-1.15.8.1和pcre-8.4.4安装。 一、安装前准备 由于openResty本质上还是基于nginx和Lua的高性能Web平台,安装openResty前需要先安装好openssl和pcre。 小编的机器因为之前安装过nginx,所以openssl和pcre已经有了。openssl的安装目…

Python(六)转义字符和原字符

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

包管理工具:npm、yarn、cnpm、npx、pnpm

yarn:  yarn是由Facebook(react)、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具;  yarn 是为了弥补早期npm 的一些缺陷而出现的;  早期的npm存在很多的缺陷,比如安装依赖速度很慢、版本依赖混乱等等一系列…

【LeetCode: 1911. 最大子序列交替和 | 暴力递归=>记忆化搜索=>动态规划 】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【C#】设置输入法,解决扫描枪在中文状态下识别异常问题

系列文章 【C#】编号生成器(定义单号规则、固定字符、流水号、业务单号) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器(开始日期、结束日期) 本文链接:h…

【Redis】特殊数据类型 Stream (流)

🎯前言 除了五中基本的数据类型外,Redis还支持两种特殊的数据类型,第一种 Geo (地理位置):用于存储地理位置相关的数据,例如经纬度、距离等。第二种 Stream (流):是一个高级的列表类型,支持对列…

学习系统编程No.30【多线程控制实战】

引言: 北京时间:2023/7/7/9:58,耳机正在充电中,所以刚好让我们先把引言写一写,昨天睡觉前听了一会小说,听小说的好处就在于,它可以让你放下手机,快速睡觉,并且还有一定的…

python批量检测网站是否能打开

import requestsif __name__ "__main__":file_name input() #读取文件名fp1 open(file_name, "r") #以只读,打开文件for line in fp1.readlines(): #readlines 按行读取文件,会保留\n,返回一个(文…