变分自动编码器的大致概念已经理解了快一年多了,但是其中的数学原理还是没有搞懂,在看到相关的变体时,总会被数学公式卡住。下决心搞懂后,在此记录下我的理解。
1 公式推导——变分下界#
这篇文章提出一种拟合数据集分布的方法,拟合分布最常见的应用就是生成模型。该方法遵循极大似然策略,即对于数据集X={x(i)}Ni=1,对生成模型pθ(x)(注意!这里的pθ(x)既代表生成模型本身,又代表模型生成数据x的边缘概率,下面类似)完成如下优化:
maxθL=N∑i=1logpθ(x(i))(1)
但是,模型不可能凭空产生数据,必须要有输入才能有输出,所以作者对数据的生成过程进行了假设,假设数据集X={x(i)}Ni=1的生成过程由以下两步组成:
1、通过某个先验分布pθ∗(z),抽样获得隐变量z(i) 。
2、再通过某个条件分布pθ∗(x|z),抽样生成x(i)。
显然,以上参数θ∗的值、个数,甚至是计算推演的过程,都是未知的。为了使优化得以进行,就要对参数的个数和计算流程进行约束,通常专家会根据经验来给予特定数据集特定的计算过程。不失一般性,作者假设先验分布pθ∗(z)和似然函数pθ∗(x|z)来自于参数族pθ(z)和pθ(x|z),并且它们的概率分布函数(PDFs)几乎处处可微。换句话说,作者定义生成模型为pθ(z)pθ(x|z)。
尽管有如上假设,由于数据x(i)与隐变量抽样z之间的关系未知,pθ(x|z)还是无法直接进行优化。于是,作者采用一种迂回的方式,让模型自己学会z与x之间的关系。作者使用自动编码器的机制,与生成模型同时训练一个后验分布模型qϕ(z|x),用来模拟其后验分布pθ(z|x),称为编码器,并称pθ(x|z)为解码器。概率图如下:

其中θ表示生成模型pθ(z)pθ(x|z)的待优化参数,ϕ表示用于估计pθ(z|x)的模型的参数。
有了qϕ(z|x)作为辅助后,针对每一数据集样本x,待优化式可转换如下:
logpθ(x)=Eqϕ(z|x)logpθ(x)=Eqϕ(z|x)logpθ(x,z)pθ(z|x)=Eqϕ(z|x)[logpθ(x,z)−logpθ(z|x)+logqϕ(z|x)−logqϕ(z|x)]=Eqϕ(z|x)[logqϕ(z|x)pθ(z|x)+logpθ(x,z)−logqϕ(z|x)]=KL[qϕ(z|x)||pθ(z|x)]+Eqϕ(z|x)[logpθ(x,z)−logqϕ(z|x)]=KL[qϕ(z|x)||pθ(z|x)]+L(θ,ϕ)(2)(3)(4)(5)(6)(7)(8)
容易看出,由于(8)式第一项是相对熵非负,第二项就可看作(2)式的下界,称之为变分下界或证据下界(evidence lower bound, ELBO)。获得如下不等式
logpθ(x)≥L(θ,ϕ)(9)
当且仅当qϕ(z|x)=pθ(z|x)时,不等式取等。因为pθ(z|x)未知,第一项KL散度无法计算,又因为它有非负的性质,对优化的影响有限。所以,我们只需对L(θ,ϕ)进行优化,原式自然变大。将L(θ,ϕ)进行变换如下:
L(θ,ϕ)=Eqϕ(z|x)[logpθ(x,z)−logqϕ(z|x)+logθ(z)−logθ(z)]=Eqϕ(z|x)[−logqϕ(z|x)+logθ(z)+logpθ(x,z)−logθ(z)]=Eqϕ(z|x)[−logqϕ(z|x)pθ(z)+logpθ(x,z)pθ(z)]=−KL[qϕ(z|x)||pθ(z)]+Eqϕ(z|x)[logpθ(x|z)](10)(11)(12)(13)
对于以上两项,我们可以把第一项理解为正则项,也就是说拟合的后验分布应该和生成模型先验分布比较接近才好;第二项理解为重构损失,就是自编码器的损失。同时对这两项进行优化,就可以使生成模型向目标靠近。
最终的目标函数如下:
1NN∑i=1−KL[qϕ(z|x(i))||pθ(z)]+Eqϕ(z|x(i))[logpθ(x(i)|z)](14)
换成期望的写法:
Ex∼XEqϕ(z|x)[−logqϕ(z|x)+logpθ(z)+logpθ(x|z)](15)
2 重参数化#
在以上优化式中包含随机采样过程,作者提出使用重参数化来建立可反向传播的采样。实际上就是给模型额外添加一个已知的随机变量作为输入,从而使模型的抽样过程可微。
将作者于文中对以上推导的举例——变分自动编码器(VAE),拿来与(13)式做对比,推导的式子以及重参数化的意义就一目了然了。其中VAE的pθ(z)定义为相互独立的多维高斯分布;qϕ(z|x)对z的采样则是先用模型产生其方差与均值,再使用标准高斯分布的抽样重参数化获得;pθ(x|z)在z条件下对x的抽样,由于图像数据分布的复杂性,在实践中并没有使用重参数化,也就是解码器直接对z进行解码产生x。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!