VAE论文阅读

在网上看到的VAE解释,发现有两种版本:

  1. 按照原来论文中的公式纯数学推导,一般都是了解生成问题的人写的,对小白很不友好。
  2. 按照实操版本的,非常简单易懂,比如苏神的。但是却忽略了论文中的公式推导,导致论文中公式一点不懂。

下面是我对VAE的理解:

1 VAE生成模型的数学描述

我们见到的生成模型,一般都有这几个步骤:

  1. 采样一个随机噪声(为啥要随机噪声,因为随机噪声我们是能获得的,调用一个torch.randn()就可以。)
  2. 输入神经网络一通计算
  3. 最后输出了图片。

这个过程应该怎么用数学描述呢?在VAE论文中是这样的:

在这里插入图片描述

作者的意思是整个模型分为两步:

  1. 从一个先验分布中采样一个值z,对应之前的第一步
  2. 从一个后验分布中生成一个值x,对应之前的第二步

模型可以描述为:

p θ ( x ) = ∫ p θ ( z ) p θ ( x ∣ z ) d z p_θ(x) = ∫ p_θ(z)p_θ(x|z) dz pθ(x)=pθ(z)pθ(xz)dz

这里解释几点:

1. 生成模型为什么是一个概率密度呢,我希望直接有表达式,比如采样了一个噪声z,那么图片 X = g(z),这样多好

其实有了概率密度,可以直接在里面采样。这里是推导过程,大家都这么写。在实际操作的时候,所有的p都会变成一个已知的分布,否则无法计算的。比如假如生成模型的表达式是:

p θ ( x ) = 一些公式 p_\theta(x) = 一些公式 pθ(x)=一些公式

这些公式计算后发现是一个高斯分布 N ( μ , σ ) N(\mu, \sigma) N(μ,σ),那么操作的时候可以写为:
x = μ + σ ε x = \mu + \sigma \varepsilon x=μ+σε
其中 ϵ \epsilon ϵ是随机采样的噪声。所以说,两种形式必须都能看懂才行。

2. 上面的式子含义是什么?

上面的式子中: p θ ( x ) p_\theta(x) pθ(x)是x的概率密度,它的含义是生成模型生成了值为x的样本的概率是多少。

PS 本文中所有的概率都应该是概率密度。但是为了便于理解,就当作概率来写了。

式子的右边是一个全概率公式,意思是计算生成样本x的概率,应该根据生成z的概率,和从z中计算出x的概率计算。

上面的式子其实涵盖了采样+通过采样的z计算x的过程。

2 VAE的损失函数

对生成函数建模后 ,下面考虑如何从z中计算x。下面先说明下实际操作是怎样的,然后结合着理解文中的数学公式。

在这里插入图片描述

这里借用了VAE原文中的图。z可以理解为噪声空间,x可以理解为生成的图片空间。这里训练分为两步。

  1. 首先从样本中获得一个值x,然后通过神经网络计算出对应的z的分布(虚线)
  2. 从z的分布中采样出一个z
  3. 根据z重新计算出x(实线)

损失函数包含两项:

  1. 重建的x和原始的x之间的差值
  2. z的分布尽可能接近标准正态,因此使用了z的分布和标准正态的KL散度。

使用2的原因是:最终我们需要从标准正态中采样一个z,而不是从样本中计算z,因此让z的分布接近标准正态是为了采样时效果更好。

以上的过程非常符合直觉,遗憾的是这两项是通过数学推导出来的,VAE背景的论文中都会包含数学推导,看懂数学推导的大概意思是必不可少的。下面是推导过程:

VAE损失函数的数学推导

首先VAE模型的目标是最大化似然函数。这里可以理解为:有一个分布中,参数 θ \theta θ是未知的,但是有一组采样结果 x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn是已知的,似然函数表示了采样出这组结果的概率,但是包含了参数 θ \theta θ。通过最大似然函数可以计算出 θ \theta θ的取值。

似然函数的其他内容可以看这篇文章: 文章地址

