AAAI'23 | NAS-LID:用「局部内在维度」给超网做体检,省 86% 显存

AAAI’23 | NAS-LID:用「局部内在维度」给超网做体检,省 86% 显存

原文:NAS-LID: Efficient Neural Architecture Search with Local Intrinsic Dimension 代码:github.com/marsggbo/NAS-LID


1. 问题背景:One-shot NAS 的排名失灵问题

One-shot NAS(又叫 Weight-sharing NAS)是 AutoML 领域在 2019-2022 年最火的研究方向之一。核心思路很简单:

不是搜一个架构就从头训练,而是训练一个包含所有候选架构的超网(Supernet),所有子网(subnet)共享权重,搜索时直接评估 subnet 的性能。这样搜索效率从「450 GPU 天」降到了「4 GPU 时」(对比 NASNet 和 DARTS)。

但有一个老大难问题:超网训出来的权重,给子网的性能排名严重不准

具体来说,同一个超网里,子网结构差异很大(有的选 conv3×3,有的选 skip-connect),但它们的权重被强制共享,训练时互相干扰,导致从超网继承权重估计出的性能排名,和子网单独训练的真实排名对不上。

当时的解决方案(GM-NAS 等)是:按梯度相似度把超网拆成多个子超网,每个子超网只包含结构相似的架构,减少干扰。方向是对的,但有两个痛点:

  1. 计算梯度需要 forward + backward,内存消耗大(对大 batch 不友好)
  2. 梯度是高维稀疏的,用它衡量架构相似度,可分性(separability)低

我们就是从这里切入,提出了 NAS-LID


2. 核心 idea:用「局部内在维度」代替梯度

局部内在维度(Local Intrinsic Dimension,LID) 是一个来自拓扑学的概念,描述数据点周围邻域的有效维度(内在维度),反映了高维数据实际”躺”在的低维流形的维数。

形式上,对于数据分布 $\mathbf{R}$,点 $x$ 的 LID 定义为:

\[\widehat{\text{LID}}(x) = -\left(\frac{1}{k}\sum_{i=1}^{k}\ln\frac{r_i(x)}{r_k(x)}\right)^{-1}\]

其中 $r_i(x)$ 是 $x$ 到第 $i$ 个近邻的距离,$r_k(x)$ 是最大近邻距离(本文取 $k=20$)。

在 NAS 里,我们把这个工具用来描述架构的几何性质

  • 对超网的每一层,提取该层的输出表示,算出层级 LID 值 $\text{LID}(x_i)$
  • 把所有层的 LID 拼成向量 $[\text{LID}_1, \ldots, \text{LID}_L]^T$,作为这个架构的”几何指纹”
  • 用这个指纹来判断两个架构是否”相似”

不同架构的LID profile:arch-shaped vs 单调递减两种典型形态

有意思的现象:性能好的架构往往呈”拱形”LID profile(先升后降),而性能差的呈单调递减。这说明 LID 不只是一个分组工具,它本身就包含了架构性能的信息。

为什么 LID 比梯度更好?

  • 计算量小:只需 forward,不需要 backward(梯度)。对于一个 $L$ 层超网分成 $n$ 子超网,NAS-LID 只需 $n \times L$ 个参数,而 GM-NAS 需要 $n \times M$ 个($M$ 是超网参数量,$M \gg L$)
  • 可分性高:梯度在高维稀疏空间里很难区分相似架构,而 LID 衡量的是低维流形的维数,在低维空间里更好区分

3. 方法:如何用 LID 拆超网

核心流程如下图:

Supernet partition via LID:从超网到多个子超网的分组过程

第一步:对超网每一层的每个候选操作(conv3×3, skip-connect 等),计算该操作对应子超网的层级 LID。

第二步:构造 LID 相似度矩阵。两个子超网的相似度定义为:

\[S(\mathcal{A}_{O_i}, \mathcal{A}_{O_j}) = \frac{1}{\|\mathcal{L}_{\mathcal{A}_{O_i}} - \mathcal{L}_{\mathcal{A}_{O_j}}\|_2 + \epsilon}\]

第三步:用图最小割(Graph Min-Cut)把操作分成两组,最大化同组内相似度之和(partition score)。

第四步:迭代拆分,直到子超网数量满足需求。

对比 GM-NAS 的双向传播方式,NAS-LID 只需要 forward,内存节省显著:

NAS-LID vs GM-NAS 表征对比:只需forward vs forward+backward

GPU显存消耗对比:NAS-LID vs GM-NAS on V100 32GB

在 NASBench-201 上 batch size 32×3×224×224 时,NAS-LID 只用 3,413 MB,GM-NAS 用 24,073 MB,省了 86% 的 GPU 显存。


4. 实验结果

可分性(Separability)

核心指标之一:LID 的可分性比梯度高出两个数量级。

NAS-LID vs GM-NAS separability scores on NASBench-201 edges

所有 edge 上,NAS-LID 的可分性分数都远高于 GM-NAS,说明用 LID 做超网分组更”确定”,不同组之间的边界更清晰。

排名相关性 & 最终架构性能

Table 2: 排名相关性 + Table 3: SOTA对比

  • 排名相关性(Table 2):NAS-LID 在 Top50/100/150 上的 Kendall 和 Spearman 系数均显著优于 SPOS 和 GM-NAS。更低的标准差说明 LID 驱动的分组更稳定。
  • 最终架构性能(Table 3):NAS-LID+RSPS 在 CIFAR-10 test 上达到 92.90%(接近 optimal 94.37%),CIFAR-100 test 上达到 69.39%,均超过 GM-NAS+RSPS。

训练过程中验证精度曲线:NAS-LID更稳定

进化搜索过程中,NAS-LID 的验证精度波动明显小于 GM-NAS(蓝线 vs 红线),说明子超网干扰减少了,搜索更稳定。


5. 踩坑记录

坑 1:LID 估计的近邻数 k 怎么选?

我们在代码里硬编码了 $k=20$。实际上 $k$ 太小会导致估计不稳定,$k$ 太大又引入了远邻噪声。20 是个经验值,在 NASBench-201 的 batch size 32 下表现稳定。如果换更大的 batch size 或不同数据集,可能需要重新调。

坑 2:子超网数量的平衡

拆太多子超网会增加 fine-tune 的开销(每个子超网都要单独 fine-tune),但拆太少减少干扰的效果有限。我们最终选择 $T=2$ 轮拆分($2^2=4$ 个子超网)作为默认配置,兼顾效率和效果。

坑 3:迁移到 OFA/ProxylessNAS 空间

NASBench-201 是个比较小的 tabular 搜索空间,迁移到更大的 OFA 和 ProxylessNAS 空间时,LID 计算的 batch size 需要相应调大,否则近邻不准。这也是文章最后指出的一个局限。


6. 总结

NAS-LID 的贡献可以用一句话概括:用更轻量(只需 forward)、更有可分性(LID vs 梯度)的几何指标来拆超网,解决 one-shot NAS 里的权重共享干扰问题。

从 86% 的显存节省和更高的排名相关性来看,这个方向是对的。

从现在(2026 年)回看:one-shot NAS 这个方向在大模型时代确实沉寂了不少,但超网权重干扰这个根本问题依然存在——换个场景,比如 MoE 的路由器训练干扰、多任务学习的梯度冲突,本质上是同类问题。NAS-LID 里的 LID-based 分组思路,或许在这些新场景里还有用武之地。

论文:arxiv.org/abs/2211.12759 代码:github.com/marsggbo/NAS-LID