图像生成-VAE(变分自编码器)详解

生成模型-VAE学习笔记

目录

前言

一、基本概念

二、AutoEncoder--自编码器

2.1 简介

2.2 AE 算法描述

2.3 AE的局限性

三、Variational AutoEncoder--变分自编码器

3.1 VAE简介

3.2 Variational Inference--变分推理推导

参考文章:



前言

图像生成一直是计算机视觉中的热门研究领域,生成模型从PixelRNN/CNN,到VAE,到GAN,到现在很火的diffusion model。生成任务的目的探究训练集的数据分布规律(训练得到模型),并能够生成与训练集数据分布相近的数据(生成任务)。

本文主要是介绍VAE(变分自编码器)的生成原理。

变分自编码器(VAE)是在自编码器(AE,AutoEncoder)的基础上加上变分推断(V,Varaitional Inference)的深度生成模型。

而自编码器(AE)是一种无监督的特征学习器,通过训练得到AE能够提取能够代表数据的显著特征,达到降维的目的,是一种有效的embedding方法。

以下将从基本概念,AE,VAE三个方面逐步讲解。


一、基本概念

1. 先验概率和后验概率

       先验概率是知道原因,求结果,对时间发生前的预判概率。比如下雨会导致摔跤。今天下雨,那摔跤的概率为10%。在这里摔跤的概率就是先验概率,是基于数据统计或者主观给出的,一般是单独事件概率。

        后验概率是某个时间发生了,求影响这个时间发生由某个因素引起的可能性大小,即知道结果,求原因的概率,举个例子,就是今天摔跤了,那么今天下雨的概率是多少。P(下雨|摔跤)就是后验概率。一般来说,后验概率是通过贝叶斯公式对先验概率进行修正而获得的概率。另一方面,通过似然函数也可以计算后验概率。

1.概率、似然、最大似然估计

概率:已知原因(theta),推测某个结果发生的概率p。

        例如,在抛硬币游戏中,已知得到正面的概率为0.6,那么抛10次硬币6正4反的概率是多少?  在这个问题中,0.6就是theta,6正4反就是结果,已知theta求结果发生的概率p,这就是概率。举例如图

似然:已知结果,反推原因(theta)。

        现在theta是未知的,我们需要根据已知的结果,去反推原因。例如,在抛硬硬币游戏中,我们现在抛了10次,得到了6正4反的结果,为什么会发生这个结果呢,为什么不是10正0反,5正5反,我们需要探究原因(theta)。似然函数L(Likelihood)--结果发生的可能性,如下

        看起来似乎和概率P差不多,虽然形式一致,但是此时的theta是未知的,是一个变量。它描述观察到的真实数据在不同参数下发生的概率,即结果在不同原因下的发生概率。

        而最大似然估计,就是对该似然函数L(结果可能性)最大化,寻找最优参数theta。换而言之,就是找到一原因,使得该时间最有可能发生。

2.latent variable--隐变量

隐变量是指模型从观测数据中推断出来的变量。

        在AE和VAE中,指编码器(NN Encoder)从对输入input进行编码后的结果(也就是提取到的重要特征),后面用z表示。

3.泛函数

泛函数是一个输入为函数,输出为数值的函数。

eg.

        在上面的式子中, L便是一个泛函。其中被积函数 1+(y′)2 我们称为Lagrange Function,即拉格朗日函数 F。

5. KL divergence--KL散度

又称为KL距离或相对熵,用于衡量两个概率分布之间的距离。

(1)给定真实分布 P(x) 和理论分布 Q(x) ,我们将它们之间的KL散度公式定义为:

KL(P||Q)=\sigma P(x)log\frac{P(x)}{Q(x)}=\int{P(x)log\frac{P(x)}{Q(x)}dx}

(2)KL散度的一些性质:

         KL散度是不对称的:因为P到Q的距离不等于Q到P的距离,即KL(P||Q)≠KL(Q||P)。这很容易造成model collapse即模式坍缩——模型倾向于生成一些比较容易骗过判别器的样本,加快模型的收敛,从而导致生成的多样性变差,生成出来的效果也比较差,相当于走捷径。
        当且仅当两个分布完全一致时,KL散度等于0。

二、AutoEncoder--自编码器

2.1 简介

VAE是AE的变种,在介绍VAE之前,先介绍AE。

AE,自编码器,它通过无监督的训练方式,能够从原始特征获得一个潜在的特征编码,实现了自动化的特征工程,并且达到了降维和泛化的目的。

