【轩说AI】生成模型(1)——自编码器AE+变分自编码器VAE

2023-11-08

生成模型

从概率分布的角度去理解“生成”一张图片

一维随机变量的概率密度 f ( X ) f(X) f(X)
二维随机变量的联合概率密度 f ( X , Y ) f(X,Y) f(X,Y)

一张图片的每一个像素都是一个随机变量X,他可以在0-255之间任意取值,一张20pixel*20pixel的图片,就是400维的随机向量,他的分布 f ( X 1 , X 2 , . . . , X 399 , X 400 ) f(X_1,X_2,...,X_{399},X_{400}) f(X1,X2,...,X399,X400),如果它是一张特定的宝可梦的图片
宝可梦

生成宝可梦

上述宝可梦图片每个像素的值是确定的。如果一个生成模型想要生成它,那么他的分布 f ( X 1 , X 2 , . . . , X 399 , X 400 ) f(X_1,X_2,...,X_{399},X_{400}) f(X1,X2,...,X399,X400)必须尽可能的拟合这个原图给出的像素值 Y = ( x 1 , x 2 , . . . , x 399 , x 400 ) Y=(x_1,x_2,...,x_{399},x_{400}) Y=(x1,x2,...,x399,x400),也就是说,这个生成模型是在拟合一个概率分布,这个分布在某个给定的400维像素分布Y的时候,取值最大,且方差尽可能小。

举例,假如Y中某个像素Xi=168,那么 f ( X 1 , X 2 , . . . , X 399 , X 400 ) f(X_1,X_2,...,X_{399},X_{400}) f(X1,X2,...,X399,X400)的边缘概率密度 f ( X i ) f(X_i) f(Xi)可以拟合出一个均值168,方差越小越好的正态分布。

生成系列图片

生成所有的宝可梦:
在这里插入图片描述
P ( X ) P(X) P(X)=分布 f ( X 1 , X 2 , . . . , X 399 , X 400 ) f(X_1,X_2,...,X_{399},X_{400}) f(X1,X2,...,X399,X400)

  1. 在上述生成单个皮卡丘的情况,这个分布P(X)是单峰的,只有在给定的Y分布时,概率密度最大。
  2. 在生成所有的宝可梦时,这个分布可以是多峰的,也就是P(X)涵盖了所有可能的宝可梦。同理,在手写数字识别时,它涵盖了所有可能的数字“1”(或者其他数字)。这时,只要在P采样,就可以得到想要的sample。

可见,图片中像素的分布需要满足一定条件时,P(X)中采样得到的图片才能是个宝可梦。可以想象,一个400维的随即向量的可能取值有 25 6 400 256^{400} 256400种,并不是每种像素值的组合都会是一张宝可梦,假如每个像素的边际分布是均匀分布,那么得到的会是一张“电视雪花模糊”图片,毫无意义。

所以,这个P(X)是一种客观实在的东西,是我们用概率学去抽象出的图片的分布规律。于是,我们要想办法生成这个分布函数P(X),让他尽可能的拟合真实世界中的分布。

我们认识客观世界的过程就是学习分布的过程。买菜买肉时“看成色”,是因为我们头脑中有“好物”的颜色、气味应该是什么分布,比如一个深蓝绿色的汉堡包就很奇怪。

自动编码器Auto-Encoder

AE的模型及其存在的问题

在这里插入图片描述
把图片X降维,然后生成code,然后在解码,得到一个模拟的分布中的采样sample。

关于降维,如果感兴趣背后的故事,请看我上一篇博客【轩说AI】无监督特征学习——主成分分析、稀疏编码、自编码器

这里面X是咖啡这个分布的一个采样,生成的也是某个分布中的采样code,最后得到的也是一个分布中的采样sample,整个AE只是在做编码解码。

