(十六)从零开始学人工智能-深度学习基础

文章目录算法

1、生成对抗网络基础网络

1.1 GANGAN概述架构

1.2 什么是生成对抗网络?app

1.2.1 对抗生成网络背后的数学原理框架

1.2.2 重说GAN原理机器学习

1.2.3 小结函数

1.3 GANs应用举例性能

1.3.1 从生成MNIST开始学习

1.3.2 垃圾邮件识别测试

1.3.3 更多实际应用

1.3.4 小结

声明

参考文献

1、生成对抗网络基础

​ 生成对抗网络(Generative Adversarial Networks, GANs)是由Ian Goodfellow等人在2014年的Generative Adversarial Networks一文中提出。Facebook的人工智能主管Yann Lecun对其的评价是:“机器学习在过去10年中最有趣的想法”。**GANs的潜力巨大,由于它们能够学习模仿任何数据分布。**也就是说,GANs通过学习后,能够创造出相似于咱们真实世界的一些东西,好比:图像、音乐、散文等等。从某种意义来讲,它们是“机器人艺术家”,有些确实可以让人印象深入。

基于GAN,能够将人脸粘贴到视频中的目标人物上

1.1 GANGAN概述

在讲GANGAN以前,先讲一个小趣事,你知道GANGAN是怎么被发明的吗?据IanIan GoodfellowGoodfellow本身说: 以前他一直在研究生成模型,多是一时兴起,有一天他在酒吧喝酒时,在酒吧里跟朋友讨论起生成模型。而后IanIan GoodfellowGoodfellow想到GANGAN的思想,跟朋友说你应该这么作这么作这么作,我打赌必定会有用。可是朋友不信,因而他直接从酒吧回去开始作实验,一夜就写出了GANGAN论文~

这个故事告诉咱们,喝酒,不只能打醉拳,也能写出顶级论文…

故事讲完,开干(GANGAN)吧:GANGAN包含有两个模型,一个是生成模型(generativegenerative modelmodel),一个是判别模型(discriminativediscriminative modelmodel)。生成模型的任务是生成看起来天然真实的、和原始数据类似的数据。判别模型的任务是判断给定的实例看起来是天然真实的仍是认为伪造的(真实实例来源于数据集,伪造实例来源于生成模型)。

这能够看作一种零和游戏。论文采用类比的手法通俗理解:生成模型像“一个造假团伙,试图生产和使用假币”,而判别模型像“检测假币的警察”。生成器(generatorgenerator)试图欺骗判别器(discriminatordiscriminator),判别器则努力不被生成器欺骗。模型通过交替优化训练,两种模型都能获得提高,但最终咱们要获得的是效果提高到很高很好的生成模型(造假团伙),这个生成模型(造假团伙)所生成的产品能达到真假难分的地步,这个过程就如上图的对抗过程。

随着学术界和工业界都开始接收并欢迎GANGAN的到来,GANGAN的崛起不可避免:

首先,GANGAN最厉害的地方是它的学习性质是无监督的。GANGAN也不须要标记数据,这使GANGAN功能强大,由于数据标记的工做很是枯燥。

其次,GANGAN的潜在用例使它成为交谈的中心。它能够生成高质量的图像,图片加强,从文本生成图像,将图像从一个域转换为另外一个域,随年龄增加改变脸部外观等等。这个名单较长并还在快速增加。

第三,围绕GANGAN不断的研究是如此使人着迷,以致于它吸引了其余(图像以外)全部行业的注意力。

1.2 什么是生成对抗网络?

要全面理解生成对抗网络,首先要理解的概念是监督式学习和非监督式学习。监督式学习是指基于大量带有标签的训练集与测试集的机器学习过程,好比监督式图片分类器须要一系列图片和对应的标签(“猫”,“狗”,…),而非监督式学习则不须要这么多额外的工做,它们能够本身从错误中进行学习,并下降将来出错的几率。监督式学习的缺点就是须要大量标签样本,这很是耗时耗力。非监督式学习虽然没有这个问题,但准确率每每更低。天然而然地但愿可以经过提高非监督式学习的性能,从而减小对监督式学习的依赖。GANGAN能够说是对于非监督式学习的一种提高。

第二个须要理解的概念是“生成模型”, 以下图所示生成图片模型的概念示意图。这类模型可以经过输入的样本产生可能的输出。举个例子,一个生成模型能够经过视频的某一帧预测出下一帧的输出。另外一个例子是搜索引擎,在你输入的同时,搜索引擎已经在推断你可能搜索的内容了。

基于上面的两个概念就能够设计生成对抗网络GANGAN了。相比于传统的神经网络模型,GANGAN是一种全新的非监督式的架构(以下图所示)。GANGAN包括了两套独立的网络,二者之间做为互相对抗的目标。第一套网络是咱们须要训练的分类器(下图中的D),用来分辨是不是真实数据仍是虚假数据;第二套网络是生成器(下图中的G),生成相似于真实样本的随机样本,并将其做为假样本。

D做为一个图片分类器,对于一系列图片区分不一样的动物。生成器G的目标是绘制出很是接近的伪造图片来欺骗D,作法是选取训练数据潜在空间中的元素进行组合,并加入随机噪音,例如在这里能够选取一个猫的图片,而后给猫加上第三只眼睛,以此做为假数据。

在训练过程当中,D会接收真数据和G产生的假数据,它的任务是判断图片是属于真数据的仍是假数据的。对于最后输出的结果,能够同时对两方的参数进行调优。若是D判断正确,那就须要调整G的参数从而使得生成的假数据更为逼真;若是D判断错误,则需调节D的参数,避免下次相似判断出错。训练会一直持续到二者进入到一个均衡和谐的状态。

