原文链接:https://arxiv.org/pdf/1808.07233.pdf 发表:NIPS 2018
编辑:牛涛
code:https://github.com/renqianluo/NAO_pytorch
本文argue的仍然是基于RL或EA的NAS在离散空间搜索,很低效。故提出一种通过将网络结构编码映射成连续向量,并通过梯度下降更新的NAS方法。
方法分为三个模块,encoder、performance predictor和decoder。先将网络结构编码成向量,然后再用这个latent vector预测精度,再将这个向量还原回原始结构,通过最小化预测精度与实际精度的差来训练performance predictor,通过最小化原始结构与还原后结构的差来训练encoder+decoder,这两部分损失写在了一起做成了联合优化。如下图
首先作者规定了结构的空间,依旧是基于cell,cell中有两个输入node,n-3个中间node,一个输出node(将中间node中的叶子节点concat)。每个node由两个输入,两个操作组成。文中给了个例子,比如一个节点的序列为“node-2 conv 3x3 node1 max-pooling 3x3 ”。这表示它将node-2和node1作为输入,分别用3*3conv和3*3 max-pooling处理。一个cell中的每个node都这么编码成一个句子,接下来就用NLP的方式去处理。
encoder输入就是这个句子x,隐向量h的拼接就是编码后的网络结构。
得到的这个编码矩阵在序列维度取均值得到一个向量,输入到performance predictor中去计算回归得到预测的精度。值得一提的是,encoder编码的结果应该满足对称不变性。具体地说,对于一个节点只是交换分支顺序的话,encoder编码后的结果应该与原始的离得很近,以便于predictor预测相近的性能。所以训练的时候把对称样本也加入训练集训练。(结果表明这么做提升了2个百分点,cifar10)
decoder输入encoder编码后的矩阵,并输出解码后的结构向量,这里涉及到一些NLP的公式和概念,想了解的可以参考原文。
encoder、predictor、decoder是联合训练的,利用下列公式
当整个框架收敛后,从一个比较好的结构开始,encoder编码并预测性能,然后拿预测性能作为loss进行梯度上升,更新输入的结构向量x。收敛后会得到最优的结构。
文章的伪代码如下