NAS 学习笔记(一)- Google NAS

  |     |   本文总阅读量:

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

引言

  最近开始学习 NAS,看了谷歌在 ICLR 2017 上提出的一篇 NAS[1] 算法的论文,它主要利用了通过 RNN 来生成网路模型结构,然后使用 RL 来训练这个 RNN,以此来在验证集上最大化预期的准确性。算法整体还是比较容易理解的,本文简单的记录下它的思想。

Compare

  在 NAS 中,作者把每个 RNN 称作一个 controller,它可以生成一个 string 来表示生成网络的 configuration。因此,它是可以支持可变长度的 configuration space的,与之前 AutoML 一些经典的 HPO 方法来比,它们只能从一个 fix-length space 里来搜索模型,很难要求他们生成一个可变长度的 configuration 来指定网络的结构和连接性。利用贝叶斯优化,如果它们可以有一个比较好的 initial model,这些算法会有比较好的表现,作者指出这些方法和 NAS 相比,NAS 具有更好的灵活性与泛化性。

Controller RNN

  在论文中,作者使用 controller,也就是 RNN,来 generate 网络每层的 hyperparameter。需要注意的是这篇文章里涉及到的网络的每一层只考虑了是卷积层的情况。下图是一个示意图:

  不断 generate architecture 的过程会当层数超过一个阈值而终止,而这个阈值会随着训练的进行不断增加。与此同时为了判断训练有没有收敛,我们会有一个 held-out 的验证集来记录每一个 architecture 的精度。

RL

  实际上,controller 里 predict 的那些 tokens 可以看作是一系列的 actions \(a_{1:T}\),这个 architecture 可以看作是一个 child network,在收敛时,它在 held-out 验证集上会达到 accuracy \(R\),此时我们就可以把这个 \(R\) 当做 reward,然后用 RL 来训练这个 controller。
  为了得到最优的 architecture,我们需要 maximize expected reward,即:

\[ J\left(\theta_{c}\right)=E_{P\left(a_{1: T} ; \theta_{c}\right)}[R] \]

  因为 \(R\) 是不可微分的,我们需要使用 policy gradient 来迭代的更新 \(\theta_{c}\),文中用的 RL rule 为:

\[ \nabla_{\theta_{c}} J\left(\theta_{c}\right)=\sum_{t=1}^{T} E_{P\left(a_{1: T} ; \theta_{c}\right)}\left[\nabla \theta_{c} \log P\left(a_{t} | a_{(t-1): 1} ; \theta_{c}\right) R\right] \]

  经验估计为:

\[ \frac{1}{m} \sum_{k=1}^{m} \sum_{t=1}^{T} \nabla \theta_{c} \log P\left(a_{t} | a_{(t-1): i} ; \theta_{c}\right) R_{k} \]   \(m\) 是 controller 采样的 architecture 的个数,\(T\) 是 controller 需要 predict 的 hyperparameter 的个数,\(R_k\) 是第 k 个 architecture 在验证集上达到的 accuracy。
  上述的 update 是一个无偏估计,但是有很高的方差,为了减少方差,我们可以使用一个baseline:

\[ \frac{1}{m} \sum_{k=1}^{m} \sum_{t=1}^{T} \nabla_{\theta_{c}} \log P\left(a_{t} | a_{(t-1): 1} ; \theta_{c}\right)\left(R_{k}-b\right) \]

  在论文中,\(b\) 是先前所有 architecture 的 accuracy 的一个 exponential moving average。

Parallelism and asynchronous updates

  因为 controller 训练一个 child network 到收敛往往需要好几个小时,作者提出了一些方法去加速训练过程,主要是利用了 distributed training 和 asynchronous parameter updates 的思想,作者利用一个叫做 parameter-server 的组件,它会有 \(S\) 个 parameter server,它们保存着 \(K\) 个 controller replica 的 shared parameter,每个 controller 会采样 \(m\) 个 architecture,因此来达到并行训练的目的。
  然后,controller 收集 \(m\) 个 architecture 收敛时的 gradient,并将其发送到 parameter server,以更新所有 controller replica 中的 weights。在论文中,判断收敛的条件是训练达到指定的 epoch 数。示意图如下:

