生成对抗网络入门指南
生成对抗网络(GAN)是由两个相互竞争的网络组成的深度神经网络架构。
2014年,Lan Goodfellow和蒙特利尔大学包括Yoshua Bengio在内的其它研究人员在论文中介绍了生成对抗网络。Facebook的AI研究主管Yann LeCun称对抗训练是“近10年来最有趣的机器学习(ML)”
生成对抗网络具有很大的潜力,因为它们可以学习模拟任何数据的分布。换句话说,在任何领域,我们都可以教生成对抗网络创造出与我们类似的世界:图像,音乐,演说,散文。从某种意义上来说,它们是机器人艺术家,能够创造出令人印象深刻甚至是伤感的东西。
生成算法和判别算法
为了理解生成对抗网络,首先应该了解生成算法的是如何工作的,为此,现将生成算法和判别算法进行对比以便更好的理解。判别算法试图对输入数据进行分类:即给定一个数据实例的特征,来预测该数据所属的标注或类别。
例如:给定一封电子邮件的所有单词,判别算法能够预测该邮件是否为垃圾邮件。垃圾邮件是其中的一种标注,从邮件中收集到的单词则构成了输入数据的特征。用数学表达式表述这一问题,y表示标注,x表示特征,公式p(y|x)表示“给定x,y的概率”,则该事件可描述为“给定邮件中所包含的单词,邮件为垃圾邮件的概率”。因此,判别算法将特征映射到标注,只关注二者之间的相关性。
一种理解生成算法的方式是,生成算法做相反的事情。生成算法并不预测给定特征的标注,而是试图预测给定标注的特征。
生成算法试图解决的问题是:假设这封电子邮件为垃圾邮件,它的特征可能是什么?判别模型关注y和x之间的关系,而生成模型关注的是如何得到x。这允许你得到p(x|y),即给定y,x的概率或给定一个类,特征的概率。(也就是说,生成算法可用作分类器,只不过它不仅仅只是对输入数据进行分类)。
另一种区分判别模型和生成模型的理解方式是:判别模型学习类间的边界,而生成模型模拟各个类的分布。
生成对抗网络是如何运行的?
生成器,是一个用来生成新的数据实例的神经网络;判别器,则是用来评估其真实性的神经网络。即判别器决定它所检验的每个数据实例是否属于实际的训练数据集。
比方说,我们试图做一些比仿制蒙娜丽莎更平庸的工作。我们从现实世界中获取并生成那些类似在MINST数据集中发现的手写数字,当显示来自真实MINST数据集中的实例时,判别器将其识别为可信。
同时,生成器创建传送给判别器的新图像。即便这是假的,我们也视为将其视为真。生成器的目标是生成像样的手写数字,假装不会被发现。判别器的目标是识别生成器中的图像是假的。
生成对抗网络的运行步骤如下:
1.生成器输入一系列随机数字并返回一张图像。
2.将生成的图像和真实数据集中的图像流一起送入判别器。
3.判别器接受真实图像和假图像,并返回概率值,范围是0~1之间的数字,其中1表示真实性的预测,0表示假的预测。
因此,得到一个双反馈回路:判别器在包含图像真相的反馈回路中;发生器在在判别器的反馈回路中。
你可以将生成对抗网络想象成一个伪造者和一个警察在猫和老鼠游戏中的组合,在这里,伪造者正在学习虚假注释,警察正在学习检测他们。二者都是动态的,也就是说警察也在训练中,并且每一方都在不断升级中学习对方的方法。
判别器网络是一个可对输入图像进行分类的标准卷积网络——将图像标记为真或假的一个二值分类器。从某种意义上来说,生成器是一个反向卷积网络:标准卷积分类器获取一张图像,采样并输出概率,而生成器则获取随机噪声矢量并将其上采样到一张图像中。前者使用maxpooling这样的下采样技术扔掉数据,后者生成新的数据。
两个网络都试图在零和博奕中优化一个不同且对立的目标函数,或者是损失函数。它本质上就是一个演员-评论模型。随着判别器改变行为,生成器也随之改变,反之亦然。他们的损耗也相互抗衡。
生成对抗网络:自动编码器和变分自编码器(VAE)
自动编码器将输入数据编码为矢量,创建一个隐藏或压缩的原始数据representation,主要用于降维。也就是说,用作隐藏representation的矢量将原始数据压缩为一个较小的主要纬度。自动编码器可以和解码器配对,可根据其隐藏representation重建输入数据,这和受限玻尔兹曼机相同。
变分自编码器是生成算法,在对输入数据编码的过程中增加了额外约束,即将隐藏表示进行标准化。变分自编码器既可以像自动编码器一样压缩数据,又可以像生成对抗网络那样合成数据。然而当生成对抗网络生成细节数据时,变分自编码器生成的图像往往更加模糊。Deeplearning4j’s包中包括自动编码器和变分自编码器。
生成算法可分为以下三种类型:
1.给定一个标注,预测相关的特征(朴素贝叶斯)。
2.给定一个隐藏表示,预测相关特征(变分自编码器,生成对抗网络)。
3.给定一些特征,预测其余特征(图像修复,图像插补)。
训练生成对抗网络的技巧
训练判别器时,保持生成器的值不变;训练生成器时,则保持判别器不变。比如:这可以让生成器更好的读取它必须学习的梯度变化。同样的道理,在开始训练生成器前,对用于MINST数据集的判别器先进行预训练,可以建立一个更佳清晰的梯度。
生成对抗网络的每一方都可以压制另一方。若判别器太好,返回接近0或1的值,发生器将难以读取梯度;若生成器太好,它将不断利用判别器的弱点导致漏报。这可以通过各自的学习率来减轻这种压制。
注意: Maven 上的Deeplearning4j’s最新版本不包括生成对抗网络,但很快就可以通过自动分化和模型导入来构建和使用,目前这些都可以在Github上额主存储库中获得。