隐空间code中的分布是一个个“点”,每个X进来,生成一个code值,会出现如下问题。
在这里插入图片描述
也就是说,这个生成器产生的分布和隐空间的点具有一一对应的关系,“记得死死的”,过拟合。并且隐空间的编码值可解释性差。而隐空间中各个编码值的之间的“点”,decoder可能因为完全没见过,而产生一些错误的分布。假设我们在隐空间Z中取得数字“8”降维后和数字“9”降维后的点的中心点,我们希望这个点可以既像8又像9,但是真实情况是,decoder并未能解析这个点。

AE中的高斯混合模型

在这里插入图片描述
m :隐空间的取值。 p ( m ) :隐空间的分布 p ( x ∣ m ) : d e c o d e r 拟合的正态分布 ( g a u s s i a n ) p ( x ) :所有 g a u s s i a n 的 m i x t u r e m:隐空间的取值。\\ p(m):隐空间的分布\\ p(x|m):decoder拟合的正态分布(gaussian)\\ p(x):所有gaussian的mixture\\ m:隐空间的取值。p(m):隐空间的分布p(xm)decoder拟合的正态分布(gaussian)p(x):所有gaussianmixture

我们要拟合一个手写数字“1”,P(x)就是这个手写数字1的概率分布函数,x∈R(400),每个峰值都对应着一种可能的字体“1”,每处低谷都对应着其他图像分布(可能是一只宝可梦,但是我们不管他)【上述图像的峰值位置应该比较集中,图示仅供参考

上述这个分布是decoder来拟合的,也就是说,给出一个隐空间的点m(前提是这个点距离之前训练样本产生的点非常非常近),那么这个decoder会拟合出一个比较合理的正态分布 p ( x ∣ m ) p(x|m) p(xm),对应着某一种写法的数字“1”(比如草体数字“1”)

但是,这个 P ( m ) P(m) P(m)如果是离散型随机变量的分布,那么有些m的取值我们的decoder就难以拟合出正确的 p ( x ∣ m ) p(x|m) p(xm),而进一步说,我们的 P ( x ) P(x) P(x)也可以说是“不完整的”,没有涵盖所有可能的数字“1”。

这就是普通的auto-encoder的问题所在:隐空间中的分布不是连续的。

AE的训练情况

在这里插入图片描述
可见,每个训练样本在隐空间用一个有颜色的点来表示,同一类用一个颜色表示。可以看出,点和点之间的空隙很大。每个样本都在decoder中获得了一个 p ( x ∣ m ) p(x|m) p(xm),产生了对应的一个正态分布。并且通过 Σ m [ p ( x ∣ m ) ∗ p ( m ) ] \mathop{\Sigma} \limits_{m}[p(x|m)*p(m)] mΣ[p(xm)p(m)]得到了P(x)。与上述所言**“AE中的高斯混合模型”**不同的是,这里将p(m)推广为所有手写数字训练样本的在隐空间的分布。生成了的p(x)也是所有手写数字的分布,概率密度大的地方就可能是某一种数字的手写图片分布值(也就是同时涵盖了“1”~"9"的分布)
这里的推广,更多的是开拓思路,也就是p(x)可以用decoder生成的Gaussian 任意mixture。就如同一堆宝可梦的例子中,我们的P(X)涵盖了所有可能的宝可梦,而不只是所有可能的皮卡丘。

举例理解从AE到VAE

在这里插入图片描述
根据前文,我们知道了AE隐空间的分布是离散的,decoder实际上就是一个 p ( x ∣ m ) p(x|m) p(xm)

在上面图片中,我们在code(隐空间)中取出一个介于满月和圆月的code-x,然后想要送入decoder,可惜,这个decoder并不能把它映射为一个比较”合理“的”3/4月亮“,同时,在Gaussian Mixture后的P(X)中,我们在3/4月亮对应的分布处的概率密度也是几乎为0。这显然不够合理。

于是产生了VAE,通过加入噪音,来使得code-x在圆月样本训练和半月样本训练时都参加,也就是既去拟合圆月的分布,又去拟合半月的分布,最后得到一个”合理“的”3/4月亮“。

