专栏首页机器之心解读 | 如何用进化方法优化大规模图像分类神经网络?

解读 | 如何用进化方法优化大规模图像分类神经网络?

机器之心原创

作者:Angulia Chao

参与:Joni、侯韵楚、高振

让机器具备生物一样的进化能力一直是计算机科学的一个热门研究领域,今年三月份,谷歌的多位研究者提出了一种图像分类器的大规模进化方法,机器之心也曾报道过这项研究,参阅:《深度 | 谷歌和 OpenAI 新研究:如何使用达尔文进化论辅助设计人工智能算法?》。研究发布之后,机器之心的技术分析师又对这项重要研究进行了更加深度细致的解读。

论文:图像分类器的大规模进化(Large-Scale Evolution of Image Classifiers)

https://arxiv.org/pdf/1703.01041.pdf

摘要:神经网络已被证明可以有效地解决难题,但它们的架构设计起来颇具挑战性,即便只是图像分类问题也如此。进化算法(evolutionary algorithms)提供了一种能够自动发现这类网络的技术。尽管其计算需求显著,但是设计出能与大型人工设计的架构相媲美的进化模型如今已非天方夜谭。我们以空前的规模采用了简单的进化技术,并从平凡的初始条件出发,来发现可用于 CIFAR-10 和 CIFAR-100 数据集的模型。为此,我们使用直观的新型变异算子(mutation operators)来导航大型搜索空间。我们认为,演化一旦开始,其输出就应当是一个经过完整训练的模型,不需任何人进行参与。这项研究尤其重要的是结果的可重复性、可变性以及计算要求。

解读

不论是在学术研究还是产业应用方面,神经网络都展现了强大的能力。为了解决不同的实际问题,多种网络架构可根据特定的任务而建立。然而如今所创建的有效架构均为人工设计的成果,因此本文为解决神经网络图像分类方面的架构优化问题提出了新的方法。在进化算法中,所提出的方法通过操控直观突变,来自动适应最优的网络架构。此外,整个优化过程并不需要人为干预来获得经过完整训练的模型。为了深入了解,我们将会介绍神经网络中应用演化算法的细节,并将其与之前发表的论文进行比较。最后将会对本研究的整体质量进行简要评估。

在图像分类领域,只要拥有足够的训练数据,神经网络对于多个困难任务而言便是十分成功的分类器,但只有经过研究人员与工程师多年的研究和分析,才能实现表现出色的网络模型。因而以自动方式设计神经网络架构成为热议。若要实现架构的自动设计,一种直观的方法便是「搜索」。因此我们应用了进化算法的思想:受到生物演化机制的启发,算法将候选解决方案作为大群体中的个体,而后定义适应度函数,以度量每个候选解决方案的质量。我们还应用了迭代选择过程,其中相对最优的个体将作为「父代」进行繁殖,通过变异和重组在群体中产生新的后代。通过重复上述操作,子代会继承父代的优势,而突变则进一步提供了群体多样性。依次,我们终将搜索出最佳解决方案。

为了协助优化神经网络,神经演化最初仅用于进化神经网络的连接权重。以 NEAT(增强拓扑的神经演化)算法(Stanley 和 Miikkulainen)为例,它需要改变权重、增加现有节点之间的权重连接以及分割现有连接时插入节点这三种变异,在超参数搜索中也应用了其他类似的方法。但与如今广泛使用的神经网络(如 AlexNet 与 VGGnet)相比,上述方法仅适用于相当小规模的网络。这些传统方法侧重于演化过程的效率而非规模,故而不适于最先进的网络优化。另一方面,非演化性神经发现方法则更适合如今的「深度」网络。因此我们使用了其他替代方法(如贝叶斯优化和强化学习)来优化深度模型,尽管它们的缺陷很明显——网络层数仍需由研究人员证明,而非算法本身。故而所提出的研究强调了在没有人为干涉的条件下,其在研究网络架构的大规模搜索与基本初始条件方面的新颖性。实验比较如下:

