VAE
前言
上一篇文章我们讲了生成式模型基础知识,大概描述了一下如何去生成一张图片。总的来讲,就是去拟合分布。详细看这里
最后我们发现,一个符合**鸡的图片的分布 P θ ( x ) P_θ(x) Pθ(x)**是十分复杂并且很难去求解的,这也导致我们最后的优化目标 θ ∗ = a r g max θ ∏ i = 1 n P θ ( x i ) \theta^*=arg\max_\theta\prod_{i=1}^nP_\theta(x^i) θ∗=argmaxθ∏i=1nPθ(xi)很难去计算。
接下来我们讨论VAE模型是如何解决这个问题的。
一、曲线救国
上篇文章我们通过从高斯分布中采样一个随机值 z z z送到我们训练的网络 θ \theta θ中,得到的输出满足分布 P θ ( x ) P_\theta(x) Pθ(x),我们训练网络 θ \theta θ让它去拟合我们的训练数据集 P d a t a ( x ) P_{data}(x) Pdata(x)。那么假如我们希望去训练这样一个网络,那就是整个过程反过来,使用x作为输入去调整网络 θ \theta θ,最终使用x来得到我们的z。这里的z我们称为隐变量,它是一个或一组机器能理解的抽象的参数值,只要有它们就可以生成我们的图片。
生成过程标准的表达方式就是 P ( z ) P ( x ∣ z ) P(z)P(x|z) P(z)P(x∣z):先从分布中取得z,在拥有z的条件下去得到x。
训练过程标准的表达方式就是 P ( x ) P ( z ∣ x ) P(x)P(z|x) P(x)P(z∣x):先从分布中取得x,在拥有x的条件下去得到z。
这里的 P ( x ∣ z ) P(x|z) P(x∣z)叫先验分布,也叫解码器,指在不知道答案x的情况下使用z进行推理
这里的 P ( z ∣ x ) P(z|x) P(z∣x)叫后验分布,也叫编码器,指在知道答案x的情况下反向推理z
上一篇文章我们讲到了 P θ ( x ) P_θ(x) Pθ(x)很复杂,无法去进行计算及优化。既然分布 P θ ( x ) P_θ(x) Pθ(x)很难求,我们如何去避开它,另寻他路进行优化呢?
我们需要在两个地方进行退而求其次:
1.放弃直接求 P θ ( x ) P_θ(x) Pθ(x),想办法替代一下
2.将优化目标变换为可以计算的形式
二、解决问题
1. VAE工作流程图
柿子要调软的捏,我们先了直观的解一下VAE的工作流程:
从左向右看:
(1) 我们首先将我们的数据集“一张鸡的图片 X i X_i Xi”输入到一个均值方差计算模块中,输出两个数值:均值和方差。
(2) 利用这两个值为这张图片构建一个专属于它自己的正态分布(高斯分布)。
(3) 在这个正态分布中我们从中随机抽取一个 Z i Z_i Zi,
(4) 将 Z i Z_i Zi送到我们训练的生成器中,最后得到预测的输出 X ^ i \hat{X}_{i} X^i。
(5) 对比 X ^ i \hat{X}_{i} X^i和 X i X_i Xi,计算loss,调整模型的参数。
整个过程中需要训练的部分有两个:均值方差计算模块和生成器
均值方差计算模块也称编码器,写作 p ( z ∣ x ) p(z|x) p(z∣x),就是将人们可以看懂的图片变换为只有机器可以看懂的高维表征。
生成器也称解码器,写作 p ( x ∣ z ) p(x|z) p(x∣z),它可以将只有机器可以看懂的高维表征转换为一张对应的人们可以看懂的图片。
我们的目标是训练这两个模型,让每一个图片 X i X_i Xi和 Z i Z_i Zi都对应,这样我们随机输入一个 Z i Z_i Zi,模型都会给我们生成一张对应的图片。
值得注意的是,我们“为一张图片构建一个专属于它自己的正态分布(高斯分布)”,这很反常识,我们看下图。
假设我们输入了两张图片,编码器将它们编码到红色线的高维的空间上,皮卡kun对应 Z 1 Z_1 Z1 ,普通kun对应 Z 3 Z_3 Z3。随后我们将 Z 1 Z_1 Z1 Z 3 Z_3 Z3投喂给解码器 ,由于解码器学到了皮卡kun对应 Z 1 Z_1 Z1 ,普通kun对应 Z 3 Z_3 Z3,可以正确地将对应图像生成出来了。但是如果此时此刻在 Z 1 Z_1 Z1 Z 3 Z_3 Z3之间我们取了个 Z 2 Z_2 Z2的话,机器没有见过这种隐变量,那么它将会输出什么?我们希望的肯定是然他输出一个介于 Z 1 Z_1 Z1 Z 3 Z_3 Z3之间的样子,但是现实情况往往是:由于机器没见过,所以不知道要输出什么。
我们将方法改良一下,每一张图片对应一小段连续的隐变量Z,这样做有什么好处呢?
我们看到在高维空间上,两个图片对应的隐变量Z中间有一部分重合了,这可真是难为我们的模型了,假设正好采样Z的时候采样到了它们重合的部分,那么机器的输出又要像普通kun,又要像皮卡kun。对啦,我们要的就是这种效果,相比较于机器根本不知道中间要输出什么图片来讲,这样折磨我们的模型反而可以很好的同时学习普通kun和皮卡kun的特征,最后输出的图像又像普通kun又像皮卡kun。
相信“为一张图片构建一个专属于它自己的正态分布(高斯分布)”这句话,大家应该已经知道是什么情况了。实际上来讲,我们训练一个表达为 q ϕ ( z ∣ x ) q_{\boldsymbol{\phi}}(\mathbf{z}|\mathbf{x}) qϕ(z∣x)的编码器,每一个输入x都对应一个属于它自己的高斯分布,让它尽可能地去接近真实理想状况的编码器 p ( z ∣ x ) p(z|x) p(z∣x)。
需要注意的是,我们训练的时候并不能只直接用**”对比 X ^ i \hat{X}_{i} X^i和 X i X_i Xi,计算loss“的方式来优化 q ϕ ( z ∣ x ) q_{\boldsymbol{\phi}}(\mathbf{z}|\mathbf{x}) qϕ(z∣x),它会退化成第一一对应的样子(第一张图),即方差值=0,所以训练的时候需要对方差做一点限制**,让它尽可能去逼近1而不是0。
最简单的方法就是添加一个loss,让输出的分布 q ϕ ( z ∣ x ) q_{\boldsymbol{\phi}}(\mathbf{z}|\mathbf{x}) qϕ(z∣x)和标准正态分布尽可能地相似:
K L ( N ( μ , σ 2 ) ∥ N ( 0 , 1 ) ) = ∫ 1 2 π σ 2 e − ( x − μ ) 2 / 2 σ 2 ( log e − ( x − μ ) 2 / 2 σ 2 / 2 π σ 2 e − x 2 / 2 / 2 π ) d x = ∫ 1 2 π σ 2 e − ( x − μ ) 2 / 2 σ 2 log { 1 σ 2 exp { 1 2 [ x 2 − ( x − μ ) 2 / σ 2 ] } d x } = 1 2 ∫ 1 2 π σ 2 e − ( x − μ ) 2 / 2 σ 2 [ − log σ 2 + x 2 − ( x − μ ) 2 / σ 2 ] d x = 1 2 ( − log σ 2 + μ 2 + σ 2 − 1 ) \begin{aligned} &KL\Big(N(\mu,\sigma^{2})\Big\Vert N(0,1)\Big) \\ &=\int\frac{1}{\sqrt{2\pi\sigma^{2}}}e^{-(x-\mu)^{2}/2\sigma^{2}}\left(\log\frac{e^{-(x-\mu)^{2}/2\sigma^{2}}/\sqrt{2\pi\sigma^{2}}}{e^{-x^{2}/2}/\sqrt{2\pi}}\right)dx \\ &=\int\frac{1}{\sqrt{2\pi\sigma^{2}}}e^{-(x-\mu)^{2}/2\sigma^{2}}\log\left\{\frac{1}{\sqrt{\sigma^{2}}}\exp\left\{\frac{1}{2}[x^{2}-(x-\mu)^{2}/\sigma^{2}]\right\}dx\right\} \\ &=\frac{1}{2}\int\frac{1}{\sqrt{2\pi\sigma^{2}}}e^{-(x-\mu)^{2}/2\sigma^{2}}\begin{bmatrix}-\log\sigma^{2}+x^{2}-(x-\mu)^{2}/\sigma^{2}\end{bmatrix}dx \\ &=\frac{1}{2}\left(-\log\sigma^{2}+\mu^{2}+\sigma^{2}-1\right) \end{aligned} KL(N(μ,σ2) N(0,1))=∫2πσ21e−(x−μ)2/2σ2(loge−x2/2/2πe−(x−μ)2/2σ2/2πσ2)dx=∫2πσ21e−(x−μ)2/2σ2log{σ21exp{21[x2−(x−μ)2/σ2]}dx}=21∫2πσ21e−(x−μ)2/2σ2[−logσ2+x2−(x−μ)2/σ2]dx=21(−logσ2+μ2+σ2−1)
这里的推导暂时放在这里了,有兴趣的小伙伴可以看一看。
2. 解决问题一:放弃直接求 P θ ( x ) P_θ(x) Pθ(x)
我们无法去直接求得 P θ ( x ) P_θ(x) Pθ(x),那我们就迂回一下,使用两个高斯分布相乘的结果来近似这个复杂分布。
我们都学过泰勒展开和傅里叶变换,他们的共同思想就是将一个复杂的函数拆分成多个简单的函数。
直观上来讲,复杂的分布也可以拆分成多个简单的高斯分布。
如上图所示,假设复杂分布 P ( x ) P(x) P(x)是黑色的图像,那么它可以被拆分成多个蓝色简单高斯分布图像的叠加。
想想我们刚刚讲的模型,我们从标准正态分布(高斯分布)中随机抽取一个 Z i Z_i Zi,将它送到我们训练的生成器中,最后得到预测的输出 X ^ i \hat{X}_{i} X^i。那么整个过程可以表达为 p ( Z ) p ( X ∣ Z ) p(Z)p(X|Z) p(Z)p(X∣Z)。这里假设 p ( z ) p(z) p(z)和 p ( x ∣ z ) p(x|z) p(x∣z)这两个分布都是高斯分布。此时我们刚刚无法表达的分布 P θ ( x ) P_θ(x) Pθ(x)被我们替换成了两个简单高斯分布 p ( z ) p(z) p(z)和 p ( x ∣ z ) p(x|z) p(x∣z),数学表达式长这样 P θ ( x ) = ∫ z P ( x ∣ z ) P ( z ) d z P_\theta(x)=\int\limits_zP(x|z)P(z)dz Pθ(x)=z∫P(x∣z)P(z)dz,看不懂没关系,待会告诉你什么是边缘分布。
这样一来,我们的生成器就有了限制条件:它是一个高斯分布。这样一来我们开始提到的分布 P θ ( x ) P_θ(x) Pθ(x)非常复杂难以求解的问题就被绕开了。现在我们需要做的就是用生成器输出两个值:均值和方差,再将开始抽取的Z丢到满足这个均值和方差的高斯分布表达式中就可以得到对应的输出了。
3. 解决问题二:优化目标似然函数
这一部分又要考验我们数学推理的功夫了,不过没事我这里都把饭嚼碎了喂给你了。
推理需要的基础知识:
1. 二维随机变量的边缘分布
我们看看GPT是如何解释的:
二维连续变量的边缘分布指的是在二维联合分布中,将其中一个变量(或多个变量)视为关注对象,而将其余变量积分或求和得到的概率分布。这个过程称为边缘化。
假设有两个连续随机变量 X 和 Y,它们的联合概率密度函数为 f X Y ( x , y ) f_{XY}(x,y) fXY(x,y)。边缘分布是指将其中一个变量的概率分布从联合分布中"边缘化"掉,得到的单个变量的概率分布。
边缘概率密度函数 f X ( x ) f_X(x) fX(x)和 f Y ( y ) f_Y(y) fY(y) 分别定义为:
f X ( x ) = ∫ − ∞ ∞ f X Y ( x , y ) d y f Y ( y ) = ∫ − ∞ ∞ f X Y ( x , y ) d x \begin{aligned}f_X(x)&=\int_{-\infty}^\infty f_{XY}(x,y) dy\\\\f_Y(y)&=\int_{-\infty}^\infty f_{XY}(x,y) dx\end{aligned} fX(x)fY(y)=∫−∞∞fXY(x,y)dy=∫−∞∞fXY(x,y)dx
其中, f X ( x ) f_X(x) fX(x) 是 X 的边缘概率密度函数, f Y ( y ) f_Y(y) fY(y) 是 Y 的边缘概率密度函数。这样,通过积分或求和,我们将另一个变量(Y 或 X)"边缘化"掉,得到了单个变量的概率分布。
我们知道,通过积分,我们可以将二维分布转化为一维分布。
2. 贝叶斯公式
P ( A ∣ B ) = P ( B ∣ A ) ⋅ P ( A ) P ( B ) = P ( A , B ) P ( B ) P(A|B)=\frac{P(B|A)\cdot P(A)}{P(B)}=\frac{P(A,B)}{P(B)} P(A∣B)=P(B)P(B∣A)⋅P(A)=P(B)P(A,B)
3. KL散度
来自于上篇文章:
如果我们有两个离散型概率分布 P 和 Q,其概率质量函数分别为 p(x) 和 q(x),KL 散度可以定义为:
D K L ( P ∥ Q ) = ∑ x p ( x ) log ( p ( x ) q ( x ) ) D_{KL}(P\|Q)=\sum_xp(x)\log\left(\frac{p(x)}{q(x)}\right) DKL(P∥Q)=∑xp(x)log(q(x)p(x))
如果是连续型概率分布,则 KL 散度可以表示为积分形式:
D K L ( P ∥ Q ) = ∫ − ∞ ∞ p ( x ) log ( p ( x ) q ( x ) ) d x D_{KL}(P\|Q)=\int_{-\infty}^\infty p(x)\log\left(\frac{p(x)}{q(x)}\right)dx DKL(P∥Q)=∫−∞∞p(x)log(q(x)p(x))dx
KL 散度的值通常是非负的,且当且仅当两个概率分布完全相同时取得最小值 0。当 P 和 Q 之间的差异越大时,KL 散度的值也越大。
开始推理
我们首先往DNA中刻入几个表达式:
(1) q ( z ∣ x ) q(z|x) q(z∣x):我们训练的编码器,给定一个x的情况下输出指定隐变量z,服从高斯分布。
(2) P ( z ) P(z) P(z): 我们的隐变量空间,服从高斯分布。
(3) P ( x ∣ z ) P(x|z) P(x∣z): 我们的训练的解码器,给定一个隐变量z,输出指定的x,服从高斯分布。
现在开始推理!
P θ ( x ) = ∫ z P θ ( x , z ) d z P_\theta(x)=\int\limits_zP_\theta(x, z)dz Pθ(x)=z∫Pθ(x,z)dz (这里省去了积分上下限,我们引入隐变量z完全没影响,反正一个积分就积没了)
P θ ( x ) = ∫ z P ( z ∣ x ) P ( x ) d z P_\theta(x)=\int\limits_zP(z|x)P(x)dz Pθ(x)=z∫P(z∣x)P(x)dz (很好理解,同时产生 x z xz xz的概率 = 先产生x的概率*产生x的条件下产生z的概率)
P θ ( x ) = P ( x ) ∫ z P ( z ∣ x ) d z P_\theta(x)=P(x)\int\limits_zP(z|x)dz Pθ(x)=P(x)z∫P(z∣x)dz (这里的积分只和z有关,故可以提出P(x))
P θ ( x ) = P ( x ) ∫ z q ( z ∣ x ) d z P_\theta(x)=P(x)\int\limits_zq(z|x)dz Pθ(x)=P(x)z∫q(z∣x)dz (由于左右等式相等,所以这里的积分值=1,所以跟是否是** P ( z ∣ x ) P(z|x) P(z∣x)分布无关**,可以写成任意分布)
l o g P θ ( x ) = l o g P ( x ) ∫ z q ( z ∣ x ) d z logP_\theta(x)=logP(x)\int\limits_zq(z|x)dz logPθ(x)=logP(x)z∫q(z∣x)dz (两边加上log方便后面运算)
l o g P θ ( x ) = ∫ z q ( z ∣ x ) l o g P ( x ) d z logP_\theta(x)=\int\limits_zq(z|x)logP(x)dz logPθ(x)=z∫q(z∣x)logP(x)dz (P(x)放进来方便观察)
l o g P θ ( x ) = ∫ z q ( z ∣ x ) l o g ( P ( z , x ) P ( z ∣ x ) ) d z logP_\theta(x)=\int\limits_{z}q(z|x)log\left(\frac{P(z,x)}{P(z|x)}\right)dz logPθ(x)=z∫q(z∣x)log(P(z∣x)P(z,x))dz (贝叶斯公式)
l o g P θ ( x ) = ∫ z q ( z ∣ x ) l o g ( P ( z , x ) q ( z ∣ x ) q ( z ∣ x ) P ( z ∣ x ) ) d z logP_\theta(x)=\int\limits_{z} q(z|x)log\left(\frac{P(z,x)}{q(z|x)}\frac{q(z|x)}{P(z|x)}\right)dz logPθ(x)=z∫q(z∣x)log(q(z∣x)P(z,x)P(z∣x)q(z∣x))dz (分子分母同乘q(z|x))
l o g P θ ( x ) = ∫ z q ( z ∣ x ) l o g ( P ( z , x ) q ( z ∣ x ) ) d z + ∫ z q ( z ∣ x ) l o g ( q ( z ∣ x ) P ( z ∣ x ) ) d z logP_\theta(x)=\int\limits_{z} q(z|x)log\left(\frac{P(z,x)}{q(z|x)}\right)dz+\int\limits_{z} q(z|x)log\left(\frac{q(z|x)}{P(z|x)}\right)dz logPθ(x)=z∫q(z∣x)log(q(z∣x)P(z,x))dz+z∫q(z∣x)log(P(z∣x)q(z∣x))dz ( l o g ( A B ) log(AB) log(AB) = l o g ( A ) log(A) log(A) + l o g ( B ) log(B) log(B))
l o g P θ ( x ) = ∫ z q ( z ∣ x ) l o g ( P ( z , x ) q ( z ∣ x ) ) d z + K L ( q ( z ∣ x ) ∣ ∣ P ( z ∣ x ) ) logP_\theta(x)=\int\limits_zq(z|x)log\left(\frac{P(z,x)}{q(z|x)}\right)dz+KL(q(z|x)||P(z|x)) logPθ(x)=z∫q(z∣x)log(q(z∣x)P(z,x))dz+KL(q(z∣x)∣∣P(z∣x)) (KL散度公式)
l o g P θ ( x ) ≥ ∫ z q ( z ∣ x ) l o g ( P ( z , x ) q ( z ∣ x ) ) d z logP_\theta(x)\geq\int\limits_zq(z|x)log\left(\frac{P(z,x)}{q(z|x)}\right)dz logPθ(x)≥z∫q(z∣x)log(q(z∣x)P(z,x))dz (KL散度非负值)
l o g P θ ( x ) ≥ ∫ z q ( z ∣ x ) l o g ( P ( x ∣ z ) P ( z ) q ( z ∣ x ) ) d z logP_\theta(x)\geq\int_zq(z|x)log\left(\frac{P(x|z)P(z)}{q(z|x)}\right)dz logPθ(x)≥∫zq(z∣x)log(q(z∣x)P(x∣z)P(z))dz (贝叶斯公式)
l o g P θ ( x ) ≥ ∫ z q ( z ∣ x ) l o g ( P ( z ) q ( z ∣ x ) ) d z + ∫ z q ( z ∣ x ) l o g P ( x ∣ z ) d z logP_\theta(x)\geq\int_z q(z|x)log\left(\frac{P(z)}{q(z|x)}\right)dz +\int_z q(z|x)logP(x|z)dz logPθ(x)≥∫zq(z∣x)log(q(z∣x)P(z))dz+∫zq(z∣x)logP(x∣z)dz ( l o g ( A B ) log(AB) log(AB) = l o g ( A ) log(A) log(A) + l o g ( B ) log(B) log(B))
l o g P θ ( x ) ≥ − K L ( q ( z ∣ x ) ∣ ∣ P ( z ) ) + E q ( z ∣ x ) [ l o g P ( x ∣ z ) ] logP_\theta(x)\geq-KL(q(z|x)||P(z))+E_{q(z|x)}[logP(x|z)] logPθ(x)≥−KL(q(z∣x)∣∣P(z))+Eq(z∣x)[logP(x∣z)] (第一项是KL散度公式,第二项看成 l o g P ( x ∣ z ) logP(x|z) logP(x∣z)的加权相加)
经过保姆级的推导流程,我们最终得到了一个下界:
L b = − K L ( q ( z ∣ x ) ∣ ∣ P ( z ) ) + E q ( z ∣ x ) [ l o g P ( x ∣ z ) ] L_b = -KL(q(z|x)||P(z))+E_{q(z|x)}[logP(x|z)] Lb=−KL(q(z∣x)∣∣P(z))+Eq(z∣x)[logP(x∣z)]
这里的参数都是已知的,只要最大化这个下界, P θ ( x ) P_\theta(x) Pθ(x)就会跟着一起被最大化。
小结
我们结合流程图来看一下我们优化这个下界的时候到底优化了啥
首先我们向编码器输入一张图片x,输出了 μ ′ ( x ) σ ′ ( x ) \mu^{\prime}(x)\sigma^{\prime}(x) μ′(x)σ′(x),它们构成了一个分布 q ( z ∣ x ) q(z|x) q(z∣x),我们希望 K L ( q ( z ∣ x ) ∣ ∣ P ( z ) ) KL(q(z|x)||P(z)) KL(q(z∣x)∣∣P(z))越小越好,即 q ( z ∣ x ) q(z|x) q(z∣x)和标准正态分布 P ( z ) P(z) P(z)越接近越好,以上就是在优化编码器。
后来我们采样一个 z z z,送到解码器中,输出了 μ ( x ) σ ( x ) \mu(x)\sigma(x) μ(x)σ(x),我们让输出的均值尽可能和原图输入 x x x接近,也就是让 E q ( z ∣ x ) [ l o g P ( x ∣ z ) ] E_{q(z|x)}[logP(x|z)] Eq(z∣x)[logP(x∣z)]尽可能大,这样就可以优化解码器。
总的来讲,就是去调节 q ( z ∣ x ) q(z|x) q(z∣x)和 P ( x ∣ z ) P(x|z) P(x∣z),让 L b L_b Lb越大越好。
4. 遗留问题
回到我们刚刚讲的,我们只去优化一个下界真的没问题吗?
l o g P ( x ) = L b + K L ( q ( z ∣ x ) ∣ ∣ P ( z ∣ x ) ) logP(x)=L_b+KL(q(z|x)||P(z|x)) logP(x)=Lb+KL(q(z∣x)∣∣P(z∣x)) 这才是我们真正需要优化的目标
那么如果KL散度那一项跟随着优化过程越来越差怎么办?我们看看下图
我们刚刚推公式的时候讲到了, q ( z ∣ x ) q(z|x) q(z∣x)是什么都无所谓,它根本不影响 P ( x ) P(x) P(x)的值。那么当我们优化 q ( z ∣ x ) q(z|x) q(z∣x)的时候, L b L_b Lb会随之变大,然而 P ( x ) P(x) P(x)又不变,最终的结果就是间接的缩小了 K L ( q ( z ∣ x ) ∣ ∣ P ( z ∣ x ) ) KL(q(z|x)||P(z|x)) KL(q(z∣x)∣∣P(z∣x))的值。这样一来,当我们优化 q ( z ∣ x ) q(z|x) q(z∣x)到一定程度时, L b L_b Lb就和我们的目标基本相等了。
但不管怎么说这也只是一个近似的过程,如果处理不好会导致生成的图片模糊之类的问题。
三、最后一点小问题
我们基本已经成功了,我们知道了如何搭建模型,如何训练模型。
有一点问题在于:我们的编码器 p ( z ∣ x ) p(z|x) p(z∣x)输出一个正态分布,然后我们从这个分布中采样了一个隐变量 z z z出来丢给下一步。
这个采样的过程是不可导的,想象一下你拿着一个离散的野生 z z z,训练模型的人要求你去优化编码器 p ( z ∣ x ) p(z|x) p(z∣x)的 μ , σ \mu,\sigma μ,σ让模型的输出最佳,你看了半天连一个能计算的表达式都没有,上哪里搞梯度啊???
模型的数据流在这里会断掉,没有梯度可以计算的话模型也就没办法训练了。
重参数技巧(reparameterization trick)
既然采样过程不可导,我们就把它从模型的训练过程中剥离出去。
从 N ( μ , σ 2 ) 中采样一个 Z ,相当于从 N ( 0 , I ) 中采样一个 ε ,然后让 Z = μ + ε × σ 。 \text{从}\mathcal{N}(\mu,\sigma^2)\text{中采样一个}Z\text{,相当于从}\mathcal{N}(0,I)\text{中采样一个}\varepsilon\text{,然后让}Z=\mu+\varepsilon\times\sigma\text{。} 从N(μ,σ2)中采样一个Z,相当于从N(0,I)中采样一个ε,然后让Z=μ+ε×σ。
这里的 N ( μ , σ 2 ) \mathcal{N}(\mu,\sigma^2) N(μ,σ2)指的是编码器 p ( z ∣ x ) p(z|x) p(z∣x)输出的正态分布。
这样一来,我们的Z有了来源,并且来源还跟 μ , σ \mu,\sigma μ,σ有关。我们对Z进行求导的时候,就可以得到一个梯度,可以去更新编码器 p ( z ∣ x ) p(z|x) p(z∣x)的参数了。
四、总结收工
本文我们共干了几件事
了解VAE模型框架
解决复杂分布无法计算的问题
求解一个优化下界
解决采样导致的不可导问题
1. 了解VAE模型框架
(1) 我们首先将我们的数据集“一张鸡的图片 X i X_i Xi”输入到一个均值方差计算模块中,输出两个数值:均值和方差。
(2) 利用这两个值为这张图片构建一个专属于它自己的正态分布(高斯分布)。
(3) 在这个正态分布中我们从中随机抽取一个 Z i Z_i Zi,
(4) 将它送到我们训练的生成器中,最后得到预测的输出 X ^ i \hat{X}_{i} X^i。
(5) 对比 X ^ i \hat{X}_{i} X^i和 X i X_i Xi,计算loss,调整模型的参数。
2. 解决复杂分布无法计算的问题
我们通过将复杂分布拆成多个简单的高斯分布来解决复杂分布无法计算的问题:
P θ ( x ) = ∫ z P ( x ∣ z ) P ( z ) d z P_\theta(x)=\int\limits_zP(x|z)P(z)dz Pθ(x)=z∫P(x∣z)P(z)dz
3. 求解一个优化下界
我们通过推导,求出了一个可求得变分下界: L b = − K L ( q ( z ∣ x ) ∣ ∣ P ( z ) ) + E q ( z ∣ x ) [ l o g P ( x ∣ z ) ] L_b = -KL(q(z|x)||P(z))+E_{q(z|x)}[logP(x|z)] Lb=−KL(q(z∣x)∣∣P(z))+Eq(z∣x)[logP(x∣z)]
讨论了公式中每一项对应模型的哪一部分,以及训练的时候如何去优化对应部分。
随后又讨论了目标函数和我们的变分下界之间的关系 l o g P ( x ) = L b + K L ( q ( z ∣ x ) ∣ ∣ P ( z ∣ x ) ) logP(x)=L_b+KL(q(z|x)||P(z|x)) logP(x)=Lb+KL(q(z∣x)∣∣P(z∣x))
4. 解决采样导致的不可导问题
我们通过重采样技术,使得训练反向传播时可以计算训练编码器。
五、结语
作为刚入门的新手VAE这篇文章真的是直接给我干废了,花了好几天反复琢磨沉淀才总结出这一片文章,在前进的路上还任重而道远啊!
如果这篇文章对你有帮助一定一定要点个赞点个关注。没人看的话就又没动力更新了。
下一期我打算讲讲扩散模型(Denoising Diffusion Probabilistic Models),(前提是有下一期),喜欢的小伙伴记得点个关注奥。
六、参考文献
苏剑林 变分自编码器(一):原来是这么一回事:https://spaces.ac.cn/archives/5253/
李宏毅机器学习,P44 VAE:https://www.bilibili.com/video/BV1J94y1f7u5/
Auto-Encoding Variational Bayes:https://arxiv.org/abs/1312.6114