生成模型内容丰富多彩,我们可以按照概率密度函数的处理方式对其进行分类。总体而言,把对概率密度函数进行显式处理的模型称为显式生成模型,而把隐式处理概率密度函数的模型称为隐式生成模型,如图1-1所示。显式生成模型出于训练模型的原因,需要精确或者近似给出样本的似然函数表达式,而隐式生成模型通过样本间接控制概率分布,训练过程不出现似然函数,是一种间接控制概率密度的方式。无论是显式还是隐式生成模型,其核心均是对 p ( x )进行建模,只是显式生成模型直接优化 p ( x ),其建模难度比较大,而隐式生成模型避开了直面 p ( x )的困难,通过 p ( x )生成的样本间接优化 p ( x )。在本节,我们将从最基本的极大似然估计法开始,顺着脉络深入、详细地介绍一些具有代表性的显式和隐式生成模型,例如完全可见置信网络、变分自编码器、生成对抗网络等。
图1-1 生成模型分类
在生成模型中,概率密度函数 p ( x )一直处于核心的位置。对于一批从 p data ( x )中独立采样得到的训练样本集{ x (1) , x (2) ,…, x ( N ) }(注意,我们要求训练样本集的数据是独立同分布的),我们希望用训练数据来训练一个生成模型 p g ( x ),这个生成模型可以显式或隐式地学习数据的分布 p data ( x )或者获得 p data ( x )的(近似)表达式,即 p data ( x )≈ p g ( x )。那么接下来在前向推断过程中,可以通过在 p g ( x )上显式或隐式地采样而得到一批样本,并且使获得的样本(近似)符合概率分布 p data ( x )。
既然生成模型的核心是求解 p ( x ),那么我们来考虑一个简单的问题,对于一批样本集合,是否可以通过直接统计样本的个数来对 p ( x )进行估计?这听起来是可行的,我们只需要对每一个样本统计频次,然后除以样本集合的总样本数进行概率归一化,即可得到关于 p ( x )的柱状分布图,如图1-2所示。但是当样本维度较大时,便会出现维数灾难问题。例如对于MNIST数据集中的图像,其维度为28×28=784,每个像素位置的可取数值为0或1,即概率分布共包含2 784 ≈10 236 个样本点,也对应了大约10 236 个需要估计的概率数值。实际上,任何一个训练数据集都只能包含全部样本空间中的极小一部分样本点,并且每一张图像只能影响一个样本点的概率,对其他内容相似的样本点概率则不能产生任何影响,故这种计数统计模型不具备泛化性能。在实际操作中,我们不可能保存每一个样本点的概率数值,而是会使用参数化的概率密度函数 p θ ( x ),其中 θ 为模型的参数。
图1-2 概率分布柱状图
我们先介绍使用极大似然估计法的生成模型,充分理解极大似然原理对理解生成模型有非常重要的意义。注意,并不是所有的生成模型都使用极大似然估计法,有些生成模型默认不使用,但是也可以做一些修改令其使用极大似然估计法,GAN就属于这一类。
极大似然估计法是对概率模型参数进行估计的一种方法,例如有一个包含 N 个样本的数据集{ x (1) , x (2) ,…, x ( N ) },数据集中每个样本都是从某个未知的概率分布 p data ( x )中独立采样获得的,若我们已经知道 p g ( x )的形式,但是 p g ( x )的表达式里仍包含未知参数 θ ,那问题就变成如何使用数据集来估算 p g ( x )中的未知参数 θ 。例如 p g ( x )是一个均值和方差参数还未确定的正态分布,那么如何用样本估计均值和方差的准确数值?
在极大似然估计法中,首先计算所有样本的似然函数 L ( θ )为:
似然函数是一个关于模型参数 θ 的函数,当选择不同的参数 θ 时,似然函数的值是不同的,它描述了在当前参数 θ 下,使用模型分布 p g ( x ; θ )产生数据集中所有样本的概率。一个朴素的想法是:在最好的模型参数 θ ML 下,产生数据集中的所有样本的概率是最大的,即
实际上,在计算机中,多个概率的乘积结果并不方便存储,例如计算过程中可能会出现数值下溢的问题,即对比较小的、接近于0的数进行四舍五入后成为0。我们可以对似然函数取对数(即log[ L ( θ )])来解决该问题,并且仍然通过求解最好的模型参数 θ ML 使对数似然函数最大,即
可以证明两者是等价的,但是将似然函数取对数后会把概率乘积形式转换为对数求和的形式,大大方便了计算。继续将其展开后,有
可以发现,使用极大似然估计法时,每个样本 x i 都希望拉高它所对应的模型概率值 p g ( x ( i ) ; θ ),如图1-3所示。但是由于所有样本的密度函数 p g ( x ( i ) ; θ )的总和必须是1,所以我们不可能将所有样本点都拉高到最大的概率。换句话说,一个样本点的概率密度函数值被拉高将不可避免地使其他点的函数值被拉低,最终达到一个平衡态。
图1-3 极大似然估计法原理
我们也可以将上式除以 N ,此时极大似然估计最大化的目标是在经验分布 下使得概率对数的期望值最大,即
另一种对极大似然估计的理解是:极大似然估计本质是最小化训练集上的经验分布 和模型分布 p g ( x ; θ )之间的KL散度值,即
而KL散度的表达式为:
由于 θ 值与第一项无关,故只考虑第二项,有
可以发现两者是完全一样的,也就是说极大似然估计就是希望 p g ( x ; θ )和 p data ( x )尽量相似,最好无任何差异(KL散度值为0),这与生成模型的思想是一致的。但实际的生成模型一般不可能提前知道 p g ( x ; θ )的表达式形式,只需要估计表达式中的参数,因为实际样本数据非常复杂,往往对 p g ( x ; θ )无任何先验知识,只能对其进行一些形式上的假设或近似。
很多生成模型可以使用最大似然的原理进行训练,在得到关于参数 θ 的似然函数 L ( θ )后,我们只需最大化似然函数即可,只是不同模型的差异在于如何表达或者近似表达似然函数 L ( θ )。图1-1的左边分支均为显式生成模型,其中完全可见置信网络模型对 p g ( x ; θ )做出了形式上的假设,而流模型则通过定义一系列非线性变换给出了 p g ( x ; θ )的表达式,这两个模型其实都给出了似然函数 L ( θ )的确定表达式;变分自编码器模型则采用近似的方法,只获得了对数似然函数log[ L ( θ )]的一个下界,通过最大化该下界近似地实现极大似然;玻尔兹曼机使用马尔可夫链对似然函数的梯度进行了近似。接下来,我们将分别介绍这些模型,并讨论它们的优缺点。
完全可见置信网络(FVBN)中不存在不可观察的潜在变量(隐变量),高维度的观察变量的概率表达式被链式法则从维度上进行分解,即对于 n 维观察变量 x ,其概率表达式为:
自回归网络是最简单的完全可见置信网络,其中每一个维度的观察变量 x i 都构成概率模型的一个节点,而所有这些节点{ x 1 , x 2 ,…, x n }共同构成一个完全有向图,图中任意两个节点都存在连接关系,如图1-4所示。
图1-4 自回归网络
因为自回归网络中已经有了随机变量的链式分解关系,所以核心问题便成为如何表达条件概率 p ( x i x i -1 , x i -2 ,…, x 1 )。最简单的模型是线性自回归网络,即每个条件概率均被定义为线性模型,对实数值数据使用线性回归模型(例如定义 p ( x i |x i -1 , x i -2 ,…, x 1 )= w 1 x 1 + w 2 x 2 +…+ w i -1 x i -1 ),对二值数据使用逻辑回归模型,而对离散数据使用softmax回归模型,具体计算过程如图1-5所示。但线性模型容量有限,拟合函数的能力不足。在神经自回归网络中,我们使用神经网络代替线性模型,该模型可以任意增加容量,理论上可以拟合任意联合分布。神经自回归网络还使用了特征重用的技巧,例如神经网络从观察变量 x i 学习到的隐藏抽象特征 h i 不仅会在计算 p ( x i +1 | x i , x i -1 ,…, x 1 )时使用,也会在计算 p ( x i +2 | x i +1 , x i ,…, x 1 )时进行重用,其计算图如图1-6所示。同时,该模型不需要分别使用不同神经网络表示每个条件概率的计算,而是可以整合为一个神经网络,因此只要设计成抽象特征 h i 只依赖于 x 1 , x 2 ,…, x i 即可。目前,神经自回归密度估计器是神经自回归网络中比较具有代表性的方案,它引入了参数共享的方案,即从观察变量 x i 到任意隐藏抽象特征 h i +1 , h i +2 ,…的权值参数是共享的。总之,使用了特征重用、参数共享等深度学习技巧的神经自回归密度估计器具有更优秀的性能。
图1-5 线性自回归网络计算图
图1-6 神经自回归网络计算图
WaveNet [ 1 ] 是谷歌提出的一个语音生成模型,用于自回归地生成语音序列。它所采用的主要计算模块是空洞因果卷积,核心思想是基于之前时间节点的语音信息生成当前时间节点的语音信息。空洞因果卷积如图1-7所示,在每一层的一维卷积神经网络中,其输出依赖于前一层的第 t 个和第 t-d 个时间节点的信息,其中 d 为空洞因子,例如第1、2、3个隐层的空洞因子分别为1、2、4。需要说明的是,当前时间节点的语音不会与之前所有时间节点的语音建立某种联系,故样本概率的表达式与式(1.11)有所出入,具体的依赖关系由卷积层的设定决定。在输出语音信息时,先通过 μ -law量化方法获得256维的概率分布,每一个维度表示一个语音信号数值,然后从概率分布中采样获得当前时间节点的信号。
PixelRNN和PixelCNN [ 2 ] 也属于完全可见置信网络。从名字可以看出,这两个模型一般用于图像的生成。它们将图像 x 的概率 p ( x )按照像素分解为 n 个条件概率的乘积,其中 n 为图像的像素点个数,即在每一个像素点上定义了一个条件概率,用以表达像素之间的依赖关系,该条件概率分别使用循环神经网络(RNN)或者卷积神经网络(CNN)进行学习。为了将输出离散化,通常将RNN或CNN的最后一层设置为softmax层,用以表示其输出不同像素值的概率。在PixelRNN中,我们一般定义从左上角开始沿着右方和下方依次生成每一个像素点,如图1-8所示。当设定了节点依赖顺序后,便可以得到样本的对数似然的表达式,后续在训练模型时只需要将其极大化即可。
图1-7 WaveNet空洞因果卷积示意图(见彩插)
图1-8 PixelRNN生成像素顺序
PixelRNN在其感受野内可能具有无边界的依赖范围,因为待求位置的像素值依赖之前所有已知像素点的像素值,这将需要极大的计算代价。PixelCNN使用标准卷积层来捕获有界的感受野,其训练速度要快于PixelRNN。在PixelCNN中,每个位置的像素值仅与其周围已知像素点的值有关,如图1-9所示。上部分为已知像素,而下部分为未知像素,计算当前位置的像素值时,需要把方框区域内的所有已知像素值传递给CNN,由CNN最后的softmax输出层来表达在中间矩形位置取不同像素值的概率,这里可以使用由0和1构成的掩膜矩阵将方框区域内的灰色位置像素抹掉。PixelRNN和PixelCNN此后进行了非常多改进,例如为了在生成像素时消除盲点,Gated PixelCNN [ 3 ] 将感受野拆分为水平和垂直两个方向,进一步提升了生成质量。但由于它是逐个像素点地生成图像,像素点前后存在依赖关系,具有串行性,故在实际应用中采样效率难以保证,这也是诸多FVBN类模型经常出现的问题。
图1-9 PixelCNN原理
PixelCNN模型是完全可见置信网络中比较易于理解的模型,以下为PixelCNN模型的核心代码:
流模型是一种想法比较直接但实际不容易构造的生成模型,它通过可逆的非线性变换等技巧使得似然函数可以被精确计算出来。相较于FVBN,流模型添加了隐变量的概念,并通过某种确定性的映射关系建立了隐变量到观察变量之间的联系。
我们首先介绍流模型的基本思想。对于一个分布比较简单(例如高斯分布)的隐变量 z ,其概率密度分布记为 p z ( z ),这时若存在一个连续、可微、可逆的非线性变换 g ( z ),将简单的隐变量 z 的分布转换成关于样本 x 的一个复杂分布,我们将非线性变换 g ( z )的逆变换记为 f ( x ),即有 x = g ( z )和 z = f ( x ),则可得到样本 x 的准确的概率密度函数 p x ( x ):
注意,非线性变换 g ( z )会引起空间的变形,即 p x ( x )≠ p z ( f ( x )),但有 p z ( z )d z = p x ( x )d x 。对于可逆矩阵有det( A -1 )=det( A ) -1 ,故 p x ( x )也可写为:
若上述模型构建成功,则生成样本时只需从简单分布 p z ( z )中随机采样然后使用非线性变换将其变换为 x = g ( z )即可。
为了使用极大似然估计法训练上述生成模型,我们必须计算样本的概率密度函数 p x ( x )。分析上式,要计算概率密度函数 p x ( x ),就需要计算 p z ( z )和雅可比矩阵的行列式绝对值。 p z ( z )理论上可以具备任意的形式,但是通常设计为简单的分布,例如高斯分布 N (0, I ),这样便于进行计算和采样。我们将 p z ( z )为标准高斯分布的流模型称为标准流模型(normalizing flow model);对于雅可比矩阵,要将 f ( x )设计为某种特殊的形式,使得雅可比矩阵的行列式易于计算。另外,变换的可逆性要求样本 x 和隐变量 z 具有相同的维度。综上,我们需要将上述模型精心设计成一种易于处理且灵活的双射模型,使其逆变换 f ( x )存在,且对应的雅可比矩阵的行列式可高效计算。
在实际的流模型中,非线性映射 f ( x )是由多个映射函数 f 1 , f 2 ,…, f k 组合而成的,即 z = f k °…° f 1 ( x )和 x = ( z ),一个变量连续流过多个变换最终“形成”另一个变量,这就是流模型中流的意义。相应地,雅可比矩阵的行列式可分解为:
此处,我们介绍两种非常基本的流:仿射流(affine flow)和元素流(element-wise flow)。在仿射流中,非线性映射 f ( x )= A -1 ( x-b )将样本 x 映射到标准正态分布,其中可学习参数 A 为非奇异方阵, b 为偏置向量,采样过程为先采样获得 z ,再根据 x = Az + b 获得样本。仿射流模型中的雅可比矩阵为 A -1 ,即行列式的计算难度源于矩阵的维度数目是多少。在元素流中,映射是逐元素进行的,即 f ( x 1 ,…, x n )=( f ( x 1 ),…, f ( x n )),则雅可比矩阵为对角矩阵:
其行列式也容易计算,即:
为了使读者对流模型有更深刻的理解,我们对NICE模型 [ 4 ] 进行详细的介绍。NICE模型的逆变换 f ( x )由多个加性耦合层和一个尺度变换层构成。在每个加性耦合层中,首先将 n 维样本 x 分解为两部分, x 1 和 x 2 ,例如可以将 x 的第1,3,5,…个元素划入 x 1 部分,将第2,4,6,…个元素划入 x 2 部分,每个部分的维度均为 n /2;也可以将 x 的第2,4,6,…个元素划入 x 1 部分,将第1,3,5,…个元素划入 x 2 部分;还可以使用其他划分方式。然后对两部分进行变换:
其中 m ()为任意函数,注意这里要保证 m ()的输出结果维度与 x 2 一致,NICE模型使用多层全连接网络和ReLU激活函数来构建 m ()。容易发现,使用加性耦合层作为逆变换 f ( x )的一部分,它是可逆的,并且雅可比矩阵的行列式也是容易计算的。当已知 h 1 和 h 2 时,可得其逆变换:
其雅可比矩阵为:
根据三角矩阵的性质,其行列式为对角元素的乘积,故加性耦合层雅可比矩阵的行列式绝对值为1。当将多个加性耦合层串联时,NICE模型结构如图1-10所示。由于每层的逆变换是容易计算的,因此串联后的逆变换仍然是容易计算的。此时的雅可比矩阵为:
图1-10 NICE模型结构
根据矩阵行列式的性质,有:
需要说明的是,必须注意在不同的加性耦合层使用不同的划分策略,使得样本不同维度的信息充分混淆。在尺度变换层,定义了一个包含 n 个非负参数的向量 s =[ s 1 , s 2 ,…, s n ],将加性耦合层的输出结果 h ( l ) 与 s 逐元素相乘可得到对应的隐变量 z 。这里 s 用于控制每个维度的特征变换的尺度,可以表征维度的重要性,对应维度的数值越大,表明这一维度的重要性越低。显然,尺度变换层的逆变换只需逐元素乘1/ s ,因此生成样本时隐变量需要先经过尺度变换层,需要逐元素乘1/ s 。尺度变换层作为一种元素流,其雅可比矩阵为:
由此,其雅可比矩阵的行列式为 s 1 s 2 … s n 。现在,我们就构造了可逆的、雅可比矩阵的行列式绝对值易于计算的逆变换 f ( x )。对于隐变量 z ,NICE模型假设其 n 个维度彼此独立,即
若选择 z 为高斯分布,则样本 x 的似然函数为:
若选择 z 为logistic分布,即:
则样本 x 的似然函数为:
此时,我们可以使用极大似然法对NICE模型进行训练,训练完成后也得到了生成模型 g ( z )。若 z 为高斯分布,则直接从高斯分布中采样可得到 z ;若选择 z 为logistic分布,则可先在0-1之间的均匀分布中采样得到 ε ,然后使用变换 z = t ( ε )得到隐变量。根据两个随机变量的映射关系
则有 t ( ε )=log ε -log(1 -ε )。对隐变量 z 进行非线性变换 g ( z ),即经过尺度变换层的逆变换、多个加性耦合层的逆变换可得到生成样本 x 。
NICE模型的核心代码如下所示:
Real NVP [ 5 ] 模型和Glow [ 6 ] 模型在NICE模型的基础上进行了改进,例如在耦合层中引入了卷积操作,添加了多尺度结构等,进一步提升了生成样本的质量。此外,在自回归模型中引入非线性映射可构建为自回归流模型,主要包括掩膜自回归流(Masked Autoregressive Flow,MAF)、以及逆自回归流(Inverse Autoregressive Flow,IAF)两大类,它们由于设计方法存在较大差异,故在计算似然函数的速度上分别具有不同的优势。总体而言,流模型通过精巧的设计使得样本的概率密度函数可以精确计算,具有非常优雅的理论支撑,但不足之处在于运算过程复杂,并且训练时间过长,实践效果与GAN等模型仍有差距。
自编码器(autoencoder)在深度学习中占有重要地位,它最开始只是用于降维或者特征学习。一般的自编码器由编码器(encoder)和解码器(decoder)两个神经网络构成,如图1-11所示。
图1-11 自编码器结构
样本 x 经过编码器得到它的某种编码表示 z ,而且 z 的维度一般小于 x ,再将编码向量 z 送入解码器则可得到样本 x 的重构 x ′。如果重构的效果比较好,则认为编码器成功地学到了样本的抽象特征,也可以理解为实现了降维。当学习到数据的抽象特征 z 后,我们不仅可以用于样本的重构,也可以把提取到的抽象特征用于分类问题,只需要在编码器后接一个分类器即可,如图1-12所示。隐变量在生成模型中具有非常重要且广泛的应用,一方面它可以对样本进行某种“有意义”的表示;另一方面,基于隐变量的模型相对于FVBN模型具有更高的采样速度。因为FVBN模型中只包含观察变量,且观察变量被建立前后依赖关系,所以我们可以将其中的部分观察变量修改为隐变量(隐变量是指不可观测到的变量,但它与模型中可观察变量存在某种相关关系),并建立两者的条件概率关系,从而获得更快的采样速度。
图1-12 将自编码器用于分类任务
VAE [ 7 ] 将自编码器构建成一个生成模型。它将 z 视为生成样本的隐变量,并对编码器和解码器进行了一些修改,最终实现了一个性能卓越的生成模型。与FVBN和GAN等生成模型不同,VAE希望定义一个通过隐变量来生成样本的生成模型:
这个生成模型生成样本的方式十分简洁优雅:先从隐变量的分布 p θ ( z )中采样得到 z ,然后在条件分布 p θ ( x|z )中采样即可生成样本,但是这个生成模型无法被直接搭建出来!因为训练生成模型通常需要将对数似然函数极大化来求解模型参数 θ ,即对 N 个独立同分布的训练样本{ x (1) , x (2) ,…, x ( N ) }来说,要求: 。这里必然要计算 p θ ( x ),分析 p θ ( x )的计算式子。积分号内部是相对容易求解的,对于隐变量 z 的先验分布 p θ ( z ),可以将其设计为简单的高斯分布,对于 p θ ( x|z ),可使用一个神经网络来学习,难以解决的地方是求积分时需要遍历所有的隐变量 z ,因为 z 在理论上是不可能被精确地遍历的。另外,隐变量 z 的后验分布为:
它也是难以求解的。训练生成模型必须先求解对数似然函数(也就是说以似然函数作为损失函数),然后使其最大。VAE的想法是:虽然无法求解准确的对数似然函数,但可以设法得到对数似然函数的下界,然后令其下界极大化,这就相当于近似地令对数似然函数达到极大。具体做法是,VAE引入一个新的概率分布 q φ ( z|x )来逼近后验分布 p θ ( z|x ),这时的对数似然函数为:
最终的式子由三项组成,前两项是可以计算的,第三项无法计算,但是根据KL散度的性质可知第三项必定大于或等于0,也就是说
我们将上述不等式右侧称为一个变分下界(ELBO),记为 l ( x ( i ) ; θ , φ ),这时只需要最大化变分下界即可,即将变分下界作为模型的损失函数:
至此,VAE的最核心的想法已实现,接下来将描述一些细节,例如,如何将数学模型转换到神经网络上?即如何计算变分下界 EBLO?首先来看 EBLO的第二项D KL ( q φ ( z | x ( i ) ) p θ ( z )),计算隐变量 z 的后验分布的近似分布 q φ ( z | x ( i ) )和隐变量的先验分布 p θ ( z )的KL散度。基于实际经验,我们做出两个基本假设:①隐变量的先验分布 p θ ( z )为 D 维标准高斯分布 N (0, I ),注意这时的 p θ ( z )将不包含任何未知参数,重新记为 p ( z );②隐变量的后验分布的近似分布 q φ ( z | x ( i ) )为各分量彼此独立的高斯分布 N ( μ , Σ ; x ( i ) ),也就是说,每一个样本 x ( i ) 均对应一个 D 维高斯分布 N ( μ , Σ ; x ( i ) )。现在只需要再知道 μ ( x ( i ) )、 Σ ( x ( i ) )就可以计算KL散度了。我们用两个神经网络(即编码器,参数为 φ )来求解均值、方差的对数(因为方差的对数的值域为全体实数,而方差的值域为全体正实数,使用神经网络拟合方差的对数不需要精确限定激活函数,相对方便)。由于 D 维隐变量 z 的每个维度彼此独立,则均值为 D 维向量,而方差为 D 维对角矩阵,即
此时,方差其实也只有 D 个需要学习的参数,而不是 D 2 个。那么这里的编码器的输入为样本 x ( i ) ,第一个编码器输出 D 维向量[ μ 1 , μ 2 ,…, μ D ],第二个编码器的输出也为 D 维向量[ ],即
由于两个高斯分布的每个维度彼此独立,KL散度可分开计算,其中第 d 维的KL散度值为:
上述计算过程比较简单,在此不展开。易知总KL散度为:
在计算上,通过让编码器学习隐变量后验分布的近似分布的均值和方差,我们得到了隐变量后验分布的近似分布的概率密度表达式,从而可以计算 KL散度。本质上,VAE训练编码器是希望KL散度值达到最小,即令后验近似分布趋近于标准高斯分布,也就是说,对每个样本 x ( i ) , q φ ( z | x ( i ) )都向高斯分布靠拢。
现在来看ELBO的第一项 E z [log p θ ( x ( i ) | z )]。为了计算这一项,我们需要使用一个经验上的近似:
计算这一项时并不需要采样所有不同 z 再计算log p θ ( x ( i ) | z ),而只需要从中采样一次即可。这样的做法看似不合理,但实际效果证明约等于的关系是成立的,另外,联想到一般的自编码器中是一一映射的,即一个样本 x 对应一个隐变量 z ,可认为 q φ ( z | x ( i ) )是一个非常锐利的单峰分布,故多次采样计算均值和一次采样效果相差不大。接下来,为了计算log p θ ( x ( i ) | z ),我们再次做出假设,假设 p θ ( x|z )是伯努利分布或高斯分布。当假设为伯努利分布时,对应的 x 为二值(0 1)、 Q 个维度彼此独立的向量,将伯努利分布的 Q 个参数[ ρ 1 , ρ 2 ,…, ρ Q ]交给神经网络学习,这个神经网络即解码器,它由 θ 来参数化,其输入为隐变量 z ,输出为[ ρ 1 , ρ 2 ,…, ρ Q ],即
现在可以计算样本的似然为:
相应的对数似然函数为:
所以只需要把编码器的最后一层激活函数设计为sigmoid函数,并使用二分类交叉熵作为解码器的损失函数即可。若假设 p θ ( x ( i ) | z )为高斯分布,对应的 x 为实值、 Q 个维度彼此独立的向量,将该高斯分布每个维度的方差固定为某个常数 σ 2 ,而 Q 个均值参数[ μ 1 , μ 2 ,…, μ Q ]交给神经网络学习,这个神经网络即解码器,它同样由 θ 来参数化,输入为隐变量 z ,输出为[ μ 1 , μ 2 ,…, μ Q ],即
现在可以计算样本的似然函数为:
相应的对数似然为:
所以需要把编码器的最后一层激活函数设计为值域为全体实值的激活函数,并使MSE作为损失函数。在计算上,我们基于经验知识使用了一次采样的近似操作,并依靠编码器学习 p θ ( x|z )的参数,最后计算条件概率下样本的似然。VAE希望将解码器部分对应的损失函数的值最大,本质上是希望样本的重构误差最小,这在伯努利分布中非常明显,而在高斯分布中,MSE损失希望编码器的输出(高斯分布的均值)与样本尽可能接近。
回顾上面的过程,训练流程是这样的:将样本 x ( i ) 送入解码器可计算得到隐变量后验近似分布的各项参数(即高斯分布的均值和方差),这时需要从分布中采样一个隐变量 z ,然后将 z 送入解码器,最后计算损失函数,并反向传播更新参数。其实这里有一个小问题,从分布中采样的过程是不可导的,即编码器计算的均值和方差参数在采样得到隐变量后就被“淹没”了,解码器面对的只是一个孤立的、不知从哪个高斯分布采样得到的 z 。我们需要把 μ ( x ( i ) )、 σ ( x ( i ) )与编码器建立计算上的联系,否则反向传播时,梯度传播到采样得到 z 的环节就会中断。重参数技巧(Reparameterization Trick)做了一个简单的处理,它直接在标准正态分布中采样 N (0, I )得到 ε ,然后令 z = μ + ε × σ ,这样,反向传播的环节被打通,如图1-13所示。
图1-13 变分自编码器正向计算
训练完成后,直接从 p ( z )中采样得到隐变量 z ,然后送入解码器,在伯努利分布中解码器输出样本每个维度取值的概率;在高斯分布中解码器输出均值,即生成的样本。
VAE与GAN经常被用来进行比较,GAN属于隐式概率生成模型,在GAN中没有显式出现过似然函数,而VAE属于显式概率生成模型,它也试图最大化似然函数,但是不像FVBN模型中存在精确的似然函数以供其最大化,而是得到了似然函数的下界,近似地实现了极大似然。在图像生成问题上,VAE的一个比较明显的缺点是,生成图像模糊,这可能是使用极大似然的模型的共同问题,因为极大似然的本质是最小化D KL ( p data || p model ),这个问题的解释涉及KL散度的性质,在此不再展开。
VAE模型的核心代码如下:
玻尔兹曼机属于另一种显式概率模型,是一种基于能量的模型。训练玻尔兹曼机同样需要基于极大似然的思想,但在计算极大似然梯度时,还需要运用一种不同于变分法的近似算法。玻尔兹曼机已经较少引起关注,故在此我们只简述。
在能量模型中,通常将样本的概率 p ( x )建模成如下形式:
其中, Z = 为配分函数。为了增强模型的表达能力,通常会在可见变量 v 的基础上增加隐变量 h ,以最简单的受限玻尔兹曼机(RBM)为例,RBM中的可见变量和隐变量均为二值离散随机变量(当然也可推广至实值)。它定义了一个无向概率图模型,并且为二分图,其中可见变量 v 组成一部分,隐藏变量 h 组成另一部分,可见变量之间不存在连接,隐藏变量之间也不存在连接(“受限”即来源于此),可见变量与隐藏变量之间实行全连接,结构如图1-14所示。
图1-14 受限玻尔兹曼机结构图
在RBM中,可见变量和隐藏变量的联合概率分布由能量函数给出,即
其中能量函数的表达式为:
配分函数 Z 可写为:
考虑到二分图的特殊结构,当隐藏变量已知时,可见变量之间彼此独立;当可见变量已知时,隐藏变量之间也彼此独立,即有 以及 p ( v|h ) = ,进一步地,我们可得到离散概率的具体表达式:
为了使RBM与能量模型有一致的表达式,定义可见变量 v 的自由能 f ( v )为:
其中 h i 为第 i 个隐藏变量,此时可见变量的概率为:
配分函数 Z 为 。使用极大似然法训练RBM模型时,我们需要计算似然函数的梯度,记模型的参数为 θ ,则
可以看出,RBM明确定义了可见变量的概率密度函数,但它并不易求解,因为计算配分函数 Z 时需要对所有的可见变量 v 和隐藏变量 h 求积分,所以无法直接求解对数似然函数log p ( v ),故无法直接使用极大似然的思想训练模型。但是,若跳过对数似然函数的求解而直接求解对数似然函数的梯度,也可完成模型的训练。对于 θ 中的权值、偏置参数有
分析其梯度表达式,其中不易计算的部分在于对可见变量 v 的期望的计算。RBM通过采样的方法来对梯度进行近似,然后使用近似得到的梯度进行权值更新。为了采样得到可见变量 v ,我们可以构建一个马尔可夫链并使其最终收敛到 p ( v ),即设置马尔可夫链的平稳分布为 p ( v )。初始随机给定样本,迭代运行足够次数后达到平稳分布,这时可根据转移矩阵从分布 p ( v )连续采样得到样本。我们可使用吉布斯采样方法完成该过程,由于两部分变量的独立性,当可见变量(或隐藏变量)固定时,隐藏变量(可见变量)的分布分别为 h ( n +1) ~sigmoid( W T v ( n ) + c )和 v ( n +1) ~sigmoid( Wh ( n +1) + b ),即先采样得到隐藏变量,再采样得到可见变量,这样,我们便可以使用“随机极大似然估计法”完成生成模型的训练了。
玻尔兹曼机依赖马尔可夫链来训练模型或者使用模型生成样本,但是这种技术现在已经很少使用了,这很可能是因为马尔可夫链近似技术不能被适用于样本维度较大的生成问题。并且,即便马尔可夫链方法可以很好地用于训练,但是使用一个基于马尔可夫链的模型生成样本需要花费很大的计算代价。
受限玻尔兹曼机 [ 8 ] 的核心代码如下所示:
隐式生成模型通常也是使用隐变量 z 来辅助构建的,即首先在一个固定的概率分布 p z ( z )(例如高斯分布、均匀分布等)中采样获得噪声 z ,然后利用神经网络将其映射为样本 x 。这类想法与流模型、VAE是一致的,但是不同之处在于流模型之类的训练方法为极大似然法,需要对概率密度函数 p ( x )或者似然函数log p ( x )进行某种处理。隐式生成模型的核心目的同样是使 p g ( x )接近 p data ( x ),它并没有显式对概率密度函数或似然函数进行建模或近似,但依旧可以通过训练数据与 p data ( x )间接交互,典型代表有GSN [ 9 ] (生成随机网络)和GAN [ 10 ] 。在隐式生成模型中,我们无法获得 p ( x )的(近似)表达式,表达式是隐藏在神经网络中的,模型只能生成样本。
实践表明,即使模型具有非常高的似然函数值但它仍旧可能生成质量不高的样本。一个极端的例子是模型只记住了训练集中的样本,显式生成模型不会总那么可靠。避开似然函数而获得生成模型的另一条路线是使用两组样本检验(two sample test)。例如,生成模型可以生成大量样本 S 1 ,训练数据集存在大量样本 S 2 ,我们可以检查 S 1 和 S 2 是否来自同一概率分布,然后不断优化生成模型使得两组样本能够检验通过。与上述想法类似,实际上的隐式生成模型是先计算比较 p g ( x )和 p data ( x )的某种差异,然后使得两者的差异尽可能最小。在选择这种比较差异时,可以分为基于密度比 p ( x )/ q ( x )和密度差 p ( x ) -q ( x )两类方法。前一类可进一步分为概率类别估计(标准GAN)、散度最小化(fGAN)和比例匹配(b-GAN)等3种方法;第二类方法主要以IPM类方法为代表,包括WGAN、MMDGAN等模型。不同的比较差异方法则对应不同的损失函数,例如MMD、JS散度、最优传输距离等。需要说明的是,当选择KL散度时,则得到了之前的极大似然法的优化目标E x [log p θ ( x )]。对于该优化目标的计算,显式生成模型的做法是对其做分解、近似等计算上的处理,而隐式生成模型则通过两类样本和神经网络直接拟合距离的数值。
以GAN为例,由于不存在显式的概率密度函数 p g ( x ),故GAN无法直接写出似然函数而使用极大似然法。它直接使用生成器从噪声中采样并直接输出样本,然后借助判别器学习 p data ( x )和 p g ( x )的距离,再训练生成器使上述距离最小。可以看出,GAN是通过控制生成器来间接控制 p g ( x )的。相比完全可见置信网络,GAN可以并行产生样本,效率更高;玻尔兹曼机因为需要使用马尔可夫链进行近似,故对概率分布有一定的要求。同样地,流模型也要求变换函数 x = g ( z )可逆,噪声与样本维度相同,虽然雅可比矩阵的行列式容易求解,但GAN使用生成器作为生成函数则没有可逆和维度上的限制,也没有概率分布的限制;此外,GAN不需要马尔可夫链的参与,不需要花很多精力产生一个样本,相比于玻尔兹曼机和生成随机网络效率较高;GAN相比于变分自编码器,也不需要对似然函数的变分下界进行处理。总体来看,GAN是一个非常简洁、高效的模型,但不足之处在于难以训练,理论上全局纳什均衡几乎不可能达到,并且容易模式崩溃,产生样本的多样性较差。