表 1. 与人工设计的架构相对比。「C10+」和「C100+」这两列分别表示经过数据增强的 CIFAR-10 和 CIFAR-100 数据集的测试精度。「Reachable?」这一列则表示给定的人工设计的模型是否位于搜索空间内。「-」表示 Huang 等人的论文(2016b)未报告该值(并非原作者)。这张表大部分基于 Huang 等人的论文(2016a)。

表 2. 与自动发现的架构相对比。「C10+」和「C100+」分别包含经过数据增强的 CIFAR-10 和 CIFAR-100 数据集的测试精度。「-」表示该信息未报告或不为我们所知。请参考表 1 包括先进技术的人工设计结果。「离散参数」表明只能从少量值中挑选出参数(如从 {1,2,4} 中进行选择)。

由表 1 和表 2 可得,根据所提出的演化方法,C10+以及 C100+的分类性能超过了人工方法和其他自动发现的架构,并不需经过后处理阶段。

下文将对大规模演化方法做出详细阐述。

根据演化算法的工作原理,该方法将经过训练的架构视为个体。因此,我们能够创建具有多个模型的群体,并将适应度值视为验证集的精确度。本文建议使用图形作为数据结构来编码个体的基本架构。在这个设计图中,顶点表示 3 级张量,这在卷积神经网络中十分常见:使两个维度作为图像的空间坐标,而第三个张量表示 RGB 颜色通道;图形的边缘则表示连接、卷积或可变参数。随后我们通过删除低适应度值模型来应用进化规则,并选择最优的父代来产生新的个体。在繁殖过程中,为了增加个体多样性,我们也会使所选父代的复制版产生突变,接着会在大型搜索空间中重复进行随机个体的成对比赛,以寻得最终的最优子代。对于具体的规模实现,我们已经开发了大规模并行的无锁基础设施。不同的计算机将进行异步操作,并在表示个体的文件目录之下,依靠共享文件系统进行通信,移除和垃圾回收也将被用于处理计算效率问题。此外,繁殖过程对整个群体进行了演变。变异操作也会从预定集中随机选择。变异操作包括:

  • 更改学习率(下文会列出抽样细节)。
  • 身份(实际是指「保持训练」)。
  • 重设权重(如 He et al.(2015)的样本)。
  • 插入卷积(在「卷积主干」中的随机位置插入卷积,如图 1 所示。插入的卷积具有 3×3 的滤波器,随机步长为 1 或 2,信道数量与输入相同。可以应用批量归一化及 ReLU 激活,也可不进行随机使用)。
  • 消除卷积
  • 改变步长(仅允许幂为 2 的步长)
  • 改变任一卷积的信道数。
  • 过滤器尺寸(水平或垂直方向随机,并随机选择卷积,但仅为奇数值)
  • 插入一对一(插入一对一或身份连接,类似于插入卷积突变)
  • 添加跳过(随机层之间的身份)
  • 删除跳过(删除随机跳过)

在突变过程中,所有参数都会产生一个密集的搜索空间,这意味着任何参数都不存在上限。因此所有的模型深度都能够实现。参数的这种无限性引起了对可能存在的真正大型架构集的探索。换言之,神经网络的参数与架构都能够在没有人为干预的条件下演化。

经过对理论背景的阐释,我们逐步介绍了将要做的实验的初始设置与验证策略。众所周知,在初始化方面,即便是一个经过训练的卷积神经网络也属于强分类器,它还可能在实验中达到相对较高的精确度,因此本文会从简单个体所组成的群体出发。这些个体不包含卷积以及在分类方面性能不佳的网络,同时其学习率会被初始化为很大的值:0.1。这种设置会强制个体进行学习,使强分类器进行演变,并能通过变异进行自我发现;同时实验可以避免「操控」,进而大获成功。

