Loading

【Deeper Insights into Weight Sharing NAS】2020-ArXiv-Deeper Insights into Weight Sharing in Neural Architecture Search-论文阅读

Deeper Insights into Weight Sharing in NAS

2020-ArXiv-Deeper Insights into Weight Sharing in Neural Architecture Search

来源: Chenbong 博客园

Introduction

研究了基于参数共享的超网训练方式是否真正有效.

Motivation

  • 超网训练在很多实验中被证明对减少(搜索)训练开销有效, 但并没有理论上的研究和证明
  • 基于参数共享的超网训练方式, 基于一个假设:
    • 对超网中的不同子网进行训练, 可以同步优化各个子网的权重, 提高各个子网的性能 √
    • 但是各个子网之间存在互相的干扰, 导致每个子网都无法被优化到 train alone 的程度 √
    • 但互相的干扰不会(或很小)影响子网之间的相对性能排序(排序稳定的假设), 因此训练后的超网可以作为一个所有子网的性能评估器, 找到最佳的子网 (?)
  • 几个问题有待解决:
    • 通过超网训练方式找到的最佳子网, 与搜索空间中的最佳子网距离远吗?
    • 在多次run中, 最佳子网是稳定的吗?
    • 权重共享是如何影响搜索结果的精度和稳定性的?

Contribution

  • 作者通过大量实验观察发现:
    • 不同 seed run下的最佳子网 (使用 supernet 评估出来的 rank1 子网) 是不同的, 而且方差很大 ==> 排序不是稳定的
    • 子网之间的互相干扰是导致不同run方差大的主要因素
    • (通过精心设计)适当地减小权重共享的程度, 可以降低不同run的方差并提高超网训练的表现
    • 虽然有很大的方差, 我们依然可以从超网的训练过程中提取有价值的统计信息, 从而指导搜索空间的调整
  • 定义了一种新的metric来评估基于 weight share 的NAS方法
  • 一些观察和发现 (不同run直接的高方差)
  • 解释了高方差的来源, 并使用降低权重共享程度的方式, 降低了方差

Method

Search Space

经典的supernet NAS的搜索空间都很大(\(10^{10}\)), 无法将搜索空间中的每个子网都完全训练, 导致没有ground truth, 不利于实验研究

我们认为, 如果supernet NAS在大搜索空间上有效, 那么在小搜索空间上也应该有效, 因此我们设计了一个小的搜索空间进行实验:

每个子网由4个相同的cell组成, 每个cell内部有n个输出, 输出之间是密集连接: \(x_{j}=\sum_{0 \leq i<j} O_{(i, j)}\left(x_{i}\right)\) , 在连接上是不同的操作 \(O(i,j)=\{1,2,3,4\}\)

我们取n=2, 即每个cell可以表示为 \(O(0,1), O(0,2), O(1,2)\) , 因此一共有 \(4^{4}=64\) 种cell, 即64种子网

(这种搜索空间和 通道left n的搜索空间有点区别, 本文这种空间不同的子网基本上大小一致, 而且不会不同子网互相包含的情况)

image-20210530162142837

训练方式

Setup

  • CIFAR10
  • K80
  • SGD, momentum=0.9, weight decay=1e-3
  • init lr=0.025, cosine schedule, annealed down to 0.001
  • batch size=256
  • epoch=200

Ground Truth

64个子网单独训练, 每个子网都用10个seed训练10次取平均

image-20210530163812920

使用sampler均匀生成子网序列(64个), 每个batch训练1个序列中的子网(64个batch可以把所有子网训练一遍)

  • 超网训练seed: 超网权重初始化
  • sampler seed: 控制生成的子网序列的顺序
  • sampler shuffle: {True, False} 每64个batch是否重新生成 新的子网顺序

可以看出, 不同的run 使用相同的超网训练seed, sampler seed, 相同的sampler shuffle, 得到的结果应该相同

