前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多图演示高效的神经架构搜索

多图演示高效的神经架构搜索

作者头像
AI研习社
发布2019-06-10 15:22:43
7670
发布2019-06-10 15:22:43
举报
文章被收录于专栏:AI研习社AI研习社

本文为 AI 研习社编译的技术博客,原标题 : Illustrated: Efficient Neural Architecture Search 作者 | Raimi Karim 翻译 | 胡瑛皓、约翰逊 · 李加薪 编辑 | 酱番梨、Pita 原文链接: https://towardsdatascience.com/illustrated-efficient-neural-architecture-search-5f7387f9fb6 注:本文的相关链接请访问文末【阅读原文】

(简而言之 你只要理解这两个动画)

设计不同类型的神经网络诸如图像分类和自然语言理解通常需要大量的网络架构工程及专业知识。神经架构搜索(NAS)可使这些手工设计过程自动化。学界对NAS的研究兴趣与日俱增,特别是用于最近的深度学习模型优化。探索和发现神经网络架构有很多方法。这里小结一下在过去几年里,深度学习社区已经发展出以下方案,包括:

  • 增强学习 Neural Architecture Searchwith Reinforcement Learning (Zoph and Le, 2016) NASNet (Zoph et al., 2017) ENAS (Pham et al., 2018)
  • 遗传算法 Hierarchical Evo (Liu et al., 2017) AmoebaNet (Real et al., 2018)
  • Sequential model-based optimisation (SMBO) PNAS (Liu et al., 2017)
  • 贝叶斯优化 Auto-Keras (Jin et al., 2018) NASBOT (Kandasamy et al. 2018)
  • 基于梯度的优化 SNAS (Xie et al., 2018) DARTS (Liu et al., 2018)

本文关注于高效神经架构搜索 (ENAS)方法,它通过增强学习构建卷积神经网络(CNNs)及递归神经网络 (RNNs)。Hieu Pham, Melody Guan, Barret Zoph, Quoc V. Le, Jeff Dean等作者提出一种使用预定义的神经网络结构,通过增强学习框架借助宏搜索(macro search)和微搜索(micro search)产生新的神经网络的方法。没错,用一个神经网络构建另一个神经网络。

本文目的是向读者介绍,如何使用宏搜索/微搜索策略,生成新的神经网络。本文会用图片和动画引导作者逐步理解,有时候(由于向量化等因素)文中动画的顺序并不反映实际的处理流。

篇幅所限本文只介绍NAS在CNN图像分类任务中的应用。同时也假定读者已经知道RNN、CNN和增强学习等基础概念。熟悉深度学习的一些概念诸如迁移学习、跳跃连接/残差连接(skip/residual connection)等也会有利于你对架构搜索的理解。这里并不要求阅读论文原文,当然阅读论文会加速你的理解。

0.概览

ENAS中会使用2种神经网络, 分别为:

  • 控制器 (controller) – 预定义的 RNN 网络, 该网络采用(LSTM)单元
  • 子模型 (child model) – 生成的图像分类模型

与其他NAS算法一样, ENAS中有3个核心概念:

  1. 搜索空间 — —所有不同的可能产生的架构或可能被生成的子模型;
  2. 搜索策略 — —构建这些架构或子模型的方法;
  3. 效果评估 — —度量子模型性能的方法。

接下来让我们看一下ENAS是如何运用上述5个基本概念的。

控制器利用搜索策略通过生成一组指令(或更严格地说,做出决定或抽样决定)的方式去控制或指导子模型的架构。这里的决定好比子模型在某个特定层需要用什么操作(卷积、池化等)。子模型通过一系列这样的决定来构建。那么最后生成的子模型也就是搜索空间中诸多可能的子模型中的一个。

然后这个选定的子模型将被用于训练直至收敛 (95%左右的训练精度),会使用SGD去最小化期望损失函数,(对于图像分类任务而言) 梯度来自预测的分类和实际数据。训练过程会持续一定的epoch轮数,这里我们称之为child epochs,比如执行100轮。接着验证模型,我们可以得到验证精度。

然后用增强学习(这里是基于策略的增强学习算法)更新控制器参数,最大化期望回报函数,这里也就是验证精度。参数更新的目的是帮助控制器提升其能力,从而最终得到更高的验证精度。

