理解VAE,可视化

引言

本文主要摘抄自:Understanding Variational Autoencoders (VAEs), Joseph Rocca, Sep 24, 2019,同时会加一些自己的理解和对原文的解释。
关于数据生成,目前深度生成模型中主流的有:

  • 生成对抗网络——GANs,这是老牌了,研究的已经非常成熟。
  • 变分自编码器——VAEs,主在图像生成的时候主要用于风格转换。
  • Transformer,主要用于自然语言处理。
  • Diffusion Models,扩散模型,听说吊打GANs在图像生成领域。

本文的重点主要是介绍VAE的思想和一些相关的基础概念,在写这篇博客的时候同时也去加深自己的理解,希望能够帮助到有需要的人。简而言之,VAE是一种自动编码器,其编码分布在训练过程中被正则化,以确保其潜在空间具有良好的特性,从而使我们能够生成一些新数据。此外,“变分”一词来源于正则化与统计中的变分推断方法之间的密切关系。听不懂这些没关系,我们慢慢来,同时在阅读这篇文章的时候相信你是有一些深度学习基础的,否则你也不可能浏览这个知识点,所以默认你有一些基础知识,那我们开始吧。

什么是降维

我们首先了解一下降维的概念。在机器学习中,降维就是减少描述某些数据的特征数量。这个减少的过程要么就是"selection"——只有一部分已存在的特征被保留下来),要么就是"extraction"——从原有的特征中生成数量较少的新特征。

比如我们有一个包含许多狗狗的健康信息的数据集,其中每个狗狗都有很多特征,如年龄、体重、饮食习惯、运动量、心率、血压、毛色、单双眼皮等。每个狗狗的这些因素都可以看作是判断狗狗是否健康的一个特征。但是特征维度太多,直接分析会需要很多的计算资源,并且许多特征并不能反应狗狗的健康状态,比如“毛色”这是狗狗生来具有的,所以我们从中提取能够更直观或有效反应健康状态的特征,这就是降维。

首先,我们将从旧特征”产生“新特征”的过程称作编码(encoder),解码(decoder)是这一过程的反过程。降维相当于是数据的压缩,encoder 压缩数据(是从原始特征空间到编码空间的过程,也叫隐空间 latent space),decoder 解压。而隐空间的维度是低于原始空间的,这个压缩过程是有损的,也就意味着一部分信息在 encoding 过程中会丢失, 过程无法还原这些特征。过程如图1所示,X=d(e(x))是一种非常理想的数据编码解码过程,怎么说呢有点像你平时给一些文件打成压缩包,占用的存储空间变小了,然后解压的时候也能够原原本本的还原数据。 不过在VAE的应用场景中,这种情况很难实现,大多情况还是第二种x≠d(e(x))。
降维的过程

图1.降维的过程
其实降维的目的无非不是找到一组最佳的encoder,decoder,即能够保留最多信息的 encoder 和能产生最少重建误差(reconstruction error)的 decoder。

主成成分分析(Principal components analysis,PCA)

一说到降维,第一个想到的应该就是 PCA 了,我们简要回顾下 PCA。PCA通过以线性组合的方式,从 n d n_d nd个原始特征,构建 n e n_e ne 个相互独立的新特征,让原始数据在子空间上的映射与原始数据之间尽可能接近。可以通过图2来了解这个过程
在这里插入图片描述

图2.PCA降维的过程

首先原始数据集有A到E五个点在平面上,表示这些点的位置需要一个坐标(x,y),也就是每一个点都需要至少两个维度表示,即2个数值,5个点需要10个数值。如果我们将其映射到一条直线上(图中的黑线),即过点做黑线的垂线,交点就是映射的位置。经过这样的映射,表示这些点,我只需要给出这些点到原点(0,0)的长度即可,也就是图右侧表格中的Encoded列,这样表示这5个点只需要5个数值即可,相比原来的10个数值特征数量减少了一半。当然这个压缩过程是有损的,在decoding的时候无法准确的还原,图中黑色虚线长度就形象的表示了数据丢失的程度,长度越短丢失的信息越少。(吐槽,这条线的划分看着有点像SVM)

