共计 3414 个字符,预计需要花费 9 分钟才能阅读完成。
论文基于层级表达提出高效的进化算法来进行神经网络结构搜索,通过层层堆叠来构建强大的卷积结构。论文的搜索方法简单,从实验结果看来,达到很不错的准确率,值得学习
来源:【晓飞的算法工程笔记】公众号
论文: Hierarchical Representations for Efficient Architecture Search
- 论文地址:https://arxiv.org/abs/1711.00436
Introduction
由于网络的验证需要耗费很长的时间,神经网络结构搜索计算量非常巨大,很多研究通过降低搜索空间的复杂度来提高搜索的效率。论文通过加入分层网络结构来约束搜索空间,在最初几层仅使用卷积和池化等简单操作,逐步到高层将底层的 block 进行组合搭建,最后将最高层的 block 堆叠成最终的网络。由于搜索空间设计够好,网络的搜索方法仅用进化算法或随机搜索足以。
论文总结如下:
- 提出对神经网络结构的层级表达
- 通过实验证明搜索空间的设计十分重要,可以降低搜索方法的投入,甚至随机搜索也可以
- 提出可扩展的进化搜索方法,对比其它进化搜索方法有更好的结果
Architecture Representations
Flat Architecture Representation
将神经网络结构定义为单输入、单输出的计算图,图中每个节点代表特征图,每条有向边为基本操作(卷积、池化等),所以网络的表达 $(G,o)$ 包含两部分:
- 一个有效的操作集合 $o=\{o_1,o_2,…\}$
- 一个邻接矩阵 $G$,用以指定操作的神经网络图,$G_{ij}=k$ 为节点 $i$ 和节点 $j$ 间的操作为 $o_k$
将操作集 $o$ 和邻接矩阵 $G$ 组合起来就得到网络的结构
每个节点 $i$ 的特征图 $x_i$ 由其前面的节点 $j$ 通过公式 2 计算而得,$|G|$ 是图中节点数量,$merge$ 将多个特征图合并成一个的操作,这里直接使用 depthwise concatentation,由于 element-wise addition 要求维度一致,比较不灵活,而且如果融合特征后接的是 $1\times 1$ 卷积,这就其实类似于做 concatienation
Hierarchical Architecture Representation
层级结构表达的关键是找到不同的层级的模版,在构建高层模版时使用低层的模版作为积木 (operation) 进行构建
对于 $L$ 层的层级关系,$\ell$ 层包含 $M_{\ell}$ 个模版,最高层 $\ell=L$ 仅包含一个模版,对应完整的网络,最低层 $\ell=1$ 是元操作集,定义 $o_m^{(\ell)}$ 为 $\ell$ 层的第 $m$ 个模版,为低层模版 $o^{(\ell)}=\{o_1^{(\ell -1)},o_2^{(\ell -1)},…,o_1^{(\ell – 1)}\}$ 根据公式 3 的组合。最终的层级结构表达为 $(\{\{G_m^{(\ell)}\}_{m=1}^M\}_{\ell=2}^L,o^{(1)})$,由每层的模版的网络结构关系和最底层操作定义,如图 1
Primitive Operations
低层的原操作共六种($\ell=1$,$M_t=6$):
- 1 × 1 convolution of C channels
- 3 × 3 depthwise convolution
- 3 × 3 separable convolution of C channels
- 3 × 3 max-pooling
- 3 × 3 average-pooling
- identity
使用时,所有元操作为 stride=1,以及进行 padded 来保留分辨率,卷积后都接 BN+ReLU,维度固定为 $C$。另外每层都有 $none$ 操作,代表节点 $i$ 和节点 $j$ 之间没有连接
Evolutionary Architecture Search
Mutation
分层基因的变异包含以下步骤:
- 采样一个非原始层 $\ell\ge2$ 作为目标层
- 在目标层采样一个模版 $m$ 作为目标模版
- 在目标模版中采样一个后继节点 $i$
- 在目标模版中采样一个前置节点 $j$
- 随机替换当前操作 $o_k^{(\ell -1)}$ 为其它操作 $o_{k^{‘}}^{(\ell -1)}$
对于当前层级只有两层的,第一步直接将 $\ell$ 设为 2,变异可总结为公式 4,$\ell$,$m$,$i$,$j$,$k^{‘}$ 从各自区域的均匀分布中随机抽样得到,上面的突变足够对模版产生 3 种修改:
- 添加边:$o_k^{(\ell -1)}=none$,$o_{k^{‘}}^{(\ell -1)}\ne none$
- 修改存在的边:$o_k^{(\ell -1)}\ne none$,$o_{k^{‘}}^{(\ell -1)}\ne none$,$o_k^{(\ell -1)}\ne o_{k^{‘}}^{(\ell -1)}$
- 删除存在的边:$o_k^{(\ell -1)}\ne none$,$o_{k^{‘}}^{(\ell -1)}= none$
Initialization
基因指代完整的网络,基因的种群初始化包含两个步骤:
- 建立一个不重要的基因,每个模版都使用 identity 进行连接
- 对基因进行大批量的随机变异来多样化
对比以前的研究使用常见的网络进行基因初始化,这样的初始化不仅能很好地覆盖不常见的网络的搜索空间,还能去除人工初始化带来的传统偏向
Search Algorithms
论文的进化算法基于锦标赛选择(tournament selection),首先对初始化的种群网络进行训练和测试得到分数,然后从种群中随机获取 5% 的基因,表现最好的基因进行突变得到新网络,在训练和测试后放入种群中,重复进行上述选取与放回,种群数量不断增大,最终取种群表现最好的基因
论文也使用随机搜索进行实验,基因种群随机生成,然后进行训练和验证,选取最好的模型,这种方法的主要好处在于能整个种群并行化计算,减少搜索时间
Implementation
论文使用异步分布式进行实现,包含一个 controller 和多个 worker,分别负责基因的进化和测试,两者共享一个内存表格 $\mathcal{M}$,记录基因及其准确率(fitness),还有一个数据队列 $\mathcal{Q}$,包含待测试的基因
当有 worker 空余时,controller 使用锦标赛选择从 $\mathcal{M}$ 中选择一个基因进行突变,然后放到队列 $\mathcal{Q}$ 中等待测试
worker 从 $\mathcal{Q}$ 中拿到待测试的基因,测试后放到 $\mathcal{M}$ 中,训练是从头开始训练的,没有使用权值共享加速
Experiments and Results
Experimental Setup
在实验中,没有对整体网络进行搜索,而是使用提出的方法进行卷积单元 (cell) 的搜索,这样能够在小网络上快速进行网络测试然后迁移到较大的网络。具体的各结构如图 2,每个 cell 后面接 $2c$ 维度和 $stride=2$ 的 $3\times 3$ 分离卷积,用于升维和降低分辨率,最后一个 cell 后面接 $c$ 维度和 $stride=1$ 的 $3\times 3$ 分离卷积
Architecture Search on CIFAR-10
200 卡,初始种群为 200,层级 $L=3$,每层模版的操作分别为 $M_1=6$,$M_2=6$ 和 $M_3=1$,每层 ($\ell \ge2$) 的节点图分别为 $|G^{(2)}|=4$ 和 $|G^{(3)}|=5$,层 2 的模版跟一个跟模版输入维度一样 $1\times 1$ 的卷积来降维。对于用于对比的不分层的搜索方法,则使用 11 个节点的计算图。从图 3 来看,论文提出的方法在收敛速度、准确率和参数量上都不错
为了进一步展示论文方法的效果,对图 3 中间的结果的每轮增量进行了可视化。在 P100 GPU 上,每个网络的测试需要花费 1 小时,进化共 7000 轮,200 张卡共需要 1.5 天
Architecture Evaluation on CIFAR-10 and ImageNet
CONCLUSION
论文基于层级表达提出高效的进化算法来进行神经网络结构搜索,通过层层堆叠来构建强大的卷积结构。论文的搜索方法简单,从实验结果看来,200 张卡共需要 1.5 天,达到很不错的准确率,值得学习
APPENDIX A
如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】