训练完成后, 使用超网的参数对每个子网进行评估, 得到64个子网的排序

Metric

Kendall 相关系数, 衡量两组排序 \(R_1, R_2\) 的相关性: \(\tau(R_1, R_2)\) ; 排序完全一致时, \(\tau=1\) , 排序完全反序时, \(\tau=-1\)

一次supernet search run会得到一组排序 \(R_i\)

设计一个metric来衡量 N次 run得到的N组rank: \(R_1, R_2, ..., R_N\) 的排序稳定性(-1, 1 越大越好), 衡量N组排序的内部差异程度, 类似方差 (任意2个rank都计算一次 \(\tau\)):

  • S-Tau: \(\frac{2}{N(N-1)} \sum_{1 \leq i<j \leq N} \tau\left(R_{i}, R_{j}\right)\)

某次run的rank \(R\) 和 ground truth rank的相关性(-1, 1 越大越好):

  • GT_Tau: \(\tau(R, R_{gt})\)

某次run 的top n个子模型的ground truth rank平均值(衡量本次run找到优质子网的能力, 1, 64 越小越好):

  • Top-n-Rank(TnR): \(\tau(R_{top_n}, R_{top_n gt})\)

Experiments

Multi run: S-Tau 子网排序的稳定性

image-20210530173114153

神经网络无论使用什么种子初始化, 最后都能逐渐收敛到一个性能好的, 稳定的(收敛的)状态

我们期望基于权重共享的NAS也是如此, 即无论使用什么seed, 搜索的结果(rank)都要逐渐收敛, 稳定性S-Tau越来越高, 且接近ground truth

每行都是10个run计算的结果

  • Different seeds (不同run之间, 超网初始化不同, 子网序列相同, 且子网序列保持不变(周期循环)):
    • 不同的超网训练seed
    • 相同的sampler seed
    • sampler shuffle=False, 每64个batch不重新生成子网序列
  • Different orders (不同run之间, 超网初始化相同, 子网序列不同, 且子网序列保持不变(周期循环)):
    • 相同的超网训练seed
    • 不同的sampler seed
    • sampler shuffle=False, 每64个batch不重新生成子网序列
  • Diff. orders (shuffle) (不同run之间, 超网初始化相同, 子网序列不同, 且子网序列一直变化(没有周期循环)):
    • 相同的超网训练seed
    • 不同的sampler seed
    • sampler shuffle=True, 每64个batch重新生成子网序列

最随机的方式应该是, 超网初始化不同, 子网序列不同, 序列不重复

2个baseline:

  • random rank: 随机生成10组rank
  • Ground truth: 单独训练64个子网, 得到1组rank; 重复10次, 得到10组rank

观察:

  • 表1: 不同的seed(超网seed, sampler seed), 会导致不同run之间差异很大, 有的run之间相关性很高(0.79), 有的甚至负相关(-0.01)
  • 表1: Ground truth的baseline就稳定得多, max=0.82, min=0.67
  • 表1: 3个实验的总体稳定性都不高(0.5)
  • 图2: 虽然3个实验的总体稳定性都不高, 但实际上他们并没有可比性, 由图2可以看出, S-Tau在训练后期的几个epoch依然剧烈变化(0.3-0.7), 说明搜索结果(rank)并没有收敛

总结: 不同run之间, 子网的rank是非常不稳定的; 超网NAS的假设并不成立

Multi run: GT-Tau & TnR

image-20210530184210801

观察:

  • 3个实验与GT rank的相关性都很低(0.5), 说明run产生的rank不足以指示子网性能的真实排序
  • T1R的范围在15-19, 说明以训练后的超网作为评估器搜索到的top 1, 实际的rank排在15-19, 和GT Top1差距很远; T3R稍好, 但超网NAS中一般无法承担将top n的子网都train from scratch; 进一步说明了使用run得到的rank来作为子网排序的proxy并不靠谱

Single run: S_Tau & GT-Tau & TnR

