NAS 学习笔记(三)- ENAS

  |     |   本文总阅读量:

版权声明:本文原创,转载请留意文尾,如有侵权请留言,谢谢

引言

  ENAS[1] 是一种由 Google 提出的 NAS 算法,与之前我们所说的 NAS 和 SMASH 相比,它进一步了算力成本,将算力成本减少 1000 倍以上,仅用一块英伟达 GTX 1080Ti 显卡,就能在 16 个小时之内完成搜索。其中主要用到的思想是利用 policy gradient 去寻找 subgraph,这个 subgraph 会在验证集上最大化 expected reward,同时在训练时这些 subgraph 的优化目标是最小化一个 canonical cross entropy loss,除此之外,ENAS 还用到了 sharing parameters 的思想。

DAG(Directed Asyclic Graph)

  ENAS 基于的一个重要观察就是在 NAS 中所有被搜索的 graph 都可以被看作是一个 更大的 graph 的 subgraph。换句话来说,NAS 的 seach space 可以表示成有向无环图(DAG),一个神经网络架构可以表示成 DAG 的一个 subgraph。下图是 DAG 的一个示意图,它包含 6 个节点的 search space,红色箭头连接的子图表示一个神经网络架构,节点表示计算,边表示信息流。

Recurrent Cell

  与 Google 之前提出的 NAS 相同,ENAS 也是使用 RNN 作为 controller,controller 需要决定两件事情:

  • 哪些边需要被激活
  • 每个节点需要执行哪些计算

  这其实就与之前 Google 提出的 NAS 中的 RNN cell 不同了,之前是将拓扑结构描述成一个 binary tree,并且只要学习 tree 上每个节点的 operation。而 ENAS 中拓扑结构和节点上的 operation 都需要学习。
  接下来我们用一个有四个 RNN cell 的 search space 的例子来展示下 controller 的工作流程,下图是示意图:

  下图是论文中给出的计算流程,还是非常容易理解的:

  需要注意的是,controller 不仅决定哪些 previous indices 和 activation,还需要决定使用哪些 parameter matrices,即 \(\mathbf{W}_{\ell, j}^{(\mathrm{h}, j)}\) 。在NAS中,这些 weights 都是随机初始化,并在每个神经网络架构中从头开始训练的。而在 ENAS 中,这些 weights 是所有神经网络架构共享的。举个例子,上图用到了 \(\mathbf{W}^{(\mathbf{X})}, \mathbf{W}_{1}^{(\mathbf{h})}, \mathbf{W}_{2,1}^{(\mathbf{h})}, \mathbf{W}_{3,2}^{(\mathbf{h})}, \mathbf{W}_{4,1}^{(\mathbf{h})}\)。如果下一次 controller 得到的神经网络架构如下图,它的 weights 有 \(\mathbf{W}^{(\mathbf{X})}, \mathbf{W}_{1}^{(\mathbf{h})}, \mathbf{W}_{2,1}^{(\mathbf{h})}, \mathbf{W}_{3,2}^{(\mathbf{h})}, \mathbf{W}_{4,2}^{(\mathbf{h})}\),其中 \(\mathbf{W}^{(\mathbf{X})}, \mathbf{W}_{1}^{(\mathbf{h})}, \mathbf{W}_{2,1}^{(\mathbf{h})}, \mathbf{W}_{3,2}^{(\mathbf{h})}\) 与上面神经网络架构是相同的,我们可以共享这些 weights,这大大减少了计算成本。

  ENAS 中使用节点数为 \(N = 12\) 的 search space,计算类型为 tanh,relu,identity,sigmoid 四种激活函数,所以搜索空间有 \(4^N \times N! \approx 10^{15}\) 种神经网络架构。

Training ENAS and Deriving Architectures

  论文中使用的 controller 是包含 100 个 hiddenunits 的 LSTM,每个 predict 通过 softmax classifier。
  在 ENAS 中,有两种 weights 需要训练:

  • LSTM 的 parameters: \(\theta\)
  • child network 的 sharing parameters:\(\omega\)

  因此,ENAS 整体的训练过程,也分为两个阶段,先训练 \(\omega\),再训练 \(\theta\)

Train \(\omega\)

  在这个阶段,controller 的 policy \(\pi(\mathbf{m} ; \theta)\) 会被确定下来,然后在 \(\omega\) 上进行 SGD,最小化 expected loss function \(\mathbb{E}_{\mathbf{m} \sim \pi}[\mathcal{L}(\mathbf{m} ; \omega)]\),其中 \(\mathcal{L}(\mathbf{m} ; \omega)]\) 是 standard cross-entropy loss,通过 minibatch 去计算,model \(m\) 通过 \(\pi(\mathbf{m} ; \theta)\) 采样得到。gradient 可以通过 Monte Carlo estimate 得到:

\[ \nabla_{\omega} \mathbb{E}_{\mathbf{m} \sim \pi(\mathbf{m} ; \theta)}[\mathcal{L}(\mathbf{m} ; \omega)] \approx \frac{1}{M} \sum_{i=1}^{M} \nabla_{\omega} \mathcal{L}\left(\mathbf{m}_{i}, \omega\right) \]   上式是 \(\nabla_{\omega} \mathbb{E}_{\mathbf{m} \sim \pi(\mathbf{m} ; \theta)}[\mathcal{L}(\mathbf{m} ; \omega)]\) 的一个无偏估计,但是相比 standard SGD gradient,还是有较大的方差。论文中提到 \(M = 1\) 时效果很好。
  需要注意的是,训练 \(\omega\) 的过程是通过训练集完整的训练的。

