想象一下,你要装修一套房子,但完全不知道什么风格适合自己。传统的做法是请设计师出好几套方案——北欧风、日式风、工业风——然后一套一套地建样板间、住进去试,最后才选定。又贵又慢,你可能要折腾大半年。现在,来了一位「智能设计师」:他不用搭建样板间,而是把所有装修风格都揉在一张「可调节的设计图」里,先让每种风格都参与进来,再通过不断微调每个旋钮,让最合适的风格自动“显形”。这就是 DARTS——可微分神经架构搜索——的魔法:它把“选哪种网络结构”这个离散难题,变成了对连续参数求梯度的优化问题,让 AI 自己“装修”自己的大脑,又快又准。 本文将用“智能设计师”这个比喻贯穿始终,带你拆解 DARTS 的核心思想、连续松弛化、搜索空间设计、梯度优化与离散化重训。你将看到,一个曾经需要几千 GPU 天的搜索任务,如何被压缩到几十 GPU 天,甚至几天。这套方法论,是通往 AutoML 与自动化深度学习的钥匙。

岗位关联

对 AI 从业者而言,DARTS 是理解“如何让机器自动设计模型”的高效入口。掌握它,你就能用可微分优化取代暴力搜索,大幅降低架构搜索成本,为自动化机器学习打下扎实基础。

目录
  1. 可视化演示
  2. 核心思想:让架构搜索可微
  3. 连续松弛化技巧:给每个选项装一个旋钮
  4. 搜索空间设计:设计图的骨架与可选材料
  5. 梯度优化:双涡轮交替驱动的引擎
  6. 离散化与重训练:从软决策到硬结构
  7. 实现技巧与局限:装修工程的雷区与优化
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

DARTS Cell搜索空间 (DAG结构)

核心思想:让架构搜索可微

想象那位“智能设计师”拿到你的房子后,并不急着画最终图纸,而是先画一张“万能底稿”:墙可以是白色的也可以是灰色的,地板可以是木质的也可以是瓷砖的——每个选项都配一个旋钮,旋钮转到哪,风格就偏向哪。传统 NAS 是“建好一套样板间,住进去试,不行就拆”,而 DARTS 的核心思想是“让设计图本身可调、可微、可求导”,用梯度一步步拧旋钮,让最优风格自己浮出水面。

技术上,DARTS 的关键一步是连续松弛化:把“从离散候选操作集合里选一个”这个不可导的操作,替换为“对所有候选操作做加权求和”,权重由 softmax 产生。这样一来,网络结构就从离散变量变成了连续变量 \\(\alpha\\),整个搜索过程就变成了对 \\(\alpha\\) 的连续优化。

为什么这一小步如此重要?因为离散优化通常只能靠枚举、进化、强化学习,样本效率极低;而连续优化可以直接利用深度学习的“老本行”——反向传播与梯度下降。DARTS 把架构搜索从“试错”变成了“求导”,搜索成本从数千 GPU 天降到几十 GPU 天,这正是它的“范式革命”所在。

回扣比喻:传统装修是“建样板间-试住-拆掉-重建”的暴力循环,而 DARTS 的“万能底稿+旋钮”让设计师能在图纸上直接调参。核心理念就是一句话:用连续可导的旋钮取代离散的选择,让建筑过程本身变成一场优雅的梯度下降。