既然不同run之间的差异很大, 那同一个run在训练末期的稳定性如何?

Different epochs:

  • 表1, S_Tau中位数
  • 表2, GT-Tau 均值±方差; TnR

观察:

  • 同一个run, 在训练后期不同的epoch, 产生的rank也是很不稳定的, 即不同的epoch设置(100/120/150)对产生的rank也有很大的影响
  • single run different epoch 与 Multi run 的 metric(S_Tau & GT-Tau & TnR)很接近

single run different epoch 与 Multi run final epoch 的rank分布对比:

图例

  • 线段: 数据范围
  • 方框: 四分位数/中位数
  • 圆圈: 离群点

image-20210530190809234

single run different epoch 与 Multi run final epoch的分布很接近, 差的子网容易被识别, 好的子网不容易被识别

Insight 1: 虽然超网NAS的rank是不稳定的, 但由于single run与multi run具有相似性, 可以利用single run快速识别出差的子网, 从而缩小搜索空间, 只训练排名靠前的模型

从前面的实验我们知道, 当超网训练到一定的阶段后(e.g. 100 epochs), 继续训练并不能提高产生的rank的质量, 可以认为是一种"稳定"状态, 因此可以让子网继承当前状态的权重, 对每个子网进行微调:

image-20211015174420280

图4 a/c: 在训练100个epoch后, 对每个子网进行64个batch的微调, 可以发现只用了10个batch左右, 每个子网的acc都迅速提高且趋于稳定, GT-Tau也迅速提高到0.6左右

图4 b/d: 从200个epoch后开始微调的结果更好, GT-Tau迅速提高到接近0.8

Insight 2: 训练后的权重共享超网可以作为一个良好的 pre-trained model, 只需要很少的微调(10个batch), 就可以迅速得到各个子网的rank

不同run差异的来源

对single run, 最后128个batch, 计算每个batch后所有子网的精度:

image-20211015174359321

图例:

  • 该batch训练的子网用方块标记
  • 浅色的是GT性能好的子网

观察:

  • 图5 a: 有明显的周期性, 且周期为64, b shuffl后, 周期性消失
  • 图5 a/b: 每个子网被训练1个batch后, 性能都会迅速提升
  • 优质子网被训练后, 会提升到更高的性能, 但在其他batch, 优质子网不一定是排在最上方的 (训练一个子网, 很容易扰乱整体的rank), 因此在哪个batch生成rank对最终结果影响很大
  • 因此rank高差异的原因可能是不同的子网训练产生的相互干扰

Group Sharing

将64个模型分为m组, 每组之内共享参数, m=1即超网训练, m=64即每个子网 train alone

GT-Tau-Mean-k(Mean-k): 最后k个batch的GT-Tau均值

image-20211015174537312

观察:

  • 表3 a 左: 随机分组并不能提高稳定性

不合理的分组: 分为16组, 每组4个子网, 424是GT最好的子网

image-20210530194122786

因此我们认为不合理的分组(随机分组)是导致分组不能提高稳定性的原因

合理的分组: 尝试对子网编号 (111-444) 按照字典序进行分组, 表3 a 右, 分组有效地提高了GT-Tau的值, 即m越大, 生成的rank越接近GT

结论:

  • 当多个子网共享权重进行训练时, 子网之间存在相互干扰, 一个子网的精度, 严重依赖于与之一起训练的其他子网
  • 一中Smart的分组方式, 可以改善训练的稳定性 (本例子中的smart指的是similarity, 但使用字典序衡量相似性可能不是最佳的)

Prefix sharing (left n)

有k个cell共享

  • k=0, 只有first conv共享;
  • k=4, first conv+4个cell都共享

表3 b, epoch=2000

k越小, GT-Tau越高, k=0时, 仍需要1000个epoch才能提高到0.6

Conclusion

Summary

To Read

Reference

posted @ 2021-06-04 10:35  ChenBong  阅读(133)  评论(0编辑  收藏  举报