开发 | 自Ian Goodfellow之后,GANs还有哪些开拓性进展?

AI科技评论按:本文由作者Adit Deshpande总结,AI科技评论编译整理。Adit Deshpande目前是UCLA计算机科学专业生物信息学方向的大二学生。他热衷于将自己的机器学习和计算机视觉技术应用在健康领域,给医生和患者带来更好的解决方案。

一直以来,Adit Deshpande 都有总结和解释一些深度学习论文的习惯,在本文中,Adit Deshpande 将围绕对抗生成网络(GANs)的主题来展开介绍。以下为AI科技评论编译整理的内容:

介绍

Yann LeCun在Quora上曾说,“对抗训练是自切片面包出现以来最酷的东西”。我也同意他说的,因为切片面包从未在深度学习的圈子里引起如此多的关注和兴奋。在这篇总结里,我们一起来看看3篇基于Ian Goodfellow在2014年发表的开拓性工作的文章。

生成对抗网络(GANs)概述

我在之前的博文,《9篇你要知道的深度学习论文》,里提到过Ian Goodfellow生成对抗网络的论文。那些网络模型大致是,你有两个模型,一个生成模型(generative model)和一个辨别模型(discriminative model)。辨别模型的任务是决定一张图片是自然的(来自数据集)还是人工合成的。生成器的任务是生成看起来自然,和原始数据分布类似的图片。

这可以被看做是一个两者间的零和或极小极大博弈。这篇文章中比喻到,生成模型就像“一群制印使用假钞的造假者”,而辨别模型就像“查验假钞的警察”。生成器想要骗过鉴别器,鉴别器则努力防止被骗。两个模型经过交替优化的训练,直到伪造品和真品不能被区分。

论文1. 对抗网络的拉普拉斯金字塔

简介

对抗网络最重要的一个应用就是在足够的训练后,生成器能合成看起来自然的图片。在Goodfellow 2014年的文章中有一些生成器输出的例子。

如图所示,生成器能很好地处理数字和人脸,但在遇到CIFAR-10数据集的时候,生成的图片就很模糊不清。

为了矫正这个问题,Emily Denton, Soumith Chintala, Arthur Szlam, 和Rob Fergus四人发表了《基于拉普拉斯金字塔生成式对抗网络的深度生成图像模型(Deep Generative Image Models using Lapalacian Pyramid of Adversarial Networks)》。这篇文章的主要贡献是一种网络结构,它能生成在40%情况下让人类评测者误以为真的高质量合成图像。

方法

在谈论论文之前,让我们回顾下生成器在GAN里的作用。它需要能够生成大型,复杂且自然的,能够骗过经过训练的鉴别器的图像。这可不是一个一蹴而就的任务。作者们的解决方法是,使用多重CNN(Convolutional Neural Network,卷积神经网络)模型,依次生成更大的图像。正如Emily Denton在她LAPGANs的演讲中提到的:

“低清晰度的图像很容易生成,根据低清图像生成清晰度稍高一些的也不算难。”