自编码器Autoencoders

autoencoders就是神经网络降低维度的手段,其整体思路非常简单,将encoder和decoder设置为神经网络即可,通过迭代优化来学习最佳的encoding-decoding组合。可以这么理解:给定一个RGB图片形状为(255,255,3),通过encoder这个图片变成了(25,25,1),通过decoder变成了(255,255,3),只需要计算最开始的图像矩阵和最终decoder生成的图像矩阵之间的loss,随后反向传播即可,这个过程就是网络学习图片本身的特征,encoder的(25,25,1)就是网络学习到的特征表示。
autoencoder

图3. autoencoder

可知,网络结构越复杂,autoencoder 越可以降低更多的维度,同时保持较低的重构损失。 直观地讲,如果我们的 encoder 和 decoder 具有足够的自由度,则可以将任何初始维数减小为 1。也确实,具有“无限能力”的 encoder 理论上可以将我们的 N 个初始数据编码为1、2、3,……N 个,并且对应的 decoder 也可以进行逆变换,而在此过程中不会造成任何损失。

但是,在我们应该注意两点。 首先,没有重建损失的降维通常要付出代价:隐空间中缺乏可解释和可利用的结构(缺乏正则化),其次,在大多数情况下,降维的最终目的不仅仅是减少数据的维数,而且要在减少维数的同时将数据结构信息的主要部分保留在简化的表征中。 由于这两个原因,必须根据降维的最终目的来仔细控制和调整隐空间的尺寸和 autoencoder 的“深度”(压缩的程度和质量)。
在这里插入图片描述

图3.不同降维程度损失的信息

怎么理解没有重建损失的降维通常要付出代价:隐空间中缺乏可解释和可利用的结构(缺乏正则化),观察图4如果我们将原始的数据压缩到只有一个维度,是否有”生命“即左边的部分。但是这样我们会丢失很多信息,比如是否有轮子,是否会飞,是否会发出声音。这样压缩过后的数据很难将其利用起来,或者说利用价值不大。比如在图像生成领域,如果压缩的过厉害像左边的部分一样,我想生成风格不同的车,可能给我生成了一个石头,因为同样是没有生命的,这当然是理想情况讨论了,现实中压缩这么极端的模型生成的数据可能就跟你家电视收不到信号时满屏的噪声点一样。如果退而求其次,压缩成右边的部分那么就可以保留更多的信息,使得隐空间所表达的信息更有意义,具有可解释性。

Autoencoders 在样本生成中的限制

我们考虑一个极端的情况,有一种强大的 autoencoders,强大到可以将任何 N 个初始训练数据映射到实数轴上(每个数据点都被编码为实数值),并且可以没有任何重建损失地 decode。在这种情况下,autoencoders 可以在没有信息损失的情况下进行 encode 和 decode(尽管隐空间的维数较低),这样会导致严重的过拟合,意味着一旦 decode,隐空间的某些点将给出无意义的内容。
在这里插入图片描述

图4.不规则的潜空间阻止我们使用自动编码器来生成新内容。

通过图4我们可以更直观的理解,正方形、圆形、三角形被编码到了实数轴上可以无损的被decoder还原出来,这很好。但是其它的点在被decoding后就变成了一些没有意义的点,这样的数据对我们来说没有意义是我们不想看到的。

我们要明确一点就是,encoder是将原来的高纬度数据比如可能是(x,y,z)三维空间的数据,映射到一个低纬度空间比如可能是实数轴一样的一个一维空间。这个一维空间有无数种表示(实数轴上有无数个数值),原来的高维数据是有限的只能映射到一部分的实数上面,那么其它的数字对于decoder来说就是没有意义的,在数据生成这个角度来说就是败笔,因为没有办法生成新的数据,你给什么数据我只能还原他,相当于就是一个压缩功能。我们想要的是你能够压缩,同时也能够生成的模型。

variational autoencoders

