在图像处理中,比拟常见的工作有辨认、检测、追踪等,这些工作的模型通常在训练阶段通过参数估计学得如何提取输出图像的特色,并建设输出图像与输入之间的映射,在利用阶段之间提取输出图像的特色,以失去相应的后果。
但有这样一类非凡的模型,其参数估计的目标不是通过提取特色来建设输入输出之间的映射,而是学习训练数据的散布,从而模型在利用阶段可能生成与训练数据类似的图像,通常这些图像与实在图像极为类似,我愿称之为“以假乱真”的哲学,这类模型就是 生成式模型。
基于特定散布进行数据生成,是近年来机器学习畛域钻研和落地,通常由由模型通过学习一组数据的散布,而后生成相似的数据。在机器学习畛域,支流的生成模型共有 4 类:
- 生成式反抗网络(Generative adversarial net, GAN)
- 变分自编码器(variational autoencoder, VAE)
- 变分自编码器(variational autoencoder, VAE)
- 流模型(Flow-based model)
这 4 类模型是基于不同的原理构建的,在本文中,我将介绍最常被用到的两类模型—— GAN 和 VAE。
生成反抗网络(GAN)
生成式反抗网络(Generative adversarial net, GAN)是一种基于反抗学习的深度生成模型,最早由 Ian Goodfellow 在《Generative Adversarial Nets》提出,一经提出就成为了学术界钻研的热点,Ian Goodfellow 也因而被人称为“GANs 之父”(没错,就是那个写了花书的大佬 ヾ(≧▽≦*)o)。
GAN 的根本思维
想必看过金庸小说的同学们都晓得,“老顽童”周伯通有一样异于常人的本事——左右互博,有了这样一门文治,一来只有本人一个人也能玩得不可开交,二来本人一个人就能切磋武艺。那是不是神经网络也能够通过这种形式来“修炼功夫”?反抗学习就是基于这样的思维。
GAN 的思维很简略,总结起来就是 以假乱真、互相反抗,而它的做法也是十分之简略粗犷,同时(或者说交替)训练两个网络,通过两个网络之间的博弈,从而达到互相促进的作用。
在 GAN 的整体框架中,用于训练的模型由两个网络组成,一个网络是 生成器 G(generator),用于数据的生成;另一个网络是 判断器 D(discriminator),用于对生成器生成的数据和训练数据进行虚实判断。就拿图像生成为例,在图像生成模型的训练过程中:
- G 是生成图像的网络,它承受一个随机的噪声 \(z\),并依据噪声生成图像,生成的图像记作 \(G(z)\),
- D 是一个判断网络,判断一张图像是不是“实在的”。它的输出参数是 \(x\),\(x\) 代表一张图像,输入 \(D(x)\) 代表 \(x\) 为实在图片的概率,如果为 \(1\),就代表 \(100\%\) 是实在的图片,而输入为 \(0\),就代表不可能是实在的图像。
在训练过程中,生成器和判断器就像是两个互相博弈的人,生成网络 G 的指标就是尽量生成实在的图像去坑骗判断网络 D,而 D 的指标就是尽量把 G 生成的图片和实在的图片别离开来。通过互相反抗,生成网络的生成能力和判断网络的判断能力将越来越强,最终当模型收敛时,咱们将失去一个生成成果较好的生成器。
GAN 的具体实现和训练过程
为了形容 GAN 如何实现这个博弈过程,咱们先定义 GAN 指标函数:
$$
\min_G\max_D V(D,G)=\mathbb E_{\boldsymbol x\sim p_{data(\boldsymbol x)}}[\log D(\boldsymbol x)]+\mathbb E_{\boldsymbol z\sim p_z(\boldsymbol z)}[\log(1-D(G(\boldsymbol z)))]\tag{1}
$$
让我来解释一下这个公式:
- 这个式子由两局部形成。第一局部判断网络在实在图像上的对数似然(掂量”将实在图片断定为真“的能力),第二局部是判断网络在生成网络生成的图像上的对数似然的(掂量”将生成图片断定为假“的能力)。
- 在第一局部中,\(x\) 示意实在图像,\(D(x)\) 示意 D 判断实在图像是否实在的概率;在第二局部中,\(z\) 示意输出 G 的噪声,\(G(z)\) 示意 G 网络生成的图像,而 \(D(G(z))\) 是 D 网络判断 G 生成的图片的是否实在的概率。
- 对于判断网络 D 来说,它的目标是可能辨别生成图像和实在图像,这须要它对指标函数进行最大化。
- 对于生成网络 G 来说,它须要生成可能”骗“过 D 的数据,这就意味着它须要最小化第二项似然,因为在 G 进行参数更新时,不会对第一项的值造成影响,所以相当于生成网络在最小化似然函数。
借用论文里的一张图来阐明这个过程,如下图:
在理论实现中,两个网络的更新是交替进行的,这导致在超参数调节不适合时,会呈现参数更新不均衡的问题,不过这个问题不是这篇博客探讨的重点,暂且挂起不谈。
其训练过程如下图所示(来自原论文):
能够看到,在每一轮迭代中:
- 先更新由生成器生成数据,并由判断器对生成数据和训练数据进行判断,并利用梯度下 降法对判断器的参数进行更新,这样对判断器的更新每次迭代要反复屡次。
- 再利用生成器生成数据,并利用梯度降落法进行生成器的参数更新,每次迭代只须要更 新一次
DCGAN
GAN 仍然存在一些毛病,比如说训练不稳固,生成过程不可控,不具备可解释性等,于是起初呈现了若干改良的版本。
当卷积神经网络再视觉畛域大放荣耀后,有人尝试将卷积操作交融到 GAN 中,也就是接下来要讲的深度卷积反抗生成网络(DCGAN)。
DCGAN 在《UNSUPERVISED REPRESENTATION LEARNING WITH DEEP CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORKS》被首次提出,是基于 GAN 的根本框架构建的生成模型,相比于 GAN,它有了如下的改良:
- 勾销所有 pooling 层。G 网络中应用转置卷积(transposed convolutional layer)进行上 采样,D 网络中用退出 stride 的卷积代替 pooling;
- 在 D 和 G 中均应用 batch normalization;
- 去掉 FC 层,使网络变为全卷积网络;
- G 网络中应用 ReLU 作为激活函数,最初一层应用 tanh;
- D 网络中应用 LeakyReLU 作为激活函数;
DCGAN 的网络结构如下图:
DCGAN 的训练过程与 GAN 雷同,不过因为网络结构的扭转,相比于 GAN,DCGAN 的训练绝对均衡,并且对部分特色的提取和还原能力较 GAN 强。但因为 DCGAN 属于晚期的 GANs,所以仍然存在局部 GAN 的问题,在 DCGAN 后 GAN 又有了若干改进版,因为数量较多、有的比拟水,这里就暂且挂起,不多叙述。
变分自编码器(VAE)
如果说 GAN 在数据生成模型畛域为咱们抉择了一条简略粗犷的路线,那接下来要讲的模型则为咱们提供了更加奇妙的方法。
变分自编码器(variational autoencoder, VAE)采纳变分推断的形式来构建,与其余自编码器相似,变分自编码器也是由编码器和解码器组成,其本质是对一个含隐变量的函数进行密度估计。在训练过程中,VAE 的次要目标是进行极大似然预计,为了使得隐变量遵从某一散布,在参数估计的过程中采纳了变分推断的思维。
KL 散度
假如咱们当初须要在某零碎中,预计模型的后验概率 \(p(z|x)\),而这个 \(p(z|x)\) 的计算非常复杂,其中 \(z\) 是隐变量,\(x\) 是显变量。
针对这一问题,在变分推断中,咱们心愿望找到一个绝对简略好算的概率分布 \(q(z)\),使它尽可能地近似咱们待剖析地后验概率 \(p(z|x)\),以求咱们可能用 \(q(z)\) 来近似 \(p(z|x)\)。所以,为了度量两个概率分布 \(q(z)\) 和 \(p(z|x)\) 之间的间隔,咱们须要用到的一个工具就是 KL 散度。
KL 散度(Kullback-Leibler divergence)即绝对熵,两个概率分布间差别的非对称性度量。如果两个散布越靠近,那么 KL 散度越小,如果越远,KL 散度就会越大。对于两个散布 \(p\) 和 \(q\),其 KL 散度的公式为:
- \(KL(p|q)= \sum p(x)\log\frac{p(x)}{q(x)}\),这个是离散概率分布的公式;
- \(KL(p|q)= \int p(x)\log\frac{p(x)}{q(x)}dx\),这个是间断概率分布的公式。
VAE 的根本思维
假如咱们有一个判断工作,现有一个期待判断的事物 \(X\),这个事物有一个类别 \(y\),咱们须要建设一个模型 \(y=f(x;w)\) 使得 \(p(y|X)\) 的概率尽可能大,即让 \(f(x;w)\) 尽可能地靠近 \(y\)。
如果咱们应用生成式模型去解决这一问题,就须要用贝叶斯公式将这个问题转换成:
$$
p(z|X)=\frac{p(X|z)p(z)}{p(X)}\tag{2}
$$
让咱们再考虑一下数据生成问题,则问题能够转换成:当咱们有式子右边的 \(p(z|X)\),应该如何生成一个合乎某种 \(z\) 的 \(X\)(其中 \(z\) 为合乎某种散布的隐变量)?
一个解决形式是:每次随机生成一个 \(X\),用 \(p(z|X)\) 计算概率,如果概率满足,则完结,如果不满足,则持续随机生成。但这种形式在某些状况下是不事实的,特地是右部的公式难以间接计算失去,所以,咱们须要采纳其余可行的办法来解决这一问题。这时就能够用到变分推断的思维联合自编码器,假如隐变量 \(z\) 遵从某种散布来解决这一问题。
因为公式(2)中,右部的积分公式难以计算,咱们能够用一个变分函数 \(q(z|X)\) 去代替 \(p(z|X)\)。在 VAE 中,这个函数将采纳编码器实现),当编码器可能将数据可能完满地将实在数据编码成遵从肯定散布的隐变量时,那解码器就能将遵从这一散布的隐变量解码成靠近实在数据的生成数据,从而解码器将能作为生成器应用,这便是 VAE 的根本思维。
为了能采纳 \(q(z|X)\) 去代替 \(p(z|X)\),咱们须要使得两个散布布尽可能地相近,于是乎咱们抉择了 KL 散度这个指标用来掂量两者的相近水平,于是有:
$$
\begin{aligned}
KL(q(x|X)\|p(z|X))&=\int q(z|X)\log{\frac{q(z|X)}{p(z|X)}}dz\\
&=\int q(z|X)[\log{q(z|X)}-\log{p(z|X)}]dz\\
&=\int q(z|X)[\log{q(z|X)}-\log{p(X|z)}-\log{p(z)}+\log{p(X)}]dz\\
&=\int q(z|X)[\log{q(z|X)}-\log{p(X|z)}-\log{p(z)}]dz+\log{p(X)}
\end{aligned}\tag{3}
$$
左右整顿一下,咱们能够失去:
$$
\log{p(X)}-KL(q(z|X)\|p(z|X))=\int q(z|X)\log{p(X|z)}dz-KL(q(z|X)\|p(z))\tag{4}
$$
咱们晓得在 \(X\) 给定的状况下,\(p(X)\) 是个固定值,而咱们的目标是最大化 \(KL(q(z)|p(z|X))\),所以咱们须要让等号左边那局部尽量大,所以,为了找到一个好的 \(q(z|X)\),使得它和 \(p(z|X)\) 尽可能地相近,咱们须要:
- 左边第一项的对数似然的冀望最大化
- 左边第二项的 KL 散度最小化
VAE 的实现
为了将数据编码到隐变量,咱们须要假如隐变量 \(z\) 遵从某种散布。通常咱们假如 \(z\) 遵从高斯分布,则计算公式为:
$$
KL(p_1\|p_2)=\frac12[\log{\frac{\det(\Sigma_2)}{\det(\Sigma_1)}}-d+tr(\Sigma^{-1}_2\Sigma_1)+(\mu_2-\mu_1)^T\Sigma^{-1}_2(\mu_2-\mu_1)]\tag{5}
$$
为了计算不便,咱们再进行一个比拟强的假如,假如隐变量遵从规范正态分布,即遵从均值为 \(0\),方差为单位矩阵的高斯分布,则:
$$
KL(p_1\|\mathcal N(0,I))+\frac12[-\log{[\det(\Sigma_1)]}-d+tr(\Sigma_1)+\mu^T_1\mu_1]\tag{6}
$$
接下来,咱们就能通过构建编码器,失去一个由输出 \(X\) 求解隐变量 \(z\) 的函数,利用梯度降落法,可依据公式(6)对网络参数进行优化,使得编码器近似靠近咱们想要拟合的函数。
而对于公式(4)的第一项,咱们能够通过构建一个从 \(z\) 再变回 \(X\) 的解码器,通过梯度降落法进行解码器参数优化,从而实现对 \(p(X|z)\) 的极大似然预计,咱们将失去一个将合乎高斯分布的隐变量变成生成数据的生成器。
CVAE
条件变分自编码器(CVAE)是 VAE 的变种。VAE 是无监督学习,然而当咱们须要网络可能依据咱们的须要生成特定的图片,须要退出标签 y 辅组训练,这就是 CVAE。
CVAE 能够看作是有监督学习的 VAE。将公式(4)的右部变为:
$$
\mathcal L(X,y)=\int p(y|X,z)-KL(q(z|X,y)\|p(z|X))\tag{7}
$$
在这里,自编码器须要重构的是 \(y|X\) 而不是 \(X\), 所以最终的生成器可能依据标签进行采样而生成对应的数据。