Train \(\theta\)

  在这个阶段,\(\omega\) 已经确定了,我们需要训练 \(\theta\),让它最大化 \(\mathbb{E}_{\mathbf{m} \sim \pi(\mathbf{m} ; \theta)}[\mathcal{R}(\mathbf{m}, \omega)]\)。论文中的用的是 Adam optimizer,梯度是通过 REINFORCE 计算的,\(\mathcal{R}(\mathbf{m}, \omega)\) 是在验证集上进行计算的。论文中对于 language model experiment,reward function 是 \(c/vlaid\_ppl\),而对于 image classification experiment,reward function 是 \(accuracy\)

Deriving Architectures

  与 NAS 相似,我们通过 \(\pi(\mathbf{m} ; \theta)\) 采样一些 models,然后在验证集上采样一个 minibatch 来得到它的 reward,挑选 reward 最高的 model 重新完整的训练。

Design CNN Network

  下面拿 CNN 举个例子,构建 CNN 时,controller 依然需要考虑两件事情:

  • 每个节点需要连接之前的哪些节点
  • 每个节点上需要执行什么 operation

  ENAS 和 NAS 一样,支持 skip connections,具体来说,在 \(k\) 层,对之前 \(k-1\) 层是否需要连接进行采样,会有 \(2^{k-1}\) 种可能,我们可以看看下图是一个 \(k=4\) 的例子:

  有 6 种 operation,分别是 \(3 \times 3\) 的 filter size 的 convolution,\(5 \times 5\) 的 filter size 的 convolution,\(3 \times 3\) 的 filter size 的 depthwise-separable convolution,\(5 \times 5\) 的 filter size 的 depthwise-separable convolution,\(3 \times 3\) 的 kernal size 的 max pooling 和 \(5 \times 5\) 的 kernal size 的 average pooling。
  如果有 \(L\) 层网络的话,那么 search space 就会有 \(6^L \times 2^{L(L-1)/2} \approx 1.6 \times 10^{29}\) 种 network。

Design Convolutional Cell

  相比于直接设计 CNN 的整体结构,我们来看看 ENAS 是如何设计每一个 cell 的,类似的,ENAS 在每个节点上支持 5 种 operation,分别是 identity,\(3 \times 3\) 的 filter size 的 depthwise-separable convolution,\(5 \times 5\) 的 filter size 的 depthwise-separable convolution,\(3 \times 3\) 的 kernal size 的 max pooling 和 \(5 \times 5\) 的 kernal size 的 average pooling。
  假设 cell 里有 \(B\) 个节点,那么对于 \(B-2\) 个节点,controller 需要决定两件事情:

  • 采样两个节点作为输入
  • 指定这两个节点上的 operation

  下图是一个 \(B = 4\) 的示意图:

  下图是一个它的流程说明:

  同时,如下图所示,CNN 中经常还会有 reduction cell,它通常用来减少 spatial dimensions(通常 factor 为 2,每次减半),它的采样方式也很简单:

  • 从 search space 里采样出 computational graph
  • 将所有 operation 的 stride 设置为 2

  论文中,作者在每个 convolutional cell 后都加了一个 reduction cell,这样 controller 需要总共 \(2(B-2)\) 个 block。
  同样的,我们来看一下 search space 的大小,因为第 \(i(3 \le i \le B)\) 个节点可以从前 \(i-1\) 个节点中任意选择两个作为输入,所以一共会有 \((5 \times (B-2)!)^2\) 种不同的 cell,因为我们又是独立的去采样 reduction cell,所以我们总共会有 \((5 \times (B-2)!)^4\) 种不同的 cell,论文中取 \(B = 7\),便会有了 \(1.3 \times 10^{11}\) 种 network,比之前设计整体 CNN 的方法会有 \(1.6 \times 10^{29}\) 种 network 相比,要小的多。

Conclusion

  学习完 ENAS,ENAS其核心思想是让搜索中所有的 child model 可以 sharing weights。它将NAS的过程看作是在一张大的 graph 中找 subgraph,图中的边代表算子操作,基于 LSTM 的 controller 产生 candidate architecture(决定大图中的哪些边激活,以及使用什么样的操作),这个 LSTM controller 的参数和模型参数交替进行优化。
  我们再那拿它和之前我们学习的 SMASH 作个对比,SMASH 中 HyperNet 会将 SMASH child architecture 的 weights 限制在 low-rank 的 space 中。因为 HyperNet 通过 tensor product 为 SMASH 的 child architecture 生成 weights,因为对于任意矩阵 \(A\)\(B\),总有 \(rank(A \times B) \le min\{rank(A),rank(B)\}\)。由于这个限制,SMASH 会发现在受限制的 weights de low-rank space 中表现良好的 architecture,而不是在不再受 weights 限制的常规训练设置中表现良好的 architecture。同时,ENAS允许其 child model 的 weights 是任意的,从而有效地避免了这种限制。

Refer

[1]. Pham, Hieu, et al. "Efficient Neural Architecture Search via Parameter Sharing." arXiv: Learning (2018).

相关内容


坚持原创技术分享,您的支持将鼓励我继续创作,π(3.14)元就够啦!



文章目录
  1. 1. 引言
  2. 2. DAG(Directed Asyclic Graph)
  3. 3. Recurrent Cell
  4. 4. Training ENAS and Deriving Architectures
    1. 4.1. Train \(\omega\)
    2. 4.2. Train \(\theta\)
    3. 4.3. Deriving Architectures
  5. 5. Design CNN Network
  6. 6. Design Convolutional Cell
  7. 7. Conclusion
  8. 8. Refer
  9. 9. 相关内容
您是第 位小伙伴 | 本站总访问量 | 已经写了 670.5k 字啦

载入天数...载入时分秒...