这个噪音通常是以原来AE的code为均值,产生一定方差的正态分布。这个分布p(m),也被称为先验分布。他可以是其他分布,但是我们暂且定义为N(μ,Σ)

变分自动编码器Variational Auto-Encoder

VAE的模型

在这里插入图片描述
VAE中,某样本Xi经过encoder产生的是一个隐空间上的正态分布,而不是一个具体的点。
不同于AE的Encoder只产生一个vector,VAE的Encoder产生一个两倍dimension的vector,并将前1/2看做产生的分布的“均值”,后1/2看做产生的分布的“方差的以e为底的对数”。之所以如此,是因为我们希望分布均值为0,方差为1,则ln(e)=0,而神经网络拟合变量趋向于0的能力比拟合到1的能力更稳定。
z ~ N ( m 1 , m 2 , m 3 , e x p ( σ 1 ) , e x p ( σ 2 ) , e x p ( σ 3 ) ) 这里我们定义均值 μ = m ,方差 Σ = e x p ( σ ) z~N(m_1,m_2,m_3,exp(\sigma_1),exp(\sigma_2),exp(\sigma_3))\\这里我们定义均值\mu=m,方差\Sigma=exp(\sigma) zN(m1,m2,m3,exp(σ1),exp(σ2),exp(σ3))这里我们定义均值μ=m,方差Σ=exp(σ)
在这里插入图片描述
如下图,在代码实现上,为了保证没有“梯度断裂”,可以做back propagation,不能产生 μ \mu μ σ \sigma σ后生成高斯分布然后随机sample。而是迂回一下,通过在N(0,I)中采样得到 ϵ \epsilon ϵ,然后 z = ϵ σ + μ z=\epsilon\sigma+\mu z=ϵσ+μ得到sample值,然后放入后面的decoder解码。这样就保证了梯度在反向传播时可以顺畅无阻。
在这里插入图片描述
在李宏毅的PPT中的模型,也是这种思想。

VAE的高斯混合模型

在这里插入图片描述
我们把m换成z,同样表示隐空间的变量。在上述的m分布里,m是一组离散的隐空间取值。z是一个随机向量,每一个维度表示一种特征。我们在其某一维度上映射在图中,方便观察。z的每一维度都是连续型随机变量。z的每一个取值都对应一个Gaussian,所以P(x)是由无数个Gaussian来mix而成。

我们还以二维隐空间为例。
在这里插入图片描述
这样,隐空间中连续分布的p(z),每一个点都会对应一个Gaussian,从而有无穷多个Gaussian。使得decoder可以对隐空间的任意位置(相对AE而言更任意)进行分布映射,生成对应的图片像素分布。将其mixture之后得到了P(X)
P ( x ) = ∫ p ( x ∣ z ) ∗ p ( z ) d z P(x)=∫p(x|z)*p(z)dz P(x)=p(xz)p(z)dz
这样,我们就解决了普通auto-encoder中存在的问题——隐空间中的分布已经变成连续的了。

我们用标准正态分布来定义这个p(z)(其他连续型的先验分布也可以),我们将p(z)称为隐空间的理想分布。

明确p(z)和p(z|x)的区别

  1. p(z)
    p(z)是我们期望的隐空间的分布情况,是一种先验分布,人为定义成正态分布,也可以是其他分布。在AE中,我们隐空间的p(z)是离散型分布【又称之为p(m)】,故经过decoder后在p(x)中不能包含隐空间中每个点的Gaussian,而是只有个别某些可数个点的Gaussian的mixture。所以我们希望隐空间应该是一种连续的分布,并假设二维隐空间上的分布是一个标准正态分布N(0,0,1,1),经过强大的decoder后,每一个Z(x,y)都会映射为一个Gaussian,具体公式上文已经解释过。

  2. p(z|x)
    p(z|x)是我们用encoder根据某个输入x得到的编码分布,是一种后验分布。是根据某一个输入样本,实际产生的在隐空间的分布。也就是根据encoder产生的 μ \mu μ σ \sigma σ得到的分布。