这时我们不妨换个思路,把映射到某个具体的点改为映射成某个分布,这样是不是就保证每个点都是有意义的,一个分布中有无数的数值,那么是不是就可以用有限的数据生成无限的数据,并且生成的数据与原来的类似,不会生成一些没有意义数据。(把这句话的数据改为图像,理解起来或许可以更形象一些)这其实就是变分自编码器的思想。

如何形象或者说更具体的理解这一过程呢——“将输入的数据 encode 为具有一定方差而不是单个点的分布”

在传统的神经网络中,输入数据通常被映射到一个确定性的输出,也就是说,给定相同的输入,神经网络总是产生相同的输出。而在变分自编码器中,我们希望将输入数据映射到一个潜在空间中的分布,而不是一个确定的点。因此,编码器的输出并不是一个具体的值,而是一个概率分布。假设潜在空间是一个二维的高斯分布,具有均值向量 μ μ μ和方差向量 σ 2 σ^2 σ2。编码器的输出将是这两个向量,表示了给定输入图像后,潜在空间中高斯分布的参数。例如,如果我们用 μ=[-0.5, 0.3] 和 σ^2=[0.1, 0.2] 来表示某个手写数字的编码器输出,这意味着编码器认为给定的输入图像对应的潜在表示的均值大概位于 (-0.5, 0.3),并且具有一定的方差,使得在这个位置周围有一定的分布。

思路其实和之前的映射一样,将每一个输入映射到不同的潜在分布。 好多人在这个地方理解的时候搞混了,人为输入图像都是映射到一个潜在分布里面的不同点,这是不对的。如果还是映射成点的话和之前映射到实数轴上就是同一个道理了。

注意: 每个输入图像的潜在分布通常都是不同的。这是因为每个输入图像在潜在空间中都有其自己的表示,因此对应的潜在分布也会不同。换句话说,不同的输入图像会被映射到潜在空间中不同的区域,因此它们对应的概率分布会有所不同。
在训练过程中,VAE会尝试学习如何将输入数据映射到潜在空间中的合适位置(也就是映射成某个分布),以便在潜在空间中能够更好地捕捉到数据的分布。因此,尽管每个输入图像的潜在分布都是不同的,但我们希望这些分布能够相互重叠(注意重叠不是重合),从而使得潜在空间中的相似图像对应的概率分布也是相似的,这有助于模型生成具有一定连续性的新样本。

在这里插入图片描述

图5. autoencoder与VAE之间的差异

可从图5观察到autoender与VAE之间的差异,autoencoder是将输入数据映射成一个特定的点,不同的是VAE将输入数据映射到潜在空间(也就是低维空间,这样好理解)的一个分布,随后在这个对应的分布里面采样将其decoding成重建数据。

VAE的主要过程主要分为一下四个步骤:

1. 将输入 encode 为在隐空间上的分布
2. 从该分布中采样隐空间中的一个点
3. 对采样点进行 decode 并计算出重建误差
4. 重建误差通过网络反向传播

在实际应用中,我们会选择正态分布作为 encoder 的分布,以便可以训练 encoder 返回描述这些高斯分布的均值和方差。(为什么用高斯分布?因为方便啊,你也可以映射成其它的分布,但是计算可能麻烦或者不便于表达,现实中很多的事物都符合高斯分布这也是一个理由,高斯分布在很多场景都得到应用)值得关注的是VAE的loss是什么,autoencoder的loss很好理解,只要计算decoding后的数据与原始数据之间的差异即可。但是VAE不可以,如果这样会造成过拟合无法生成新的数据,所以要加入正则化,也就是不要拟合的那么彻底,需要有一些误差。
在这里插入图片描述

图6. 在 VAE 中,损失函数由两项组成

第一项很明显就是希望重构后的数据和原始的数据尽可能的有一些相似,称作“重构项”。第二项希望映射到潜在空间的分布尽可能的接近正态分布,也就是将隐空间的正则化,不要映射成一个点,称作“正则化项”。第二项的是KL散度,用于描述两个分布近似程度的指标,取值为 [ 0 , ∞ ] [0,\infty] [0,],取值为0的时候两个分布相同。