它的网络结构很简单,有编码和解码两个部分组成,如图所示。

(1)Encoder负责将输入数据进行压缩,将n维输入数据通过Hidden layer压缩成m维的数据(m << n),即通过编码器学习一组参数,得到一个latent variable z;

(2)Decoder负责重构数据,在需要用到的时候尽可能地以损失最小的方式恢复原始数据。

2.2 AE 算法描述

工作流程:输入x通过Encoder网络将其编码为z,Decoder在根据z进行重构,将重构的数据与输入进行对比计算loss,根据loss进行BP进一步优化网络,致力于让输出与输入越接近越好,那么说明latent variable z的表征效果很nice。

        容易看出,之所以是自监督就是因为网络的target即是input本身,因此不需要额外的标签工作。虽然它由编码器和解码器两个部分组成,但是,显然从自编码器这个名字就可以看出,AE的重点在于编码,即得到这个隐藏层的向量,作为input的潜在特征,这是常见的一种embedding的一种方式。

        而解码的结果,基于训练目标,如果损失足够小的话,将会与input相同,从这一点上看解码的值没有任何实际意义,除了通过增加误差来补充平滑一些初始的零值或有些许用处。因为,从输入到输出的整个过程,都是基于已有的训练数据的映射,尽管隐藏层的维度通常比输入层小很多,但隐藏层的概率分布依然只取决于训练数据的分布,这就导致隐藏状态空间的分布并不是连续的,于是如果我们随机生成隐藏层的状态,那么它经过解码将很可能不再具备输入特征的特点,因此想通过解码器来生成数据就有点强模型所难了。

2.3 AE的局限性

AE的解码器似乎能够根据z生成图片,但是AE并不是真正意义上的生成模型。

        以下摘自参考文献书目二。

对于一个特定的生成模型,它一般应该满足以下两点:

(1)编码器和解码器是可以独立拆分的(类比GAN的Generator和Discriminator);

(2)固定维度下任意采样出来的编码,都应该能通过解码器产生一张清晰且真实的图片。

        这里解释下第二点。如下图所示,我们用一张全月图和一张半月图去训练一个AE,经过训练,模型能够很好地还原出这两张图片。接下来,我们在latent code上中间一点,即两张图片编码点中间处任取一点,将这点交给解码器进行解码,直觉上我们会得到一张介于全月图和半月图之间的图片(比如阴影面积覆盖3/4的样子)。然而,实际当你那这个点去decode的时候你会发现AE还原出来的图片不仅模糊而且还是乱码的。

        为什么会出现这种现象?一个直观上的解释是AE的Encoder和Decoder都使用了DNN(深层神经网络),DNN是一个非线性的变换过程,因此在latent space上点与点之间transform往往没有规律可循。

        如何解决这个问题呢?一个思想就是引入噪声,扩大图片的编码区域,从而能够覆盖到失真的空白编码区。其实说白了就是通过增加输入的多样性从而增强输出的鲁棒性。当我们给输入图片进行编码之前引入一点噪声,使得每张图片的编码点出现在绿色箭头范围内,这样一来所得到的latent space就能覆盖到更多的编码点。此时我们再从中间点抽取去还原便可以得到一个我们比较希望得到的输出,如下所示:

        虽然我们为输入图片增添了一些噪声使得latent space能够覆盖到比较多的区域,但是还是有不少地方没有被覆盖到,比如上图右边黄色的部分因为离得比较远所以就没编码到。因此,我们是不是可以尝试利用更多的噪音,使得对于每一个输入样本,它的编码都能够覆盖到整个编码空间?只不过这里我们需要保证的是,对于源编码附近的编码我们应该给定一个高的概率值,而对于距离原编码点距离较远的,我们应该给定一个低的概率值。没错,总体来说,我们就是要将原先一个单点拉伸到整个编码空间,即将离散的编码点引申为一条连续的接近正态分布的编码曲线,如下所示:

到这里,我们已经不知不觉到来到了 变分自编码器VAE 的核心思想腹地。下面我们将详细地叙述VAE的模型架构。

三、Variational AutoEncoder--变分自编码器

如上所述,将服从一定分布(高斯分布)的z输入Decoder便可以进行图像生成。那z的分布如何得到,这就是VAE做的事。又为什么要这么得到呢,接下来将进行阐述。