加速演化的另一种策略便是权重继承。此处的继承是指,只要有可能,个体便可继承父代的部分或全部权重。在报告方法中,每次指的都是「最佳模式」。除了在一个实验中选择最佳模型,具有最高验证精确度的模型还试图在所有实验中选择「最佳实验」。

除了训练和测试策略,计算成本是实验的另一个重要方面。它由 TensorFlow 实现,其中基因变异和卷积可被视为 TF(TensorFlow)操作。对于每一个 TF 操作,我们都会预测所需浮点运算(FLOP)的理论数,并在给定每个个体后分配计算成本:

其中 F 表示用于训练和验证的 FLOP,E 表示正在运行的时期,N 表示训练和验证的样本数量。此外,每个实验的计算成本是其全部个体成本之和。

下一步是去实现上文提到的算法。每个实验需要在几天内演变出一个群体,如下图所示:

图 1. 演化实验进展。每个点代表群体中的个体。蓝点(黑色,右上)表示存活个体,其余个体已被杀死。四个图表展示了发现的例子。这些对应于最优的个体(最右)以及它们的三个祖先。最优个体通过其验证精确度进行选择。演化有时会在不存在任何非线性的区域(「C」,白色背景)之间堆叠卷积,这在数学上与单个线性运算相同。一些卷积则与典型的人工设计架构不同,其后伴随着多个非线性函数(「C + BN + R + BN + R + ...」,橙色背景)。

在训练阶段之后,所提出的方法在 CIFAR-10 数据集上使用了 9×10^19 FLOPS,使精确度达到了 94%,随后我们应用了相同的神经网络进化算法,其参数是 CIFAR-100 中使用 7×10^19 FLOPS,使精确度达到 76.3% 时的参数。我们所料不错,这两个数据集的结果与其他最先进的人工设计结果相比颇具竞争力。

我们还对多个实验中的结果进行了统计分析,其演化进展如下图所示:

图 2. 结果和控件的可重复性。本图中,时间 t 处的垂直轴被定义为在 t 时刻或之前存活的具有最高验证精确度个体的测试精确度。插图了放大主图的一部分。这条曲线所显示的各实验的进展情况如下。顶线(蓝色实线)显示了 5 次大规模演化实验的平均测试精确度,其周围阴影区域的宽度为±2s(插图更为清晰)。下一行(主图和插图中的橙色虚线)则表示禁用权重继承时的单一实验,因此每个个体都需从随机权重中进行训练。最低位的曲线(点划线)是随机搜索控件。所有实验使用的硬件数量与类型都相同,而从验证到测试集的泛化中出现的少量噪声则解释了曲线并非单调增加的原因。±2s 区域的窄宽度(主图和插图)则表明演化实验中得到高精确度具备可重复性。

在分析时,它总结出了一个用于清查的大型搜索空间,来得到更好的最优解决方案。同时,突变率的适当增加有助于避免局部最小值。另一方面,当表示训练步骤号的元参数 T 增大时,精确度便会增加。此外,更大的训练步骤意味着,个体需经过更少的身份突变来达到给定的训练水平。

图 3. 对元参数的依赖。在这两幅图中,每个圆圈表示完整演化实验的结果。两个垂直轴则表示实验结束时具有最高验证精确度个体的测试精确度。所有群体的演化时间相同。每个水平轴的值存在 5 个数据点。左侧为群体规模的影响。为了节省资源,这些实验的个体训练步骤数只有 2560 步。能够发现,精确度随着群体规模的增大而增加。右侧为个体训练步骤数量的影响。可以观察到随着步骤的增多,精确度将如何增加。

同时,其他的参数设置技巧也被应用于进一步探索,其性能如下:

