前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度生成模型

深度生成模型

作者头像
数据科学人工智能
发布2022-03-31 15:14:32
1K0
发布2022-03-31 15:14:32
举报

本次课将首先介绍生成模型的概念以及适用场景。进一步讲解基于能量的模型,包括受限玻尔兹曼机(RBM)和深度玻尔兹曼机等。它们既是早期的神经网络模型,也是经典的生成模型。接着介绍目前常见的深度生成模型,包括自编码器和变分自编码器。最后,介绍生成对抗网络(GAN)及其变种。

http://mpvideo.qpic.cn/0bf2r4aaaaaateahex3jnvpfbd6dachqaaaa.f10002.mp4?dis_k=6cd11b56975532d25f4adcd1a718a3d8&dis_t=1648707402&vid=wxv_1247830927829499904&format_id=10002&support_redirect=0&mmversion=false

  • 1 生成模型
  • 2 基于能量的模型:玻尔兹曼机
  • 3 变分自编码器
  • 4 生成对抗网络(GAN)

1 生成模型介绍

下图展示了生成模型的分类。其中基于极大似然的生成模型分为概率密度和有隐式概率密度两种。还可以进一步对这些模型进行划分。本次课程讲解其中的一部分,例如玻尔兹曼机、VAE还有GAN等。

生成模型能够从训练集中学习数据分布。学到数据分布之后,就可以生成新的数据样本。如下图所示,给定一个二维点集,假设它是由一个随机变量生成出来的。假设这个随机变量服从正态分布p(\boldsymbol{z}) 。根据观测到的数据点,能够估计正态分布的均值和方差。知道p(\boldsymbol{z}) 之后,可以根据p(\boldsymbol{z}) 来生成一些新的数据点。

我们可以将这个例子进行拓展,将\boldsymbol{z} 看作一幅图像或者自然语言的句子。比如把\boldsymbol{z} 想象成一幅图像。给定观测到的手写数字的图像集合,可以尝试学习手写数字图像的分布p(\boldsymbol{z}) 。然后根据p(\boldsymbol{z}) 采样,来生成下图右边所示的图像。在这个例子中,生成模型主要做的事情是抓住手写数字图像的结构,以生成的类似的图像。