这篇文章使用的方法就是建立一个生成模型的拉普拉斯金字塔。对那些不熟悉这个概念的读者来说,拉普拉斯金字塔是一种图像表示方法,它包含一系列连续经滤波的更低密度的图像(更多背景请看这里 http://www.cs.utah.edu/~arul/report/node12.html)。每一层金字塔样本都包含了图像在某个尺寸下的信息。它其实是原图的一种分解方法。我们来看一下一个简单GAN的输入和输出是什么。生成器接收分布的噪声向量输入,并输出一幅图像。鉴别器读入这幅图像(或者是一张来自训练数据中的真实图像),并输出一个标量来描述这个图像有多“真实”。现在我们来看一下有条件的生成对抗网络(conditional GAN,CGAN)。它的所有条件都与GAN一样,除了一点,生成器和鉴别器都还要接收另一条信息作为输入。这条信息通常是一种类标签,或另一幅图像。

网络结构

作者提出了一组卷积网络(ConvNet)模型,金字塔的每一层都有一个相关的卷积网络。与传统GAN结构不同的是,我们使用一系列的CNN,通过缓慢增加清晰度(也就是顺着金字塔)来一步步生成图像,并由粗到细的精化图像,而不是只用一个CNN生成整个图像。每一层都有它自己的CNN,并由两部分训练。一部分是低清图像,另一部分是噪声向量(这是传统GAN的唯一输入)。这就是在多输入情况下,CGAN发挥作用的时候了。输出将会是一幅将要被上采样,作为下一级金字塔输入的生成图像。因为各层的生成器可以使用不同清晰度下的信息,在连续的层级里生成更精细的输出,所以这个方法是非常有效的。

论文2:生成对抗文本到图像合成

简介

这篇论文发表在刚刚过去的六月(译者注:本博文发表于2016年),它研究了如何将文字描述转化为图 像。例如,网络的输入可以是“有粉色花瓣的一朵花”,输出就是一幅包含这些元素的图像。这个任务包含两个部分,一是使用自然语言处理的方法来理解输入的描述,另一部分是能够输出精确且自然图片样本的生成网络。作者提到的一点是,从文本到图像的转化要比从图像到文本转化(可以回顾下Karpathy的论文 https://arxiv.org/pdf/1412.2306v2.pdf)难得多。这不光因为有无数种的像素配置,还因为我们不能把任务分解为“预测下一个词”那么简单的事情(就像图片到文字的转化所使用的方法)。

方法

作者使用的方法是,训练一个基于循环文本编码器创建的文本特征的GAN网络(在此就不深入展开了,有兴趣的读者可以在此阅读原文 https://arxiv.org/pdf/1605.05395v1.pdf)。生成器和鉴别器都在它们相应的网络结构中用到了这个架构。这使得GAN能够将输入的描述文本和生成的图片关联起来。

网络结构

我们先来看生成器。我们把噪声向量z和文本编码做为网络的输入。简单来说,这个文本编码是一种使其能和噪声向量连接的,封装输入描述信息的方法(见下图)。然后反卷积层(Deconv layer)会被用来把输入向量转化为合成图片。

鉴别器读入一幅图片,然后经过一系列卷积层的处理(用BatchNorm和 leaky ReLUs)。当空间维度到达4x4的时候,网络会和前边提到的文本编码执行深度并置(depth concatenation)。之后,就会有多于两个的卷积层,并且会输出(且一直输出)反应图像真实程度的分数。

训练

这个模型被训练的方式非常有趣。如果你仔细想想模型的任务,生成器有两个任务必须要正确达成。一个是它必须生成自然且合理的图像;另一个任务是图像必须和给定的描述相关。如此一来,鉴别器必须要考虑到这两个方面,确保假的,或者不自然的图像以及不符原文的图像被拒绝。为了做出如此适应性强的模型,作者用到了三类数据来进行训练:{自然图像,匹配文本},{不自然图像,匹配文本},以及{自然图片,不匹配文本}。遇到最后一种训练数据类型时,鉴别器必须学习拒绝不符合文本的图像(即使它们看起来很自然)。

论文3.基于GANs的超解析

简介

推特Cortex的一个研究小组在几周前(译者注:本博文发表于2016年)发表的这篇文章是这个领域飞速创新的一个缩影。这篇文章中提出的模型是超解析度生成对抗网络,简称SRGAN(super-resolution generative adversarial network)。它主要的贡献在于一种全新的损失函数(要比旧的MSE好),这个函数可以使网络从被严重下采样的图像中恢复出逼真的纹理和细节。

方法

我们先来看看这个新的感知损失函数(perceptual loss function)。这个损失函数分为两部分,对抗损失(adversarial loss)和内容损失(content loss)。宏观来看,对抗损失帮助图像看起来更逼真(看起来像原图),内容损失保证新清晰度的图像和原来低清的图像有相似的特征。

网络结构

好了,现在我们来看一些细节。我们先来看一个高清晰度版本的图像,然后再来看低清晰度的。我们想把生成器训练为,当给定一个低清图像后,它能输出尽可能高清的图像。这个输出就叫做超解析图像。鉴别器会被训练来区分这些图像。还是老一套,不是么?生成器网络结构使用一组包含ReLUs 和BatchNorm 和卷积层的B残量块(译者注:见下图B residual blocks)。一旦低清图像经过这些模块处理时,就会有两个反卷积层来提高清晰度。然后再看鉴别器,我们有8个卷积层组成的Sigmoid激活函数,它可以输出图像是真实(高清)或者合成(超解析)的概率。

损失函数

我们再来看看新的损失函数。它实际上是单独的损失函数的加权和。第一部分被称为内容损失(content loss)。简单来说,它是新的重构图像(网络的输出)的特征图(在训练前的VGG网络中)到真实高清训练图像的欧氏距离(Euclidean distance)损失。如果我没理解错的话,它主要的目标是,如果把两幅图送到经过训练的卷积网络后,再比较两幅图各自的特征激活量,两幅图是相似的。

另一个作者定义的主要的损失函数是对抗损失(adversarial loss)。这个函数和通常和你期望从GANs里得到的差不多。它激励和原始数据分布负对数似然类似的输出。正则化损失是损失函数的第三项。有了这个新的损失函数,生成器可以确保输出看起来自然的更高清图像,同时相比低清图像,也有相似的像素空间。

后记:

GANs使用大部分无监督的训练(你要做的只要有一个真实图片的数据集,不需要标签和其他信息)。这意味着我们可以利用很多现有的未分类的图像数据。经过训练,我们可以用输出或者中间层作为特征提取器,如此就不需要那么多训练数据来达到高准确率了。

我拿不到,但是超级酷的文章还有:DCGANs。作者们没做什么太夸张的事,他们只是训练了一个特别特别大的卷积网络。但是特别的地方在于他们有正确的超级参数来使训练真正的有用(也就是BatchNorm, Adam, Leaky ReLUs)。

Via kdnuggets

原文发布于微信公众号 - AI科技评论(aitechtalk)

原文发表时间:2017-03-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏拭心的安卓进阶之路

Java 集合深入理解(6):AbstractList

今天心情比天蓝,来学学 AbstractList 吧! ? 什么是 AbstractList ? AbstractList 继承自 AbstractCollec...

19210
来自专栏Phoenix的Android之旅

Java 集合 Vector

List有三种实现,ArrayList, LinkedList, Vector, 它们的区别在于, ArrayList是非线程安全的, Vector则是线程安全...

672
来自专栏alexqdjay

HashMap 多线程下死循环分析及JDK8修复

1K4
来自专栏Java Edge

AbstractList源码解析1 实现的方法2 两种内部迭代器3 两种内部类3 SubList 源码分析4 RandomAccessSubList 源码:AbstractList 作为 Lis

它实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,但不支持添加和替换

462
来自专栏xingoo, 一个梦想做发明家的程序员

Spark踩坑——java.lang.AbstractMethodError

百度了一下说是版本不一致导致的。于是重新检查各个jar包,发现spark-sql-kafka的版本是2.2,而spark的版本是2.3,修改spark-sql-...

1200
来自专栏赵俊的Java专栏

从源码上分析 ArrayList

1181
来自专栏desperate633

LeetCode Invert Binary Tree题目分析

Invert a binary tree. 4 / \ 2 7 / \ / \1 3 6 9 to4 / \ 7 2 / \ / \9 6 3 1 Tri...

861
来自专栏xingoo, 一个梦想做发明家的程序员

AOE关键路径

这个算法来求关键路径,其实就是利用拓扑排序,首先求出,每个节点最晚开始时间,再倒退求每个最早开始的时间。 从而算出活动最早开始的时间和最晚开始的时间,如果这两个...

2527
来自专栏项勇

笔记68 | 切换fragmengt的replace和add方法笔记

1444
来自专栏开发与安全

算法:AOV网(Activity on Vextex Network)与拓扑排序

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex ...

2597

扫码关注云+社区