利用生成对抗网络从随机噪声创建数据

本文概述

  • 在你开始之前
  • 为什么是GAN?
  • 基础
  • 看信用卡欺诈数据
  • 使用GAN生成新的信用卡数据
  • 我们学到了什么?
  • 超越无限
自从我了解了生成对抗网络(GAN)以来, 我一直着迷于它们。 GAN是一种神经网络, 能够从头开始生成新数据。你可以输入一些随机噪声作为输入, 并且它可以产生卧室, 鸟类或任何经过训练可以生成的逼真的图像。
所有科学家都可以同意的一件事是, 我们需要更多的数据。
GAN可用于在数据受限的情况下产生新数据, 事实证明确实有用。有时生成数据可能很困难, 昂贵且耗时。但是, 有用的是, 新数据必须足够真实, 以至于我们从生成的数据中获得的任何见解仍然适用于真实数据。如果你要训练一只猫捉老鼠, 并且使用的是假老鼠, 则最好确保这些假老鼠看起来像老鼠。
对此的另一种思考方式是GAN正在发现数据中的结构, 从而使它们能够生成真实的数据。如果我们自己看不到该结构或无法通过其他方法将其拉出, 则此功能很有用。
利用生成对抗网络从随机噪声创建数据

文章图片
在本文中, 你将学习如何将GAN用于生成新数据。为了使本教程保持现实, 我们将使用Kaggle的信用卡欺诈检测数据集。
在我的实验中, 我尝试使用该数据集来查看是否可以让GAN创建足够真实的数据来帮助我们检测欺诈案件。该数据集突出显示了有限的数据问题:在285, 000个交易中, 只有492个为欺诈。 492个欺诈案例不是可训练的大型数据集, 尤其是在涉及人希望将数据集扩大几个数量级的机器学习任务中。尽管实验的结果并不令人惊讶, 但我在分享的过程中确实学到了很多有关GAN的知识。
在你开始之前 【利用生成对抗网络从随机噪声创建数据】在深入探讨GAN的领域之前, 如果你想快速掌握机器学习或深度学习技能, 可以看看以下两个相关的博客文章:
  • 机器学习理论及其应用简介:带有示例的可视教程
  • 深度学习教程:从感知器到深度网络
为什么是GAN? 生成对抗网络(GAN)是一种神经网络体系结构, 相对于以前的生成方法(如变分自动编码器或受限的Botzman机器), 已显示出令人印象深刻的改进。 GAN能够生成更逼真的图像(例如DCGAN), 实现图像之间的样式转换(请参见此处和此处), 从文本描述(StackGAN)生成图像以及通过半监督学习从较小的数据集中学习。由于这些成就, 它们引起了学术界和商业界的极大兴趣。
Facebook的AI研究总监Yann LeCunn甚至称它们为过去十年中机器学习中最激动人心的发展。
基础 考虑一下你的学习方式。你尝试一些事情, 会得到一些反馈。你调整策略, 然后重试。
反馈可能以批评, 痛苦或获利的形式出现。这可能取决于你对自己做得如何的判断。通常, 最有用的反馈是来自另一个人的反馈, 因为它不仅是数字或感觉, 而且是你对任务执行情况的智能评估。
当培训计算机完成一项任务时, 人员通常以调整后的参数或算法的形式提供反馈。当任务定义明确时(例如学习将两个数相乘), 此方法效果很好。你可以轻松准确地告诉计算机出了什么问题。
对于更复杂的任务, 例如创建狗的图像, 提供反馈变得更加困难。图像是否模糊, 看起来更像猫还是什么都没有?可以实现复杂的统计信息, 但是很难捕获使图像看起来真实的所有细节。
人类可以给出一些估计, 因为我们在评估视觉输入方面有丰富的经验, 但是我们相对较慢, 并且我们的评估可能非常主观。相反, 我们可以训练神经网络来学习区分真实图像和生成图像的任务。
然后, 通过让图像生成器(也是神经网络)和鉴别器轮流学习彼此, 它们可以随着时间的推移而改善。玩这个游戏的这两个网络是一个生成的对抗网络。
你可以听到GAN的发明者Ian Goodfellow谈论有关该主题的酒吧中的争论如何导致编码之夜, 这导致了第一个GAN。是的, 他的确在论文中承认了该条。你可以从Ian Goodfellow关于此主题的博客中了解有关GAN的更多信息。
利用生成对抗网络从随机噪声创建数据