生成模型在很多领域都有着重要的应用。

  • 可以很好地对使用一些高维的、复杂的概率分布的能力可以进行测试。因为我们经常用概率密度函数去建模一些数据。对于低维数据,可以用一些很好的分布去拟合它。但是对于高维分布,很难去回答究竟建模效果如何。比如对于图像数据我们设计一个模型并学习到了p(\boldsymbol{z} 的参数,那么p(\boldsymbol{z}) 究竟对数据刻画有多好?一种测试方法是看它生成的图像到底怎么样,是不是像原始的图像。所以这是一个很好的测试方法。
  • 在强化学习中,当环境发生变化之后,可以利用生成模型去生成预测。
  • 在半监督学习中,我们有少量的带标签数据,但是有大量的无标签数据。要把半监督学习做好,就要刻画这些无标签的数据和有标签的数据在空间中是如何分布和生成的。
  • 多模态输入以及现实的生成任务。比如说做一些艺术创作,我们需要生成一些现实的图像。这些现实图像又是多模态的,例如图像中不只有一种花,而是有好多种花。

2 基于能量的模型

2.1 基于能量的模型

基于能量的模型中常用的一个概率分布是玻尔兹曼分布,其概率密度函数形式如下。

p(\boldsymbol{z}) = \frac{e^{-E(\boldsymbol{z})}}{\sum_z e^{-E(\boldsymbol{z})}}

其中E(\boldsymbol{z}) 为能量函数,\sum_z e^{-E(\boldsymbol{z})} 为配分函数或归一化常数。

当一个事件发生的概率最大的时候,能量最低。例如自然界中的一些事物或者物质,其实是处于低能态,因为高能态的东西不太稳定。所以要使得E(\boldsymbol{z}) 比较小的时候,概率密度比较大。

在基于能量的模型(EBM)中还要加入隐变量来刻画数据生成。为了便于描述,我们将上述\boldsymbol{z} 改记为\boldsymbol{x} 。比如假设\mathcal{F}(\boldsymbol{z}) 包含隐变量\boldsymbol{h} 。所以p(\boldsymbol{x}) 可以写成包含隐变量\boldsymbol{h} 的联合概率密度函数。在物理学,\mathcal{F}(\boldsymbol{x}) 称为自由能。

已知p(\boldsymbol{x}) 的形式后,可以使用极大似然估计来学习参数。给定n 个训练样本,将似然函数作为优化目标,然后用梯度下降法来求解。注意配分函数\log Z 包含参数信息,不能忽略。关于怎样求解这个东西,这节课就不详细讲了。简单来说,因为Z 涉及高维积分,求导时我们需要对模型进行一些采样。

2.2 玻尔兹曼机(BM)

基于能量的模型的一个典型例子是玻尔兹曼机。它其实是一个物理概念。在玻尔兹曼机中,能量函数是观测数据变量的一个二次函数。

其中\boldsymbol{U} 是参数矩阵,\boldsymbol{b} 是偏置向量。根据训练数据学习模型,主要是估计参数\boldsymbol{U}\boldsymbol{b} 。玻尔兹曼机是一个多维联合概率分布,极大似然估计可以解决学习的问题。

假设\boldsymbol{v} 为观测变量,玻尔兹曼机里还可以加入一些隐变量\boldsymbol{h} 。此时能量函数同样也是二次函数,但是此时还包含交叉项。例如,观测变量\boldsymbol{v} 和隐变量\boldsymbol{h} 之间的交叉项,还有隐变量与隐变量之间的二次项、偏置变量。

2.2 受限玻尔兹曼机和深度玻尔兹曼机

玻尔兹曼机求解非常困难。研究人员设计了一种称为受限玻尔兹曼机(简称RBM)的随机神经网络。在该网络结构中,只有隐层节点和可见层节点存在连接。

将RBM展开,\boldsymbol{v} 就是观测到的数据点,比如说一共有n\boldsymbol{v} 这样的观测数据点。\boldsymbol{v} 的每一维就是观测层中的节点,它们相互之间没有连接。隐层之间也没有连接。只有隐层和观测层之间有连接。所以RBM的结构图是一个二分图。这个是方便我们做求解做的一些假设。

举个简单的例子,如果\boldsymbol{v} 是一幅图像,那么\boldsymbol{h} 刻画什么?h_1 可能刻画图像中人的鼻子是什么形状的,h_2 刻画人脸的胖瘦情况等。

RBM的参数主要是\boldsymbol{W} 以及\boldsymbol{h}\boldsymbol{b} 的偏置。由于只有\boldsymbol{v}\boldsymbol{h} 之间有交互,通过\boldsymbol{W} 参数矩阵连接。最终的配分函数需要把\boldsymbol{h}\boldsymbol{v} 积分掉。常见的RBM的\boldsymbol{v}\boldsymbol{h} 都是二值的,这样求解的时候才比较方便,如果是实数值的话就比较麻烦。

RBM不要求层内节点之间有连接。它还有一个性质,给定\boldsymbol{v} \boldsymbol{h} 的各个维度之间相互条件独立;给定\boldsymbol{h}\boldsymbol{v} 的各个维度之间也相互条件独立。我们可以使用概率图模型中的D分离准则(D-Separation)来验证这种条件独立性。

条件独立的好处是,给定\boldsymbol{h} 之后,\boldsymbol{v} 的节点之间相互独立,给定\boldsymbol{v}\boldsymbol{h} 之间也是相互独立的。如果假设所有的\boldsymbol{h}\boldsymbol{v} 的节点都是二次函数,那么概率密度函数其实就是一个Sigmoid函数。这给模型的求解带来很大的方便。

RBM主要是作为构建深度波尔兹曼机的一个组件。怎么构建呢?输入数据是可见层。在这上面堆叠多层RBM。每一层代表对原始数据的抽象表示。每个RBM将上一层的输出作为输入,RBM中的隐含单元数量可以调整。

以二层DBM为例,观测数据作为初始的输入,\boldsymbol{v}\boldsymbol{h}^1 之间有一个连接权重\boldsymbol{W}^1 。能量函数就能写成下图所示的形式,相当于把两层都叠在一起。然后联合分布函数就很自然了。这就是深度波尔兹曼机。

怎么去训练DBM呢?凭借深度学习方面的研究获得图灵奖的Jeffrey Hinton做了很多关于DBM的工作,他提出了一种DBM的训练方式叫预训练(pre-training)。

给定观测数据以及堆叠起来的网络结构,先训练第1层,把第1层训练好之后不管了。再把\boldsymbol{h}^1 作为\boldsymbol{h}^2 的输入进行训练。然后依次不停去做这样的训练。这是一个贪心算法,获得的解显然不一定是最优的,因为它没有把\boldsymbol{h}^1\boldsymbol{h}^2 联合一起训练。

通过这种方式把\boldsymbol{h}^1\boldsymbol{h}^2 训练好之后,在\boldsymbol{h}^2 上面会接一个输出项,比如做分类时让它去输出标签概率。所以,预训练完之后就知道了参数\boldsymbol{W}^1\boldsymbol{W}^2 。将这些参数取值对相同结构的多层感知机网络进行初始化,使用反向传播算法进行精调(fine tuning)。

其实,预训练加精调是一个非常早期的做有监督学习图像分类的方法。后期有了更强大的网络结构比如说AlexNet和ResNet,就很少用这种方法了。然而这是深度学习发展中一个比较重要的阶段。

这样训练的网络能做很多事情。如果做生成,比如对于28×28的手写数字,可以将500个节点或1000个节点的隐层堆叠。学出来RBM之后,就可以采样数据。

在上图中,相当于给定第3层,即将隐层定为\boldsymbol{h}^3 ,然后可以采样\boldsymbol{h}^2 ;给定\boldsymbol{h}^2 ,可以采样\boldsymbol{h}^1 ;给定\boldsymbol{h}^1 就能采样手写数字的图像数据。在黑白图像中生成效果是不错的。如果把它用在彩色图像上,确实有些困难。目前来说,在一些简单的二值问题上,RBM和DBM还做的比较好。

3 变分自编码器

接下来讲一个比较重要的网络结构:变分自编码器(简称VAE)。在此之前,先要了解一下什么是自编码器。

3.1 自编码器

自编码器是一个用来做无监督学习的神经网络。什么是无监督学习呢?就是给定\boldsymbol{x} ,我们想学习\boldsymbol{x} 的表示,比如\boldsymbol{z}

搭建自编码器有三步:编码器、解码器和设定目标函数(损失函数)。首先,把\boldsymbol{x} 经过一个编码器f 编码到\boldsymbol{h} ,这就是它隐层的表示。再把\boldsymbol{h} 解码,通过一个解码器g 解码到\boldsymbol{r} ,这就是重建。

如何设定目标函数?无监督学习很重要的一点就是怎么构建目标函数。在这一点上自编码器和主成分分析本质是一样的,就是希望重建后的\boldsymbol{r} 和最原始的\boldsymbol{x} 要尽量地接近。所以目标函数可以设定为重建误差,其参数就是编码器f 和解码器g 的参数。

自编码器的应用很多,比如可以做降噪,输入\boldsymbol{x} 是一个有噪音的数据,通过压缩然后再重建出来无噪音的数据。如果把数据压缩到低维,比如二维,则可以进行可视化展示。

自编码器和主成分分析怎样去类比?主成分分析其实只能做一些非常简单的线性变换,找隐式表达。但是自编码器很重要的一点就是每一个变化都是非线性的,可以进行非线性特征变换,找出一些更强大更有用的特征。

3.2 变分自编码器

变分自编码器的基本思路和自编码器一样。比如一个三层的自编码器网络,有了\boldsymbol{x} 之后把它编码到\boldsymbol{z} 上,然后\boldsymbol{z} 去重建\boldsymbol{x}

只不过\boldsymbol{x}\boldsymbol{z} 之间是一个概率分布的形式。即是我们要学习概率分布p(\boldsymbol{z}|\boldsymbol{x})p(\boldsymbol{x}|\boldsymbol{z}) 。所以,从某种程度上来说,它是一个概率模型去做这件事情。变分自编码器采用了变分推断学习这个概率分布。

从神经网络视角来看,变分自编码器包含编码器、解码器和损失函数三部分。编码器就是给数据\boldsymbol{x} 要学一个\boldsymbol{z} 的分布

q_{\theta}(\boldsymbol{z}|\boldsymbol{x})。我们希望从\boldsymbol{z} 重建\boldsymbol{x} ,那就需要学习分布p_{\phi}(\boldsymbol{x}|\boldsymbol{z}) ,这就是解码器。除此之外,还要建立一个损失函数进行优化。

编码器和解码器都是神经网络,里面的参数其实主要是神经网络的参数。在这里,为了求解方便我们做了非常重要的假设,就是后验分布服从多元高斯分布。\boldsymbol{x} 映射成\boldsymbol{z} ,假设\boldsymbol{z} 服从高斯分布,解码器也是一样的,可以用神经网络和多层感知机来实现,也是一个高斯分布,参数为\boldsymbol{\mu}\boldsymbol{\sigma} ,这也是神经网络。

在变分自编码器里,通过变分推断求解的损失函数是l_{i}(\phi, \theta) 。先看后边这一项,给定\boldsymbol{z} ,由\boldsymbol{z} 重建出来的\boldsymbol{x}_i 概率要最大,再根据q_{\phi}(\boldsymbol{z}) 求期望,这一项相当于重建损失。前面还有一个正则项,相当于最终的后验分布不能偏离先验。参数就是编码器里的\theta ,解码器里的\phi

怎么优化这个目标函数?因为目标函数有很多期望,实际中主要使用采样的方式去估计期望。然后就用随机梯度下降来去求解。

也可以从概率图模型的视角来理解变分自编码器。在这个概率图模型中,隐变量为\boldsymbol{z} ,观测数据表示成\boldsymbol{x} 。分别如下图中的白色圆圈和阴影圆圈所示。每一个数据样本的生成过程为:先从p(\boldsymbol{z}) 采样隐变量\boldsymbol{z}_i 。然后再从条件概率分布

p(\boldsymbol{x}|\boldsymbol{z})

有这个模型之后可以定义联合分布p(\boldsymbol{x}, \boldsymbol{z}) 。我们来看一个变分自编码器在手写数字识别的应用。应用很简单,比如有这样一个观测图像作为训练的数据集,根据刚才的目标函数我们学到了编码器和解码器的最优参数。在生成数据的时候就随机生成\boldsymbol{z} 。根据条件概率分布p(\boldsymbol{x}, \boldsymbol{z}) ,给定\boldsymbol{z} ,就可以把图像生成出来。

变分自编码器是一个非常直接的生成模型。我们可以通过输入数据\boldsymbol{x} ,直接得到\boldsymbol{z} 也就是它的表示,对我们学习数据的特征(低维的表示),是比较容易直接的。

但是它也有一些缺点。在学术界,关于生成模型的评价方式其实也比较不一致。什么是一个好的生成式模型?这是个很大的问题。现在是用极大似然函数来比较模型到底做的好不好。然而,极大似然又是根据人为给定的,所以说这个规则往往不是很明确。还有一点,它与我们接下来要讲的GAN相比,生成的图像往往比较模糊,质量不是特别高。

4 生成对抗网络

接下来,我们讲解深度生成模型的典型代表:生成对抗网络(简称GAN)。生成对抗网络来源于博弈论中的二人零和博弈问题。在解优化问题的时候,相当于训练时固定一方,优化另一个模型的参数;然后再固定另一方,优化当前模型的参数。如此交替迭代,最终来估计出来数据的分布。

这个想法是非常有意思和巧妙的。之前讲解的生成模型,必须要知道观测数据的概率密度函数的形式。比如RBM这个模型,需要知道p(\boldsymbol{x}) 的具体形式。变分自编码器需要给定条件分布、解码器还有编码器,才能知道p(\boldsymbol{x}) 是什么样的。

但GAN采用的完全是一套新的思路。首先有一个随机的噪声\boldsymbol{z} ,服从一个非常简单的分布比如标准正态分布或者是0~1之间的均匀分布,然后让\boldsymbol{z} 穿过一个生成器(Generator Network),称为G ,这是一个神经网络。

大家都知道,一个随机变量\boldsymbol{z} 如果经过一个非线性变换g 之后,其概率密度会发生大规模的变化。如果一个\boldsymbol{z} 经过一个非线性变换之后生成一幅图,接下来就是怎么判断这幅生成的图,生成的网络能够很好地抓住数据的分布呢?可以拿生成的假图和真实观测到的图做对比。

GAN很重要的一个思想就是怎么做这样一个分布意义下的对比,我们通过一个判别器(Discriminator Network),称为D ,来判断生成数据的分布和观测数据的分布到底距离近不近。这是一个二分类问题,判别器D 就是区别输入的数据到底是真还是假。

如果生成的数据通过判别器的对比,发现数据特别假,很容易被判别出是假数据,那么说明生成器G

还不是特别好。于是GAN给出反馈信号,更新G 里面的参数,然后再去生成图。然后做对比,不停的这样迭代来指导G 生成逼真的数据。

直到参数更新到一定程度之后,G 学得比较优了,其生成的图像和真实图像通过判别器D 的时候,真假难辨。给定一张图,D 输出0.5的概率,这时候就说明 G 生成的图像可以以假乱真,说明抓住了数据的分布。

这就是GAN的思想,当然DG 都是有参数的,在模型训练过程中都要更新。和以前不一样的地方在哪里呢?判别器D 做的事情相当于通过解一个分类问题,来判断两个复杂分布之间的距离,这个是GAN的精髓所在。

GAN的目标函数如下图:

我们希望判别器D 输出的似然要最大,所谓似然就是能正确的分辨假还是真,比如说采样的真实数据p(data) ,经过判别器D 必须要V(D,G) 最大。如果通过先采样得到噪声,然后经过D 生成了这样的假数据,也要判定为假数据的概率的话,减去相当于是假数据的可能性,也希望V(D,G) 要最大。

也就是说D 要扮演分类器的这个角色,就是要让真的判定是真的,假的判定是假的,实现这么一个目标。而对于G 来说,做的事情就是需要使得G 判别是假数据的概率要最小,也就是跟D 对着干,相当于一个博弈的过程。

当然这个问题求解起来肯定是需要交替迭代来求解。先求解这个D ,把D 求好之后,然后再迭代求G ,然后给定G 然后再求GGD 的目标是不一致的。

GD 的优化过程中,判别器需要最大化,把分类做的最正确,真的是真的,假的就是假的。那么,目标函数的第1项和第2项都包含D ,所以要使用梯度上升(Gradient Ascent)算法,对这步都要求到。

然后,生成器需要最小化,希望认为它是错的概率要最小,因为和G 相关的只是后面这一项,需要使用梯度下降(Gradient Descent)算法,做这样的事交替迭代。

训练刚开始的时候,这时候的生成器G 是非常弱的,很有可能生成的就是一个乱七八糟的图像,这对于第1项来说无所谓,对于判断数据真实与否来说很容易。

对于后面这项来说,如果生成的是假数据的话,输出的概率是非常小的,那么最后一项的\log 1 就接近零,这一项的梯度非常小,没什么梯度信息,导致开始的时候更新会特别的麻烦。

因此,在GAN的文章里,作者用了一种比较简单的近似做法,运行梯度上升,某种程度上稍微缓和了这个问题,但依然很难解决这个问题。这样交替两步更新迭代的时候,会导致GAN的优化比较困难。其实,GAN的优化一直来说就是个问题,最原始版本的GAN,大家需要非常细致的去调整。

不论调整D 的学习率,还有D 的更新步速,还有G 的更新步速,G 的学习率,如果调的不是特别好的话,训练是很难进行的。这个原因就是训练初期的时候,G 生成的图像往往是比较随机的,它很难通过D传递有效的梯度信息对G 进行分析。

这张图就是想显示这一点。在初期的时候,梯度是非常平缓,梯度信息非常少,很难去更新。但最后如果做的好的话,它更新的过程是这样的:

画的是概率密度,点状的线就是训练数据,然后绿色的连续线是生成器生成的东西,蓝色的虚线就是判别器判别的概率,它是真的或假的一个概率。初始的时候,生成器生成的数据的概率分布和训练数据的概率离得很远,所以很容易判断它是真的,然后这边是假的。

随着不停的迭代,到生成的绿线和真实数据分布的比较接近的时候,它就输出一个0.5的概率,表明真假难辨,达到了生成器的效果,抓住了数据的分布。所以说这个事情很简单,训练的时候就给出一些生成的图像,然后训练图像,让它去生成就可以。

GAN的想法非常的好,非常的优雅。这个想法就相当于用一个判别器来去判别两个数据分布之间的距离,这个是非常好的。实际的过程中,大家也发现GAN的图像质量生成的也特别高,这些年来有一些很好的科研上的结果,就是可以再生成一个非常高清的人脸的图像,或者自然图像。生成比如说512×512、1024×1024这样的彩色图像都能生成的特别逼真,咱们人去看的话,真假难辨,真的是非常难去判定世界上到底是存不存在这种东西。

GAN的缺点很明显,训练过程不稳定。还有一点,就是不知道p(\boldsymbol{x}) 的具体形式。变分自编码器中,给了\boldsymbol{x} ,知道\boldsymbol{z} 的编码是怎么样。GAN是不可能实现这一点的。因为GAN永远都是反向的过程,知道\boldsymbol{z} 然后得到\boldsymbol{x} ,但很难从\boldsymbol{x} 得到\boldsymbol{z} ,这是它的一个缺点。但是如果你只用它来去做生成,GAN做比较好。

GAN发明之后,有一些在GAN基础上生成质量更好图像的做法。第一个是深度卷积生成式对抗网络(DCGAN),它把生成器的结构做了一些改变。

针对一些GAN发生的问题,研究人员提出了一些改进的方式。一个比较出名的做法,称为Wasserstein GAN(W-GAN)。这是生成网络GAN中一个里程碑式的工作,做得非常数学化,非常有理论基础。在某种程度上,它能解决GAN训练过程中的一些不稳定性的问题。

原始GAN的目标函数用来解决度量两个数据分布PQ 之间的距离。这个目标函数就是Jensen Shannon散度,也就是两个概率分布,然后用KL距离两个对称的东西1/2这样,这就是原始GAN的目标函数。其实我们在很多时候做这个数据的极大似然估计的时候是用的KL散度,极大似然的本质其实是做KL散度,其中P 为数据的分布,Q 为模型的分布。但是在W-GAN里,它度量数据和模型的分布是用的Wasserstein距离。

这种改进某种程度上避免了梯度消散的问题。会发现它处处都有梯度,而不会在零附近的时候一个非常平缓的地方,很难求梯度。优化过程也逐渐的稳定,通过观察损失函数的下降来逐渐生成一些比较有意义的图,GAN很难做到这一点的。

在GAN的基础上还有一个非常有意义、有意思的变种,叫做CycleGAN。它利用GAN的思想解决另外一个任务,即图像到图像的翻译,也就是图像到图像的一个转换。比如,原始输入的是最简单的线条图,希望线条图能加上彩色,生成有立体感效果的真实图像。传统的做法是一对一地去训练,训练数据就是一个x ,一个y ,学习xy 的函数变换。

本文是博雅大数据学院“深度学习理论与应用课程”的第7课的内容整理。我们将部分课程视频、课件和讲授稿进行发布。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据科学人工智能 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 生成模型介绍
  • 2 基于能量的模型
    • 2.1 基于能量的模型
      • 2.2 玻尔兹曼机(BM)
        • 2.2 受限玻尔兹曼机和深度玻尔兹曼机
        • 3 变分自编码器
          • 3.1 自编码器
            • 3.2 变分自编码器
            • 4 生成对抗网络
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档