专栏首页AutoML(自动机器学习)论文笔记系列-Efficient Neural Architecture Search via Parameter Sharing

论文笔记系列-Efficient Neural Architecture Search via Parameter Sharing

Summary

本文提出超越神经架构搜索(NAS)的高效神经架构搜索(ENAS),这是一种经济的自动化模型设计方法,通过强制所有子模型共享权重从而提升了NAS的效率,克服了NAS算力成本巨大且耗时的缺陷,GPU运算时间缩短了1000倍以上。在Penn Treebank数据集上,ENAS实现了55.8的测试困惑度;在CIFAR-10数据集上,其测试误差达到了2.89%,与NASNet不相上下(2.65%的测试误差)

Research Objective 作者的研究目标

设计一种快速有效且耗费资源低的用于自动化网络模型设计的方法。主要贡献是基于NAS方法提升计算效率,使得各个子网络模型共享权重,从而避免低效率的从头训练。

Problem Statement 问题陈述,要解决什么问题?

本文提出的方法是对NAS的改进。NAS存在的问题是它的计算瓶颈,因为NAS是每次将一个子网络训练到收敛,之后得到相应的reward,再将这个reward反馈给RNN controller。但是在下一轮训练子网络时,是从头开始训练,而上一轮的子网络的训练结果并没有利用起来。

另外NAS虽然在每个节点上的operation设计灵活度较高,但是固定了网络的拓扑结构为二叉树。所以ENAS对于网络拓扑结构的设计做了改进,有了更高的灵活性。

Method(s) 解决问题的方法/算法

ENAS算法核心

回顾NAS,可以知道其本质是在一个大的搜索图中找到合适的子图作为模型,也可以理解为使用单个有向无环图(single directed acyclic graph, DAG)来表示NAS的搜索空间。

基于此,ENAS的DAG其实就是NAS搜索空间中所有可能的子模型的叠加。

下图给出了一个通用的DAG示例

如图示,各个节点表示本地运算,边表示信息的流动方向。图中的6个节点包含有多种单向DAG,而红色线标出的DAG则是所选择的的子图。

以该子图为例,节点1表示输入,而节点3和节点6因为是端节点,所以作为输出,一般是将而二者合并求均值后输出。

在讨论ENAS的搜索空间之前,需要介绍的是ENAS的测试数据集分别是CIFAR-10和Penn Treebank,前者需要通过ENAS生成CNN网络,后者则需要生成RNN网络。

所以下面会从生成RNN和生成CNN两个方面来介绍ENAS算法。

1.Design Recurrent Cells

本小节介绍如何从特定的DAG和controller中设计一个递归神经网络的cell(Section 2.1)?

首先假设共有\(N\)个节点,ENAS的controller其实就是一个RNN结构,它用于决定

  • 哪条边需要激活
  • DAG中每个节点需要执行什么样的计算

下图以\(N=4\)为例子展示了如何生成RNN。

假设\(x[t]\)为输入,\(h[t-1]\)表示上一个时刻的输出状态。

  • 节点1:由图可知,controller在节点1上选择的操作是tanh运算,所以有\(h_1=tanh(X_t·W^{(X)}+h_{t-1}·W_1^{(h)})\)
  • 节点2:同理有\(h_2 = ReLU(h_1·W_{2,1}^{(h)})\)
  • 节点3:\(h_3 = ReLU(h_2·W_{3,2}^{(h)})\)
  • 节点4:\(h_4 = ReLU(h_1·W_{4,1}^{(h)})\)
  • 节点3和节点4因为不是其他节点的输入,所以二者的平均值作为输出,即\(h_t=\frac{h_3+h_4}{2}\)

由上面的例子可以看到对于每一组节点\((node_i,node_j),i<j\),都会有对应的权重矩阵\(W_{j,i}^{(h)}\)。因此在ENAS中,所有的recurrent cells其实是在搜索空间中共享这样一组权重的。

2.1 Design Convolutional Networks

本小节解释如何设计卷积结构的搜索空间

回顾上面的Recurrent Cell的设计,我们知道controller RNN在每一个节点会做如下两个决定:a)该节点需要连接前面哪一个节点 b)使用何种激活函数。

而在卷积模型的搜索空间中,controller RNN也会做如下两个觉得:a)该节点需要连接前面哪一个节点 b)使用何种计算操作。

在卷积模型中,(a)决定 (连接哪一个节点) 其实就是skip connections。(b)决定一共有6种选择,分别是3*3和5*5大小的卷积核、3*3和5*5大小的深度可分离卷积核,3*3大小的最大池化和平均池化。

下图展示了卷积网络的生成示意图。

2.2 Design Convolutional Cell

本文并没有采用直接设计完整的卷积网络的方法,而是先设计小型的模块然后将模块连接以构建完整的网络(Zoph et al., 2018)。

下图展示了这种设计的例子,其中设计了卷积单元和 reduction cell。

接下来将讨论如何利用 ENAS 搜索由这些单元组成的架构。

假设下图的DAG共有\(B\)个节点,其中节点1和节点2是输入,所以controller只需要对剩下的\(B-2\)个节点都要做如下两个决定:a)当前节点需要与那两个节点相连 b)所选择的两个节点需要采用什么样的操作。(可选择的操作有5种:identity(id,相等),大小为3*3或者5*5的separate conv(sep),大小为3*3的最大池化。)