这里和我们的情况很像:已有的数据可以看成是从一个分布中采样出来的,我们需要求解的是这个分布的参数。
在我们的问题中似然函数可以表示为:
log ⁡ p θ ( x ( 1 ) , ⋅ ⋅ ⋅ , x ( N ) ) = ∑ i = 1 N log ⁡ p θ ( x ( i ) ) \log p_θ(x^{(1)}, · · · , x^{(N)}) = \sum^N_{i=1} \log p_θ(x^{(i)}) logpθ(x(1),⋅⋅⋅,x(N))=i=1Nlogpθ(x(i))
用更加通俗的话来说就是:模型生成一个数据xi的概率是p(xi), 那么生成出所有数据的概率是p(x1)乘到p(xi)。但是p中有一个参数是未知的,x1到xi是已知的。现在这个参数应该取什么值才能让模型生成出x1到xi的概率最大呢?

求和其实用处不大,下面对某一个数据xi的损失函数进行计算:

log ⁡ p θ ( x ( i ) ) = D K L ( q φ ( z ∣ x ( i ) ) ∣ ∣ p θ ( z ∣ x ( i ) ) ) + L ( θ , φ ; x ( i ) ) \log p_θ(x^{(i)}) = D_{KL}(q_{φ}(z|x^{(i)})||p_{θ}(z|x^{(i)})) + L(θ, φ; x^{(i)}) logpθ(x(i))=DKL(qφ(zx(i))∣∣pθ(zx(i)))+L(θ,φ;x(i))

其中: L ( θ , φ ; x ( i ) ) = E q φ ( z ∣ x ) [ − log ⁡ q φ ( z ∣ x ) + log ⁡ p θ ( x , z ) ] L(θ, φ; x^{(i)}) = E_{q_φ(z|x)} [− \log q_{φ}(z|x) + \log p_θ(x, z)] L(θ,φ;x(i))=Eqφ(zx)[logqφ(zx)+logpθ(x,z)]

上面这串到底怎么来的,本来就一个 p θ p_\theta pθ好好的,怎么多了一个 q ϕ q_{\phi} qϕ??

q ϕ q_{\phi} qϕ其实就是encoder,也就是如何把x反向映射到z上。简单来说,整个VAE的训练过程是:

  1. 在p(z)中采样一个z (采样一个噪声)
  2. 通过 q ϕ ( z ∣ x ) q_{\phi}(z|x) qϕ(zx) 计算出x对应的z
  3. 通过 p θ ( x ∣ z ) p_{\theta}(x|z) pθ(xz) 计算出z对应的x

这里 p ( x ∣ y ) p(x|y) p(xy)有两种理解方式:

  1. 给定y之后x的概率是多少
  2. 给定y之后如何计算x

由于有两个神经网络,所以自然有两个参数。这里p, q其实没什么区别,主要是参数的区别。

OK, 那么上面那个KL散度里面两个分布是怎么回事呢?

其实这个也挺魔幻的,大概就是如果我计算出了 θ \theta θ

  1. p θ ( z ) p_{\theta}(z) pθ(z),和 p θ ( x ∣ z ) p_{\theta}(x|z) pθ(xz)就都是已知的
  2. 那么其实 p θ ( z ∣ x ) p_{\theta}(z|x) pθ(zx)也是已知的 (根据贝叶斯公式)
  3. encoder q ϕ ( z ∣ x ) q_{\phi}(z|x) qϕ(zx) 同时也描述了这个关系。那么这两个关系应该是接近的

换句话说,我知道了噪声z的分布,同时我有一个样本x,那么我有两种方式计算x对应的z。

  1. 神经网络decodeer输入z,输出x,再加上贝叶斯公式就能告诉我们应该如何通过x计算z。
  2. 神经网络encoder输入x,输出z,天然的告诉了我们如何通过x计算z。

这两个过程应该是一致的才行。比如给了一个x, 那么神经网络1+贝叶斯计算的z分布,应该和encoder计算出来的是一样的才行。