潜在空间是否正则化有哪些影响呢,可以从下图直观的去感受这一不同。
在这里插入图片描述

图7.潜在空间是否正则化的不同

没有正则化的潜在空间,距离相近的点代表的意思可能完全不同,如左边部分,红色代表三角形,绿色代表正方形,这样差异很大不说,一些其他没有被编码到的点会被decoder解码成没有意义的数据。相反正则化之后,在潜在空间距离相近的点或者说在潜在空间中相似的分布被解码之后也应该具有一定的相似性。这样的隐空间比较好,所有的点我们都可以拿来生成数据,这是一个具有良好性质的潜在空间。

至此,VAE大概就这些内容,本文所说的都是形象的理解不涉及到复杂的数学公式,另外我感觉原文写的数学推理也不是很好连贯性不够,挖个坑到时候自己重新排版一下。以上内容主要还是以理解为主,准备过段时间上推理。

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

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

相关文章

leetcode 双指针 滑动窗口 求解 移动零问题

错误示范 # 1. 移动零 nums [0, 1, 0, 3, 12] # left 0 # right len(nums) 1for i in range(len(nums) 1):nums_index nums[i]if nums_index 0:nums.pop(i)print(nums)修改列表时遍历:在遍历列表的同时修改列表(如删除元素)会导致问题…

蓝桥杯第十三届--李白打酒加强版

题目描述 话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒 2 斗。他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路上&#xff0c…

超市销售数据-python数据分析项目

Python数据分析项目-基于Python的销售数据分析项目 文章目录 Python数据分析项目-基于Python的销售数据分析项目项目介绍数据分析结果导出数据查阅 数据分析内容哪些类别比较畅销?哪些商品比较畅销?不同门店的销售额占比哪个时间段是超市的客流高封期?查看源数据类型计算本月…

QT 实现无边框可伸缩变换有阴影的QDialog弹窗