3.1 VAE简介

                VAE结构如图所示,与AE结构类似,也是一个编码器(NN Encoder)和解码器(NN Decoder),但是这里的编码器是为了生成隐变量的某种分布(这里是高斯分布)。

        VAE将经过神经网络编码后的隐藏层假设为一个标准的高斯分布,然后再从这个分布中采样一个特征,再用这个特征进行解码,期望得到与原始输入相同的结果。上图展示了结构,同时也展示了训练过程,后续会讲(截的cs231n课件ppt)。

        明明生成只需要解码器,为什么还要用编码器生成z的分布呢。这个模型的训练过程又是怎样的呢?请看3.2,从如何训练的角度讲述了为什么要这么做。

3.2 Variational Inference--变分推理推导

         在VAE中,训练数据x的似然函数如下,简单的理解就是,不同输入z下的x的发生的概率d的期望,这里z是连续的。

        对于先验概率p_\theta(z),我们假设它基于某种简单分布,eg,Gaussian。对于条件概率(先验概率)p_\theta(x|z),较为复杂,用神经网络(解码器NN Decoder)表示建模。

        该模型是一个隐变量(z)模型,未知的为z和theta,z后续通过一定的假设和技巧,得到他分布,所以z其实也不是未知量。训练的目标就是最大化似然函数(为什么要最大化训练数据x的似然函数,因为生成任务的目标不就是去探究训练数据的分布特征嘛,体现到函数上就是最大化训练数据分布的似然函数)

        根据输出x的概率求目标函数的最大似然估计。在没有隐变量模型,即用一般的机器学习算法训练生成模型的过程中使用的是最大似然函数作为损失函函数。这时候将含隐变量模型的公式带入可以得到新的损失函数,但是这个损失函数的最大似然估计是很难求解的(completely intractable),不能直接优化(具体而言,一般最大似然估计就是直接求导,导数为0,找到极值点,一般也是最值点,获得在极值点下的theta)导致我们训练受阻,如下图所示。

        简而言之,目标函数包含两项p(z)p(x|z)。我们已经假设了p(z)符合了简单的分布(例如高斯分布)以及p(x|z)可以通过NN Decoder来表示建模,所以这两个都已经解决。问题在于积分导致的困难!!!求导方法对于该隐变量模型的最大似然估计不可用!!!

        上述方法行不通,那么接下来的问题就是如何让新的目标函数变得可以求解呢?(这个很tricky,技巧性很强)。

        探究z的后验概率p_\theta(z|x),根据贝叶斯公式可以得到

        p(z)p(x|z)前面已经解决,但是p_\theta(x)不正是我们要求的吗,所以这个z的后验概率似乎也表示失败,但是转机来了,这不是给我们提供了目标函数p_\theta(x)的又一种表示方法吗,这个表示方法里面没有导数,如果我能以某种方式得到后验概率p_\theta(z|x),那我就可以表示目标函数了呀!!!!

        额外定义一个编码器NN Encoder,将x编码为z,那么通过编码器就可以z的近似后验概率q_\varphi(z|x),可以利用该编码器去估计p_\theta(z|x)!!!

        具体而说,编码器和解码器如图所示。对于编码器,利用网络将x编码为隐变量z,那么我们就可以通过网络来建模表示z|x的分布的估计。同理对于解码,将z解码为x,得到先验分布x|z。

        由此我们得到了p_\theta(x)的另一种表示。如图所示,第一行为一般的目标函数表示,取了一个对数,所以说很tricky,下图第二行为利用贝叶斯公式进行新的表示,在这个表示里没有积分。最后化简为三项之和(第一项为p_\theta(x|z)对z的期望),后两项为KL散度。同时,最后一项>0,那么前两项决定下界。        现在,可以对该似然函数进行最大似然估计了!!!那么就可以进行模型训练了!!!将它分为两部分,第一步为最大化下界,第二部分为最大化第三项。具体步骤如结构图所示。

        这样,训练好模型之后,我们可以直接将解码部分拿出来,通过标准高斯分布随机采样源源不断的生成数据了。


PS :从编码得到的分布N ( μ , σ ) \mathcal{N}(\mu,\sigma)N(μ,σ) 随机采样z 的这个过程没法求导,没法进行误差反向传播,运用了一个叫做重参数的技巧,这里不做详述。

如果有不对的地方,欢迎评论区或者私信讨论。

参考文章:

最大似然估计 | 鲁老师

无监督学习之VAE——变分自编码器详解 - 知乎

CS285课程笔记(5.(1))——从概率图角度理解强化学习(变分推断原理+VAE) - 知乎

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值