文章图片
使用GAN时会遇到许多挑战。由于涉及众多选择, 训练单个神经网络可能很困难:架构, 激活函数, 优化方法, 学习率和辍学率, 仅举几例。
GAN将所有这些选择加倍, 并增加了新的复杂性。生成器和鉴别器都可能会忘记他们在训练中使用的技巧。这可能会导致两个网络陷入一个稳定的解决方案周期, 而随着时间的推移, 解决方案不会有所改善。一个网络可能会压倒另一个网络, 从而使两个网络都无法学习。或者, 生成器可能不会探索太多可能的解决方案空间, 而只能探索足够多的空间来找到切合实际的解决方案。最后一种情况称为模式崩溃。
模式崩溃是指生成器仅学习可能的现实模式的一小部分时。例如, 如果任务是生成狗的图像, 则生成器可以学习仅创建小棕狗的图像。生成器会错过由其他大小或颜色的狗组成的所有其他模式。
已经采取了许多策略来解决此问题, 包括批量标准化, 在训练数据中添加标签或通过更改鉴别器判断生成数据的方式。
人们已经注意到, 向数据添加标签(即, 将其分解为类别)几乎总是可以提高GAN的性能。例如, 与其学习通常生成宠物的图像, 不如生成猫, 狗, 鱼和雪貂的图像, 应该更容易。
GAN开发中最重大的突破也许就在于改变鉴别器评估数据的方式, 因此让我们仔细研究一下。
在Goodfellow等人于2014年提出的GAN原始公式中, 鉴别器会生成给定图像真实或生成的概率估计。鉴别器将被提供一组由真实和生成的图像组成的图像, 并且它将为这些输入中的每一个生成估计。鉴别器输出和实际标签之间的误差随后将通过交叉熵损失来测量。交叉熵损失可以等同于Jensen-Shannon距离度量标准, 并在2017年初由Arjovsky等人证明。表示该指标在某些情况下会失败, 而在其他情况下不会指向正确的方向。该小组表明, Wasserstein距离度量标准(也称为推土机或EM距离)在很多情况下都可以工作并且效果更好。
交叉熵损失是鉴别器识别真实和生成图像的准确程度的度量。 Wasserstein度量标准而是查看真实和生成的图像中每个变量(即每个像素的每种颜色)的分布, 并确定分布在真实和生成的数据中的距离。 Wasserstein度量标准以质量乘以距离的方式查看要花费多少努力, 才能将生成的分布推到实际分布的形状中, 因此也称为” 地球移动器距离” 。由于Wasserstein指标不再评估图像是否真实, 而是批评生成的图像与真实图像有多远, 因此” 判别器” 网络在Wasserstein中被称为” 评论” 网络建筑。
为了对GAN进行更全面的探索, 在本文中, 我们将探索四种不同的体系结构:
  • GAN:原始(“ 香草” )GAN
  • CGAN:使用类标签的原始GAN的条件版本
  • WGAN:Wasserstein GAN(具有渐变惩罚功能)
  • WCGAN:Wasserstein GAN的条件版本
但首先让我们看一下我们的数据集。
看信用卡欺诈数据 我们将使用Kaggle的信用卡欺诈检测数据集。
该数据集包含约285, 000笔交易, 其中只有492笔是欺诈交易。数据包含31个特征:” 时间” , “ 数量” , “ 类别” 和28个其他匿名特征。类别特征是指示交易是否为欺诈的标签, 其中0表示正常, 而1表示欺诈。所有数据都是数字且连续的(标签除外)。数据集没有缺失值。数据集一开始就已经很不错了, 但是我会做更多的清理工作, 主要是将所有要素的均值调整为零, 将标准偏差调整为1。我在这里的笔记本电脑中对清洁过程进行了更多描述。现在, 我只显示最终结果:
利用生成对抗网络从随机噪声创建数据

