你想定制一套西装,传统做法是:裁缝先请一个“标准身材”的塑料模特,在模特身上反复试版、调肩线、改腰围,等样衣完美了,再照版型给你做一件。可问题恰恰出在这里——塑料模特的肩宽、臂长、胸围,都不是你的。它在模特身上笔挺服帖,套在你身上却勒得慌。ProxylessNAS 的思路,就是把那个塑料模特扔进仓库,直接拿着皮尺在你身上量、在你身上剪、在你身上缝。它不依赖任何“代理模型”来间接评估网络结构,而是把候选架构直接放到目标设备上训练、实测延迟,用真实反馈指导搜索。本篇就用这家“裁缝店”的故事,带你从裁缝的皮尺、骰子、试衣镜一路看到收银台,把 ProxylessNAS 的原理和落地讲清楚。
对 AI 从业者的价值:掌握 ProxylessNAS,意味着你不再靠“代理模型 + 事后部署”的旧流程赌运气,而是能面向手机、边缘设备等真实硬件直接产出高效网络结构,这是 AutoML 从论文走向工业落地的关键能力。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
ProxylessNAS超网络结构 超网络特点 超网络统一表示所有候选架构,一次训练完成搜索 路径级二值化机制 L = L_ce(y, ŷ) + λ · latency(arch, device) ProxylessNAS神经架构搜索可视化:超网络结构、路径二值化、梯度估计、硬件感知延迟优化。
代理模型痛点
裁缝店里原本有个塑料模特,师傅在模特上把版型改得无可挑剔,可你穿上身才发现腋下紧绷、裤腿吊脚。问题不在师傅手艺,而在“替身”和“真人”之间存在不可忽视的偏差。传统神经架构搜索(比如两阶段 NAS)也有同样毛病:它先用一个小数据集、小分辨率或轻量模型组成的“代理任务”把候选架构筛一遍,再用 FLOPs 或参数量这类间接指标打分,最后才到真实设备上重新训练。搜索阶段和部署阶段的环境不一致,导致“代理阶段排名靠前”的网络,到了真实设备上反而不一定好用。
ProxylessNAS 的核心主张正是“无代理”:搜索过程直接面向目标硬件、目标数据集和目标推理框架,每一步评估的对象就是将来真正要部署的那个模型。它把量体、剪裁、试穿放在同一个人身上完成,从根上消除了代理与真实之间的错位,也让搜索出的结构不再需要大幅度迁移调优。
所以,把塑料模特请出裁缝店,不是省事,而是为了避免“替身说好,真人说不”的灾难。ProxylessNAS 的第一个明智决定,就是让裁缝只对你一个人负责。
- 真实设备排名把候选架构 $a$ 放到目标设备上实测,得到它在真实条件下的性能排名。
- 代理模型排名在代理任务上评估同一个架构,得到近似排名。
- 取绝对差两个排名差得越远,说明代理评估失真越严重,最终模型迁移到真机时风险也越大。
路径级二值化
如果一件西装有两只袖子,裁缝却同时把左边荷叶袖、右边灯笼袖一起缝上去试穿,那就完全分不清哪只袖子好看,还会浪费双倍布料。传统的 DARTS 方法就有点像这样:每条边上所有候选算子同时保留,通过 softmax 加权混合,前向和反向都要遍历全部算子,显存开销随候选数量线性膨胀。ProxylessNAS 用路径级二值化解决这个问题:每个候选路径配一个 0/1 门控,前向传播时只激活一条路径,其余路径全部关闭。
具体来说,超网络中每条边都有一组架构参数 $\alpha_i$ 表示对各候选算子的偏好。搜索时按这些偏好随机采样一条路径,只有被采中的算子参与计算,因此单次迭代的显存和算力成本只相当于一个子网络,而不是整个超网络。这一招像极了裁缝试衣:一次只让顾客穿上一只袖子,看清效果再换另一只,布料的用量和判断的复杂度都大大降低。
每条路径像一只单独的袖子,每次只试一只,反馈清楚、成本可控。路径级二值化让搜索从“所有款式叠在一起”变成“逐一试穿、择优录取”,这正是 ProxylessNAS 能在真实硬件上高效搜索的基石。
- 偏好分数$\alpha_i$ 是裁缝手里记录“这款袖子好看程度”的原始评分,越大越被偏爱。
- softmax 归一化对所有候选的评分做指数归一化,变成一组和为 1 的概率,评分差距会被指数放大。
- 伯努利采样按概率 $p_i$ 掷一次硬币,得到 0 或 1 的二值化掩码,决定本次只试穿哪一条路径。
梯度估计方法
掷骰子本身是随机的,可裁缝想要的是“让骰子逐渐偏向好看的款式”。二值化门控 $G_i$ 是离散的 0/1,离散操作对架构参数 $\alpha$ 不可导,梯度无法直接穿过门控回传。ProxylessNAS 需要一套“可学习的骰子”:既要保持前向的离散采样,又要在反向传播时给出有用的梯度信号。
论文中讨论并对比了几种估计方法:Gumbel-Softmax 通过温度退火把离散采样变成可导的软采样;REINFORCE 使用策略梯度做无偏估计但方差较大;而最实用的做法是二进制连接——前向传播时使用二值化门控,反向传播时把门控近似为连续变量,让梯度“直通”过去。这个直通估计器就像裁缝不用等顾客把整件西装穿完,只看袖子试穿的效果就记下一笔“偏好修正”,既保持了前向的离散真实性,又让评分更新足够平稳。
骰子掷得多了,统计规律自然会浮现。梯度估计方法让裁缝店里的每一次“随机试穿”都能变成有方向的经验积累,而不是纯粹的碰运气。
- 期望形式离散路径 $G$ 来自分布 $p_\alpha$,损失对 $\alpha$ 的梯度无法直接求,只能写成期望形式。
- 对数概率导数score function 把对分布的梯度转化为对 $\log p_\alpha(G)$ 求导,对 softmax 而言恰好等于 $G_i - p_i$。
- 蒙特卡洛近似用一次采样近似期望,得到可反向传播的梯度估计:损失越大、越偏向当前路径,$\alpha_i$ 的修正量就越大。
硬件感知延迟优化
西装好不好看,不能只看挂在那里的版型;同样,网络结构好不好,也不能只看 FLOPs 或参数量。ProxylessNAS 会在目标设备上实测候选路径的真实延迟,并把“延迟”本身写进损失函数。这就像裁缝让顾客穿上真西装后走几步、抬抬手臂、弯弯腰,用秒表记录动作是否顺畅,而不是对着图纸空想。
延迟项通常取对数形式,因为延迟值可能从几毫秒到几百毫秒跨两个数量级,直接相加会让大延迟样本主导梯度,取对数可以压缩长尾,让优化过程平稳。超参数 $\lambda$ 控制精度与速度的平衡:$\lambda$ 越大,搜索越偏向低延迟;$\lambda$ 越小,越偏向高精度。通过调节 $\lambda$,使用者可以在同一次搜索框架下得到一系列“帕累托最优”的架构,按业务需求灵活挑选。
真机实测、延迟入损失、超参调平衡——这三步让 ProxylessNAS 不只是“在目标设备上搜索”,而是“为目标设备量身优化”,真正做到了量体之后才下剪。
- 分类损失衡量网络精度的交叉熵损失,是搜索的基础目标。
- 延迟对数项实测延迟取对数,把几十倍的延迟差距压缩到可控范围内。
- 平衡系数$\lambda$ 决定延迟惩罚的权重,相当于裁缝问顾客“你更在意贴身还是更在意活动方便”。
搜索空间定制
一件定制西装的可选项很多:尖领还是方领、单排扣还是双排扣、羊毛面料还是棉麻混纺。搜索空间就是给裁缝开放的“款式菜单”。ProxylessNAS 的搜索空间通常由三部分构成:每层可选的算子集合(3x3 深度可分离卷积、5x5 深度可分离卷积、池化、跳跃连接等)、层间的拓扑连接方式、以及通道数等维度配置。
搜索空间必须根据目标设备裁剪:手机上跑模型,内存带宽有限,深度可分离卷积和轻量融合算子更受欢迎;服务器 GPU 上则可以考虑大卷积核和高通道数。ProxylessNAS 允许你像改菜单一样改搜索空间,把不合适的算子直接从候选里拿掉。这样一来,搜索算法不会浪费时间在“硬件跑不动的选项”上,也降低了搜索过程中的不确定性。
菜单定制得当,裁缝就不必为不存在的尺码浪费布料。搜索空间定制让 ProxylessNAS 能针对不同性能档位的设备给出不同的“菜单”,既尊重硬件差异,也控制搜索成本。
- 单层候选集合第 $j$ 层的可选算子集合 $\mathcal{O}_j$,相当于菜单上某一栏的选项。
- 逐层组合两层之间的候选两两相乘,形成更大一层的组合空间。
- 全局乘积连续乘到第 $L$ 层,得到全部网络结构的搜索空间;算子越多,空间越大,搜索难度也随之增加。
交替优化流程
裁缝和顾客的合作从来不是一锤子买卖:量体、试穿、修改、再试穿,反复迭代直到满意。ProxylessNAS 的优化过程也分两派交替进行:一派是“模型权重 $w$”,负责让网络在训练数据上把分类任务做好;另一派是“架构参数 $\alpha$”,负责决定哪条路径更值得保留。两者交替更新,就像裁缝一边缝线一边调整版型。
超网络作为一个共享权重的“大工作台”,其中每条路径都可以借用其他路径学到的参数,因此训练成本大幅降低。每次迭代先固定 $\alpha$,按采样的单一路径更新权重 $w$;再固定 $w$,用验证集上的性能和延迟反馈更新 $\alpha$。这种交替优化保证了搜索过程不需要从头训练每个候选网络,而是让所有候选在同一个工作台上公平竞争。
当交替优化收尾,裁缝会从工作台上抽出那件“综合表现最好”的西装——最优子网,再做一次最终试穿与微调。此时这件西装已经在你的身上量过、剪过、改过无数回,不再需要任何塑料模特。
- 内层最优权重给定当前架构偏好 $\alpha$,在训练集上把模型权重训练到损失最小,得到 $w^*(\alpha)$。
- 外层架构优化带着这组最优权重去验证集上评估,找到让验证损失最小的 $\alpha$。
- 嵌套约束外层不能随意挑 $\alpha$,必须以内层训练充分为前提,两层一起优化才能避免“空有其表的版型”。
AI 应用场景
手机端实时分类模型搜索
阶段:模型结构设计 / AutoML 架构搜索
解决的问题:传统做法先在 GPU 集群上用代理模型搜索,再移植到手机端,常常出现精度高但速度慢、算子不支持等问题。ProxylessNAS 直接在目标手机上实测每一段路径的延迟,把“手机跑得快不快”直接纳入损失函数,确保搜出的网络开箱即用。
具体案例:某图像识别团队要在中端 Android 手机上部署 100 类物体分类模型。他们用 ProxylessNAS 在骁龙芯片上直接搜索,候选算子只保留深度可分离卷积、池化和跳跃连接,延迟约束设为 30ms。最终搜索出的网络比手工调参的 MobileNetV3 在同样延迟下准确率高出 1.8 个百分点,且无需二次剪枝压缩。
边缘 NPU 专用模型定制
阶段:模型部署优化 / 硬件适配
解决的问题:NPU 对算子类型和通道对齐有严格约束,通用搜索空间搜出的网络迁移到 NPU 后可能触发低效算子。ProxylessNAS 允许把 NPU 算子库直接设为搜索空间,并在 NPU 上实测延迟,解决“通用模型上 NPU 水土不服”的痛点。
具体案例:一家智能安防公司为自研 NPU 搜索夜间人体检测模型。搜索空间只保留 NPU 加速效果好的 3x3 深度卷积和逐点卷积,配合延迟约束,最终模型在 NPU 上推理延迟从原来的 45ms 降到 21ms,精度仅损失 0.3%。
Python 演示
import numpy as np class BinarizedPathDemo: def __init__(self, num_paths=4): self.num_paths = num_paths self.alpha = np.zeros(num_paths) self.latency_map = np.array([1.2, 2.3, 0.8, 0.5]) def forward_prob(self): scores = np.exp(self.alpha) return scores / scores.sum() def sample_one(self, probs): rnd = np.random.rand() acc = 0.0 for i, p in enumerate(probs): acc += p if rnd <= acc: return i return self.num_paths - 1 def compute_loss(self, acc_loss, latency_ms, lam=0.1): return acc_loss + lam * np.log(latency_ms + 1e-6) def update_alpha(self, chosen, lr=0.1): probs = self.forward_prob() grad = np.zeros_like(self.alpha) grad[chosen] = 1.0 - probs[chosen] self.alpha -= lr * grad def run_epochs(self, steps=12, lr=0.1): history = [] for step in range(steps): probs = self.forward_prob() chosen = self.sample_one(probs) latency_ms = self.latency_map[chosen] loss = self.compute_loss(0.5, latency_ms) self.update_alpha(chosen, lr) history.append((step, chosen, loss, probs.copy())) return history if __name__ == "__main__": demo = BinarizedPathDemo() history = demo.run_epochs() for step, chosen, loss, probs in history: print("step=%d chosen=%d loss=%.3f probs=%s" % (step, chosen, loss, np.round(probs, 3)))
self.alpha = np.zeros(num_paths)初始化架构参数,初始时所有候选路径被选概率相同。scores = np.exp(self.alpha)指数化让偏好分数非负,为 softmax 做准备。return scores / scores.sum()得到归一化概率,等价于公式中的 $p_i$。if rnd <= acc:用累积概率实现伯努利采样,每次只激活一条路径,对应二值化门控 $G$。self.compute_loss(0.5, latency_ms)把延迟以对数形式加入损失,延迟越高的路径对更新越不利。grad[chosen] = 1.0 - probs[chosen]模拟 softmax 的梯度方向:被选中的路径概率越大,梯度越小,促使 α 收敛。history.append((step, chosen, loss, probs.copy()))记录每轮实验,便于观察概率收敛过程。
常见误区
误区以为“Proxyless”意味着整个过程不用训练任何模型,直接把最终网络一步到位搜出来,所以搜索期间零成本、零预训练。
正解ProxylessNAS 仍然要训练一个共享权重的超网络,为所有候选路径提供可复用的权重参数。它去掉的是“代理任务/代理模型”这个中间评估环节,避免代理排序与真实排序不一致的问题。就像裁缝还是要有一个工作台和一批布料,只是不再请塑料模特替顾客试身。
为何常见:名字里的“Proxyless”太有误导性,让人以为整个流程完全没有中间产物。
误区看到前向只激活一条路径,就认为搜索结束后网络已经是二值化的窄网络,可以直接部署。
正解二值化只是为了在训练阶段节省显存和计算开销的训练技巧。搜索结束后,仍需根据 α 选出最优路径、剪除其他分支,再将剪好的子网重新训练或微调,才能作为最终部署模型。二值化是“试穿过程”,不是“出厂成品”。
为何常见:训练过程和部署过程看起来结构相似,容易让人忽略中间的“剪枝 + 重训”步骤。
误区把 FLOPs 当延迟的近似指标,认为搜索时只要最小化 FLOPs,手机或 NPU 上就一定跑得快。
正解延迟受内存带宽、缓存命中率、算子并行度、NPU 指令调度等多种因素影响。ProxylessNAS 之所以坚持实测目标设备延迟,正是因为 FLOPs 无法反映这些硬件行为。只盯着 FLOPs 就像只看布料多少,不看顾客穿上后是否活动自如。
为何常见:FLOPs 是论文里最常用的复杂度指标,大家习惯了用它衡量速度,忽略了真实硬件的复杂性。
误区把在 GPU 上设计的搜索空间原封不动搬到手机或 NPU 上,认为候选算子越丰富越好。
正解不同设备对算子种类、通道数、核大小甚至数据排布都有限制。ProxylessNAS 支持为每类目标硬件定制搜索空间,把硬件不友好的算子直接移除,既降低搜索成本,也避免搜出跑不动的结构。
为何常见:搜索空间设计看起来只是“列个算子清单”,容易被低估其对最终结果的决定性影响。
面试题
Q1. ProxylessNAS 的 “Proxyless” 最核心的意思是什么?
- A.搜索时不需要任何预训练权重
- B.搜索时不依赖代理模型完成推荐← 正确答案
- C.搜索时完全不使用梯度下降
- D.搜索时只用一个算子做候选
答案:B。ProxylessNAS 仍然会训练共享权重的超网络,但不依赖“代理模型”做间接评估,而是直接在目标设备上搜索,故选 B。A 曲解了“无代理”的含义;C 与事实相反;D 是干扰项,搜索空间中候选算子仍然丰富。
Q2. 路径级二值化中,用于选择算子的二值化掩码取值是什么?
- A.恒为 1 的常数值
- B.0 到 2 的随机数
- C.0 或 1 的离散值← 正确答案
- D.大小可变的浮点数
答案:C。二值化掩码只有两个状态:0 表示该路径本次不激活,1 表示激活,对应伯努利采样 $G_i \sim \text{Bernoulli}(p_i)$。A 没有选择能力,B、D 是连续值,均不符合二值化定义。
Q3. 与两阶段代理搜索相比,ProxylessNAS 的最大优势是什么?
- A.完全不需要训练数据
- B.搜索次数一定大幅减少
- C.搜索结果直接契合目标硬件← 正确答案
- D.验证集一定不需要划分
答案:C。ProxylessNAS 直接在目标设备上训练并实测延迟,消除代理模型与真实部署环境的偏差,因此搜出的结构更契合真实硬件,选 C。A、D 不符合事实;B 中“一定大幅减少”不是必然结论。
Q4. 架构参数 α 经过 softmax 归一化后得到的是什么?
- A.训练集的随机噪声
- B.各候选算子的选择概率← 正确答案
- C.网络每层的特征输出
- D.最终模型的损失值
答案:B。α 是各候选算子的偏好分数,softmax 把它变成一组和为 1 的概率,随后用于伯努利采样。这就像裁缝对每种袖子款式的“心动程度”归一化成选择概率,因此选 B。
Q5. REINFORCE 方法估计架构参数梯度的特点是什么?
- A.无偏但方差较大← 正确答案
- B.有偏且方差较小
- C.无偏且方差为零
- D.有偏且方差为零
答案:A。REINFORCE 是策略梯度的经典方法,理论上无偏,但单次采样的随机性导致梯度方差很大。ProxylessNAS 因此也讨论更稳定的二进制连接直通估计器来降低方差,故选 A。
Q6. 延迟损失项采用 log(Latency) 而不用 Latency,主要原因是什么?
- A.避免延迟出现负数
- B.让损失值一定大于零
- C.使延迟的数值变得更大
- D.压缩长尾延迟并稳定梯度← 正确答案
答案:D。延迟可能从几毫秒到几百毫秒,跨度巨大。取对数能压缩长尾、平滑梯度尺度,同时仍保留“延迟越小越好”的优化方向,故选 D。A、B、C 都是对 log 作用的常见误读。
Q7. 在交替优化的双层形式中,内层优化通常在哪个集合上更新模型权重?
- A.目标设备实测延迟
- B.训练集上的分类损失← 正确答案
- C.验证集上的架构损失
- D.测试集上的全部指标
答案:B。内层优化固定架构参数,在训练集上最小化分类损失得到 $w^*(\alpha)$;外层才在验证集上更新 α 并考虑延迟等约束,因此选 B。
Q8. 二进制连接在前向使用二值化门控,反向传播时如何处理不可导的取整操作?
- A.用直通估计器近似其梯度← 正确答案
- B.直接把取整结果当作常数求导
- C.完全跳过一次反向传播
- D.用遗传算法代替反向传播
答案:A。直通估计器(BinaryConnect / STE)在前向保留 0/1 的离散性,反向传播时把门控近似为连续值,让梯度直接穿过,实现对 α 的稳定更新。B 把梯度直接丢弃,C 断开了学习,D 则完全偏离了梯度优化框架。
Q9. 下列哪些属于 ProxylessNAS 讨论或对比过的梯度估计方法?
- A.Gumbel-Softmax 软采样← 正确答案
- B.REINFORCE 策略梯度← 正确答案
- C.随机梯度下降
- D.遗传算法种群交叉
答案:AB。ProxylessNAS 论文对比了 Gumbel-Softmax、REINFORCE 和二进制连接等方法。SGD 只是通用优化器而非针对离散路径的梯度估计方法;遗传算法属于进化搜索,不是该文用于路径二值化梯度估计的候选。
Q10. 关于搜索空间和硬件感知策略,下列说法正确的有哪些?
- A.搜索空间包含卷积核大小的选择← 正确答案
- B.延迟约束只影响最终剪枝阶段
- C.实测延迟可作为损失项参与训练← 正确答案
- D.搜索空间必须适配目标硬件特性← 正确答案
答案:ACD。搜索空间由每层的算子集合(如卷积核大小)、拓扑和通道等构成,且需根据目标硬件裁剪,故 A、D 正确。延迟从搜索训练阶段就进入损失函数而非只影响剪枝,故 C 正确、B 错误。这就像裁缝从量体开始就记录顾客的活动习惯,而不是等到做成成衣才改。