AutoML之NAS

Posted luchi007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AutoML之NAS相关的知识,希望对你有一定的参考价值。

前言

autoML最近非常火热,在调参、特征选择等方面都有了不少的进展,与其同时,在深度网络日益复杂化的今天,如何为任务设计合适的网络结构成了每位炼丹工程师的日常,而在缺乏先验知识的情况下,调整网络结构往往需要较长的时间和精力,如何自适应的调整网络结构就成了一个值得研究的问题。今天主要介绍的是autoML下面的一种自适应调整网络结构的方法: NEURAL ARCHITECTURE SEARCH (下面简称NAS),NAS主要作用是自适应构建网络结构,减轻人为调整的繁复劳动,还是值得一看的。

NAS 开篇

【论文地址:NEURAL ARCHITECTURE SEARCH WITH
REINFORCEMENT LEARNING

基本思路是通过构建一个controller来搜索行为空间,根据行为空间构建网络图,并根据网络图的rewards(一般是在验证集上的指标收益等)调整控制器的参数,主要结构见下图:
上图看上去很熟,其实就是强化学习的框架,可以把controller看做是RL里的agent,搜索空间看做是action,子网络看做是environment,在验证集上的指标看作是reward,如此一比,其实就很清楚了,本质上是个RL的问题。

网络结构

以一个卷积网络为例,日常我们在设计CNN的时候,一般考虑到的参数有卷积核个数、卷积核的height和width、 stride-height、stride-width,在使用NAS搜索的时候,使用RNN作为controller,结构见下图:
每一个卷积层设计为如下步骤:

  1. RNN接收前一层的输出作为当前的input,同时根据前一层的hidden_vec,生成当前cell的hidden_vec以及output
  2. output接一个softmax层,softmax类别个数为搜索空间的个数,选择概率最高的为当前的action
  3. 当前cell的输出会作为下一个cell的输入,不断循环,就能依次拿到卷积核个数、卷积核的height和width、 stride-height、stride-width等参数
  4. 拿到参数后就可以构建当前的卷积layer
  5. 依次循环就可以构建一个卷积网络
  6. 根据卷积网络训练,并在验证集上拿到一个指标,也就是reward

param learning

controller的参数学习是RL里面的policy-gradient方法,其loss是:
其中 m m m表示探索的次数, T T T表示的是一次探索设计的超参数(可以理解为RNN的output个数), P P P函数表示的是action的预估概率, R k R_k Rk是设计的网络在验证集上的准确率指标。
为了减少模型方差,后面作者改了一个新的loss:
其中 b b b表示的是baseline的准确率

NAS 进化:ENAS

【论文地址 Efficient Neural Architecture Search via Parameter Sharing
ENAS相比NAS的主要改动在于shareing subgraph weight,比如设计一个rnn网络,对于RNN的每一个cell单元,由N个block组成,下面以N=4举例,其block的构建过程如下:

  1. 初始化输入 x t x_t xt和前一时刻隐向量 h t − 1 h_t-1 ht1,controller的action空间为 选择前一个输入以及选择激活函数
  2. controller接收输入,输出「激活函数」 action概率并选一个激活函数,假设是tanh,那么node1的输出为 h 1 = t a n h ( x t W x + h t − 1 ∗ W 1 h ) h_1 = tanh(x_tW_x + h_t-1*W_1^h) h1=tanh(xtWx+ht1W1h)
  3. controller继续run rnn并输出「前一个输入」action概率并选择一个输入,假设是 h 1 h_1 h1,继续输出「激活函数」action概率并选择一个激活函数,假设是Relu,那么node2的输出为 h 2 = R e L U ( h 2 W 2 , 1 h ) h_2 = ReLU(h_2W_2,1^h) h2=ReLU(h2W2,1h)
  4. controller继续run rnn并输出「前一个输入」action概率并选择一个输入,假设是 h 2 h_2 h2,继续输入「激活函数」action概率并选择一个激活函数,假设是tanh,那么node2的输出为 h 2 = t a n h ( h 2 W 3 , 2 h ) h_2 = tanh(h_2W_3,2^h) h2=tanh(h2W3,2h)
  5. controller继续run rnn并输出「前一个输入」action概率并选择一个输入,假设是 h 1 h_1 h1,继续输入「激活函数」action概率并选择一个激活函数,假设是tanh,那么node2的输出为 h 2 = t a n h ( h 1 W 4 , 1 h ) h_2 = tanh(h_1W_4,1^h) h2=tanh(h1W4,1h)
  6. 由于 h 3 h_3 h3 h 4 h_4 h4没有后向依赖,最终该RNN的cell隐向量输出为 h t = ( h 3 + h 4 ) / 2 h_t = (h_3+h_4)/2 ht=(h3+h4)/2

上图的controller可用下图表示:
而RNN cell的构建过程可用下图表示:

该RNN cell的构建有向图可以表示为:

注意到在构建RNN cell步骤中, W i , j h W_i,j^h Wi,jh在不同的cell中间是共享的,这也是本paper提出的idea的核心,也就是share子图的weight

参数学习和NAS一样,也是基于policy gradient更新controller参数

DARTS: one-shot learning

【论文地址DARTS: DIFFERENTIABLE ARCHITECTURE SEARCH
DARTS的思路比较简单,是将所有的子图全部汇集在一个超图里一起训练,在最后通过选择子图的weight来决定用哪个子图。

  1. 假设有个图网络结构是这样的:

    问号的部分指的是不通的node直接可以有不同的operation,比如max-pooling之类的
  2. 假设operation有N的action空间,首先就是构建一个包含所有空间的超图,如下:


3. 将每个node直接构建所有的action,使用参数对action加权:
4. 然后通过梯度下降直接训练 α \\alpha α参数得到不同action的weight, 训练loss如下:
loss先约束求解使得loss最小的图网络参数 w w w,然后再求解在此图参数下的 α \\alpha α最优值,因为上式直接求解比较麻烦,实际的训练过程如下:
主要改动是在第一步中,把先优化 w w w约束条件变成了先对 w w w根据梯度下降求一个更新值,然后利用此更新值去优化 α \\alpha α
5. 最终训练得到 α \\alpha α之后,根据最大值取action,得到最终的subgraph:
上图左边边表示各个连接的 α \\alpha α权重,颜色越深表示权重越大,挑出最大的权重,就得到右边的最终子图。

以上是关于AutoML之NAS的主要内容,如果未能解决你的问题,请参考以下文章

《Vega 是诺亚方舟实验室自研的 AutoML 算法工具链》

AutoML技术现状与未来展望

超图球面与平面场景的区别和地理坐标系

DNN结构构建:NAS网络结构搜索和强化学习迁移学习

通过超图在网页中加载3dmax模型

AutoML工具之HyperGBM介绍