随机连线神经网络:用图论替代 NAS 的新思路
Kaiming He 和 Ross 刚出了一篇文章,简单说就是把网络结构的产生方式从手工设计或NAS直接换成一个随机图生成器,用这个生成器直接生成随机的计算图,连筛选都省了——随机出来什么就用什么。
核心思路
这个方法和NAS里的Random Search有本质区别。Random Search是随机搜索一批结构,然后挑里面最好的那个;而这里的做法是直接随机生成,不做任何挑选。实验表明,同一个生成器参数下,不同随机种子生成的网络性能方差很小,效果都差不多——这就意味着根本不需要挑选。
作者的结论是:与其花精力去设计或搜索某个具体的网络结构,不如去设计更好的网络生成器(即采样器)。让生成器采出来的结构普遍都好,比优化单一结构或搜索过程更重要。这个方向值得认真想一想。
三种随机图生成算法
论文用了图论中的三种经典随机图生成算法:Erdős–Rényi(ER)、Barabási–Albert(BA)和 Watts–Strogatz(WS)。生成的图样例如下:
这些随机图不一定是有向无环图(DAG),而神经网络的计算图必须是DAG,否则前向传播会有环。论文的处理方式是对节点做拓扑排序编码,把生成的图转换成DAG。
Erdős–Rényi(ER)
两个参数:节点数N和连边概率P。
遍历所有节点对,每对之间以概率P独立地连一条边。任何含N个节点的图都有可能通过ER生成,没有任何结构偏好,完全随机。
Barabási–Albert(BA)
两个参数:节点数N和每步新增边数M。
初始时有M个孤立节点,无边。之后每次插入一个新节点,为其连接M条边,连接目标按已有节点的入度成比例地随机选取——度数越高的节点被选中的概率越大。总共插入(N - M)个节点,生成 M(N - M) 条边。
Watts–Strogatz(WS)
三个参数:节点数N、初始近邻数K(偶数)和重连概率P。
初始时N个节点排成一个环,每个节点与其左右各K/2个邻居相连。然后对每个节点,在顺时针方向上依次选择那些尚未连接且不是自身的节点,以概率P连一条额外的边。按此算法生成的图恰好有 N×K 条边。
网络整体结构:保留了多少人工先验
随机化只在计算图的拓扑上,整个网络仍然需要一些人工设计的先验知识。
整体结构沿用了多stage的经典范式(下图中的conv层),不同stage之间用卷积做下采样,控制特征图分辨率。随机连线发生在每个stage内部。
每个节点上的操作固定为3×3 depthwise separable convolution(sep conv)。
在每个随机子图的首尾各加一个特殊节点:
- 输入节点:连接到原始图中所有入度为零的节点,把输入tensor复制并分发给它们。
- 输出节点:连接到图中所有出度为零的节点,将这些输出加权求和,得到该stage的最终输出。
图内部,当一个节点有多个输入时,同样做加权求和。整体结构如下图所示:
超参数极少
整个网络的超参主要用来控制规模大小:随机图的节点数、Channel数、输入图片分辨率。各生成算法内部的参数只有一两个。作者在ImageNet上对不同算法和不同超参做了系统对比:
实验结果
ImageNet
实验分大、中、小三种规模,在相同计算量和参数量下,随机生成的网络几乎能达到当时state-of-the-art的水平:
COCO目标检测
将backbone替换成随机生成的网络,检测精度比ResNet-50和ResNeXt-50要好:
鲁棒性实验
网络训练完成后,随机删掉一些节点和边,测试准确率的下降幅度。不同生成算法下,鲁棒性表现有差异:
说实话我觉得这组实验意义不大——为什么要人为去掉已经训练好的网络中的节点和边?这个设定的实际应用场景不太清楚。
节点操作消融
将节点操作从3×3 sep conv换成3×3普通conv,或者pooling后接1×1 conv,最终3×3 sep conv效果最好:
一点工程疑虑
论文里的FLOPs和参数量都比较小,但我怀疑实际训练时内存开销会很大。原因是随机图中存在大量tensor的copy和分发操作(输入节点把tensor复制分发给多个子节点,多分支汇聚时也要保存中间激活)。这部分运行时显存开销不体现在FLOPs和参数量里。
当然也有可能不会——如果框架对不可变tensor的”复制”只是传引用而非真实拷贝,额外开销可能没那么大。但这一点在当前框架下并不能保证,值得实际跑一跑验证。
小结
这篇论文的主要贡献在于提出了一个新的思路:网络设计的未来方向应该从传统的结构设计或NAS,转变为设计更好的网络生成器。如果一个生成器采出来的结构性能普遍都好、方差极小,那么优化这个生成器(采样分布)比优化单一结构或搜索过程更为根本。超参少、先验知识少,是这个方向相比NAS的明显优势。这个思路值得继续跟进。