图 4. 避免局部最优。这几幅图显示了两次演化实验的进展,而下述事件发生在演化中期。这些事件使群体能够避免被困在局部最优中。在这两幅图中,每个点代表一个个体。这些实验使用小规模群体与较少的训练步骤,这 2560 个个体是主实验。这两种情况都使群体更容易受困,消耗的计算资源也更少。垂直轴是进化算法中举足轻重的验证精确度(或适应度)。上部:个体数为 100 的群体通过利用突变率上升的时期,成功避免局部最优的示例(第 5 节)。群体向高原期演变,每次繁殖的正常情况是突变为 1(左),随后使突变率上升,使每次繁殖的突变为 5(中间),接着,再次将每次繁殖的突变改为 1(右)。可以发现,群体最终避免了最初的高原期。底部:个体数为 50 的群体通过重设权重,成功避免局部最优的示例(第 5 节)。权重分别在三个中间刻度的标记处进行了 3 次重设,每次重设后,群体都会达到精确度更高的新高原期。

综上,本文提出了一种用于大规模搜索的新型神经演化算法,其新颖性在于它能够处理相当大的神经网络(如 CNN 等)。由于该方法使用了新的变异策略,故而在分类任务中极具竞争力;同时,经过训练的模型获得了良好的转移能力(从 CIFAR-10 转移到 CIFAR-100)。但考虑到在特定任务中,通用应用不具备多个并行的高性能计算机,因而存在计算成本昂贵的缺点。此外还需考虑到,如今只用一个功能强大的 CNN 分类器便可轻松完成分类任务。详尽的搜索似乎并不必要,因为它花费虽多,却只能提升一点点精确度。但若这个方法能够扩展到适应多个任务(如具有改良空间的分割和检测),这个尝试便是良好开端,并且颇具潜力。

机器之心英文网站原文地址:https://syncedreview.com/2017/05/01/large-scale-evolution-of-image-classifiers/

©本文为机器之心英文原创文章,转载请联系本公众号获得授权。

本文分享自微信公众号 - 机器之心(almosthuman2014),作者:Angulia Chao

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-06-08

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 教程 | 通过可视化隐藏表示,更好地理解神经网络

    将神经网络可视化是非常有趣的。对于监督学习而言,神经网络的训练过程可以看做是学习如何将一组输入数据点转换为可由线性分类器进行分类的表示。本文我想利用这些(隐藏)...

    机器之心
  • 资源 | Geoffrey Hinton多伦多大学演讲:卷积神经网络的问题与对策

    机器之心
  • ​ICCV 2019 Oral论文:KAUST提出大幅加深图卷积网络的新方法

    论文作者:Guohao Li, Matthias Müller, Ali Thabet, Bernard Ghanem

    机器之心
  • 深度学习入门

    引言 近几年来人工智能越来越火,大家都已经知道了AlphaGo的威力,然而在其背后,从技术层面来说,深度学习功不可没。那么深度学习到底是什么,其...

    机器学习算法工程师
  • LeCun、Bengio、Hinton三巨头曾合体,Nature发文综述深度学习(论文精华)

    大数据文摘
  • 第21次文章:工厂模式

    在我们GOFO23种设计模式中,上期着重介绍了创造型模式中的单例模式,这周我们着重介绍另一种创造型设计模式——工厂模式。

    鹏-程-万-里
  • 反射面试题-请了解下

    反射就是动态加载对象,并对对象进行剖析。在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,这种动态获...

    猿天地
  • [转]2011黑帽大会亮点预览

    同往常一样,将于本周在拉斯维加斯举行的年度黑帽大会无疑是重磅事件。会上,安全专家将会粉碎人们不切实际的幻想——他们会告诉大众高科技行业制造的东西,不会有任何安全...

    the5fire
  • oldboy python 3.5 we

    py3study
  • 10个常见的 Java 错误及避免方法之第一集(后续持续发布)

    当Java软件代码通过编译器运行时,会创建编译器错误消息。谨记编译器可能会针对一个错误抛出许多错误消息。所以得修复第一个错误并重新编译。这样做可以解决很多问题。

    用户1289394

扫码关注云+社区

领取腾讯云代金券