好吧,那么似然函数是怎么变成KL散度+ELBO的呢?

推导过程如下:

K L ( q ϕ ( z ∣ x ) ∣ ∣ p θ ( z ∣ x ) ) = ∫ q ϕ ( z ∣ x ) log ⁡ q ϕ ( z ∣ x ) p θ ( z ∣ x ) d z = ∫ q ϕ ( z ∣ x ) log ⁡ q ϕ ( z ∣ x ) d z − ∫ q ϕ ( z ∣ x ) log ⁡ p θ ( z ∣ x ) d z = E q ϕ ( z ∣ x ) [ log ⁡ q ϕ ( z ∣ x ) ] − ∫ q ϕ ( z ∣ x ) log ⁡ p θ ( z , x ) d z + ∫ q ϕ ( z ∣ x ) log ⁡ p θ ( x ) d z = E q ϕ ( z ∣ x ) [ log ⁡ q ϕ ( z ∣ x ) ] − E q ϕ ( z ∣ x ) [ log ⁡ p θ ( z , x ) ] + E q ϕ ( z ∣ x ) log ⁡ p θ ( x ) = − E L B O + log ⁡ p θ ( x ) \begin{split} KL(q_{\phi}(z|x)||p_{\theta}(z|x)) &=\displaystyle\int q_{\phi}(z|x)\log\frac{ q_{\phi}(z|x)}{p_{\theta}(z|x)}dz\\ &=\displaystyle\int q_{\phi}(z|x)\log q_{\phi}(z|x)dz-\int q_{\phi}(z|x)\log p_{\theta}(z|x)dz\\ &=\mathbb{E}_{q_{\phi}(z|x)}[\log q_{\phi}(z|x)]-\int q_{\phi}(z|x)\log p_{\theta}(z,x)dz+\int q_{\phi}(z|x)\log p_{\theta}(x)dz\\ &=\mathbb{E}_{q_{\phi}(z|x)}[\log q_{\phi}(z|x)]-\mathbb{E}_{q_{\phi}(z|x)}[\log p_{\theta}(z,x)]+\mathbb{E}_{q_{\phi}(z|x)}\log p_{\theta}(x)\\ &=-ELBO+\log p_{\theta}(x)\\ \end{split} KL(qϕ(zx)∣∣pθ(zx))=qϕ(zx)logpθ(zx)qϕ(zx)dz=qϕ(zx)logqϕ(zx)dzqϕ(zx)logpθ(zx)dz=Eqϕ(zx)[logqϕ(zx)]qϕ(zx)logpθ(z,x)dz+qϕ(zx)logpθ(x)dz=Eqϕ(zx)[logqϕ(zx)]Eqϕ(zx)[logpθ(z,x)]+Eqϕ(zx)logpθ(x)=ELBO+logpθ(x)

经过变换就可以获得似然函数如何表示为KL散度+ELBO的了。

VAE损失函数的数学推导(续)

重写表示了似然函数之后,其实只需要关心ELBO即可,因为KL散度是恒大于0,并且非常难计算,因此最大化似然函数,其实是最大化ELBO罢了。

下面重新改下ELBO:

E L B O = − E q ϕ ( z ∣ x ) [ log ⁡ q ϕ ( z ∣ x i ) ] + E q ϕ ( z ∣ x ) [ log ⁡ p θ ( z , x i ) ] = − E q ϕ ( z ∣ x ) [ log ⁡ q ϕ ( z ∣ x i ) ] + E q ϕ ( z ∣ x ) [ log ⁡ p θ ( z ) p θ ( x i ∣ z ) ] = − E q ϕ ( z ∣ x ) [ log ⁡ q ϕ ( z ∣ x i ) ] + E q ϕ ( z ∣ x ) [ log ⁡ p ( z ) ] + E q ϕ ( z ∣ x ) [ log ⁡ p θ ( x i ∣ z ) ] = − K L ( q ϕ ( z ∣ x i ) ∣ ∣ p ( z ) ) + E q ϕ ( z ∣ x ) [ log ⁡ p θ ( x i ∣ z ) ] \begin{array}{rl} ELBO &= -\mathbb{E}_{q_{\phi}(z|x)}[\log q_{\phi}(z|x_i)]+\mathbb{E}_{q_{\phi}(z|x)}[\log p_{\theta}(z,x_i)]\\ &=-\mathbb{E}_{q_{\phi}(z|x)}[\log q_{\phi}(z|x_i)]+\mathbb{E}_{q_{\phi}(z|x)}[\log p_{\theta}(z)p_{\theta}(x_i|z)]\\ &=-\mathbb{E}_{q_{\phi}(z|x)}[\log q_{\phi}(z|x_i)]+\mathbb{E}_{q_{\phi}(z|x)}[\log p(z)]+\mathbb{E}_{q_{\phi}(z|x)}[\log p_{\theta}(x_i|z)]\\ &=-KL(q_{\phi}(z|x_i)||p(z))+\mathbb{E}_{q_{\phi}(z|x)}[\log p_{\theta}(x_i|z)] \end{array} ELBO=Eqϕ(zx)[logqϕ(zxi)]+Eqϕ(zx)[logpθ(z,xi)]=Eqϕ(zx)[logqϕ(zxi)]+Eqϕ(zx)[logpθ(z)pθ(xiz)]=Eqϕ(zx)[logqϕ(zxi)]+Eqϕ(zx)[logp(z)]+Eqϕ(zx)[logpθ(xiz)]=KL(qϕ(zxi)∣∣p(z))+Eqϕ(zx)[logpθ(xiz)]

可以看出新的ELBO具有两部分,

  1. 后面一部分可以看作从 x -> q -> z -> x 的过程(这是因为z符合的是q的分布),似然函数需要最大。因此我们最小化了重构损失,这和目标1是一致的。
  2. 前面一部分可以看作是encoder生成的z必须和z的原始分布相近,在实际中就是encoder通过x计算出的z必须符合正态分布。和我们之前的目标2是一致的

通过不断努力,我们终于从直觉上以及数学上解释了VAE的损失函数构成!

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

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

相关文章

信创学习笔记(四),信创之数据库DB思维导图

创作不易 只因热爱!! 热衷分享,一起成长! “你的鼓励就是我努力付出的动力” 一. 信创学习回顾 1.信创内容 信创内容思维导图 2.信创之CPU芯片架构 信创之CPU芯片架构思维导图 3.信创之操作系统OS 信创之操作系统OS思维导图 二. 信创之国产数据库DB思维导图 …

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(四)-无人机系统(UAS)命令与控制(C2)通信用例

引言 本文是3GPP TR 22.829 V17.1.0技术报告,专注于无人机(UAV)在3GPP系统中的增强支持。文章提出了多个无人机应用场景,分析了相应的能力要求,并建议了新的服务级别要求和关键性能指标(KPIs)。…

对某根域的一次渗透测试