min⁡α Lval(w∗(α),α)s.t.w∗(α)=arg⁡min⁡wLtrain(w,α)\min_{\alpha}\ \mathcal{L}_{val}(w^{*}(\alpha),\alpha)\quad \text{s.t.}\quad w^{*}(\alpha)=\arg\min_{w}\mathcal{L}_{train}(w,\alpha)
这个公式描述了一个“双层优化”:内层是在训练集上把网络权重 \\(w\\) 练到最优;外层是在验证集上把架构参数 \\(\alpha\\) 调到最优。内层是“工人干活”,外层是“设计师修改图纸”。
  1. 外层目标 \\(\min_{\alpha}\\)我们要找到一组架构参数 \\(\alpha\\),使验证集损失最小。这是“设计师”的目标。
    min⁡α Lval(w∗(α),α)\min_{\alpha}\ \mathcal{L}_{val}(w^{*}(\alpha),\alpha)
  2. 验证集损失 \\(\mathcal{L}_{val}\\)用没训练过的验证样本评估当前架构好坏。这是“验收测试”。
    Lval(w∗(α),α)\mathcal{L}_{val}(w^{*}(\alpha),\alpha)
  3. 约束条件 \\(\text{s.t.}\\)表示“设计师的修改必须基于工人已经干完活的状态”。此时 \\(w^{*}(\alpha)\\) 是最优权重。
    s.t.w∗(α)=arg⁡min⁡wLtrain(w,α)\text{s.t.}\quad w^{*}(\alpha)=\arg\min_{w}\mathcal{L}_{train}(w,\alpha)
  4. 内层目标 \\(\arg\min_{w}\\)对给定架构 \\(\alpha\\),在训练集上优网络权重 \\(w\\)。这是“工人”的目标。
    arg⁡min⁡wLtrain(w,α)\arg\min_{w}\mathcal{L}_{train}(w,\alpha)

连续松弛化技巧:给每个选项装一个旋钮

装修时,如果你不确定餐厅要铺木地板还是瓷砖,设计师会怎样做?他会在图纸上标一个“混合材质”区域:木地板占 60%,瓷砖占 40%,随着你不断调整偏好,这个比例会逐渐倒向最终选择。DARTS 的连续松弛化正是这个“混合比例”的数学版。

对于单元中连接节点 \\(i\\) 和节点 \\(j\\) 的边,传统方法是从候选操作集合 \\(\mathcal{O}\\)(如 3×3 卷积、5×5 卷积、最大池化、跳跃连接等)里硬选一个。DARTS 把这条边定义为所有候选操作的加权和:

其中 \\(\alpha_{o}^{(i,j)}\\) 是操作 \\(o\\) 在该边上的架构权重,softmax 把权重归一化成概率分布。训练初期,各操作权重接近均匀;训练后期,权重会“两极分化”,最强操作的概率趋近 1。

为什么用 softmax 而不是直接学比例?因为 softmax 的输出恒为正且和为 1,天然是合法的概率分布;而且它对 \\(\alpha\\) 可导,梯度可以从损失函数顺畅地流回每个 \\(\alpha\\)。这就好比每个旋钮都能被一只“无形的手”精准微调,而不是只能“开/关”两档。

回扣比喻:连续松弛化就是那张“万能底稿”上的混合材质层。它让设计师不必在初期就押注某一种风格,而是让所有风格公平竞争,用梯度温和地调大胜者的音量。这种“软决策”正是 DARTS 高效的精髓。

oˉ(i,j)(x)=∑o∈Oexp⁡(αo(i,j))∑o′∈Oexp⁡(αo′(i,j)) o(x)\bar{o}^{(i,j)}(x)=\sum_{o\in\mathcal{O}}\frac{\exp(\alpha_{o}^{(i,j)})}{\sum_{o'\in\mathcal{O}}\exp(\alpha_{o'}^{(i,j)})}\,o(x)
αo(i,j)=softmax 之前的原始分值,随梯度连续变化\alpha_{o}^{(i,j)}=\text{softmax 之前的原始分值,随梯度连续变化}
通俗地说:\\(\alpha\\) 是旋钮的“刻度”,softmax 把刻度翻译成“各风格占比”。旋钮本身是连续变量,所以梯度能顺畅流过。
  1. 混合操作 \\(\bar{o}\\)边的输出 = 所有候选操作输出的加权平均。这是“混合材质层”。
    oˉ(i,j)(x)=∑o∈Opo(i,j) o(x)\bar{o}^{(i,j)}(x)=\sum_{o\in\mathcal{O}} p_{o}^{(i,j)}\, o(x)
  2. softmax 权重 \\(p_o\\)\\(\alpha\\) 经 softmax 变成 0\~1 的概率,和为 1。这是“旋钮最终显示的比例”。
    exp⁡(αo(i,j))∑o′∈Oexp⁡(αo′(i,j))\frac{\exp(\alpha_{o}^{(i,j)})}{\sum_{o'\in\mathcal{O}}\exp(\alpha_{o'}^{(i,j)})}
  3. 候选操作 \\(o(x)\\)每个操作本身是一个小函数,如卷积、池化。这是“每种材质的效果”。
    o(x)∈{conv 3×3, conv 5×5, pool, skip}o(x)\in\{\text{conv 3×3, conv 5×5, pool, skip}\}
  4. 连续变化 \\(\alpha\\)搜索时 \\(\alpha\\) 是实数,可被梯度更新。这是“旋钮无级可调”。
    α∈R∣O∣\alpha\in\mathbb{R}^{|\mathcal{O}|}