训练后的产物是一个质量较高的自动生成器和一个判断能力较强强的分类器。前者能够用于机器创做(自动画出“猫”“狗”),然后者则能够用来机器分类(自动判断“猫”“狗”)。

小结:GANGAN算法流程简述

算法流程简述

初始化generator和discriminator。

每一次的迭代过程当中:

固定generator, 只更新discriminator的参数。从你准备的数据集中随机选择一些,再从generator的output中选择一些,如今等于discriminator有两种input。接下来, discriminator的学习目标是, 若是输入是来自于真实数据集,则给高分;若是是generator产生的数据,则给低分,能够把它当作一个回归问题。

接下来,固定住discriminator的参数, 更新generator。将一个向量输入generator, 获得一个output, 将output扔进discriminator, 而后会获得一个分数,这一阶段discriminator的参数已经固定住了,generator须要调整本身的参数使得这个output的分数越大越好。

按这个过程听起来好像有两个网络,而实际过程当中,generator和discriminator是同一个网络,只不过网络中间的某一层hidden-layer的输出是一个图片(或者语音,取决于你的数据集)。在训练的时候也是固定一部分hidden-layer,调其他的hidden-layer。

1.2.1 对抗生成网络背后的数学原理

如下这一段真的是太枯燥了,纯属为了内容完整性,不喜跳过… 一点不影响全文理解,哈哈哈~

------------------------------------------------------------高能开始分割线------------------------------------------------------------------------------

考虑一下,GAN到底生成的是什么呢?好比说,假如咱们想要生成一些人脸图,实际上,咱们是想找到一个分布,从这个分部内sample出来的图片,像是人脸,而不属于这个distribution的分布,生成的就不是人脸。而GAN要作的就是找到这个distribution。

在GAN出生以前,咱们怎么作这个事情呢?

以前用的是Maximum Likelihood Estimation,最大似然估计来作生成的,咱们先从几率分布及参数估计提及,经过介绍极大似然估计、KL散度、JS散度,再详细介绍GAN生成对抗网络的数学原理。

不管是黑白图片或彩色图片, 都是使用 0 ~ 255 的数值表示像素. 将全部的像素值除以 255 咱们就能够将一张图片转化为 0 ~ 1 的几率分布, 并且这种转化是可逆的, 乘以 255 就能够还原.

从某种意义上来说, GAN 图片生成任务就是生成几率分布. 所以, 咱们有必要结合几率分布来理解 GAN 生成对抗网络的原理.

回顾几率分布及参数估计

先来看一个例子:

假设一个抽奖盒子里有45个球,其编号是1-9共9个数字。每一个编号的球拥有的数量是:

编号123456789

数量246897531

占比0.0440.0880.1330.1780.2000.1560.1110.0660.022

占比是指用每一个编号的数量除以全部编号的数量总和,在数理统计中,在不引发误会的状况下,这里的占比也能够被称为几率/频率。

使用向量qq表示上述的几率分布:

​\begin{aligned}q &=(1,4,6,8,9,7,5,3,1)/45 \\&=(0.044,0.088,0.133,0.178,0.200,0.156,0.111,0.066,0.022) \end{aligned}q​=(1,4,6,8,9,7,5,3,1)/45=(0.044,0.088,0.133,0.178,0.200,0.156,0.111,0.066,0.022)​

将上述分布使用图像绘制以下:

如今咱们但愿构建一个函数p=p(x;\theta)p=p(x;θ),以xx为编号做为输入数据,输出编号xx的几率。\thetaθ是参与构建这个函数的参数,一经选定就再也不变化。

假设上述几率分布服从二次抛物线函数:

​\begin{aligned}p &=p(x;\theta) \\ &=\theta_1(x+\theta_2)^2+\theta_3 \\ \end{aligned}p​=p(x;θ)=θ1​(x+θ2​)2+θ3​​

​ x=(1,2,3,4,5,6,7,8,9)x=(1,2,3,4,5,6,7,8,9)

使用L_2L2​偏差做为评价拟合效果的损失函数,总偏差值为error(标量e)error(标量e):

​ e=\Sigma_{i=1}^9(p_i-q_i)^2e=Σi=19​(pi​−qi​)2

咱们但愿求得一个\theta^*θ∗,使得ee的值越小越好,数学上表达为:

​ \theta^*=\mathop {argmin}_{\theta}(e)θ∗=argminθ​(e)

argmin是argument minimum的缩写。

如何求\theta^*θ∗不是本文的重点,这是生成对抗网络的任务。为了帮助理解,取其中一个可能的数值做为示例:

​ \theta^*=(\theta_1,\theta_2,\theta_3)=(-0.01,-5.0,0.2)θ∗=(θ1​,θ2​,θ3​)=(−0.01,−5.0,0.2)

​ p=p(x;\theta)=-0.01(x-5.0)^2+0.2p=p(x;θ)=−0.01(x−5.0)2+0.2

绘制函数图像以下:

在生成对抗网络中,本例的估计函数p(x:\theta)p(x:θ)至关于生成模型(generator),损失函数至关于鉴别模型(discriminator)。

从最大似然估计讲起