整个过程(从第3段开始)到这里为一个epoch — 称为控制器epoch数。然后重复这一过程,比如执行2000轮。

这里产生的所有2000个子模型中,验证精度最高的模型将有幸称为最终图像分类任务架构。再部署模型前,该子模型需要再次训练(指定子模型epoch轮数)。

训练过程的伪算法如下:

代码语言:javascript
复制
CONTROLLER_EPOCHS = 2000
CHILD_EPOCHS = 100

Build controller network

for i in CONTROLLER_EPOCHS:
     1. Generate a child model
     2. Train this child model for CHILD_EPOCHS
     3. Obtain val_acc
     4. Update controller parameters
     
Get child model with the highest val_acc
Train this child model for CHILD_EPOCHS

可以看到模型选择问题可以套用增强学习框架,其主要构成如下:

  • Agent —— 控制器
  • Action — —构建子网络的一组决定
  • Reward — —子模型的验证精度

本例中增强学习的目标是根据agent(控制器)执行的action(构建子模型架构的一系列决定)最大化回报reward(验证精度)。

1. 搜索策略

回想一下前一节提到,控制器会使用一些搜索策略生成子模型架构。这句话里会有2个问题— (1) 控制器如何决定? (2) 用什么搜索策略 ?

控制器如何做决定?

我们来看一下控制器的模型,它是用LSTM构建的。LSTM网络以自回归的方式通过softmax分类器采样决定: 上一步的决定作为下一步的(以嵌入形式)输入用于网络。

搜索策略又是什么 ?

ENAS作者提出2种搜索和生成架构的策略:

  1. 宏搜索
  2. 微搜索

宏搜索方法就是让控制器设计整个网络架构。采用该方法的论文包括Zoph和Le写的NAS、FractalNet和SMASH等论文。另一方面,微搜索方法就是用控制器设计神经网络中的模块或构建模块(building block),最终用它们构建整个神经网络,之前有论文用这种方法实现,比如Hierarchical NAS、Progressive NAS、NASNet等论文。

以下2部分将介绍ENAS如何实现这两种策略。

1.1 宏搜索

宏搜索算法中,对于子模型中每一层,控制器需要作出2个决定:

  • 执行上一层的操作 (参见说明操作列表)
  • 为上一层连上跳跃连接

下面例子中会看到,控制器如何生成子模型的4个层,色红、绿色、蓝色、紫色分别表示子层中不同层。

卷积层1(红色)

首先,控制器执行第一个时点,该时点的输出为一个softmax后的向量,最后被翻译为一个3x3的卷积操作。

对子模型这意味着,先用一个3x3的过滤器对输入图像做卷积操作。

控制器在第1时点的输出(3x3卷积),对应于在子模型中构建第一层(红色)。这意味着子模型会先对输入执行一次3x3卷积操作。

前面提到控制器需要做2个决定,不过这里只看到1个决定。这是因为此处是网络初始处,只能采样一个决定,也就是可以执行的操作,显然这步除了输入层没有其他层需要连接。

卷积层2 (绿色)

构建接下来的卷积层。控制器需要做两个决定 (也就是): (i) 产生操作 和 (ii) 产生连接层。此处我们看到,控制器产生1、5×5 深度可分离卷积操作。

对于子网络这意味着,需要对上一层输出结果执行一次5×5 深度可分离卷积操作,然后将此输出与下面第一层的输出连接在一起,比如来自红色层的输出。

控制器在第2、3时点的输出(1和5x5 深度可分离卷积)对应于构建子模型中第二层 (绿色)。

卷积层3 (蓝色)

重复前面的步骤生成第三个卷积层。同样我们看到控制器得到两个结果: (i) 操作 (ii) 需要连接的层。下面示例中控制器产生连接1、2和3×3 最大池化操作。

因而子模型会在上一层(第二层,绿色)输出结果上执行一次3x3 最大池化操作。然后结果就是沿着深度维度合并了1、2层的输出。

控制器第4、5时点的输出 (1,2层 和3×3 最大池化操作) 对应于子模型中第3层卷积 (蓝色)。

卷积层4 (紫色)

