VAE变分自编码器VAE Loss基础数学知识
一、基础数学知识1.1凸函数的定义下面我们要讲到生成模型。首先我们复习一些要用到的数学知识。第一个是凸函数的定义因为不同教材对于凸函数的定义不同为了避免混淆这里我们讨论的是下凸函数也就是函数曲线向下突出。下凸函数有一个很明显的性质那就是任意两点的割线位于函数图形的上方。那么在数学中如何定义任意两点的割线位于函数图形上方的这个性质呢下边我们先给出公式然后再进行证明。Lambda是0到1之间的一个数对于下凸函数 f(x) 总有如下的性质任取两点x1x2。先用lambda和1 - lambda对x1x2进行加权求和再代入函数f得到的函数值 分别将x1x2代入函数f然后将函数值按照lambda和1 - lambda加权求和的值。现在我们取X1和X2之间的任意一点X我们把X1和X2之间的距离作为单位1设X和X2之间的距离为lamdalambda取值在0到1之间则X1和X之间的距离就为1 - lambda那么X实际坐标就等于X2 - lambda * (X2 - X1)。整理后就得到X的坐标为lambda * x1 (1 - lambda) * X2。然后我们看在二维坐标下的下凸函数f过f(x1)做一个平行于X轴的平行线然后再做这样一条中间的平行线。根据平行线切割线段等比例的关系我们可以得到在Y轴方向的距离也满足lambda和1 - lambda的比例关系。所以这一点的值就等于lambda * f(x1) (1 - lambda)*f(x2)。从图像观察它大于等于f (lambda * x1 (1 - lambda) * x2)。总之下凸函数就是对于参数先进行加权求和再经过下凸函数的值小于等于先经过下凸函数后经过加权求和的值。1.2Jenson不等式第二个要复习的点是Jenson不等式。Jenson不等式定义为对于一个下凸函数f(x)对于任意的点集xi如果有有一组权重参数lambda每个lambda_i都0并且这一组lambda_i加和为1则有对这一组xi按照lambda_i先加权求和再带入下凸函数f(x)得到的结果 先把每个xi带入下凸函f(x)再把函数值按照lambda_i加权求和的结果。简单来说对于下凸函数把参数加权求和小于等于把函数值加权求和。下边我们进行证明:所以我们就用归纳法证明了詹森不等式因为lambda 0且所有的lambda求和为1一个概率分布里的所有概率值正好满足这个性质。所以詹森不等式还有一种写法就是FX的期望小于等于对FX求期望。1.3KL散度接着我们复习一下KL散度KL散度是衡量两个概率分布差异的指标它的值大于等于0只有两个分布完全一致时它的值等于0。分布差异越大KL散度的值越大。比如这里有两个离散分布P和QP对Q的KL散度等于X每个可能的取值PX乘以log (PX / QX)然后累加。需要注意的是KL散度是不对称的P对Q的KL散度不等于Q对P的KL散度。当P和Q分布完全一致时在X的每个可能取值PX等于QXPX除以QX就等于1log1等于0累加求和为零。证明KL散度是大于等于零的。首先我们把KL散度公式的log里面的分子和分母交换位置为了保证整体的值不变我们需要给log前面加上负号。然后又因为PX是个概率质量函数累积和为1-log x是个下凸函数。所以根据詹森不等式对下凸函数值的加权求和大于等于对参数值的加权求和然后这里分子分母约去P对概率质量函数QX累加为1-log1 0。所以最后证明KL散度大于等于0。对于连续性随机变量也有同样的性质KL散度的公式就由累加变成了积分。二、VAE变分自编码器2.1为什么需要VAE在学习VAE算法之前我们需要先了解图片生成问题的本质是什么。比如对于一张黑白的人脸图片它是由几万个像素构成每个像素的灰度值可以看作是一个随机变量整个照片就是这几万个随机变量的联合分布可以想象其中是人脸图片的点在整个空间里是极其少的空间里几乎所有的点都是噪声。如果我们可以得到一个人脸图片概率密度函数PX那么我们就可以在里面随机采样出人脸图片。这样的想法很美好但是这个概率分布函数非常复杂不像正态分布、均匀分布或者二项分布这样只需要几个参数就可以表达复杂到我们无法求解。还有一个重要的原因是即使我们得到了这个概率密度函数我们也很难对其进行采样。那怎么办呢人们引入隐变量来解决这个问题。比如对于一个人脸图片从像素角度分析它的维度很大。比如对于一个100 * 100像素的彩色人脸图片需要3万个维度来表达。但是如果可以抽象到一些隐变量比如照片里人的头发的长短、脸的宽度、眼睛的大小、鼻子的高度等等我们可以用较少的隐变量比如128个隐变量来描述这个人脸图片。当然这里的隐变量不用我们人为定义可以让神经网络自己去学习并且让隐变量服从一个简单的分布比如是一个正态分布这个正态分布每一个采样都是一个有效的采样这个隐变量可以转化到真实的图片分布中间这个从隐变量到真实图片分布的映射可以交给一个神经网络去拟合。所以引入隐变量就解决了我们的问题引变量的维度低好采样便于我们生成图片。看到这里学过自编码器的同学可能已经坐不住了那是不是训练一个自编码器然后只用它的解码器部分就可以生成图片了呢自编码器是一类无监督学习的模型主要用于学习输入数据的有效表示也就是通过学习得到一组可以很好表示输入数据的隐变量。自编码器训练时分为编码器和解码器两部分。编码器把高维度的输入特征经过编码器网络映射到一个低维度的隐变量向量上然后这个隐变量向量再通过解码器网络重新映射回原来的高维度输入特征。训练时的误差就是重建后的高维度特征和原始输入的高维度特征之间的差异。一个经过良好训练的自编码器网络可以很好地把一张图片映射到一个低维度的隐变量向量上。然后这个隐变量向量通过解码器网络也可以很好的重建出原来的图片。2.2VAE的创新那是否我们可以从一个训练好的图片自编码器里仅取出解码器然后随机生成一个隐变量让解码器根据这个随机的隐变量生成一个图片呢答案是否定的。我们来看一下原因假设在编码器和解码器之间生成隐变量的隐空间是二维的。对于每个训练图片它生成的隐变量向量都是一个确定的点。然后这个确定的点可以通过解码器还原回原始的输入图片。隐空间内只有极少部分的点或者区域可以通过解码器来还原回图片。在绝大部分区域你采样一个隐变量向量生成的图片都是噪声数据。那怎么解决这个问题呢VAE想到的办法是让encoder生成的不是一个点还是一个正态分布。然后从这个正态分布里任意抽取一个点这个点代表的隐变量向量传入解码器需要还原出原来输入的图片这样隐空间内有意义可采样的空间就大大增加了。这时比如我们从这个点采样这个点同时属于这两个样本生成的正态分布里训练时会要求他同时生成像这两个人脸的图片。所以最终它生成的人脸图片会兼顾两者的特征从而形成一个新的在训练数据集里不存在的人脸图片。这样是比自编码器有所改进。但是我们发现每个训练样本生成的分布均值和方差是不一样的覆盖的隐空间的大小和区域也是不一样的还是存在很多没有被覆盖到的隐空间。这会导致我们在隐空间采样出来的有些隐变量还是不能生成人脸图片的情况产生VAE想到的优化方法是让所有的训练样本经过编码器生成的多元正态分布都尽量靠近多元标准正态分布而且各个维度之间是相互独立的也就是生成的每个隐变量都尽量靠近均值为零方差为一的正态分布。这样经过训练调整后所有训练样本在隐空间生成的分布都更靠近多元标准正态分布了。这样就可以保证生成时我们从隐空间的多元标准正态分布里采样得到的隐变量总能生成一个人脸图片了。我们还没有讲如何让编码器神经网络生成一个正态分布实际上很简单那就是让编码器生成决定正态分布的两个参数均值和方差。均值我们用μ表示它可以是任意数。我们知道方差必须为正数。假如神经网络输出为α它可正可负。我们知道e的任何次方都是正值。所以对神经网络输出的α在经过e的2次方的变化来表示方差σ的平方。所以神经网络原始输出的阿尔法就是log σ平方。为了后边讨论的方便我们来定义一些符号。输入的人脸照片为xencoder是一个映射它把x映射到隐空间zΦ是encoder的网络的参数。qΦ(z|x)表示给定一个x经过encoder将x映射到不同z的概率密度函数。z是隐变量P(z)代表我们期望的隐变量z的分布我们期望z是一个标准的多元正态分布生成时我们就是从P(z)里进行采样。pθ(x|z)表示给定一个Z解码器把这个Z映射到不同的X的概率密度函数decoder的把一个随机采样的Z映射到一个概率分布。我们也假设这个映射的分布是正态分布让神经网络输出每个正态分布的均值和方差。你可以从这个正态分布里采样一个图片作为最终的人脸图片。但是这样做没有必要我们直接只让decoder的输出这个正态分布的均值我们也只采样均值作为最终的人脸图片。我们再来看一下自编码器是如何计算loss它就是计算解码器输出的图片每个像素和原始输入图片每个像素值的MSE。对于自编码器来说它就是一个普通的全连接神经网络解码器的输入就是编码器的输出。2.3重参数化技巧我们看一下VAE的反向传播会有什么问题。我们发现编码器输出的是正态分布的参数而解码器输入的是从正态分布的采样的点采样操作是不可导的没有办法计算梯度。反向传播在采样操作这里就中断了。那怎么办呢这里就需要用到重参数化技巧。它首先从标准正态分布里采样一个噪声变量ε然后用编码器生成的μ和σ一起来生成随机采样ZZ μ σ * ε这样随机性就在ε里但是Z对于μ和σ来说是一个确定的可导的函数这样就解决了从正态分布里随机采样操作的可导性的问题了。如果没有ε这个噪声就比如你射箭每次射出去是一支箭但它无法回传参数到你手中这是个随机采样的数据所以无法更新虽然VAE把这个射箭从一个点变成了发射一片区域但是依旧无法回传参数但是现在有这个噪声ε之后你的箭就好像有了一个特点永远在以0为中心半径为1的一个小圈里随机乱飞这个时候你再加上μ和σ让μ和σ一个管圆心在哪一个管半径的放大缩小这样之前无法回传的参数就到了μ和σ这两个可以回传的参数身上而随机性被重定义到了噪声ε上。与自编码器不同VAE还有一个额外的限制那就是让每个人脸照片映射到隐空间的分布都要尽量接近标准正态分布。这个怎么来保证呢这里可以用KL散度来进行约束把Q散度加入到loss函数里让每个人脸照片生成的隐变量Z的分布都尽可能和隐空间的标准多元正态分布一致。所以最终VAE的loss就由两部分构成一个是重建人脸图片的loss一个是KL散度的loss。重建loss要求重建的图片尽可能和原始输入图片一致KL散度的loss要求每个人脸图片生成的分布尽可能接近标准多元正态分布。在实际训练时这两个loss实际上是一个互相博弈的过程。因为要想让每个生成的图片都尽可能和原始图片一致就需要在隐空间里把不同的人脸图片尽可能的区分开来让不同的图片离得尽可能的远。而KL散度的loss又要求所有的图片生成的分布都要尽可能的接近 标准多元正态分布。到这里我们通过直观理解的方式从自编码器的演化得到了VAE的loss函数的构成。VAE在自编码器的基础上让编码器不是输出一个点而是输出一个正态分布并且让这个正态分布尽可能地接近标准多元正态分布。通过这样的改进可以在隐空间的标准多元正态分布里来采样并通过解码器来生成真实的人脸图片。下边我们从另一种方式也就是通过数学推导来得到同样的VE的loss函数。这也是大多数教程讲解VAE的方式。2.4VAE Loss数学推导对于输入的人脸照片样本x1 x2一直到x n我们希望通过解码器生成Pθ(xi)的概率尽可能的大。因为有多个输入样本我们把解码器能生成每一个样本的概率连乘起来让这个联合分布的概率值最大。其中θ是神经网络的参数我们就是需要求得让这个联合概率最大的神经网络参数θ的值。让这个连成最大的θ的值等于让这个log函数取得最大值的θ。Log内的连乘可以变为连加上边是求最大值我们加上负号让它变为loss函数也就是求能让这个式子最小的θ的值。下边我们就来一步步推导任取一个训练数据X解码器生成这个X的概率为Pθ(x)就等于取隐空间里的每一个z的概率乘以在取这个z时可以生成x的概率所以这里是积分。然后第二步我们引入编码器部分同时乘以和除以一个qΦ(z|x)第三步我们移动分子和分母部分可以发现这是一个数学期望的表达形式于是可以写作下面这种数学期望的形式。下一步根据Jenson不等式log在外面的表达式小于等于log在里面的表达式。下一步我们交换log内分子和分母的位置同时去掉log前面的负号。下一步我们把log内的相除变为log的相减。下一步把期望内的相减变成两个期望的相减。然后我们看第一项它就是qΦ(z|x)对p(z)的KL散度所以我们写作KL散度得到最终的loss函数。我们把最终的loss函数放在这边可以看。第一项就是解码器对一个X生成的分布对p(z)分布的KL散度。第二项因为前面有个负号在loss函数里后面的越大越好这是一个期望表示对一个给定的X编码器将它编码到一个分布这个分布内的任意一个Z都要让生成X的概率最大。Log在这里并不影响函数的单调性有没有log让后面这一项取得最大值的θ都是相同的。所以我们通过数学推导得到VAE的loss和我们之前通过直观理解VAE得到的是一致的都是一个图片重建loss再加一个KL散度重建loss让生成的图片尽可能和训练图片一致。KL loss让编码器给每一个图片生成的分布尽可能接近隐空间内的多元标准正态分布。我们说了重建loss可以按照图片每个维度的mse loss来计算那么KL散度的部分该怎么计算呢下边我们就来推导一下。根据KL散度的公式我们把它展开成为积分形式然后把这里log内的除法变为log外的相减我们逐项来求解这个积分。首先我们看 log q_φ(z|x)。我们知道编码器输出的 z 是一个多元分布均值为 μ方差为 σ^2。我们假设 z 的各个维度都是独立的每个维度 z_i 服从正态分布 N(μ_i, σ_i^2)。接下来我们代入这个多元正态分布的概率密度函数。因为每个维度独立所以联合概率密度可以写作每个维度一元正态分布概率密度函数的乘积即 q_φ(z|x) ∏{i1}^d N(z_i; μ_i, σ_i^2)。取对数后log 内的连乘转化为 log 的相加log q_φ(z|x) ∑{i1}^d log N(z_i; μ_i, σ_i^2)。每个一元正态分布的概率密度函数为 (1/√(2πσ_i^2)) exp(-(z_i-μ_i)^2/(2σ_i^2))取对数后得到 -1/2 log(2πσ_i^2) - (z_i-μ_i)^2/(2σ_i^2)。因此 log q_φ(z|x) -1/2 ∑{i1}^d log(2πσ_i^2) - 1/2 ∑{i1}^d (z_i-μ_i)^2/σ_i^2。进一步将 log(2πσ_i^2) 拆分为 log(2π) log(σ_i^2)得到 log q_φ(z|x) -d/2 log(2π) - 1/2 ∑{i1}^d log(σ_i^2) - 1/2 ∑{i1}^d (z_i-μ_i)^2/σ_i^2。接下来我们求括号里第二项的表达式 log p(z)。p(z) 是满足多元标准正态分布的即 p(z) N(0, I)。其概率密度函数为 ∏{i1}^d (1/√(2π)) exp(-z_i^2/2)。取对数后log p(z) ∑{i1}^d [ -1/2 log(2π) - z_i^2/2 ] -d/2 log(2π) - 1/2 ∑_{i1}^d z_i^2。好了这时我们已经求得了KL散度括号里的两项他们的表达式如下我们带入来求最后的积分结果。我们把积分分为三个部分。首先我们来看第一部分把求和符号移除积分内部这个积分是对隐变量zi平方的期望。然后我们看一下方差的公式将后边的期望展开X的期望就是均值谬所以X的方差就等于X平方的期望减去均值的平方最终得到X平方的期望就等于方差加上均值的平方。所以上面的表达式zi平方的期望就等于方差和均值平方之和。接下来我们看第二部分的积分可以看作是对log累加项的期望。对log sigma iphone累加是个常数常数的期望还是这个常数所以得到这个表达式。最后我们看第三部分的积分累加的积分等于积分的累加。我们首先把累加移除积分符号然后内部是一个期望这里随机变量减去均值的平方的期望就是方差所以方差除以方差等于1最终表达式为这样最后我们可以把三个积分结果相加得到了KL散度的最终表达式。这里的d是隐空间的维度所以最终VE loss函数我们就有了具体的表达式它有重建loss和KL散度loss构成。重建loss是MSE loss KL散度的loss我们刚才已经计算出了它的表达式。这里的sigma和μ都是编码器网络的输出这里的D是隐空间Z的维度所以这里我们就得到了可以计算的VAE的loss函数。我们看一下模型的架构图。输入是RGB3通道图片然后经过几个卷积层下采样每一个卷积层都是通道数翻倍长宽减半。最后一个卷积层把所有的特征拉平经过两个线性层的映射得到均值和方差。均值和方差的维度都是隐空间的维度然后在隐空间里这个正态分布里采样得到一个隐变量这个隐变量经过一个线性层改变维度然后转化为特征图的形状这个形状和编码器最后一个卷积层输出的特征图的形状是一致的。然后再经过几个转置卷积进行上采样每一个都是特征图尺寸翻倍通道数减半最终得到RGB3通道的生成图片。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2417138.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!