实现无标题栏窗口的拖拽移动、调节窗口大小以及边框阴影效果。初始化时进行位或操作,将这些标志合并为一个值,并将其设置为窗口的标志。这些标志分别表示这是一个对话框、无边框窗口、有标题栏、有最小化按钮和最大化按钮。 setWindowFlags(Qt::Dialog |…

Java(内部类)

1.内部类 内的五大成员:属性、方法、构造方法、代码块、内部类 解释:在一个类的里面,再定义一个类。举例:在A类的内部定义B类,B类就被称为内部类注意:内部类表示的事物是外部类的一部分,内部类单独出现没…

Digi XBee RF 模块型号说明

目录 Digi XBee 射频模块 2.4 GHz 射频模块: 1.Digi XBee3系列: XB3-24Z8RM-J 2. Digi XBee S2C系列: XBP24CZ7UIS-005 低于 1 GHz 射频模块 1. Digi XBee 900 和 868 MHz 模块: XBP9X-DMUS-021 2. Digi XTend vB 模块…

MCU配置的1106模块与1102模块功能差异分析

在现代工业自动化和智能控制领域,微控制器(MCU)扮演着至关重要的角色。而在MCU的配置中,选择适合的传感器采集模块是确保数据采集准确性和多样性的关键。其中,1106模块和1102模块作为两种常见的采集模块,各自具有独特的功能特点和…

SQLAlchemy 来查询并统计 MySQL 中 JSON 字段的一个值

在使用 SQLAlchemy 来查询并统计 MySQL 中 JSON 字段的一个值时,你可以结合 SQLAlchemy 的 func 模块来实现 SQL 函数的调用,比如 JSON_EXTRACT,并使用 group_by 和 count 方法来进行分组统计。下面是如何在 SQLAlchemy 中实现这一点的基本步…

sdrangel使用说明

使用说明 首先找一个usrp设备,我找到的是b205进行连接。打开生成的sdrangel.exe,第一次打开会出现空白界面 点击Add Rx Device按钮。 然后会弹出一个设备刷新窗口,选择你需要的设备 点击OK后,会响应一段时间,然后弹…

孙崧-回归祖国的数学天才谈国外学习研究感受

孙崧,这位37岁的美国加州大学伯克利分校数学系教授,今年正式回归祖国,担任浙江大学数学高等研究院杜建英讲席教授、博士生导师。在此,知识人网小编就经历过国外就读、从事博士后研究及任教的这位数学天才是怎么说的,或…

【三十二】【算法分析与设计】深搜(2),98。 验证二叉搜索树,不同方式定义递归函数,230。 二叉搜索树中第 K 小的元素,257。 二叉树的所有路径

98. 验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左 子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。…

小程序 两页面间数据传递

页面1 页面2 实现效果&#xff1a;点击页面1 可以直接跳进页面2 实现过程&#xff1a; xhtml <view class"rank" wx:for"{{rankList}}" data-ids"{{item.id}}" data-names"{{item.name}}" data-description"{{item.descri…

C++ 11 初始化对象

1 概述 在C11中&#xff0c;可以使用多种方式来初始化对象。以下是一些常见的初始化方法&#xff1a; 2 列表初始化&#xff08;Uniform Initialization&#xff09; int a{10}; // 列表初始化一个整数 int b {10}; // 同样的&#xff0c;这也是列表初始化std::string str{…

行测——言语分析

行测——言语分析 1. 全文概括题1.1 做题思路1.2 例子1.2.1 概括内容1.2.2 标题类 2.中心理解题2.1 做题思路2.2 例子2.2.1 关键词清晰2.2.2 关键词不清晰 3. 逻辑顺序题3.1 做题思路3.2 例子3.2.1 划线部分填什么句子3.2.2 句子排序3.2.3 下一段讲什么3.2.4 细节分析题 4. 逻辑…

【C/C++】BST树的后序遍历

题目描述&#xff1a; 给定一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true&#xff0c;否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树&#xff1a; 5 / \ 2 6 / \ 1 3 示例…

IPKISS ------ 导入 Lumerical S-matrix 仿真结果

IPKISS ------ 导入 Lumerical S-matrix 仿真结果 引言引言 这里给大家介绍一下如何使用 IPKISS 导入 Lumerical 中器件 S Matrix 的仿真结果。 import ipkiss3.all as i3 import matplotlib.pyplot as plt import numpy as nps_matrix = i3.device_sim.satrix1swep.from_tou…

[ RV1108_LINUX] 关于如何调整cpu中vdd_core的电压

问题描述 通过rv1108.dtsi调整其中dvfs节点下pd_core和pd_ddr对应频率的电压。发现修改后电压并没有改变&#xff0c;一直为11.25v。尝试了将pd_core下的operating-points中的1008000 1150000修改为1008000 1200000&#xff0c;也无作用。将operating-points中频率是留一个&am…

49. QT中的HTTP通信与JSON数据格式解析

1. 说明 最近参考B站以为博主的视频视频链接学习了一些在QT当中利用HTTP访问网页数据的相关知识,在此记录一下。在访问网页的时候主要用到的接口类包括:QNetworkAccessManager、QNetworkReply、QNetworkRequest,因为大部分网页数据都是以 JSON 格式保存的,所以在获取到网页…

Spring Boot Actuator

概述 Spring Boot Actuator是Spring Boot的一个功能模块&#xff0c;用于提供生产环境中常见的监控和管理功能。它提供了各种端点&#xff08;endpoints&#xff09;&#xff0c;可以用于监视应用程序的运行状况、收集应用程序的指标数据以及与应用程序进行交互。 以下是Spri…

Oracle基础-PL/SQL编程 备份

1、PL/SQL简介 PL/SQL块结构 约定&#xff1a;为了方便&#xff0c;本文后面把PL/SQL简称PL。 PL程序都是以块&#xff08;BLOCK&#xff09;为基本单位&#xff0c;整个PL块分三部分&#xff1a;声明部分&#xff08;使用DECLARE开头&#xff09;、执行部分(以BEGIN开头)和异…