极简笔记 VAE(变分自编码器)

极简笔记 VAE(变分自编码器)

论文原文:Auto-Encoding Variational Bayes

这是一篇极其拗口的文章,但是文章从变分推断一路延伸到自编码器的构造,过程一气呵成,和当下DL领域的灌水之风形成鲜明对比,是难得的佳作。为了能够从理论到实现融会贯通地理解,本篇笔记会更加偏向于思路解读而非原文复述。

VAE是一个生成模型,对于生成模型,我们希望求得的都是原始数据分布 p(x) p ( x ) 。但是我们有的只是离散的对真实分布的采样 {x1,x2,x3,...,xn} { x 1 , x 2 , x 3 , . . . , x n } ,这就是我们的数据集。这时候我们常常会先假设分布的类型(e.g. 高斯分布,均匀分布),然后用最大似然(ML)来做,计算参数 θ=argmaxθilogp(xi) θ = arg ⁡ max θ ∑ i log ⁡ p ( x i ) ,从而求得 pθ(x) p θ ( x ) 。但是 p(x) p ( x ) 可能是一个很复杂的难以表达的分布,难以选择合适的假设分布来计算最大似然。

于是假设除了可见变量 x x ,还存在着潜变量 z z ,且 z z 满足某个简单的分布 p(z) p ( z ) 。那么原始数据分布可以按照后验概率公式分解成 p(x)=p(x|z)p(z)dz p ( x ) = ∫ p ( x | z ) p ( z ) d z ,但是在离散数据情况下边缘化 z z 是非常费时的,于是我们想到了变分推断。

logpθ(xi) log ⁡ p θ ( x i ) 有下界 L(θ,ϕ;xi) L ( θ , ϕ ; x i ) , 这个下界可以进一步拆分:

L(θ,ϕ;xi)=DKL(qϕ(z|xi)||pθ(z))+Eqϕ(z|xi)[logpθ(xi|z)] L ( θ , ϕ ; x i ) = − D K L ( q ϕ ( z | x i ) | | p θ ( z ) ) + E q ϕ ( z | x i ) [ log ⁡ p θ ( x i | z ) ]

这里非常重要,为了提升下界,等价于减小第一项的KL散度,增加第二项的期望。那么第一项可以看做是对 qϕ(z|xi) q ϕ ( z | x i ) 的正则项,使其更加接近于先验分布 pθ(z) p θ ( z ) ;第二项可以看做是负重构误差项,当 z z 满足 q q 分布时, logpθ(xi|z) log ⁡ p θ ( x i | z ) 越来越接近 logpθ(xi) log ⁡ p θ ( x i ) (输出越来越接近输入)。因为别忘了 L(θ,ϕ;xi) L ( θ , ϕ ; x i ) 就是 logpθ(xi) log ⁡ p θ ( x i ) 的下界啊,前面KL散度趋近于0,下界就只有后一项了,又要接近于原来的 logpθ(xi) log ⁡ p θ ( x i ) ,所以可以认为要求 logpθ(xi|z) log ⁡ p θ ( x i | z ) 越来越接近 logpθ(xi) log ⁡ p θ ( x i )

提到重构误差有没有想起啥?就是auto-encoder!如果对原始的自编码器中间的潜变量 z z 加上上文的正则化约束,就建立了理论到模型的桥梁!既然这么相似,那么我们确认一个目标,就是要用AE来完成下界 L(θ,ϕ;xi) L ( θ , ϕ ; x i ) 的提升。

其实到目前为止理论和模型的桥梁并没有完全打通,因为AE作为神经网络靠随机梯度下降可以做到最优化某个函数。且AE对于一个确定的输入 xi x i ,只会有一个确定的 z z 的分布(即分布参数是确定的)产生,而上面这个下界 L(θ,ϕ;xi) L ( θ , ϕ ; x i ) 里第二项还有对 z z 采样的部分。这里文章提出了一个神奇的trick——重参数化(reparameterization)。