最大似然估计的理念是:假如说咱们的数据集分布是P_{data}(x)Pdata​(x),咱们定义一个分布P_G(x;\theta)PG​(x;θ),咱们想要找到一组参数\thetaθ,使得P_G(x;\theta)PG​(x;θ)越接近P_{data}(x)越好Pdata​(x)越好。例如,若P_G(x;\theta)PG​(x;θ)是一个高斯混合模型,那么\thetaθ就是均值和方差。

具体怎么操做呢

从P_{data}(x)Pdata​(x)中采样出{x^1,x^2,x^3,\dots,x^m}x1,x2,x3,…,xm;

对每个采样出来的xx,咱们均可以计算出它的似然函数,也就是能够获得一组参数\thetaθ,进而就能知道P_G(x;\theta)PG​(x;θ)长什么样,而后就能够进一步计算出这个分布里面采样出的某一个xx的概率;

把在某个分布能够产生x_ixi​的参数似然函数乘起来,能够获得总的似然函数:

​ L=\prod_{i=1}^mP_G(x^i;\theta)L=∏i=1m​PG​(xi;θ)

​ 咱们要找到一组\theta^*θ∗,能够最大化LL。

在上面的例子中,咱们很幸运的知道了全部可能的几率分布,并让求解最优化的几率分布估计函数p(x;\theta)p(x;θ)成为可能。

若是上例的抽奖盒子(样本)中的45个球是从更大的抽奖池(整体)中选出来的,而咱们不知道抽奖池中全部球的数量及其编号。那么,咱们如何根据现有的45个球来估计抽奖池的几率分布呢?固然,咱们能够直接用上例求得的样本估计函数来表明抽奖池的几率分布,但接下来会介绍一种更为经常使用的估计方法,即本节开篇提到的最大似然估计。

假设p(x)=p(x;\theta)p(x)=p(x;θ)是整体的几率分布函数,则编号x=(x_1,x_2,x_3,\cdots,x_n)x=(x1​,x2​,x3​,⋯,xn​)出现的几率为:

​ p=p(x_1),p(x_2),p(x_3),\cdots,p(x_n)p=p(x1​),p(x2​),p(x3​),⋯,p(xn​)

在本例中,n=9n=9,即共9个编号。

设d=(d_1,d_2,d_3,\cdots,d_m)d=(d1​,d2​,d3​,⋯,dm​)是全部抽样的编号,在本例中,m=45m=45,即样本中共有45个抽样。假设全部的样本和抽样都是独立的,则样本出现的几率为:

​ \rho=p(d_1)\times p(d_2)\times p(d_3)\times \cdots \times p(d_m)=\prod_{i=1}^m(p(d_i))ρ=p(d1​)×p(d2​)×p(d3​)×⋯×p(dm​)=∏i=1m​(p(di​))

p(x)=p(x;\theta)p(x)=p(x;θ)的函数结构是人为按经验选取的,好比线性函数,多元二次函数,更复杂的非线性函数等,一经选取则再也不改变。如今咱们须要求解一个参数集\theta^*θ∗,使得\rhoρ的值越大越好。即

​ \theta^*=\mathop {argmax}_\theta(\rho)=\mathop {argmax}_\theta\prod_{i=1}^mp(d_i;\theta)θ∗=argmaxθ​(ρ)=argmaxθ​∏i=1m​p(di​;θ)

argmax是argument maximum的缩写。

通俗来说,由于样本是实际已发生的事实,在函数结构已肯定的状况下,咱们须要尽可能优化参数,使得样本的理论估计几率越大越好。

这里有一个前提,就是认为选定的函数结构应当可以有效评估样本分布。反之,若是使用线性函数去拟合正态几率分布(normal distribution),则不管如何选择参数都没法获得满意的效果。

连乘运算不方便,将之改成求和运算。因为loglog对数函数的单调性,上面的式子等价于:

​ \theta^*=\mathop {argmax}_\theta log\prod_{i=1}^mp(d_i;\theta)=\mathop {argmax}_\theta\Sigma_{i=1}^mlog \, p(d_i;\theta)θ∗=argmaxθ​log∏i=1m​p(di​;θ)=argmaxθ​Σi=1m​logp(di​;θ)

设样本分布为q(x)q(x),对于给定样本,这个分布是已知的,能够经过统计抽样的计算得出,将上式转化成指望公式:

​ \theta^*=\mathop {argmax}_\theta\Sigma_{i=1}^mlog\,p(d_i;\theta)=\mathop {argmax}_\theta\Sigma_{i=1}^n q(x_i)log\,p(x_i;\theta)θ∗=argmaxθ​Σi=1m​logp(di​;θ)=argmaxθ​Σi=1n​q(xi​)logp(xi​;θ)

注意上式中的两个求和符号,mm变成了nn。在大多数状况下,编号数量会比抽样数量少,转为指望公式能够显著减小计算量。

在一些教程中,上式写法为:

​ \theta^*=\mathop {argmax}_\theta E_{x-q(x)}log\,p(x;\theta)=\mathop {argmax}_\theta \int q(x)log\,p(x;\theta)dxθ∗=argmaxθ​Ex−q(x)​logp(x;θ)=argmaxθ​∫q(x)logp(x;θ)dx

E_{x-q(x)}Ex−q(x)​表示按q(x)q(x)的分布对xx求指望。由于积分表达式比较简洁,书写方便,下文开始将主要使用积分表达式。

以上就是最大似然估计(Maximum Likelihood Estimation)的理论和推导过程。和上例的参数估计方法相比,最大似然估计由于无需设计损失函数,下降了模型的复杂度,扩大了适用范围。

本例中的估计函数p(x;\theta)p(x;θ)至关于生成对抗网络的生成模型,样本分布q(x)q(x)至关于训练数据。