那这个p(z)和我们用encoder产生的p(z|x)有什么关联呢?如何建立一种关联?直观上说,或许p(z|x)应该越趋向于p(z)越好,后面我将用理论推导,证明二者分布应该尽可能相似。

VAE的训练情况

在VAE的训练中,如果我们只关注重构误差(reconstruction error),那么encoder产生的 l o g ( σ ) log(\sigma) log(σ)会逐渐趋于负无穷,即:z的正态分布的方差逐渐趋于0,因为VAE发现noise越小,重构误差就越小。然而这和我们的初心相悖,我们希望encoder产生的是一个有噪音的分布。
在这里插入图片描述
于是,loss中除了重构误差,还有对隐空间变量的限制:
Σ [ ( e x p ( σ i ) − ( 1 + σ i ) + m 2 ) ] \Sigma[(exp(\sigma_i)-(1+\sigma_i)+m^2)] Σ[(exp(σi)(1+σi)+m2)]

旨在让: μ i 趋向于 0 , σ i 趋向于 1 μi趋向于0,σi趋向于1 μi趋向于0,σi趋向于1
即: p ( z ∣ x ) 趋向于 N ( 0 , 1 ) p(z|x)趋向于N(0,1) p(zx)趋向于N(0,1)
而N(0,I)就是我们定义的p(z)。这个loss表明我们在让p(z|x)趋向于p(z),所以为什么loss函数要这么写呢?请看下文。

Loss中对隐空间分布限制的函数的推导

这里的推导源于李宏毅老师课上的讲述,更合理的方案是变分推断,需要了解概率图模型、有参推导等知识,建议查看邱锡鹏老师的《nndl》这本书,如果对于上述数学知识了解不深,可以试着用下面的角度理解。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

谢谢你看到这里,希望点个赞再走哟。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【轩说AI】生成模型(1)——自编码器AE+变分自编码器VAE 的相关文章

