02:AutoEncoder与VAE的区别)
2. 潜变量生成模型把“直接描述所有数据的概率规律”拆成“先确定隐藏因素再生成数据”2.0 为什么要多引入一个看不见的zzz先把这一节真正想解决的问题说清楚。我们用xxx表示一张具体图片用pdata(x)p_{\text{data}}(x)pdata(x)表示“真实世界产生各种图片的整体概率规律”。这里的“概率规律”不是要给每一张可能的图片手工列一个概率而是希望有一个统一的数学模型输入任意一张候选图片xxx这个模型都能描述它在真实数据世界中有多典型、多可能出现。困难在于一张图片可能有成百上千甚至更多像素而不同像素之间还有非常复杂的联系。我们虽然拿到了训练集里的许多图片样本却通常写不出真实分布pdata(x)p_{\text{data}}(x)pdata(x)的完整公式。因此“直接描述pdata(x)p_{\text{data}}(x)pdata(x)”这件事太难。VAE 的办法不是硬着头皮直接写这个复杂分布而是额外引入一个隐藏变量zzz。这里的zzz叫潜变量它不是图片中直接观察到的像素而是模型内部用来概括“造成这张图片的隐藏因素”的变量。于是我们尝试把原来的困难问题拆成两步先产生或确定一些隐藏因素zzz再根据这些隐藏因素产生具体数据xxx。例如生成一张人脸时zzz可以抽象地承载脸型姿态光照发型表情以及许多我们甚至说不出名字的因素。这里不要求潜变量每一维都对应一个人类可解释概念。它只是模型内部用来解释数据变化的隐藏变量。2.0.1 为什么积分代表“把所有zzz的可能性加起来”在写公式前先说明这一小节会同时出现的三个记号p(z)p(z)p(z)隐藏因素zzz自己出现的概率p(x∣z)p(x|z)p(x∣z)已经知道隐藏因素是zzz时生成数据xxx的概率规律p(x)p(x)p(x)把所有可能的zzz都考虑进去以后数据xxx最终的总体概率规律。离散版本更容易看懂。假设zzz只有三个可能值z∈{1,2,3}. z\in\{1,2,3\}.z∈{1,2,3}.那么p(x)∑zp(x∣z)p(z) p(x)\sum_z p(x|z)p(z)p(x)z∑p(x∣z)p(z)其实就是p(x)p(x∣z1)p(z1)p(x∣z2)p(z2)p(x∣z3)p(z3). p(x) p(x|z1)p(z1) p(x|z2)p(z2) p(x|z3)p(z3).p(x)p(x∣z1)p(z1)p(x∣z2)p(z2)p(x∣z3)p(z3).意思是xxx出现的总概率 “由情况 1 产生xxx”的概率 “由情况 2 产生xxx”的概率 “由情况 3 产生xxx”的概率。当zzz是连续变量时“求和”就变成积分pθ(x)∫pθ(x∣z)pθ(z) dz. p_\theta(x)\int p_\theta(x|z)p_\theta(z)\,dz.pθ(x)∫pθ(x∣z)pθ(z)dz.所以这条看起来抽象的积分中文意思其实非常朴素枚举所有潜在原因zzz把它们产生xxx的贡献全部加起来。我们真正想学的是数据分布pdata(x)p_{\text{data}}(x)pdata(x)。如果它的解析式已知我们当然可以直接从它采样困难恰恰在于它未知而且复杂。VAE 先假设一个潜变量生成过程pθ(x,z)pθ(z)pθ(x∣z) \boxed{p_{\theta}(x,z) p_{\theta}(z)p_{\theta}(x \mid z)}pθ(x,z)pθ(z)pθ(x∣z)xxx观测到的数据例如一张图片zzz潜变量latent variable例如图片背后隐藏的特征θ\thetaθ模型的参数比如神经网络中的权重pθ(z)p_\theta(z)pθ(z)zzz的先验分布pθ(x∣z)p_\theta(x\mid z)pθ(x∣z)知道zzz后生成xxx的条件分布pθ(x,z)p_\theta(x,z)pθ(x,z)x,zx,zx,z的联合分布联合分布描述多个随机变量同时取某些值的概率。例如 (p(x,z)) 表示(x) 取某个值、同时 (z) 也取某个值的概率。它能完整描述 (x) 和 (z) 之间的概率关系。于是边缘分布为pθ(x)∫pθ(x,z) dz∫pθ(z)pθ(x∣z) dz \boxed{ p_\theta(x) \int p_\theta(x,z)\,dz \int p_\theta(z)p_\theta(x\mid z)\,dz }pθ(x)∫pθ(x,z)dz∫pθ(z)pθ(x∣z)dz这个公式可以读成先从简单先验pθ(z)p_{\theta}(z)pθ(z)采一个潜变量zzz再从条件分布pθ(x∣z)p_{\theta}(x \mid z)pθ(x∣z)产生数据xxx把所有可能的zzz对xxx的贡献加起来就得到最终的pθ(x)p_{\theta}(x)pθ(x)。边缘分布是从联合分布中“忽略”某个变量后得到另一个变量自身的概率分布。例如pθ(x)p_\theta(x)pθ(x)就是把所有可能的zzz都积分掉只看xxx出现的概率。在标准 VAE 中常用pθ(z)N(0,I). p_{\theta}(z) \mathcal{N}(0,I).pθ(z)N(0,I).若模型训练成功生成新样本时就很简单从N(0,I)\mathcal{N}(0,I)N(0,I)抽zzz再让 decoder 给出pθ(x∣z)p_{\theta}(x \mid z)pθ(x∣z)的参数并从中采样或取均值。2.1 为什么“传统 AE 图”会让人困惑2.1.0 先比较普通 AutoEncoder普通 AE 通常是x→Encoderz→Decoderx^. x \xrightarrow{\text{Encoder}} z \xrightarrow{\text{Decoder}} \hat x.xEncoderzDecoderx^.这里的zzz是一个确定向量。给同一个xxx输入两次若没有 dropout 等随机机制通常会得到同一个zzz。VAE 不一样。它不是让 encoder 说“这个xxx就对应唯一的z(1.2,−0.7,…)z(1.2,-0.7,\ldots)z(1.2,−0.7,…)。”而是让 encoder 说“对于这个xxx我认为zzz大概落在某个区域这个区域可以用一个概率分布表示。”因此训练时不能把“从先验随便抽一个zzz”和“针对当前xxx抽一个zzz”混为一谈。很多初级教程会画成x→x \rightarrowx→encoder→z→\rightarrow z \rightarrow→z→decoder→x^\rightarrow \widehat{x}→x并说“随机采一个zzz再重构xxx”。如果没有说清楚这个zzz是从什么条件分布中采出来的确实会产生原材料指出的疑问随机采到的zzz凭什么还对应原来的那个xxxVAE 的传统理解图解决这个问题的关键不是“随便从全局先验取一个zzz来重构当前xxx”而是引入一个依赖于当前样本xxx的近似后验qϕ(z∣x) q_{\phi}(z \mid x)qϕ(z∣x)训练时重构当前xxx所使用的zzz是从这个qϕ(z∣x)q_{\phi}(z \mid x)qϕ(z∣x)中采样的生成时才直接从先验pθ(z)p_{\theta}(z)pθ(z)采样。