NAS基准与评估方法
1. 概述
NAS基准(Benchmark)为神经架构搜索方法提供了统一的评估平台1。高质量的基准对于:
- 比较不同NAS方法的性能
- 验证新方法的效能
- 加速NAS研究迭代
2. NAS-Bench-101
2.1 基准概述
论文: Dong & Yang, “NAS-Bench-101: Towards Reproducible Neural Architecture Search” (ICML 2019)
特点: 首个大规模NAS基准,包含423,624个独特架构。
2.2 搜索空间定义
Cell结构:
- 最多7个节点
- 每个节点与之前的节点全连接
- 5种操作类型
图结构表示:
2.3 评估协议
三个训练配置:
| 配置 | 训练周期 | 学习率 | 参数 |
|---|---|---|---|
| Config-A | 12 | 0.1 | CIFAR-10 |
| Config-B | 108 | 0.1 | CIFAR-10 |
| Config-C | 108 | 0.02 | CIFAR-10 |
指标:
- 训练/验证/测试准确率
- 参数量
- FLOPs
- 训练时间
2.4 使用示例
from nas_bench_101 import NASBench101
nasbench = NASBench101()
# 查询架构性能
arch_spec = {
'adjacency': [[0, 1, 0, 0],
[0, 0, 1, 1],
[0, 0, 0, 1],
[0, 0, 0, 0]],
'operations': ['input', 'conv3x3-bn-relu', 'conv3x3-bn-relu', 'maxpool3x3', 'output']
}
metrics = nasbench.query(arch_spec, 'config-b')
print(f"Test accuracy: {metrics['test_accuracy']}")
print(f"Params: {metrics['params']}")3. NAS-Bench-201
3.1 基准概述
论文: Dong & Yang, “NAS-Bench-201: Extending the Benchmarking Scope” (ICLR 2020)
特点: 固定Cell结构,跨数据集评估,简化比较。
3.2 搜索空间
固定Cell结构:
- 4个中间节点
- 5种操作
操作集:
| ID | 操作 | 描述 |
|---|---|---|
| 0 | none | 无连接 |
| 1 | skip_connect | 恒等映射 |
| 2 | conv_1x1 | 1x1卷积 |
| 3 | conv_3x3 | 3x3深度可分离卷积 |
| 4 | avg_pool_3x3 | 平均池化 |
3.3 数据集支持
| 数据集 | 类别数 | 图像大小 |
|---|---|---|
| CIFAR-10 | 10 | 32x32 |
| CIFAR-100 | 100 | 32x32 |
| ImageNet-16-120 | 120 | 16x16 |
3.4 评估指标
from nas_bench_201 import NASBench201API
api = NASBench201API('NAS-Bench-201-v1_1.pkl')
# 获取最优架构
info = api.query_by_index(0) # 索引0的架构
print(f"CIFAR-10 accuracy: {info.get_metrics('cifar10', 'val')}")
print(f"ImageNet-16-120 accuracy: {info.get_metrics('ImageNet16-120', 'val')}")4. NAS-Bench-301
4.1 基准概述
论文: Zela et al., “NAS-Bench-301 and the Case for Surrogate Benchmarks for NAS” (ICML 2020)
创新: 使用代理模型加速架构评估,覆盖更大搜索空间。
4.2 基于DARTS的搜索空间
搜索空间规模: 个架构
代理模型训练:
- 训练集:10,000个随机采样的架构
- 目标:预测完整训练后的性能
Surrogate模型架构:
class ArchPredictor(nn.Module):
def __init__(self, num_ops, num_nodes):
super().__init__()
self.edge_embed = nn.Embedding(num_ops, 64)
self.node_embed = nn.Linear(64 * num_nodes, 256)
self.predictor = nn.Sequential(
nn.Linear(256, 128),
nn.ReLU(),
nn.Linear(128, 1)
)
def forward(self, arch):
# arch: [num_edges, num_ops] one-hot
edge_feat = self.edge_embed(arch.argmax(dim=-1))
node_feat = edge_feat.flatten()
return self.predictor(self.node_embed(node_feat))5. NAS-Bench-360
5.1 多模态基准
论文: Chauhan et al., “NAS-Bench-360: Benchmarking NAS Methods” (NeurIPS 2022)
创新: 超越图像分类,评估跨任务泛化能力。
5.2 任务列表
| 任务 | 类型 | 说明 |
|---|---|---|
| CIFAR-10 | 图像分类 | 基准图像任务 |
| ImageNet | 图像分类 | 大规模图像 |
| Penn Treebank | 语言建模 | 文本任务 |
| WikiText-2 | 语言建模 | 长文本 |
| OGBG-MolHIV | 图分类 | 分子性质预测 |
| ESC-50 | 音频分类 | 环境声音 |
| dSprites | 因子分解 | 视觉概念学习 |
5.3 评估协议
from nas_bench_360 import NASBench360
nb360 = NASBench360()
# 评估架构在不同任务上的表现
results = {}
for task in ['cifar10', 'wikitext', 'ogbg-molhiv', 'esc50']:
results[task] = nb360.evaluate(architecture, task)
# 计算跨任务一致性
consistency = compute_rank_correlation(results)6. Zero-Shot NAS基准
6.1 NAS-Bench-Zero
评估协议: 在NAS-Bench-201基础上评估零代价代理质量。
代理指标列表:
| 代理 | 简称 | 数据依赖 |
|---|---|---|
| Gradient-based | Grad | 是 |
| Synflow | Syn | 否 |
| NASWOT | NW | 是 |
| Fisher | Fis | 是 |
| Grasp | Grasp | 是 |
6.2 评估指标
Rank相关性:
其中是代理分数排名与真实性能排名的差值。
Top-K准确率:
6.3 基准结果示例
| 代理 | CIFAR-10 Spearman | ImageNet Spearman | Top-5 Acc |
|---|---|---|---|
| Random | 0.00 | 0.00 | 5.0% |
| SNIP | 0.42 | 0.38 | 15.2% |
| GraSP | 0.45 | 0.41 | 18.7% |
| Synflow | 0.52 | 0.48 | 22.1% |
| NASWOT | 0.48 | 0.44 | 19.8% |
| NTK | 0.55 | 0.51 | 24.3% |
7. YOLO-NAS-Bench
7.1 目标检测基准
论文: 目标检测专用NAS基准
搜索空间: YOLO系列架构变体
评估指标:
- mAP@0.5
- mAP@0.5:0.95
- 推理延迟
- 参数量
7.2 自演进代理模型
创新: 使用NAS方法自动设计代理模型架构。
class EvolvingPredictor:
def __init__(self, search_space):
self.predictor = train_initial_predictor()
self.search_space = search_space
def evolve(self, n_iterations=100):
for i in range(n_iterations):
# 生成候选代理
candidates = self.generate_candidates()
# 评估
scores = [self.predictor.predict(c) for c in candidates]
# 选择
best = candidates[argmax(scores)]
# 更新代理
self.predictor = self.update_predictor(best)
return self.predictor8. ParZC方法
8.1 参数化零代价代理
论文: “ParZC: Parametric Zero-Cost Proxies for NAS” (AAAI 2025)
核心创新: 引入可学习参数改进零代价代理。
8.2 方法原理
传统零代价代理:
其中是固定的标量函数。
参数化零代价代理:
其中是可学习的神经网络。
8.3 训练过程
class ParametricZeroCost:
def __init__(self, hidden_dim=64):
self.scoring_net = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, 1),
nn.Sigmoid()
)
def train(self, train_archs, train_scores):
optimizer = torch.optim.Adam(self.scoring_net.parameters())
for epoch in range(num_epochs):
pred_scores = self.scoring_net(train_archs)
loss = F.mse_loss(pred_scores, train_scores)
optimizer.zero_grad()
loss.backward()
optimizer.step()
def predict(self, arch):
return self.scoring_net(arch)9. 评估协议最佳实践
9.1 完整评估流程
def comprehensive_nas_evaluation(nas_method, benchmark, num_repeats=3):
results = []
for repeat in range(num_repeats):
# 搜索
best_arch = nas_method.search()
# 重新训练
trained_model = train_from_scratch(best_arch)
# 测试评估
metrics = evaluate(trained_model, benchmark.test_set)
results.append({
'architecture': best_arch,
'metrics': metrics,
'search_time': nas_method.search_time
})
return aggregate_results(results)9.2 评估指标选择
| 研究目标 | 推荐指标 | 理由 |
|---|---|---|
| 方法比较 | Spearman相关性 | 评估排序能力 |
| 实际应用 | Top-K准确率 | 直接反映可用性 |
| 效率评估 | 搜索时间 | 计算资源消耗 |
| 稳定性 | 重复实验方差 | 结果可复现性 |
9.3 基准使用注意事项
- 搜索空间一致性: 确保使用相同的搜索空间定义
- 训练配置: 严格按照基准规定的训练配置
- 数据划分: 使用固定的数据划分保证可比性
- 重复实验: NAS结果有方差,需要多次实验
10. 相关主题
参考文献
Footnotes
-
Dong, X., & Yang, Y. (2019). NAS-Bench-101: Towards Reproducible Neural Architecture Search. ICML 2019. ↩