另外一种解释-KL散度

结合上例,在样本已知的状况下,q(x)q(x)是一个已知且肯定的分布。则\int q(x)log\,q(x)dx∫q(x)logq(x)dx是一个常数项,不影响\theta^*θ∗求解的结果,则可添加项

​\begin{aligned}\theta^* &=\mathop {argmax}_\theta(\int q(x)log\,p(x;\theta)dx-\int q(x)log\,q(x)dx) \\ &=\mathop {argmax}_\theta \int q(x)(log\,p(x;\theta)-log\,q(x))dx \\ &=\mathop {argmax}_\theta \int q(x)log\frac{p(x;\theta)}{q(x)}dx \end{aligned}θ∗​=argmaxθ​(∫q(x)logp(x;θ)dx−∫q(x)logq(x)dx)=argmaxθ​∫q(x)(logp(x;θ)−logq(x))dx=argmaxθ​∫q(x)logq(x)p(x;θ)​dx​

也能够写成这样:

​\begin{aligned}\theta^* &=\mathop {argmin}_\theta(-\int q(x)log\,p(x;\theta)dx+\int q(x)log\,q(x)dx) \\ &=\mathop {argmin}_\theta \int q(x)log\frac{q(x)}{p(x;\theta)}dx \end{aligned}θ∗​=argminθ​(−∫q(x)logp(x;θ)dx+∫q(x)logq(x)dx)=argminθ​∫q(x)logp(x;θ)q(x)​dx​

KLKL散度(Kullback-Leibler divergence)是一种衡量两个几率分布的匹配程度的指标,两个分布差别越大,KL散度越大。它还有不少的名字,好比:relative entropy, relative information。

其定义以下:

​ D_{KL}(q\mid\mid p)=\int q(x)log\frac{q(x)}{p(x)}dxDKL​(q∣∣p)=∫q(x)logp(x)q(x)​dx

当p(x)=q(x)p(x)=q(x)时,取最小值D_{KL}(q\mid\mid p)=0DKL​(q∣∣p)=0。

咱们能够将上面的公式简化为:

​ \theta^*=\mathop {argmin}_\theta D_{KL}(q\mid\mid p(x;\theta))θ∗=argminθ​DKL​(q∣∣p(x;θ))

KL散度的补充-JS散度

KLKL散度是非对称的,即D_{KL}(q\mid\mid p)DKL​(q∣∣p)不必定等于D_{KL}(p\mid\mid q)DKL​(p∣∣q)。为了解决这个问题,须要引入JSJS散度。JSJS散度(Jensen-Shannon divergence)的定义以下:

​ m=\frac{1}{2}(p+q)m=21​(p+q)

​ D_{JS}=\frac{1}{2}D_{KL}(p\mid\mid m)+\frac{1}{2}D_{KL}(q\mid\mid m)DJS​=21​DKL​(p∣∣m)+21​DKL​(q∣∣m)

JSJS的值域是对称的,有界的,范围是[0,1][0,1]。

若是p,\,qp,q彻底相同,则JS=0JS=0,若是彻底不相同,则JS=1JS=1。

注意,KLKL散度和JSJS散度做为差别度量的时候,有一个问题:

若是两个分配pp,qq离得很远,彻底没有重叠的时候,那么KLKL散度值是没有意义的,而JSJS散度值是一个常数。这在学习算法中是比较致命的,由于这意味着在这一点的梯度为0,梯度消失了。

参考上述例子,对JSJS进行反推:

​\begin{aligned}D_{JS}(q\mid\mid p) &=\frac{1}{2} D_{KL}(q\mid\mid m)+\frac{1}{2}D_{KL}(p\mid\mid m) \\ &=\frac{1}{2}\int q(x)log\frac{q(x)}{\frac{q(x)+p(x;\theta)}{2}}dx+\frac{1}{2}\int p(x;\theta)log\frac{p(x;\theta)}{\frac{p(x;\theta)+q(x)}{2}}dx \\ &=\frac{1}{2}\int q(x)log\frac{2q(x)}{q(x)+p(x;\theta)}dx+\frac{1}{2}\int p(x;\theta)log\frac{2p(x;\theta)}{p(x;\theta)+q(x)}dx \end{aligned}DJS​(q∣∣p)​=21​DKL​(q∣∣m)+21​DKL​(p∣∣m)=21​∫q(x)log2q(x)+p(x;θ)​q(x)​dx+21​∫p(x;θ)log2p(x;θ)+q(x)​p(x;θ)​dx=21​∫q(x)logq(x)+p(x;θ)2q(x)​dx+21​∫p(x;θ)logp(x;θ)+q(x)2p(x;θ)​dx​

因为:

​\begin{aligned}\int q(x)log\frac{2q(x)}{q(x)+p(x;\theta)}dx &=\int q(x)(log\frac{q(x)}{q(x)+p(x;\theta)}+log2)dx \\ &=\int q(x)log\frac{q(x)}{q(x)+p(x;\theta)}dx+\int q(x)log2dx \\ &=\int q(x)log\frac{q(x)}{q(x)+p(x;\theta)}dx+log2 \end{aligned}∫q(x)logq(x)+p(x;θ)2q(x)​dx​=∫q(x)(logq(x)+p(x;θ)q(x)​+log2)dx=∫q(x)logq(x)+p(x;θ)q(x)​dx+∫q(x)log2dx=∫q(x)logq(x)+p(x;θ)q(x)​dx+log2​