重复上述步骤生成第4个卷积层。这次生成的是1、3以及5x5卷积操作。

子模型在上一层(第3层, 蓝色)的输出上执行5x5的卷积操作。然后运算结果与深度方向上的第1、3层的结果连接。

控制器第6、7时点的输出 (第1, 3层和5×5卷积操作)对应于子模型中卷积层4(紫色)。

结束

这样就完成了—— 用宏搜索生成的一个子模型! 接下来是微搜索. 注意: 微搜索不像宏搜索那么直观。

1.2 微搜索

本文前面提过,微搜索用于设计模块或构建模块,这些模块会被连接到子模型形成最终的架构。在ENAS中把这些构建模块称为卷积单元(convolutional cells)和消减单元(reduction cells)。放置卷积单元或消减单元就构成了一个操作块。这两种其实很相似—— 唯一不同的是,消减单元的步长(stride)为2,这样从空间上就减少了维度数。

介绍到这里也许你会问,如何将这些单元连接到最终的网络?

最终的神经网络

最终生成子模型的概览图如下:

图 1.2.1: 最终生成神经网络概览

让我们回头来看看

用于微网络搜索的构建单元

用于微搜索的子网络的构建单元有一系列层次关系,从大到小是:

  • 块 (block)
  • 卷积单元 / 消减单元
  • 节点 (node)

子模型由几个块组成。每个块由N个卷积单元和1个消减单元组成,按之前提到的这个顺序。每个卷积/消减单元包含B个节点。每个节点包含标准卷积操作 (后面会介绍). (此处N 和 B 是超参数,由架构师微调确定)。

下面是一个含3个块的子模型,每块由N=3卷积单元和1个消减单元组成。 此图只展示结构,不展开显示单元中的操作。

图 1.2.2: 最终生成神经网络概览

如何用微搜索产生这样的子模型? 请继续阅读!

由微搜索生成子模型

为了简化问题本文以构建1个块的微搜索为例,每个块(虽然看起来是1)包含N=3个卷积单元和1个消减单元,其中每个单元含B=4个节点,这样构建出来的子模型如下图所示:

图 1.2.3: 由微搜索生成的带1个块的神经网络,其中包含3个卷积单元和1个消减单元,此处不显示具体操作。

现在来构建一个卷积单元!

快进

为了方便解释如何构建一个卷积单元,我们假设已经构建了2个卷积单元。注意到图中这2个单元的最后都是add操作。此处先假设就是这么设定的,下面会详细说明原因。

图 1.2.4: 用微搜索构建了2个卷积单元

已经构建好2个卷积单元了,接下来开始构建第3个。

卷积单元 #3

接下来构建第3个单元。

图 1.2.5: 在微搜索中‘准备’第3个卷积单元

还记得么,前面提到每个卷积单元由4个节点组成。那这些节点 在哪?

请仔细阅读这段,最前面2个节点就是当前单元之前的2个单元。那另2个单元呢? 这2个节点就在我们正在构建的卷积单元中。下图列出了这些节点的位置:

图 1.2.6: 构建卷积单元 #3 过程中,标识其4个节点的位置