可以看到对于节点3而言,controller采样的需要连接的两个节点都是节点2,两个节点预测的操作分别是sep 5*5和identity。

3.Training ENAS and Deriving Architectures

本小节介绍如何训练ENAS以及如何从ENAS的controller中生成框架结构。(Section 2.2)

controller网络是含有100个隐藏节点的LSTM。LSTM通过softmax分类器做出选择。另外在第一步时controller会接收一个空的embedding作为输入。

在ENAS中共有两组可学习的参数:

  • 子网络模型的共享参数,用\(w\)表示。
  • controller网络(即LSTM网络参数),用\(θ\)表示。

而训练ENAS的步骤主要包含两个交叉阶段:第一部训练子网络的共享参数\(w\);第二个阶段是训练controller的参数\(θ\)。这两个阶段在ENAS的训练过程中交替进行,具体介绍如下:

子网络模型共享参数\(w\)的训练

在这个步骤中,首先固定controller的policy network,即\(π(m;θ)\)。之后对\(w\)使用SGD算法来最小化期望损失函数\(E_{m~π}[L(m;w)]\)。

其中\(L(m;w)\)是标准的交叉熵损失函数:\(m\)表示根据policy network \(π(m;θ)\)生成的模型,然后用这个模型在一组训练数据集上计算得到的损失值。

根据Monte Carlo估计计算梯度公式如下:

\[\nabla_w E_{m-~π}(m;θ)[L(m;w)] ≈ \frac{1}{M} \sum_i^M \nabla_wL(m_i;w) \]

其中上式中的\(m_i\)表示由\(π(m;θ)\)生成的M个模型中的某一个模型。

虽然上式给出了梯度的无偏估计,但是方差比使用SGD得到的梯度的方差大。但是当\(M=1\)时,上式效果还可以。

训练controller参数θ

在这个步骤中,首先固定\(w\),之后通过求解最大化期望奖励\(E_{m~π}[R(m;w)]\)来更新\(θ\)。

导出模型架构

首先使用\(π(m,θ)\)生成若干模型。

之后对于每一个采样得到的模型,直接计算其在验证集上得到的奖励。

最后选择奖励最高的模型再次从头训练。

当然如果像NAS那样把所有采样得到的子模型都先从头训练一边,也许会对实验结果有所提升。但是ENAS之所以Efficient,就是因为它不用这么做,原理继续看下文。

Evaluation 评估方法

1.在 Penn Treebank 数据集上训练的语言模型

2.在 CIFAR-10 数据集上的图像分类实验

由上表可以看出,ENAS的最终结果不如NAS,这是因为ENAS没有像NAS那样从训练后的controller中采样多个模型架构,然后从中选出在验证集上表现最好的一个。但是即便效果不如NAS,但是ENAS效果并不差太多,而且训练效率大幅提升。

下图是生成的宏观搜索空间。

ENAS 用了 11.5 个小时来发现合适的卷积单元和 reduction 单元,如下图所示。

Conclusion

ENAS能在Penn Treebank和CIFAR-10两个数据集上得到和NAS差不多的效果,而且训练时间大幅缩短,效率大大提升。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker永久挂载本地目录

    有时我们的docker需要用到本地的数据集,虽然我们可以用docker cp的方式进行拷贝,但是通常如果数据集很大,所以直接拷贝到容器里显然不现实,所以我们需要...

    marsggbo
  • Detectron2代码阅读笔记-(二)

    上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系。那么剩下的文件夹又是如何起作用的呢?

    marsggbo
  • Tree-CNN: A Deep Convolutional Neural Network for Lifelong Learning

    深度学习领域一直存在一个比较严重的问题——“灾难性遗忘”,即一旦使用新的数据集去训练已有的模型,该模型将会失去对原数据集识别的能力。为解决这一问题,本文提出了树...

    marsggbo
  • day119-Flask的websocket使用

    少年包青菜
  • 你阅读源码的心态是什么?有哪些经验分享?

    以上种种,也许还有一些其它重要的原因,比如说qiong ... 一直以来让我非常非常有内驱力的坚持到现在。

    数据仓库践行者
  • 广播的最佳实践——实现强制下线功能(Android_Broadcast)

    其一,用于辅助统筹管理本项目的所有活动。调用ActivityCollector类的方法,如类中的onCreate和onDestroy方法,所有从父类派生出去的子...

    凌川江雪
  • Java数据库编程中的技巧

    Java数据库编程中的技巧,Java数据库编程中的技巧 1、java数据库操作基本流程 ? 2、几个常用的重要技巧: 可滚动、更新的记录集 批量更新 事务处理 ...

    企鹅号小编
  • 解决laravel5中auth用户登录其他页面获取不到登录信息的问题

    首先创建user表,里面有:id, name, password,remember_token等字段。

    砸漏
  • Mysql高级 (3) -- 使用profile来分析sql

    用户5927264
  • python zip密码破解

    import zipfile import optparse from threading import Thread

    用户5760343

扫码关注云+社区

领取腾讯云代金券