随机推荐

  • 汇编指令lmm_动画视频角色的LMM神经网络

    汇编指令lmm Researchers at Ubisoft have proposed an alternative to the Motion Matching algorithm for automated character ani
  • centos7安装配置supervisor保姆教程

    介绍 Supervisor是一个进程管理工具 是由python语言编写 基于linux操作系统的一款服务器管理工具 用以监控服务器的运行 发现问题能立即自动预警及自动重启等功能 是一个客户 服务器系统 服务器端称为supervisord 管
  • chisel相比verilog优势之一:复用特性

    0 绪论 世界由于人这个最大的无厘头变量 还是比技术本身复杂难懂很多 各种技术的兴起与发展总是有其背后的理由的 这篇文章是这个系列的第三篇文章 主要来说明Chisel比Verilog在某些方面具有优势的理由 换句话说 为什么要用Chisel
  • S32DS IDE使用Tips--参考汽车电子expert成长之路

    目录 一 S32DS for Arm PA PEMicro系列调试器包括以下接口类型 1 如何创建在MCU应用工程中添加SDK 2 如何使用SDK的demo工程 3 如何查看SDK外设组件 Component 的帮助文档 4 S32DS 使
  • 网络--TCP/IP

    TCP IP 是供已连接因特网的计算机进行通信的通信协议 在 TCP IP 内部 TCP IP不是一个协议 而是一个协议族的统称 包含一系列用于处理数据通信的协议 TCP 传输控制协议 应用程序之间通信 UDP 用户数据包协议 应用程序之间
  • [软件工程]毕业设计选题软件

    1 分析文档 1 1软件功能概述 本系统由3个功能模块组成 分别是学生功能模块 教师功能模块 教务员功能模块 附加一个独立的高级查询模块 学生功能 l 学生可以在任何能够连接Internet的计算机登录到毕业设计选题系统中 l 学生可以在选
  • HBase分布式架构处理大数据量(高并发和实时处理)

    先来了解下Hadoop的简单原理 一 HDFS主要是用于做什么的 HDFS Hadoop Distributed File System 分布式文件管理系统 是Hadoop项目的核心子项目 是分布式计算中数据存储管理的基础 是基于流数据模式
  • (董付国)Python 学习笔记---Python面向对象程序设计(3)

    6 4 2 案例精选 例6 1 自定义数组 在MyArray py文件中 定义了一个数组类 重写了一部分特殊方法以支持数组之间 数组与整数之间的四则运算以及内积 大小比较 成员测试和元素访问等运算符 class MyArray 在内部封装
  • js-用onclick写的手动轮播图

  • C++调用外部应用程序的方法的整理总结

    一 三个SDK函数 WinExec ShellExecute CreateProcess可以实现调用其他程序的要求 其中以WinExec最为简单 ShellExecute比WinExec灵活一些 CreateProcess最为复杂 WinE
  • NestedScrollView使用和理解

    https www jianshu com p fda06c916d6b 一 前言 NestedScrollView 即 支持嵌套滑动的 ScrollView 因此 我们可以简单的把 NestedScrollView 类比为 ScrollV
  • MyBatis动态SQL 多条件查询(if、where、trim标签)

    一 动态SQL概述 以前在使用JDBC操作数据时 如果查询条件特别多 将条件串联成SQL字符串是一件痛苦的事情 通常的解决方法是写很多的if else条件语句对字符串进行拼接 并确保不能忘了空格或在字段的最后省略逗号 MyBatis使用动态
  • Ubuntu18.04 (腾讯云服务器)安装MySQL 5.7,更改MySQL的root密码、并使其可远程登录的一种配置方式

    一 安装MySQL 首先需要在Ubuntu中安装MySQL 5 7相关命令如下 sudo apt get install mysql server 5 7 二 修改MySQL的root密码 1 登录 sudo mysql 上面这一步也可以使
  • 量子通信(QKD)与BB84协议

    量子密钥分发 QKD Quantum key Distribution QKD是量子信息的一个重要分支 也称为 量子保密通信 一个量子通信的课程推荐给大家 论述的全面 详细 https ke qq com course 382160 一个系
  • c#文件下载示例的4种方法

    原文链接 http www jb51 net article 57068 htm C 实现HTTP下载文件的方法
  • 电脑可以聊微信但是无法上网页的解决方法

    电脑可以聊微信但是无法上网页 ping不通百度的IP地址 一般是电脑的DNS出现错误 解决方案如下 打开360安全卫士 点击功能大全中的断网急救箱 进行扫描 之后进行修复 问题即可解决
  • clickhouse重启报错以及远程无法连接

    1 启动报Processing configuration file etc clickhouse server config xml 文件没有写入权限 先添加写入权限 sudo chmod 600 etc clickhouse serve
  • JVM性能优化之Tomcat服务器参数配置优化

    前言 tomcat 服务器在JavaEE项目中使用率非常高 所以在生产环境对tomcat的优化也变得非常重要了 对于tomcat的优化 主要是从2个方面入手 一是tomcat本身的配置 另一个是tomcat所运行的Jvm虚拟机的调优 优化传
  • Windows XP环境下IPSec 隧道的配置

    前言 这是这学期防火墙课程的一个实验 觉得挺有意义 所以记录在博客里 一 实验目的 本实验主要验证IP通信在建立IPSec隧道前后的变化 为了简化实验过程 这里只对ICMP进行加密 但在配置的过程中即可发现 其他IP协议要进行同样的加密也是
  • 【轩说AI】生成模型(1)——自编码器AE+变分自编码器VAE

    文章目录 生成模型 从概率分布的角度去理解 生成 一张图片 生成宝可梦 生成系列图片 自动编码器Auto Encoder AE的模型及其存在的问题 AE中的高斯混合模型 AE的训练情况 举例理解从AE到VAE 变分自动编码器Variatio