同理可得:

​\begin{aligned}D_{JS}(q\mid\mid p) &=\frac{1}{2}\int q(x)log\frac{q(x)}{q(x)+p(x;\theta)}dx+\frac{1}{2}\int p(x;\theta)log\frac{p(x;\theta)}{p(x;\theta)+q(x)}dx +log2 \end{aligned}DJS​(q∣∣p)​=21​∫q(x)logq(x)+p(x;θ)q(x)​dx+21​∫p(x;θ)logp(x;θ)+q(x)p(x;θ)​dx+log2​

令:

​ d(x;\theta)=\frac{q(x)}{q(x)+p(x;\theta)}d(x;θ)=q(x)+p(x;θ)q(x)​

则:

​ 1-d(x;\theta)=\frac{p(x;\theta)}{q(x)+p(x;\theta)}1−d(x;θ)=q(x)+p(x;θ)p(x;θ)​

即:

​ D_{JS}(q\mid\mid p)=\frac{1}{2}\int q(x)log\,d(x;\theta)dx+\frac{1}{2}\int p(x;\theta)log(1-d(x;\theta))dx+log2DJS​(q∣∣p)=21​∫q(x)logd(x;θ)dx+21​∫p(x;θ)log(1−d(x;θ))dx+log2

令:

​ V(x;\theta)=\int q(x)log\,d(x;\theta)dx+\int p(x;\theta)log(1-d(x;\theta))dxV(x;θ)=∫q(x)logd(x;θ)dx+∫p(x;θ)log(1−d(x;θ))dx

则:

​ D_{JS}(q\mid\mid p)=\frac{1}{2}V(x;\theta)+log2DJS​(q∣∣p)=21​V(x;θ)+log2

即:

​ \theta^*=\mathop {argmin}_\theta D_{JS}(q\mid\mid p)=\mathop{argmin}_\theta V(x;\theta)θ∗=argminθ​DJS​(q∣∣p)=argminθ​V(x;θ)

此时,\theta^*θ∗是令p(x;\theta)p(x;θ)和q(x)q(x)差别最小的参数,一样亦可经过V(x;\theta)V(x;θ)求差别最大的参数。

JS散度参数求解的两步走迭代方法

从上面的讨论知道,咱们须要一个参数\theta^*θ∗,使得

​ \theta^*=\mathop {argmin}_\theta D_{JS}(q\mid\mid p)=\mathop {argmin}_\theta V(x;theta)θ∗=argminθ​DJS​(q∣∣p)=argminθ​V(x;theta)

然而,由于涉及多重嵌套和积分,使用起来并不方便。

首先,咱们假设p(x;\theta)=p_g(x)p(x;θ)=pg​(x)为已知条件,同时令D=d(x;\theta)D=d(x;θ),考虑这个式子:

​ W(x;\theta)=q(x)log\,d(x;\theta)dx+p(x;\theta)log(1-d(x;\theta))W(x;θ)=q(x)logd(x;θ)dx+p(x;θ)log(1−d(x;θ))

​ W(x;D)=q(x)log\,D+p_g(x)log(1-D)W(x;D)=q(x)logD+pg​(x)log(1−D)

​ V(x;\theta)=V(x;D)=\int W(x;D)dxV(x;θ)=V(x;D)=∫W(x;D)dx

在xx已知的状况下,咱们关注DD。

​ W'=\frac{dW}{dD}=q(x)\frac{1}{D}-p_g(x)\frac{1}{1-D}W′=dDdW​=q(x)D1​−pg​(x)1−D1​

​ W''=\frac{dW'}{dD}=-q(x)\frac{1}{D^2}-p_g(x)\frac{1}{(1-D)^2}W′′=dDdW′​=−q(x)D21​−pg​(x)(1−D)21​

由于W''\lt0W′′<0,当W'=0W′=0时,WW取得极大值:

​ W'=q(x)\frac{1}{D}-p_g(x)\frac{1}{1-D}=0W′=q(x)D1​−pg​(x)1−D1​=0

​ D=\frac{q(x)}{q(x)+p_g(x)}D=q(x)+pg​(x)q(x)​

由于:

​ D\lt\frac{q(x)}{q(x)+p_g(x)},\, W'\gt0D<q(x)+pg​(x)q(x)​,W′>0

​ D\gt\frac{q(x)}{q(x)+p_g(x)},\,W'\lt0D>q(x)+pg​(x)q(x)​,W′<0

这代表,当DD的函数按W'=0W′=0取值时,WW在xx的每一个取样点均得到最大值,积分后的面积得到最大值,即:

​ D^*=\frac{q(x)}{q(x)+p_g(x)}=\mathop {argmax}_D\int W(x;D)dx=\mathop {argmax}_DV(x;D)D∗=q(x)+pg​(x)q(x)​=argmaxD​∫W(x;D)dx=argmaxD​V(x;D)

​ \mathop {max}_DV(x;D)=\int q(x)log\,D^*(x)dx+\int p_g(x)log(1-D^*(x))dxmaxD​V(x;D)=∫q(x)logD∗(x)dx+∫pg​(x)log(1−D∗(x))dx

在获得V(x;D)V(x;D)的最大值表达式后,咱们固定D^*D∗,接着对p(x;\theta)=p_g(x)p(x;θ)=pg​(x)将这个最大值按最小方向优化:

​ V(x;\theta;D^*)=\int q(x)log\,D^*(x)dx+\int p(x;\theta)log(1-D^*(x))dxV(x;θ;D∗)=∫q(x)logD∗(x)dx+∫p(x;θ)log(1−D∗(x))dx

​ \theta^*=\mathop {argmin}_\theta V(x;\theta^*;D^*)θ∗=argminθ​V(x;θ∗;D∗)

所以,经过两步走的方法,通过屡次前后迭代求解D^*D∗和\theta^*θ∗,咱们能够逐渐获得一个趋近于q(x)q(x)的p(x;\theta^*)p(x;θ∗)。

生成对抗网络

从上述的讨论可知,咱们能够获得一个和q(x)q(x)很是接近的分布函数p(x;\theta)p(x;θ)。这个分布函数的构建是为了寻找已知样本数据的内在规律。

而后咱们每每并不关心这个分布函数,咱们但愿无中生有的构建一批数据x'x′,使得p(x';\theta)p(x′;θ)趋近于q(x)q(x)。