文章图片
人们可以很容易地发现这些分布中的正常数据和欺诈数据之间的差异, 但是也存在很多重叠之处。我们可以应用一种更快, 更强大的机器学习算法来识别用于识别欺诈的最有用的功能。 xgboost这个算法是梯度增强的决策树算法。我们将对70%的数据集进行训练, 然后对其余30%的数据进行测试。我们可以将算法设置为继续执行, 直到算法不能提高测试数据集的查全率(检测到的欺诈样本的比例)。这样可以在测试集上实现76%的召回率, 这显然有待改进。它确实达到了94%的精度, 这意味着只有6%的预测欺诈案件实际上是正常交易。通过此分析, 我们还获得了按功能在检测欺诈方面的功能排序的功能列表。我们可以使用最重要的功能来帮助以后可视化我们的结果。
同样, 如果我们拥有更多的欺诈数据, 我们也许能够更好地检测到它。也就是说, 我们可以实现更高的召回率。现在, 我们将尝试使用GAN生成新的现实欺诈数据, 以帮助我们检测实际欺诈。
使用GAN生成新的信用卡数据 要将各种GAN架构应用于此数据集, 我将使用GAN-Sandbox, 它具有许多使用Keras库和TensorFlow后端在Python中实现的流行GAN架构。我的所有结果都可以在此处作为Jupyter笔记本获得。如果需要简单的设置, 所有必需的库都包含在Kaggle / Python Docker映像中。
GAN-Sandbox中的示例用于图像处理。生成器为每个像素生成一个具有3个颜色通道的2D图像, 并且辨别器/评论器配置为评估此类数据。在网络的各层之间利用卷积变换来利用图像数据的空间结构。卷积层中的每个神经元仅与一小组输入和输出(例如, 图像中的相邻像素)一起使用, 以允许学习空间关系。我们的信用卡数据集在变量之间缺少任何空间结构, 因此我已将卷积网络转换为具有紧密连接的层的网络。紧密连接的层中的神经元连接到该层的每个输入和输出, 从而使网络能够了解其特征之间的关系。我将针对每种架构使用此设置。
我将评估的第一个GAN将生成器网络与鉴别器网络进行对比, 利用鉴别器的交叉熵损失来训练网络。这是原始的” 香草” GAN架构。我将评估的第二个GAN以条件GAN(CGAN)的方式向数据添加类标签。该GAN在数据中还有一个变量, 即类标签。第三个GAN将使用Wasserstein距离度量标准来训练网络(WGAN), 最后一个将使用类标签和Wasserstein距离度量标准(WCGAN)。
利用生成对抗网络从随机噪声创建数据

文章图片
我们将使用包含所有492个欺诈性交易的训练数据集来训练各种GAN。我们可以向欺诈数据集添加类, 以促进条件GAN架构。我研究了笔记本中的几种不同的聚类方法, 并采用了KMeans分类, 该分类将欺诈数据分为2类。
我将对每个GAN进行5000轮训练, 并一路检查结果。在图4中, 随着训练的进行, 我们可以看到实际的欺诈数据和从不同GAN架构生成的欺诈数据。我们可以看到将实际欺诈数据划分为2个KMeans类, 并绘制了2个维度, 以最佳地区分这两个类(PCA转换特征的特征V10和V17)。 GAN和WGAN这两个不使用类信息的GAN生成的输出全部作为一个类。条件架构CGAN和WCGAN按类别显示其生成的数据。在步骤0, 所有生成的数据均显示馈给生成器的随机输入的正态分布。
利用生成对抗网络从随机噪声创建数据

文章图片
我们可以看到, 原始的GAN架构开始学习实际数据的形状和范围, 但随后却朝着较小的分布方向崩溃。这是前面讨论的模式崩溃。生成器已获悉识别器很难检测到伪造的少量数据。 CGAN架构的性能要好一些, 可以扩展并接近每种欺诈数据的分布, 但是随后会出现模式崩溃, 如步骤5000所示。
WGAN不会遇到GAN和CGAN体系结构所展现的模式崩溃。即使没有类别信息, 它也开始假定实际欺诈数据的非正态分布。 WCGAN体系结构的性能类似, 并且能够生成单独的数据类别。
我们可以使用先前用于欺诈检测的xgboost算法评估数据的真实程度。它既快速又强大, 并且无需太多调整即可直接使用。我们将使用一半的实际欺诈数据(246个样本)和相同数量的GAN生成的示例来训练xgboost分类器。然后, 我们将使用另一部分实际的欺诈数据以及一组由246 GAN生成的不同示例来测试xgboost分类器。这种正交方法(在实验意义上)将为我们提供一些指示, 表明生成器在生成实际数据方面有多成功。使用完美逼真的生成数据, xgboost算法应达到0.50(50%)的准确度, 换句话说, 它不比猜测好。
利用生成对抗网络从随机噪声创建数据