搜索空间设计:设计图的骨架与可选材料

任何设计师都需要一个“材料库”:地板有木、石、瓷砖,墙面有乳胶漆、壁纸、硅藻泥。DARTS 同样先定义了搜索空间的边界——它能搜什么、不能搜什么,完全由这个“材料库”决定。搜索空间设计是 DARTS 的“边界感”所在。

DARTS 的搜索空间以单元(Cell)为基本单位。一个单元是一个有向无环图(DAG),包含若干节点,每个节点代表一个潜在特征图(即网络中某层的输出)。节点之间的每条边绑定一个混合操作。搜索时,我们只搜索单元内部的结构;使用时,将搜索到的单元堆叠若干次,组成完整的大网络。这就像设计师设计一个“标准房间模块”,然后在整个房子里重复使用。

每次搜索默认包含 8 种候选操作:3×3 与 5×5 的可分离卷积、3×3 与 5×5 的空洞卷积、3×3 最大池化、3×3 平均池化、跳跃连接、零操作(即无边)。这种设计既保证了表达力,又控制了搜索空间规模。搜索空间的“词汇量”决定了架构的上限——如果材料库里没有大理石,设计师再怎么调旋钮也变不出大理石地面。

回扣比喻:搜索空间设计就像给设计师一份材料清单。清单决定了他能玩出什么花样,也划定了创意的边界。DARTS 的精妙,在于用“标准房间模块+有限材料库”的组合,在可控成本下搜索出高性能的“住宅图纸”。

O={sep3×3,  sep5×5,  dil3×3,  dil5×5,  maxPool3×3,  avgPool3×3,  skip,  zero}\mathcal{O}=\{ \text{sep3×3},\; \text{sep5×5},\; \text{dil3×3},\; \text{dil5×5},\; \text{maxPool3×3},\; \text{avgPool3×3},\; \text{skip},\; \text{zero} \}
这是 DARTS 的“材料清单”。搜索空间不是越大越好:清单太大会让搜索难度爆炸,太小又会限制最终架构的性能上限。
  1. 算子集合 \\(\mathcal{O}\\)8 种可选的网络操作。这是装修的“材料库”。
    O={sep3×3, sep5×5, dil3×3, dil5×5, maxPool, avgPool, skip, zero}\mathcal{O}=\{\text{sep3×3, sep5×5, dil3×3, dil5×5, maxPool, avgPool, skip, zero}\}
  2. 可分离卷积 \\(\text{sep}\\)将标准卷积分解为深度卷积+逐点卷积,减少参数量。
    sepConvk×k=Pointwise(Depthwise(Convk×k))\text{sepConv}_{k×k}=\text{Pointwise}(\text{Depthwise}(\text{Conv}_{k×k}))
  3. 空洞卷积 \\(\text{dil}\\)在卷积核内插入空洞扩大感受野,不增加参数量。
    dilConvk×k(x)=(Convk×k, rate=r)(x)\text{dilConv}_{k×k}(x)=(\text{Conv}_{k×k,\ \text{rate}=r})(x)
  4. 零操作 \\(\text{zero}\\)表示这条边不存在,让搜索器学会“剪枝”。
    zero(x)=0\text{zero}(x)=0

梯度优化:双涡轮交替驱动的引擎

图纸有了、材料有了,接下来关键问题是:设计师和工人如何配合,才能高效地把房子盖好?DARTS 的答案是双层优化——工人(网络权重 \\(w\\))和设计师(架构参数 \\(\alpha\\))交替干活,像双涡轮增压一样互相推动。

具体来说,每次迭代分两步:第一步,固定当前 \\(\alpha\\),在训练集上更新 \\(w\\)(工人按图纸施工);第二步,固定当前 \\(w\\),在验证集上更新 \\(\alpha\\)(设计师根据验收结果调整图纸)。两者交替进行,直到收敛。这种“训练-验证”交替,保证了 \\(\alpha\\) 的优化方向不是迎合训练集,而是真正提升泛化能力。