在重参数化之前,回顾一下初衷,即得到 p(x) p ( x ) 。但 p(x) p ( x ) 分布可能太复杂,希望有一个简单的潜变量分布 p(z) p ( z ) ,通过迂回的方式学到 p(x) p ( x ) 。那么我们就假设这个简单的潜变量分布的先验是个标准正态分布 zN(0,1) z ∼ N ( 0 , 1 ) 。同时中间的正则化项不是要让 qϕ(z|xi) q ϕ ( z | x i ) 逼近先验 pθ(z) p θ ( z ) 嘛,如果不是同一个分布簇的话怎么逼近(文章提到有相关证明,KL散度逼近0必定是同分布簇),所以假设分布 qϕ(z|xi) q ϕ ( z | x i ) 也是高斯分布,但是一开始他的参数 ϕ ϕ (包含期望和方差)并不是0和1,而是 μi μ i σ2i σ i 2 。那么下界第一项的KL散度就可以简化成

KL(N(μ,σ2)||N(0,1)) K L ( N ( μ , σ 2 ) | | N ( 0 , 1 ) )

=12πσ2e(xμ)2/2σ2(loge(xμ)2/2σ2/2πσ2ex2/2σ2/2π)dx = ∫ 1 2 π σ 2 e − ( x − μ ) 2 / 2 σ 2 ( log ⁡ e − ( x − μ ) 2 / 2 σ 2 / 2 π σ 2 e − x 2 / 2 σ 2 / 2 π ) d x

=12πσ2e(xμ)2/2σ2log(1σ2exp(12[x2(xμ)2/σ2]))dx = ∫ 1 2 π σ 2 e − ( x − μ ) 2 / 2 σ 2 log ⁡ ( 1 σ 2 e x p ( 1 2 [ x 2 − ( x − μ ) 2 / σ 2 ] ) ) d x

=1212πσ2e(xμ)2/2σ2[logσ2+x2(xμ)2/σ2]dx = 1 2 ∫ 1 2 π σ 2 e − ( x − μ ) 2 / 2 σ 2 [ − log ⁡ σ 2 + x 2 − ( x − μ ) 2 / σ 2 ] d x

=12(logσ2+μ2+σ21) = 1 2 ( − log ⁡ σ 2 + μ 2 + σ 2 − 1 )

从这个简化结果可以看出,AE的encoder可以回归 μ μ σ2 σ 2 ,然后通过计算上式进行约束即可。

在训练过程中,AE的decoder需要对 zpθ(z|xi)=N(μi,σ2i) z ∼ p θ ( z | x i ) = N ( μ i , σ i 2 ) 进行采样,这里文章对 z z 进行重参数化操作使得 z=gϕ(ϵ,x) z = g ϕ ( ϵ , x ) ,其中 ϵN(0,1) ϵ ∼ N ( 0 , 1 ) , 于是对 z z 采样等价于对 μi+ϵσiN(μi,σ2i) μ i + ϵ σ i ∼ N ( μ i , σ i 2 ) ,两者的分布是完全相同的。 μi,σi μ i , σ i 对每个 xi x i 是确定的,引入的 ϵ ϵ 在AE的支路上,在BP时不会对encoder部分产生影响。
极简笔记 VAE(变分自编码器)_第1张图片

采样的问题解决了,相应的decoder部分化为

Eqϕ(z|xi)[logpθ(xi|z)]=1Ll=1L(logpθ(xi|zi,l)) E q ϕ ( z | x i ) [ log ⁡ p θ ( x i | z ) ] = 1 L ∑ l = 1 L ( log ⁡ p θ ( x i | z i , l ) )

where zi,l=gϕ(ϵi,l,xi)and ϵlp(ϵ) where  z i , l = g ϕ ( ϵ i , l , x i ) and  ϵ l ∼ p ( ϵ )

最终VAE的loss,其中 j j 表示向量的各个分量索引, 表示逐元素乘法:
L(θ,ϕ;xi)12j=1J(1+log((σji)2)(μji)2(σji)2)+1Ll=1Llogpθ(xi|zi,l) L ( θ , ϕ ; x i ) ≃ 1 2 ∑ j = 1 J ( 1 + log ⁡ ( ( σ i j ) 2 ) − ( μ i j ) 2 − ( σ i j ) 2 ) + 1 L ∑ l = 1 L log ⁡ p θ ( x i | z i , l )

where zi,l=μi+σiϵl,ϵlN(0,I) where  z i , l = μ i + σ i ⊙ ϵ l , ϵ l ∼ N ( 0 , I )

从变分推断理论到VAE网络模型的路径完全打通,完结撒花!

参考阅读:
[1]https://kexue.fm/archives/5253
[2]https://zhuanlan.zhihu.com/p/25401928

你可能感兴趣的:(极简笔记)