文章图片
我们可以看到, 在GAN生成的数据上, xgboost精度首先下降, 然后在训练了步骤1000后随着模式崩溃的出现而增加。CGAN体系结构在经过2000步后获得了一些更真实的数据, 但是对于该网络, 模式崩溃的设置为好。 WGAN和WCGAN架构可以更快地获取更多真实的数据, 并随着培训的进行而不断学习。 WCGAN在WGAN上似乎没有太多优势, 这表明这些创建的类可能对Wasserstein GAN架构没有用。
你可以从这里和这里了解有关WGAN架构的更多信息。
WGAN和WCGAN体系结构中的批评者网络正在学习计算给定数据集与实际欺诈数据之间的Wasserstein(地球移动器, EM)距离。理想情况下, 它将为实际欺诈数据样本测量接近零的距离。但是, 评论家正在学习如何执行此计算。只要与生成的数据相比, 生成数据的距离更大, 网络就可以改善。我们可以看到在训练过程中生成的数据和实际数据的Wasserstein距离之间的差异是如何变化的。如果停滞不前, 则进一步的培训可能无济于事。我们可以在图6中看到, 此数据集上的WGAN和WCGAN似乎都有进一步的改进。
利用生成对抗网络从随机噪声创建数据

文章图片
我们学到了什么? 现在, 我们可以测试我们是否能够生成足够真实的新欺诈数据, 以帮助我们检测实际欺诈数据。我们可以选择训练有素的生成器, 该生成器获得最低的准确性分数, 并使用该分数生成数据。对于我们的基本培训, 我们将使用70%的非欺诈数据(199, 020例)和100例欺诈数据(约20%的欺诈数据)。然后, 我们将尝试向此培训集中添加不同数量的真实或生成的欺诈数据, 最多344个案例(欺诈数据的70%)。对于测试集, 我们将使用其他30%的非欺诈案件(85, 295个案件)和欺诈案件(148个案件)。我们可以尝试从未经训练的GAN和受过最佳训练的GAN中添加生成的数据, 以测试生成的数据是否比随机噪声更好。从我们的测试中可以看出, 我们最好的体系结构是训练步骤4800中的WCGAN, 它的xgboost精度达到70%(请记住, 理想情况下, 精度为50%)。因此, 我们将使用这种架构来生成新的欺诈数据。
在图7中我们可以看到, 随着我们使用更多生成的欺诈数据进行训练, 召回率(在测试集中准确识别的实际欺诈样本的比例)不会增加。 xgboost分类器能够保留从100个实际案例中识别欺诈所使用的所有信息, 即使从数十万个正常案例中挑选出来的额外数据也不会混淆。毫无疑问, 未经训练的WCGAN生成的数据不会有帮助或伤害。但是从训练有素的WCGAN生成的数据也无济于事。看来数据不够真实。我们可以在图7中看到, 当使用实际的欺诈数据来补充训练集时, 召回率显着增加。如果WCGAN刚刚学会了重复训练示例而又完全没有创造力, 那么它可以实现更高的召回率, 就像我们从真实数据中看到的那样。
利用生成对抗网络从随机噪声创建数据

文章图片
超越无限 尽管我们无法生成足够真实的信用卡欺诈数据来帮助我们检测实际欺诈, 但我们几乎没有使用这些方法来摸索。我们可以使用更大的网络训练更长的时间, 并为我们在本文中尝试过的体系结构调整参数。 xgboost准确性和鉴别器丢失的趋势表明, 更多的培训将有助于WGAN和WCGAN体系结构。另一个选择是重新检查我们执行的数据清理, 也许设计一些新变量或更改是否以及如何解决要素偏斜。欺诈数据的不同分类方案可能会有所帮助。
我们也可以尝试其他GAN架构。 DRAGAN具有理论和实验证据, 表明它比Wasserstein GAN训练得更快, 更稳定。我们可以整合利用半监督学习的方法, 这些方法在有限的训练集学习中显示出了希望(请参阅” 改进的GAN训练技术” )。我们可以尝试一种能够为我们提供人类可理解的模型的体系结构, 因此我们也许能够更好地理解数据的结构(请参阅InfoGAN)。
我们还应密切关注该领域的新发展, 最后但同样重要的是, 我们可以在这个快速发展的空间中致力于创造自己的创新。
你可以在此GitHub存储库中找到本文的所有相关代码。

    推荐阅读