咱们设计一个输出x'x′的生成器x'=G(z;\beta)x′=G(z;β),从随机几率分布中接收zz做为输入,x'x′的几率分布为p_g(x')pg​(x′)。

第一步,咱们固定p_g(x')pg​(x′),求D^*D∗:

​ V(x,x';D)=\int q(x)log\,D(x)dx+\int p_g(x')log(1-D(x'))dxV(x,x′;D)=∫q(x)logD(x)dx+∫pg​(x′)log(1−D(x′))dx

​ D^*=\mathop {argmax}_DV(x;D)D∗=argmaxD​V(x;D)

第二步,咱们固定D*D∗,求p_g(x';\theta^*)pg​(x′;θ∗):

​ V(x,x',D^*;\theta)=\int q(x)log\,D^*(x)dx+\int p_g(x';\theta)log(1-D^*(x'))dxV(x,x′,D∗;θ)=∫q(x)logD∗(x)dx+∫pg​(x′;θ)log(1−D∗(x′))dx

​ \theta^*=\mathop {argmin}_\theta V(x,D^*;\theta^*)θ∗=argminθ​V(x,D∗;θ∗)

而后进行屡次循环迭代,使得p_g(x';\theta^*)pg​(x′;θ∗)趋近于q(x)q(x)。

仔细观察能够发现,这里求解过程和上例的是同样,只是输入的数据不一致。

在实际任务中,咱们并不关心p_g(x';\theta)pg​(x′;θ),仅关注生成器x'=G(z;\beta)x′=G(z;β)的优化。

所以,咱们把算法改编以下:

第一步,咱们固定x'=G(z;\beta)x′=G(z;β),求D^*D∗:

​ V(x,z;D)=\int q(x)log\,D(x)dx+\int q(z)log(1-D(G(z)))dzV(x,z;D)=∫q(x)logD(x)dx+∫q(z)log(1−D(G(z)))dz

​ D^*=\mathop {argmax}_DV(x,z;D)D∗=argmaxD​V(x,z;D)

第二步,咱们固定D*D∗,求G(z;\beta^*)G(z;β∗):

​ V(x,z,D^*;\beta)=\int q(x)log\,D^*(x)dx+\int q(z)log(1-D^*(G(z;\beta)))dzV(x,z,D∗;β)=∫q(x)logD∗(x)dx+∫q(z)log(1−D∗(G(z;β)))dz

​ \beta^*=\mathop {argmin}_\beta V(x,z,D^*;\beta^*)β∗=argminβ​V(x,z,D∗;β∗)

注意,本例的两个算法都没有给出严格的收敛证实。

因为求解形式和上例的JSJS散度的参数求解算法很是的一致,咱们能够期待这种算法可以起做用。为简单起见,记为:

​ V(G,D)=\int q(x)log\,D(x)dx+\int q(z)log(1-D(G(z)))dzV(G,D)=∫q(x)logD(x)dx+∫q(z)log(1−D(G(z)))dz

​ G^*=\mathop {argmin}_G(max_D V(G,D))G∗=argminG​(maxD​V(G,D))

这就是GANGAN生成对抗网络相关文献中常见的求解表达方式。

在 Ian J. Goodfellow 的论文 Generative Adversarial Networks 中, 做者先给出了V(G,D)V(G,D)的表达式, 而后再经过JSJS散度的理论来证实其收敛性. 有兴趣的读者能够参考阅读。

本文认为, 若是先介绍JSJS散度, 再进行反推, 能够更容易的理解GANGAN概念, 理解GANGAN为何要用这么复杂的损失函数.

生成对抗网络的工程实践

在工程实践中,咱们遇到的通常是离散的数据,咱们可使用随机采样的方法逼近指望值。

首先咱们从前置的随机分布p_z(z)pz​(z)中取出mm个随机数z=(z_1,z_2,z_3,\cdots,z_m)z=(z1​,z2​,z3​,⋯,zm​), 其次咱们在从真实数据分布p(x)p(x)中取出mm个真实样本p=(x_1,x_2,x_3,\cdots,x_m)p=(x1​,x2​,x3​,⋯,xm​)。

因为咱们的数据是随机选取的,几率越大就越有机会被选中。抽取的样本就隐含了自身的指望。所以咱们可使用平均数代替上式中的指望,公式改写以下:

​\begin{aligned}V(G,D) &=\int q(x)log\,D(x)dx+\int q(z)log(1-D(G(z)))dz \\ &=\frac{1}{m}\Sigma_{i=1}^m log\,D(x_i)+\frac{1}{m}\Sigma_{i=1}^m log(1-D(G(z_i))) \end{aligned}V(G,D)​=∫q(x)logD(x)dx+∫q(z)log(1−D(G(z)))dz=m1​Σi=1m​logD(xi​)+m1​Σi=1m​log(1−D(G(zi​)))​

咱们能够直接用上式训练鉴别器D(x)D(x)。

在训练生成器时,由于前半部分和zz无关,咱们能够只使用后半部分。

最后,咱们用一张图来结束(总结这一部分),从数学的角度看GANs的训练过程:

------------------------------------------------------------高能结束分割线------------------------------------------------------------------------------

1.2.2 重说GAN原理

真的,前面的数学原理实在是太枯燥了,编写的过程当中屡次想放弃,可是正值疫情期间,个人状态是这样的:

你说不得找点事干是否是,因而乎,。。。,就有了上面那一段,无论怎么样,忘了刚才这一段吧,让咱们从新开始~

大白话GANs原理

知乎上有一个很好的解释:

假设一个城市治安混乱,很快,这个城市里就会出现无数的小偷。在这些小偷中,有的多是盗窃高手,有的可能毫无技术可言。假如这个城市开始整饬其治安,忽然开展一场打击犯罪的「运动」,警察们开始恢复城市中的巡逻,很快,一批「学艺不精」的小偷就被捉住了。之因此捉住的是那些没有技术含量的小偷,是由于警察们的技术也不行了,在捉住一批低端小偷后,城市的治安水平变得怎样倒还很差说,但很明显,城市里小偷们的平均水平已经大大提升了。

警察们开始继续训练本身的破案技术,开始抓住那些愈来愈狡猾的小偷。随着这些职业惯犯们的落网,警察们也练就了特别的本事,他们能很快能从一群人中发现可疑人员,因而上前盘查,并最终逮捕嫌犯;小偷们的日子也很差过了,由于警察们的水平大大提升,若是还想之前那样表现得鬼鬼祟祟,那么很快就会被警察捉住。

为了不被捕,小偷们努力表现得不那么「可疑」,而魔高一尺、道高一丈,警察也在不断提升本身的水平,争取将小偷和无辜的普通群众区分开。随着警察和小偷之间的这种「交流」与「切磋」,小偷们都变得很是谨慎,他们有着极高的偷窃技巧,表现得跟普通群众如出一辙,而警察们都练就了「火眼金睛」,一旦发现可疑人员,就能立刻发现并及时控制——最终,咱们同时获得了最强的小偷和最强的警察。

大白话GANs训练过程

类比上面的过程,生成对抗网络(GANs)由2个重要的部分构成:

生成器(Generator):经过机器生成数据(大部分状况下是图像),目的是“骗过”判别器

判别器(Discriminator):判断这张图像是真实的仍是机器生成的,目的是找出生成器作的“假数据”

下面详细介绍一下过程:

第一阶段:固定「判别器D」,训练「生成器G」

咱们使用一个还 OK 判别器,让一个「生成器G」不断生成“假数据”,而后给这个「判别器D」去判断。

一开始,「生成器G」还很弱,因此很容易被揪出来。

可是随着不断的训练,「生成器G」技能不断提高,最终骗过了「判别器D」。

到了这个时候,「判别器D」基本属于瞎猜的状态,判断是否为假数据的几率为50%。

第二阶段:固定「生成器G」,训练「判别器D」

当经过了第一阶段,继续训练「生成器G」就没有意义了。这个时候咱们固定「生成器G」,而后开始训练「判别器D」。

「判别器D」经过不断训练,提升了本身的鉴别能力,最终他能够准确的判断出全部的假图片。

到了这个时候,「生成器G」已经没法骗过「判别器D」。

循环阶段一和阶段二

经过不断的循环,「生成器G」和「判别器D」的能力都愈来愈强。

最终咱们获得了一个效果很是好的「生成器G」,咱们就能够用它来生成咱们想要的图片了。

下面的实际应用部分会展现不少“惊艳”的案例。

1.2.3 小结

从这个过程来看,GANs有什么优缺点呢?

三个优点:

能更好建模数据分布(图像更锐利、清晰)

理论上,GANs 能训练任何一种生成器网络。其余的框架须要生成器网络有一些特定的函数形式,好比输出层是高斯的。

无需利用马尔科夫链反复采样,无需在学习过程当中进行推断,没有复杂的变分下界,避开近似计算棘手的几率的难题。

两个缺陷:

难训练,不稳定。生成器和判别器之间须要很好的同步,可是在实际训练中很容易D收敛,G发散。D/G 的训练须要精心的设计。

模式缺失(Mode Collapse)问题。GANs的学习过程可能出现模式缺失,生成器开始退化,老是生成一样的样本点,没法继续学习。

1.3 GANs应用举例

1.3.1 从生成MNIST开始

让咱们用MNIST手写数字数据集探索一个具体的例子,以进一步描述上面的过程,Mnist数据以下图所示:

咱们从以下结构网络生成手写数字:

GAN步骤:

开始时期生成器接收随机数并返回图像;

将生成的图像与实际图像流一块儿反馈给判别器;

鉴别器对假图像和真实图像进行判别并返回几率;

GAN过程当中,开始时期从随机数开始,例如:

注:可能刚开始生成的图像很糟糕,可是通过鉴别器把关,不停的迭代,会获得一个不错的结果。

1.3.2 垃圾邮件识别

再来看一个知乎上(@陈琛)的一个例子:垃圾邮件分类。

不知道你们有印象没,垃圾邮件识别,咱们在最开始的教程里也有提到过,如今从另外一个角度再来看看。

假设有一个叫Gary的营销人员试图骗过David的垃圾邮件分类器来发送垃圾邮件。Gary但愿能尽量地发送多的垃圾邮件,David但愿尽量少的垃圾邮件经过。理想状况下会达到纳什均衡,尽管咱们谁都不想收到垃圾邮件。

想了解纳什均衡,能够参看这篇博客。

在收到邮件后,David能够查看spam filter的效果并经过”误报”或”漏报”来惩罚spam filter。

假设Gary经过本身发送给本身能够验证他的垃圾邮件哪些经过了,那么Gary和David就能够经过混淆矩阵(confusion matrix,名字听起来高大上,其实就是个表格而已)来评价本身的工做作的如何:

下面是Gary和David获得的混淆矩阵:

经此以后,Gary和David都知道出了什么问题,并从错误中学习。Gary会基于以前的成功经验尝试其余的方法来生成更好的垃圾邮件。David会看一下spam filter哪里出错了并改进过滤机制。

而后不断地重复这个过程,直到达到某种纳什均衡(固然,有可能最终致使模型崩溃,由于某一方找到了完美的假装方法或者分辨垃圾邮件的方法)。

下面来详细看一下混淆矩阵的四个象限:

True Positive:邮件是Gary生成的垃圾邮件而且被David断定为垃圾邮件。

generator:被抓包,工做作的不够好,须要优化。

discriminator:当前不须要作什么。

False Negative:邮件不是垃圾邮件,可是被David断定为垃圾邮件。

generator:当前不须要作什么。

discriminator:工做作的不够好,须要优化。

False Positive:邮件是垃圾邮件,可是被David断定为正常邮件。

generator:当前不须要作什么。

discriminator:工做作的不够好,须要优化。

True Negative:邮件不是垃圾邮件,David也断定是正常邮件。

generator:当前不须要作什么。

discriminator:当前不须要作什么。

基于上面讨论,图示Network如何训练的:

训练的步骤包括:

取batch的训练集x,和随机生成noise z;

计算loss;

使用back propagation更新generator和discriminator;

咱们已经分析好了,在True Positive,False Negative,False Positive状况下须要更新:

**True Positive:**意味着generator生成的fake数据被抓包,须要对generator进行优化。须要通过参数被固定的discriminator计算loss,更新generator的权重。注意一次只能对两个网络中的一个进行参数调整。

**False Negative:**意味着真的训练集被discriminator错认为fake数据。只更新discriminator的权重。

**False Positive:**generator生成的fake数据,被discriminator断定为真的训练集。只对discriminator进行更新。

如何结合上前一节介绍的数学原理?

如今让咱们用更数学的角度来解释一下:

咱们有一个已知的real的分布,generator生成了一个fake的分布。由于这个两个分布不彻底相同,因此他们之间存在KL-divergence,也就是损失函数不为0。

discriminator同时看到real的分布和fake的分布。若是discriminator能分清楚来自generator生成的与来自real分布的,就会生成loss并反向传播更新generator的权重。

generator更新完成后,生成的fake数据更符合real的分布。

可是若是生成的data仍然不够接近real的分布,discriminator依然能识别出来了,所以再次对generator进行权重更新。

终于此次discriminator被骗过了,它认为generator生成的fake数据就是符合real分布的。这个就对应False Positive的状况,须要对discriminator进行更新。

Loss反向传播来更新discriminator的权重。

继续这个过程,直到generator生成的分布与real分布没法区分时,网络达到纳什均衡。

1.3.3 更多实际应用

(Conditional) Synthesis—条件生成

最好玩的好比Text2Image、Image2Text。能够基于一段文字生成一张图片,好比这个Multi-Condition GAN(MA-GAN)的text-to-image的例子:

Data Augmentation—数据加强

GAN学习训练集样本的分布,而后进行采样生成新的样本,咱们可使用这些样原本加强训练集。通常咱们都是经过对原训练集的图片进行旋转和扭曲来进行加强,这里GAN提供了一种新的方法。

Style Transfer和Manipulation-风格转换

将一张图片的style转移到另一张图像上,这与neural style transfer很是相似。Neural Style Transfer能够认为是把Style Image的风格加入到Content Image里。由于只有一张Style Image,因此它其实学到的很难彻底是Style的特征,由于一个画家的风格很难经过一幅做品就展示出来。GAN可以很好的从多个做品中学习到画家的真正风格特征。

第2/3列为neural style transfer的效果,第5列为cycleGAN:

能够看出对背景特别有效,好比对云的转换等:

GAN在动物和水果上的效果:

四季变换:

改变照片的景深:

对线稿填充变成真实的物体:

能够利用风格转换来渲染图像,变成游戏GTA风格的:

将白天变夜晚:

style transfer能够具体见这个survey

Image Super-Resolution

即将图像从低分辨率LR恢复到高分辨率HR:

1.3.4 小结

更多应用,可参见这篇博客。

最后,若是你想了解更多关于GANs发展史及现有的流行模型,可参看这篇博文:生成对抗网络(GAN)的发展史

声明

本博客全部内容仅供学习,不为商用,若有侵权,请联系博主谢谢。

参考文献

[1] GANs数学原理:https://zhuanlan.zhihu.com/p/...

[2] GANs数学原理:https://blog.csdn.net/oBright...

[3] GANs原理:https://www.jianshu.com/p/bc7...

[4] 邮件识别:https://www.zhihu.com/questio...

[5] 更多应用:https://machinelearningmaster...

相关文章
相关标签/搜索