为了让优化更高效,DARTS 提出了一阶和二阶两种近似。一阶近似直接忽略 \\(w\\) 对 \\(\alpha\\) 的依赖,更新公式简单但略粗糙;二阶近似用链式法则额外补偿了 \\(w^{*}(\alpha)\\) 的导数项,更准确但计算更重。后者又被称为 DARTS+,是改进版的核心技巧之一。

回扣比喻:双层优化就像设计师与工人的双涡轮配合——工人按图施工,设计师按验收报告改图,循环往复。一阶近似是“施工到一半就验收”,二阶近似是“考虑工人后续行动再改图”,两者各有取舍,共同驱动搜索高效进行。

∇αLval(w∗(α),α)≈∇αLval(w−ξ∇wLtrain(w,α),α)⏟一阶近似,忽略 w 对 α 的依赖\nabla_{\alpha}\mathcal{L}_{val}(w^{*}(\alpha),\alpha)\approx\underbrace{\nabla_{\alpha}\mathcal{L}_{val}(w-\xi\nabla_{w}\mathcal{L}_{train}(w,\alpha),\alpha)}_{\text{一阶近似,忽略 w 对 α 的依赖}}
这个公式展示了一阶近似的思路:用一步梯度更新后的 \\(w'\\) 代替真正最优的 \\(w^{*}\\),从而大幅简化梯度计算。代价是近似误差,好处是计算量几乎减半。
  1. 近似符号 \\(\approx\\)用可计算的近似梯度代替精确梯度。这是“用快照代替全程录像”。
    ∇αLval(w∗(α),α)≈∇αLval(w′,α)\nabla_{\alpha}\mathcal{L}_{val}(w^{*}(\alpha),\alpha)\approx\nabla_{\alpha}\mathcal{L}_{val}(w',\alpha)
  2. 一步更新权重 \\(w'\\)\\(w'\\) 是 \\(w\\) 沿训练梯度走一小步后的值。
    w′=w−ξ∇wLtrain(w,α)w'=w-\xi\nabla_{w}\mathcal{L}_{train}(w,\alpha)
  3. 学习率 \\(\xi\\)控制工人“施工”的步伐大小。
    ξ=0.01 或 0.02\xi=0.01\text{ 或 0.02}
  4. 验证集梯度在验证集上计算 \\(\alpha\\) 的梯度,驱动架构更新。
    ∇αLval(w′,α)\nabla_{\alpha}\mathcal{L}_{val}(w',\alpha)

离散化与重训练:从软决策到硬结构

装修的最后阶段,设计师必须做决定:混合材质的旋钮最终停在哪一档?木地板 95%、瓷砖 5% 的话,现实中不可能真铺成 95/5 的混合地板——你必须二选一。DARTS 也一样:搜索完成后,要把“软混合”变成“硬结构”,这个过程叫做离散化(discretization)。

离散化的规则很直接:对每条边,用 \\(\arg\max\\) 选出权重最大的操作作为唯一操作,剪除其他所有候选操作。然后,用选出的离散结构重新从头训练整个网络。为什么需要重训?因为搜索阶段使用的是混合操作的“软网络”,其性能与真实部署的“硬网络”存在差距——就像样板间的混合材质灯光效果,和实际单一材质的效果并不完全一样。重训就是用最终确定的材料,把房子真正盖好。

回扣比喻:离散化与重训练,就是从“万能底稿”回归“施工蓝图”的过程。旋钮最终停在了唯一挡位,混合图层被替换成真实材料。搜索的全部努力,在这一刻凝结成一座看得见、摸得着的网络大厦。

o(i,j)=arg⁡max⁡o∈O  αo(i,j)o^{(i,j)}=\arg\max_{o\in\mathcal{O}}\;\alpha_{o}^{(i,j)}
这是“最终拍板”:每个连接只保留权重最大的那个操作,其余全部淘汰。直观地说,softmax 竞赛的冠军通吃。
  1. \\(\arg\max\\) 选择从所有候选操作中挑出 \\(\alpha\\) 最大的操作。
    o(i,j)=arg⁡max⁡o αo(i,j)o^{(i,j)}=\arg\max_{o}\ \alpha_{o}^{(i,j)}
  2. 权重比较用于比较的是 softmax 归一化后的权重,和为 1。
    αo(i,j)∈(0,1),∑oαo(i,j)=1\alpha_{o}^{(i,j)}\in(0,1),\quad \sum_{o}\alpha_{o}^{(i,j)}=1
  3. 剪除弱操作只保留冠军操作,其余从计算图中移除。
    Edge(i,j): oˉ⟶o∗\text{Edge}_{(i,j)}:\ \bar{o}\longrightarrow o^{*}
  4. 重训练用离散架构初始化权重,在完整训练集上重新训练。
    min⁡w Ltrain(w, Arch={o∗})\min_{w}\ \mathcal{L}_{train}(w,\ \text{Arch}=\{o^{*}\})

实现技巧与局限:装修工程的雷区与优化

再优秀的设计师也有翻车的时候。DARTS 在实践中同样存在需要注意的“雷区”,以及针对这些雷区的改进技巧。了解它们,你才算真正掌握这套方法。

第一个雷区是搜索阶段的早停。DARTS 在小数据集(如 CIFAR-10)上搜索时,如果训练时间过长,\\(\alpha\\) 会严重过拟合搜索空间,导致最终离散化后的架构在真实场景中表现不佳。因此实际中常采用“搜索到一半就停”的策略,保留泛化能力更强的中间状态。第二个雷区是批大小敏感性。研究发现,搜索时使用的批大小如果与重训时不一致,架构排序会发生漂移——搜出来的冠军架构不是真正的冠军。DARTS+ 通过引入二阶近似和更多正则化手段缓解了这个问题。

第三个局限是搜索空间的表达力边界。DARTS 的单元结构固定、候选操作有限,这决定了它的性能天花板。如果材料库里没有 Transformer 这类模块,DARTS 永远搜不出 Transformer。后来研究者们正是通过扩充 \\(\mathcal{O}\\)、改变单元拓扑,将 DARTS 应用于更广阔的场景。理解这一点,你就明白了为什么“搜索空间设计”是 NAS 中最具战略意义的一环。

回扣比喻:装修工程的雷区,对应 DARTS 的“早停”“批大小”“搜索空间限制”三大要点。聪明的设计师会提前踩点、控制节奏、合理选材,最终在有限条件下交出最漂亮的答卷。这正是 DARTS 从论文走向工程实践的关键心法。

DARTS+:min⁡αLval(w∗(α),α)+γ∥α∥22\text{DARTS+}:\quad \min_{\alpha}\mathcal{L}_{val}(w^{*}(\alpha),\alpha)+\gamma\|\alpha\|_{2}^{2}
DARTS+ 在损失中加入了对 \\(\alpha\\) 的正则化项,抑制架构参数过快极化,从而提升搜索稳定性。
  1. 验证集损失原始目标,衡量架构在验证集上的泛化性能。
    Lval(w∗(α),α)\mathcal{L}_{val}(w^{*}(\alpha),\alpha)
  2. 正则项 \\(\gamma\|\alpha\|^{2}\\)惩罚过大或分布极端的 \\(\alpha\\),防止过早收敛。
    γ∥α∥22,γ>0\gamma\|\alpha\|_{2}^{2},\quad \gamma>0
  3. 平衡系数 \\(\gamma\\)控制正则强度,通常在 0.01\~0.001 之间。
    γ=10−3∼10−2\gamma=10^{-3}\sim10^{-2}
  4. 稳定训练正则后的 \\(\alpha\\) 变化更平滑,离散化时排序更稳定。
    min⁡α Lval+γ∥α∥22\min_{\alpha}\ \mathcal{L}_{val}+\gamma\|\alpha\|_{2}^{2}

AI 应用场景

场景一:AutoML 平台自动化模型设计

阶段:模型架构搜索与选型

解决的问题:传统深度学习依赖专家手工设计网络,试错成本极高。一个 ResNet 级别的架构往往需要研究团队数月调试。DARTS 将架构搜索转化为可微优化后,平台可以自动在给定数据集上搜索高性能架构,无需人工干预,把“炼丹师”从繁琐的试错中解放出来。

具体案例:某 AI 云平台的 AutoML 服务,用户在界面上传图片分类数据集并指定算力预算,后端用 DARTS 在 8 块 GPU 上搜索 1 天,得到一套比 ResNet-50 精度更高、速度更快的轻量架构,直接部署到移动端 App 中。

场景二:边缘设备轻量化模型搜索

阶段:模型压缩与高效部署

解决的问题:手机、物联网设备算力有限,需要极简且高效的网络。DARTS 的搜索空间设计天然支持“零操作”剪枝,可以自动搜出带稀疏连接的精简架构,避免人工反复压缩模型带来的精度损失。

具体案例:某智能家居公司要在家用摄像头芯片上部署人脸检测模型,工程师用 DARTS 搜索的单元堆叠出参数量仅 1.2M 的轻量网络,在保持 95% 精度的同时将单帧推理时间从 80ms 降至 25ms。

Python 演示

python70 行
import numpy as np # 候选操作池: 0-恒等, 1-线性放大, 2-线性缩小, 3-置零OPS = ['identity', 'scale_up', 'scale_down', 'zero'] def apply_op(op_name, x):    if op_name == 'identity':        return x    if op_name == 'scale_up':        return x * 1.5    if op_name == 'scale_down':        return x * 0.5    return np.zeros_like(x)  # zero class Cell:    """一个简化 DARTS 单元: 2 个输入节点 -> 1 个输出节点"""     def __init__(self, n_ops=4):        self.n_ops = n_ops        self.alpha = np.zeros((2, n_ops))  # 2 条边 x 4 个操作        self.alpha_norm = np.ones((2, n_ops)) / n_ops        self.w = np.random.randn(n_ops) * 0.1  # 每个操作的权重     def _softmax(self, a):        e = np.exp(a - a.max())        return e / e.sum()     def forward(self, x0, x1):        """连续松弛化前向: 每条边输出=各操作加权和"""        self.alpha_norm[0] = self._softmax(self.alpha[0])        self.alpha_norm[1] = self._softmax(self.alpha[1])        out0 = sum(self.alpha_norm[0][i] * apply_op(OPS[i], x0)                   for i in range(self.n_ops))        out1 = sum(self.alpha_norm[1][i] * apply_op(OPS[i], x1)                   for i in range(self.n_ops))        return out0 + out1  # 输出节点 = 两输入之和     def update_alpha(self, g_alpha, lr=0.05):        """验证集梯度更新架构参数 alpha"""        self.alpha -= lr * g_alpha     def discretize(self):        """离散化: 每条边 argmax 选一个操作"""        chosen = [OPS[int(np.argmax(self.alpha[i]))] for i in range(2)]        return chosen # 模拟训练数据: 目标模式为 x -> x + 1def make_data(n=16):    x0 = np.random.randn(n)    x1 = np.random.randn(n)    y = (x0 + x1) + 1.0    return x0, x1, y if __name__ == '__main__':    np.random.seed(42)    cell = Cell()    x0, x1, y = make_data()     for epoch in range(200):        y_pred = cell.forward(x0, x1)        loss = np.mean((y_pred - y) ** 2)        # 简化梯度: 直接根据 loss 符号更新 alpha        g_alpha = np.sign(y_pred - y).reshape(2, 4) * 0.01        cell.update_alpha(g_alpha)         if epoch % 40 == 0:            print(f'epoch {epoch:3d}  loss={loss:.4f}')     arch = cell.discretize()    print('离散化架构:', arch)
目的:演示 DARTS 的连续松弛化(forward 中的加权求和)、alpha 更新(update_alpha)与离散化(discretize)三大核心步骤,帮助理解从“软混合”到“硬结构”的完整流程。
  1. import numpy as np引入数值计算库,用于向量运算。
  2. self.alpha = np.zeros((2, n_ops))初始化架构参数,每条边对应 4 个候选操作的旋钮。
  3. self.alpha_norm[0] = self._softmax(self.alpha[0])将原始 alpha 归一化为概率分布。
  4. out0 = sum(self.alpha_norm[0][i] * apply_op(...))连续松弛化的核心:所有操作加权求和。
  5. self.alpha -= lr * g_alpha用验证集梯度更新架构参数,这是“设计师”的调参动作。
  6. chosen = [OPS[int(np.argmax(...))]]离散化:每条边选出权重最大的操作。
  7. y_pred = cell.forward(x0, x1)前向传播,计算当前混合架构的输出。

常见误区

误区搜完 DARTS,拿到的网络就直接上生产环境,不需要再训练。

正解架构搜索阶段用的是“混合操作”的软网络,它的权重是多个候选操作的加权结果,不等于最终硬网络的真实参数。类比装修:设计图上的“混合材质层”只是效果示意,必须换成真实材料重新施工。因此 DARTS 搜完后必须用离散架构从头重训练,才能达到预期性能。

为何常见:很多初学者把“搜索”等同于“训练”,忽略了搜索阶段与部署阶段的网络结构差异。

误区搜索时用大批量训练没关系,反正最后都要重训,架构排序应该稳定。

正解研究发现,搜索时的批大小直接影响验证集梯度的噪声,从而影响 \\(\alpha\\) 的收敛方向。如果搜索用大 batch、重训用小 batch,两者数据分布与梯度噪声不一致,可能导致搜索出的冠军架构在重训后排名大跌。就像用装修样板间的专业灯光看效果,与实际自然光下完全是两回事。正确做法是保持搜索与重训的 batch 大小一致。

为何常见:batch size 在训练中常被视为“可随意调的性能旋钮”,但在 NAS 的搜索-重训闭环中,它变成了必须保持一致的实验变量。

误区给 DARTS 塞进越多的候选操作和节点,模型上限越高,搜出来越强。

正解搜索空间越大,\\(\alpha\\) 的维度越高,优化难度呈指数级上升,同时更容易过拟合搜索空间。现实中 DARTS 默认 8 种操作、4 个中间节点,是经过平衡的“黄金配方”。材料库太大时,设计师会陷入“选择瘫痪”,反而选不出好方案。合理做法是在保持搜索可控的前提下,逐步扩展空间。

为何常见:直觉上“更多选择=更好结果”,但在高维连续优化中,维度灾难会让搜索质量急剧下降。

面试题

Q1. DARTS 的核心思想是什么?

单选题 · easy

  • A.用进化算法搜索最优网络架构
  • B.将离散架构搜索转化为连续可微优化← 正确答案
  • C.用强化学习训练一个生成网络的控制器
  • D.随机采样大量架构进行暴力验证

答案:B。DARTS 的关键创新是把“从离散操作集合里选一个”松弛成“对所有操作加权求和”,让架构参数 \\(\alpha\\) 可微,从而用梯度下降优化。A/C/D 分别对应进化 NAS、强化学习 NAS 和随机搜索,都不是 DARTS 的做法。就像智能设计师用可旋转钮的混合材质图,而不是建多个样板间逐个试住。

Q2. 连续松弛化中,softmax 函数的作用是什么?

单选题 · easy

  • A.把输出压缩到 0\~1 之间且和为 1 的概率分布← 正确答案
  • B.随机选择一个操作
  • C.放大梯度防止梯度消失
  • D.把损失降到最低

答案:A。softmax 将架构权重 \\(\alpha\\) 归一化为概率分布,每个操作获得一个 0\~1 的混合系数且总和为 1。B 错在 softmax 是确定性运算;C 错在 softmax 不做梯度缩放;D 是优化目标而非 softmax 的功能。相当于把旋钮刻度翻译成各材质的占比。

Q3. DARTS 双层优化中,内层优化目标是什么?

单选题 · mid

  • A.在验证集上优化架构参数 alpha
  • B.在训练集上优化网络权重权重 w← 正确答案
  • C.同时优化 alpha 和 w
  • D.在测试集上评估最终精度

答案:B。内层 \\(\min_w \mathcal{L}_{train}\\) 是工人在训练集上把网络权重练好;外层 \\(\min_\alpha \mathcal{L}_{val}\\) 是设计师在验证集上调整架构参数。C 错在两者是交替而非同时优化;A 描述的是外层目标;D 是搜索完成后的评估步骤。

Q4. 为什么 DARTS 搜索完成后需要重新训练离散架构?

单选题 · mid

  • A.因为搜索阶段的权重被正则化破坏了
  • B.因为混合操作的软网络与真实部署的硬网络存在性能落差← 正确答案
  • C.因为验证集数据不可靠
  • D.因为 alpha 参数无法在推理时使用

答案:B。搜索阶段每条边是所有候选操作的加权和,离散化后只剩一个操作,网络计算方式发生了根本变化。就像样板间的混合材质效果必须换成真实材料重新施工。A 错在正则化并非必然破坏权重;C/D 不是重训的原因。

Q5. DARTS 搜索空间中的“零操作”有什么作用?

单选题 · mid

  • A.加快前向传播速度
  • B.让搜索器学会剪除不重要的边← 正确答案
  • C.防止梯度爆炸
  • D.增加模型参数量

答案:B。零操作输出恒为零,相当于“这条边不存在”。如果某条边的零操作权重最大,离散化后该边被删除,实现了结构剪枝。这就好比设计师在材料库中放入“留白”选项,表示这里可以不装修。A/C/D 都不是零操作的设计意图。

Q6. DARTS 的一阶近似为什么比二阶近似更快但更粗糙?

单选题 · hard

  • A.一阶近似忽略了 w 对 alpha 的梯度依赖← 正确答案
  • B.一阶近似不计算损失函数
  • C.一阶近似完全不更新网络权重
  • D.一阶近似使用了更小的学习率

答案:A。一阶近似直接用一步梯度更新后的 \\(w'\\) 代替真正最优的 \\(w^{}\\),省略了 \\(w^{}(\alpha)\\) 对 \\(\alpha\\) 的依赖项,因此每次迭代计算量减半,但引入近似误差。就好比设计师只看工人干了一半的活就改图,快速但可能偏差。B/C/D 都不符合一阶近似的定义。

Q7. 为什么 DARTS 要使用验证集来更新架构参数 alpha?

单选题 · easy

  • A.验证集数据更多更充分
  • B.避免 alpha 过拟合训练集,提升泛化能力← 正确答案
  • C.验证集可以加速梯度计算
  • D.训练集数据质量较差

答案:B。如果 alpha 也在训练集上优化,会与网络权重 w 同向过拟合,最终搜出的架构在真实场景表现差。用验证集更新 alpha,等于让设计师在“新户型”上验收图纸,保证泛化性。A/C/D 都不是使用验证集的核心原因。这是典型的双层优化思想。

Q8. 下列关于 DARTS 连续松弛化的说法,正确的有哪些?

多选题 · mid

  • A.每条边是所有候选操作的加权求和← 正确答案
  • B.softmax 让操作权重归一化为概率← 正确答案
  • C.搜索阶段的网络结构与最终部署结构完全相同
  • D.alpha 参数在搜索过程中被梯度持续更新← 正确答案

答案:ABD。A 正确,混合操作是加权求和;B 正确,softmax 归一化权重;D 正确,alpha 是连续变量,由验证集梯度更新。C 错误,搜索阶段是软混合结构,部署阶段是离散硬结构,两者不同——就像设计图与实际装修效果的区别。

Q9. 哪些措施可以缓解 DARTS 搜索阶段过拟合搜索空间的问题?

多选题 · hard

  • A.提前停止搜索,保留中间状态← 正确答案
  • B.搜索与重训使用一致的批大小← 正确答案
  • C.增大搜索空间到极限
  • D.使用二阶近似增强稳定性← 正确答案

答案:ABD。A 正确,早停可防止 alpha 过拟合;B 正确,一致的 batch size 能减少搜索与重训的排序漂移;D 正确,二阶近似(如 DARTS+)提升稳定性。C 错误,盲目增大搜索空间会加剧过拟合与维度灾难,如同给设计师过多样品反而无从下手。

Q10. DARTS 相比传统 NAS(如强化学习、进化算法)的优势有哪些?

多选题 · easy

  • A.将离散搜索转化为连续优化,利用梯度下降← 正确答案
  • B.搜索效率大幅提升,GPU 天数显著降低← 正确答案
  • C.不需要人工设计任何东西,完全自动化
  • D.借助反向传播更新架构参数← 正确答案

答案:ABD。A 正确,这是 DARTS 的范式创新;B 正确,搜索成本从数千 GPU 天降至数十 GPU 天;D 正确,可微性的核心好处就是能反向传播更新 alpha。C 错误,搜索空间仍需人工设计,DARTS 的“自动”是在给定空间内自动搜索,不是完全免人工设计。