前言 两个月之前的一个渗透测试项目是基于某网站根域进行渗透测试,发现该项目其实挺好搞的,就纯粹的没有任何防御措施与安全意识所以该项目完成的挺快,但是并没有完成的很好,因为有好几处文件上传没有绕过(虽然从一个…

Datawhale AI 夏令营 deepfake图像识别-Task02打卡

数据中存在正负类不平衡问题,目前采用直接每次随机抽取和负类数量相同的正类作为训练集。为了更随机,应该每次都随机选取1:1的正负类,然后加大训练量?目前更换了更好的基础模型,还在跑

Vue3项目基于Axios封装request请求

在 Vue 3 的项目开发中,使用 Axios 进行 HTTP 请求是非常常见的作法,为了更方便开发者更高效的进行代码编写和项目的维护,可以通过再次封装 Axios 来实现。 在本文中,博主将详细指导你如何在自己的 Vue 3 项目中使用 Axios 二次封…

浅谈Git

一:什么是 git git一种开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 下图是 git 的一个工作流程简图 二:什么是 分布/集中式版本控制系统 软件开发过程中,要解决多人协作的问题,需要…

Java之split 方法

方法的工作原理 split 方法首先检查字符串中是否存在指定的分隔符。如果存在,它会在每个分隔符处切割字符串,生成一个新的字符串数组。如果字符串中没有指定的分隔符,或者分隔符是非空字符但在字符串中不存在,则 split 方法会返回…

基于LSTM及其变体的回归预测

1 所用模型 代码中用到了以下模型: 1. LSTM(Long Short-Term Memory):长短时记忆网络,是一种特殊的RNN(循环神经网络),能够解决传统RNN在处理长序列时出现的梯度消失或爆炸的问题。L…

挂耳式蓝牙耳机什么牌子好?这五款综合表现遥遥领先

为什么这几年开放式耳机受到了越来越多消费者的喜爱?我想是因为它全方位的弥补了入耳式耳机堵塞耳朵、不够安全健康的缺陷,真正做到了安全性与舒适性兼得。那么刚入坑开放式耳机的小白该如何挑选一款品质较高的开放式耳机呢?挂耳式蓝牙耳机什…

2024年公路水运工程施工企业安全生产管理人员证模拟考试题库及公路水运工程施工企业安全生产管理人员理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年公路水运工程施工企业安全生产管理人员证模拟考试题库及公路水运工程施工企业安全生产管理人员理论考试试题是由安全生产模拟考试一点通提供,公路水运工程施工企业安全生产管理人员证模拟考试题库是…

模块化和包管理工具

一,模块化 1.定义 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用 2.模块化…

博客最细 STM32CubeProgrammer 使用教程(学不会来找我)

前言:编写不易,仅供参考学习,请勿搬运 文章相关介绍 本篇主要是介绍 STM32CubeProgrammer 烧录软件的使用过程,随着ST开发生态已经完成闭环,(STM32CubleMX配置代码 STM32IDE写代码 STM32CubeProgramm…

【时时三省】tessy 集成测试:小白入门指导手册

目录 1,创建集成测试模块且分析源文件 2,设置测试环境 3,TIE界面设置相关函数 4,SCE界面增加用例 5,编辑数据 6,用例所对应的测试函数序列 7,添加 work task 函数 8,为测试场景添加函数 9,为函数赋值 10,编辑时间序列的数值 11,执行用例 12,其他注意事项…

C++的链接指示extern “C“

目录 链接指示extern "C"A.What(概念)B.Why(extern "C"的作用)C.How (如何使用链接指示extern "C") 链接指示extern “C” A.What(概念) extern&quo…

Python每日一题:回文数

题干 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文&#xff0…

各种机器学习模型

一、监督学习 线性回归(Linear Regression) 多项式回归(Polynomial Regression) 岭回归(Ridge Regression) Lasso回归(Lasso Regression) 弹性网络回归(Elastic Net Reg…

AI基于大模型语言存在的网络安全风险

目的: 随着大语言模型(LLM)各领域的广泛应用,我们迫切需要了解其中潜在的风险和威胁,及时进行有效的防御。 申明: AI技术的普及正当的使用大模型技术带来的便利,切勿使用与非法用途&#xff…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【获取密钥属性(ArkTS)】

获取密钥属性(ArkTS) HUKS提供了接口供业务获取指定密钥的相关属性。在获取指定密钥属性前,需要确保已在HUKS中生成或导入持久化存储的密钥。 开发步骤 指定待查询的密钥别名keyAlias,密钥别名最大长度为64字节。调用接口[getKeyItemProperties]&…

MongoDB教程(七):mongoDB分片

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言MongoDB 分…

书生大模型第三关-Git基础

1.任务1: 破冰活动:自我介绍 目标: 每位参与者提交一份自我介绍。 提交地址:https://github.com/InternLM/Tutorial 的 camp3 分支~ 行动: 首先Fork项目到自己Repo中,然后git clone在本地上 然后创建一个…