Skip connections and branch layers

  controller 也支持 skip connections 或者 skip branch layers,从而扩大 search space。它主要用到了 set-selection type attention,在第 \(N\) 层,它会添加一个 anchor point,这个 anchor point 具有基于前面 \(N-1\) 层的 sigmoids,以次来指示是否需要连接先前层。sigmoid 的定义如下:

\[ \mathrm{P}(\text { Layer } \mathrm{j} \text { is an input to layer } \mathrm{i})=\operatorname{sigmoid}\left(v^{\mathrm{T}} \tanh \left(W_{\text {prev}} * h_{j}+W_{\text {curr}} * h_{i}\right)\right) \]

  \(h_j\) 代表第 \(j\) 层的 hiddenstate,于是我们从这些 sigmoids 采样,决定前面 \(N-1\) 层哪些需要被连接作为当前层的输入。下图是一个示意图:

  如果当前层有许多之前的层作为输入,它们会在 depth dimension 下被 concatenate。这就会带来三个问题:

  • 如果当前层没有之前层作为输入,我们会把原始输入,即 image 作为当前层的输入
  • 在最后一层,我们将尚未连接的所有层输出 concatenate 起来,然后将其发送给分类器
  • 如果连接的层 shape 不一致,我们会将较小层进行补零。

Other layer types

  作者也提到了,如果想在每层加一些其他的参数,例如 learning rate,pooling, local contrast normalization,batchnorm等等,我们只需要在每层让 controller 增加一些 predict。
  同时论文中只支持卷积层,如果还想支持其他类型的 layer,我们只需要在 controller 中添加额外的 step,来预测 layer type,然后添加相关的 hyperparameter。

Generate recurrent cell architectures

  我们都知道一个经典的 recurrent cell 通常都是这么计算的,\(h_{t}=\tanh \left(W_{1} * x_{t}+W_{2} * h_{t-1}\right)\),但其实我们也可以把 combination 操作从 addition 变成 elementwise multiplication 等等,activation 也可以换成其他函数。
  那么如下图所示,实际上这些 cell 就可以被就抽象成 tree:

  从图中可以看出,controller 还需要给每个节点 index。\(c_{t-1}\)\(c_t\) 是受 LSTM 启发,通用用来表示 memory state 的 cell,为了合并它们,我们需要 controller 在 tree 中将这两个变量连接到的节点,这些 predict 可以在 controller 的最后两个块中完成。因此图中,controller 首先给前三个 block predict,决定它们的 combination 和 activation,然后最后两个 block 来 predict 如何把 \(c_{t-1}\)\(c_t\) 加入到树中。Cell Indices Block 预测的第一个为 1,表示 \(c_t\) 通过 index 1 来输出,预测的第二个为 0,表示 \(c_{t-1}\) 通过 Cell Inject 里的操作结合 index 0 来 输出。

Conclusion

  通过学习,感觉 Google 提出的这个 NAS 方法还是非常耗算力的,不愧是 Google 爸爸,上来就是硬怼,不过把 RNN 和 RL 引入神经网络的结构搜索,还是非常具有开创性的,学到了很多。

Refer

[1] Zoph, Barret, and Quoc V. Le. "Neural architecture search with reinforcement learning." arXiv preprint arXiv:1611.01578 (2016).

相关内容


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



文章目录
  1. 1. 引言
  2. 2. Compare
  3. 3. Controller RNN
  4. 4. RL
  5. 5. Parallelism and asynchronous updates
  6. 6. Skip connections and branch layers
  7. 7. Other layer types
  8. 8. Generate recurrent cell architectures
  9. 9. Conclusion
  10. 10. Refer
  11. 11. 相关内容
您是第 位小伙伴 | 本站总访问量 | 已经写了 670.5k 字啦

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