接下来忽略图中‘卷积单元’标记,请关注图中‘节点’标记:

  • 节点 1 — 红色 (卷积单元 #1)
  • 节点 2 — 蓝色 (卷积单元 #2)
  • 节点 3 — 绿色
  • 节点 4 — 紫色

你可能想知道,当我们构建每个卷积单元时,这些节点都会改变么,答案是: 对的! 每个单元都会以这种方式‘指定’节点。

你可能还会问, 既然已经构建了节点1和节点2中的操作(也就是卷积单元 #1、#2),那还需要在这些节点中构建什么? 这是个好问题。

卷积单元 #3: 节点 1 (红色) 、节点 2 (蓝色)

当我们构建单元时,前2个节点不需生成,事实上他们作为其他节点的输入。本例中一共构建4个节点,那么节点1、2可以作为节点3、4的输入。不需要去管节点1、2,接下来构建节点3、4。嗖!

卷积单元 #3: 节点 3 (绿色)

首先从节点3处开始构建。微搜索中控制器将采样4个决定(或者说2组决定),这不同于宏搜索,每层采样2个决定:

  • 2个需要连接的节点
  • 这2节点上各自需要执行的2个操作

控制器需要执行4步,以生成这些决定,见下图:

图 1.2.7: 控制器前4个时点的输出 (分别为 2、1、5×5 平均池化操作、5×5 深度可分离卷积操作), 用于构建节点3

接上文,控制器从4个时点分别采样了2、1、5×5 平均池化操作、5×5 深度可分离卷积操作。这些结果是怎么翻译成子模型中的架构呢? 见下图:

图 1.2.8: 将控制器在前4个时点的输出 (2、1、5×5 平均池化操作、5×5 深度可分离卷积操作) 翻译成节点3

上图中, 讲了3件事:

  • 节点2的输出(蓝色)会经过一个5×5 平均池化操作。
  • 节点1的输出(红色)会经过一个5×5 深度可分离卷积操作。
  • 接下来两者会经过add操作。

节点在这步的输出经过了add操作,最后得到一个tensor。这解释了上文中提到的为什么节点1、2末端都是add操作。

卷积单元 #3: 节点 4 (紫色)

接下来是节点 4。重复同样的步骤,不过现在控制器有3个节点可供选择(节点1、2、3)。下面控制器生成3、1、id、3×3 平均池化操作。

图 1.2.9: 控制器前4个时点的输出 (3、1、id、3×3 平均池化操作),用于构建节点4

这些输出被翻译为以下结构:

图 1.2.10: 控制器前4个时点的输出 (3、1、id、3×3 平均池化操作)被翻译用于构建节点3

解释一下这一过程?

  • 节点3的输出(绿色) 经过一个id操作。
  • 节点1的输出(红色) 经过一个3×3 平均池化操作。
  • 以上结果最后会经过一个add操作。

就是这样,卷积单元#3已构建完毕

消减单元

记得么每经过N个卷积单元,需要有一个消减单元。本例中N=3 之前已经完成了卷积单元#3的构建,接下来需要构建消减单元。之前提到过,消减单元设计与卷积单元#3相似,唯一不同是采样使用的步长为2。

结束

从微搜索策略中生成子模型就是这样的。希望读者不会感到这些解释过于复杂,因为我第一次读论文曾觉得有点复杂。

2. 说明

由于本文主旨是介绍宏搜索策略和微搜索策略,有许多细节并未展开 (特别是论文中涉及迁移训练的概念和内容)。这里简单说明一下:

  • ENAS‘高效’体现在哪? 答案: 采用了迁移学习。如果两个节点间的计算之前已完成(已训练完成), 卷积过滤器的权重和1×1的卷积(为了维持输出的通道数; 上文未提及) 会被复用。这使得ENAS较其之前的模型速度更快!
  • 控制器采样决定后有可能不需要任何跳跃连接
  • 文中提及控制器生成6种可能的操作,分别为: 3×3和5×5卷积操作、3x3和5x5深度可分离卷积操作、3x3 最大池化操作和3x3 平均池化操作。
  • 每个单元末端的连接操作,可连接任何节点的“松散的末端”。
  • policy gradient (REINFORCE)增强学习算法。

3. 总结

宏搜索 (用于整个网络)

最终子模型如下

图 3.1: 用宏搜索生成卷积神经网络

微搜索 (用于卷积单元)

此处仅展现最终子模型的部分架构

图 3.2: 用微搜索生成卷积神经网络,只显示部分架构

4. 实现

  • 作者给出的TensorFlow实现
  • Keras实现
  • PyTorch实现

5. 参考资料

Efficient Neural Architecture Search via Parameter Sharing

Neural Architecture Search with Reinforcement Learning

Learning Transferable Architectures for Scalable Image Recognition

就是它,记得去读一下ENAS论文 Efficient Neural Architecture Search via Parameter Sharing。如果有任何问题,请标明文中内容,然后给我留言

最后,特别感谢 Ren Jie Tan, Derek, Yu Xuan Tay 对本文提出的思路、建议和更正。

想要继续查看该篇文章相关链接和参考文献?

点击底部【阅读原文】即可访问:

https://ai.yanxishe.com/page/TextTranslation/1600

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0.概览
  • 1. 搜索策略
  • 2. 说明
  • 3. 总结
  • 4. 实现
  • 5. 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档