跳到主要内容

用搜索代替设计 — NAS 系列

这一章讲三件事: 为什么设计网络这件事可以被自动化;用强化学习——RL:靠 「行动→奖励」的反馈自己调整策略的方法,3.2 节展开——搜网络的 NAS 怎么转起来; 以及三代 NAS 如何把「天文数字的搜索空间」砍成「一晚上能搜完」。 读完你会得到一条判断新 AutoML 工作的标尺:先看它砍了搜索空间的哪一刀。

1. 这一章讲什么

前面六章的所有网络,结构都是人设计的。设计靠什么?书里的说法:它依靠开发者的经验1。 经验无法传授、无法复制,于是 Google 的 Quoc V. Le 团队提出:让机器自己搜。

这里有个技术死结要先拆。网络的权重可以用第 01 章的训练法调;但「用几个卷积核、 核多大、要不要跳跃连接」这类结构选择,没法求梯度——你没法对一个「选项」求导。 书里点破:「NAS 学习的是网络的超参数而不是参数。超参数的一个特点是不能通过反向传播 来优化,因此需要借助强化学习的采样策略」2

强化学习(RL:让模型靠「行动→奖励」的反馈自己调整策略的方法,第 11 章还会以另一种面貌出现)在这里的用法朴素:把「选一个网络结构」当成一次行动,把「这个结构 训练出来的准确率」当成奖励,行动拿到的奖励高,就多做类似的选择2

2. 顶层全景:一条循环

RNN 控制器 ──采样──► 一个候选网络结构
▲ │
│ ▼
更新参数◄──奖励 R(验证集准确率)──真实训练这个网络
(强化学习)

图说:循环转到收敛为止。控制器是唯一的「学习者」;
候选网络只负责老老实实去训练、交成绩单。

主走查是控制器的一次具体采样(3.2 节):看它怎么逐节点「写」出一个最小的 RNN 单元——每一步预测什么、算出什么,书里给了全部中间数。

3. 核心原理

3.1 PolyNet:先把网络写成一条多项式

搜索之前,先有个能「变形」的统一表达。PolyNet 把残差块写成多项式: (I+F)·x——I 是直通,F 是加工(换成 Inception 就是 Inception-ResNet)3。 多项式可以展开:加一项 F²(两次加工)、加一项 GF(两个不同参数的加工)、 再来一元(F+G),就派生出一族新结构。参数共享的版本还能等价变形——I+F+F² 等于 I+(I+F)F,计算量少三分之一4。书里顺手指出:DenseNet 本质上也是多项式 (I⊕C⊕C²⊕…⊕Cⁿ,⊕ 换成拼接)5

哪个位置替换哪种多项式最划算?18 种组合的对照实验给出的答案很具体: 中间阶段(特征图 17×17 的阶段 B)替换最有效,混合使用(3-way→mpoly-3→poly-3 循环 四次)又优于任何单一形式6。最终的 Very Deep PolyNet 在 ImageNet 上拿到 约 4.25% 的 top-5 错误率7

书里把 PolyNet 定位成「人工搜索」:它开辟了「用数学表达式生成结构」的道路, 但每一步还是人挑的。配套的小技巧倒都留了下来:训练时随机丢掉多项式的一项 (随机路径,受 Dropout 启发,相当于数据扩充);给加工路乘 β=0.3 的权(与第 02 章 Inception-ResNet 的残差缩放同一个思路)8

3.2 NAS:控制器、奖励与一次具体的采样

NAS(2017)让 RNN 当控制器:控制器的每一段输出对应候选网络的一组结构决定 (卷积核的高、宽、通道数、步长……)9。它的更新规则是 REINFORCE: 按「奖励越高越加大这类采样概率」的方向调控制器参数;再用「以往架构精度的 指数移动平均」当基线相减,把成绩的抖动压下去10

跳跃连接也要能被采样:第 N 层前面设 N−1 个「锚点」,逐个判断要不要从前面某层引一条 捷径进来;引完还要处理三种边角——没有入边的层当输入层,没有出边的层当输出层, 拼接处尺寸不齐就补零块补齐11

主走查:控制器写出一个最小的 RNN 单元(base2)——两个叶子节点加一个中间节点, 每个节点由「一个运算 + 一个激活函数」构成12:

控制器逐节点预测(base2 示例,书里原例):
节点0: 单位加 + tanh → a0 = tanh(W1·xt + W2·ht−1)
节点1: 逐元素乘 + ReLU → a1 = ReLU[(W3·xt) ⊙ (W4·ht−1)]
添加单元: 决定怎么用 ct−1 → a0 更新为 ReLU(a0 + ct−1)
节点2: 逐元素乘 + sigmoid → a2 = sigmoid(a0new ⊙ a1),取作 ht
指示单元: 决定哪些树算 ct → ct = (W3·xt) ⊙ (W4·ht−1)
(W1~W4 是待训权重;⊙ 表示逐元素相乘)

真实实验用 base8(8 个叶子),在 Penn Treebank 这份语料(语言模型的标准练习材料)上搜出的单元击败了 LSTM13。 视觉一侧,NAS-CNN 在 CIFAR-10 上搜出的结构与 DenseNet 惊人地像——密集连接、 通道少、拼接14。代价书里没瞒:「仅仅在 CIFAR-10 上学习一个网络就需要 500 块 GPU 运行 28 天」15。书里对这篇论文的定语是「AutoML 领域的基石级别论文」16

3.3 NASNet:只学一个单元,再堆去 ImageNet

第一刀:别学整个网络。NASNet 只让控制器学两种可复用的单元——普通单元(尺寸不变) 与缩减单元(步长 2,负责缩图),ImageNet 上的大网络靠堆单元拼出来17。 单元内部被规约成五步:为两条支路各选一个输入特征图、各选一个操作(13 种备选,含 空洞卷积、深度可分离卷积、各种池化)、再选一个合并方式18

搜索空间骤然变小,收益书里给了数:同样硬件下,「NASNet 的速度要比 NAS 的快 7 倍」; 书里还给了个到位的定性——NASNet 的单元「本质上是一个更复杂的 Inception」19。 两个配套:换用名叫 PPO 的更新方法(比均匀采样略好);多分支结构的过拟合用「计划 DropPath」 ——丢弃概率随训练进度线性增加,理由很直白:越到后面越容易过拟合,防过拟合的手段 也该越到后面越用力20

3.4 PNASNet:再砍两刀,训练时间变八分之一

第二刀:删掉没人用的选项。观察 NASNet 的实验记录,13 个操作里有 5 个从未被选中, 合并方式里的「拼接」也从未被选中——全部出局,搜索空间从约 2.0×10³⁴ 砍到 约 5.6×10¹⁴(排除对称结构后仍差着 16 个数量级)21

第三刀:递进式搜索(SMBO)+ 代理函数。从小到大:先把单块的全部 256 种结构一个个列出来, 真训练、记下(结构,准确率)对;拟合一个代理函数——用 LSTM 读变长的结构描述、 直接预测准确率的小模型;之后每扩一个块,先用代理函数给海量候选「云评分」, 只把 top-K 拿去真训练,再把结果喂回代理函数22。代理函数的三条要求书里总结得很清楚: 能处理变长输入、预测至少与真实精度正相关、样本很少时也能用23。有趣的是对照实验: 同块数时 LSTM 更准,预测「多一块」的结构时 MLP 反超,「原因可能是 LSTM 过拟合了」24。 总账:训练时间降到 NASNet 的 1/8,ImageNet 结果反而更好25

3.5 AmoebaNet:换掉控制器,只换淘汰规则

强化学习不是唯一的搜索器。AmoebaNet 用遗传算法(模仿生物繁衍的搜索方法: 变异、竞争、淘汰)搜同一个 NASNet 搜索空间,核心创新只有一条——淘汰规则。

书里先讲了个外星球寓言:星球上的食物只够养 P 个外星人,繁殖权用「随机抽 S 个、其中的最优者 获胜」决定,而淘汰不选最差、只「流放岁数最大的那个」26。这就是年龄进化(AE): 群体是一个先进先出的队列,每个结构寿命相同;每轮随机抽 S 个竞争,胜者变异出一个后代, 然后从队首移除最老者27。为什么不淘汰最差的?书里的回答堪称全章最妙: 淘汰最差会让群体被同一个强势祖先的后代占满,多样性崩溃,「这种情况在遗传学中也有一个 名字:近亲繁殖」28

结果:同等参数量级下精度与强化学习版几乎持平,但收敛明显更快;作者加了随机搜索的参照组,AE 的曲线依然领先29。参数堆到 4.69 亿时,AmoebaNet-A 拿下当时的 ImageNet 最好成绩——书里照例补了一刀:「不知道是得益于 AmoebaNet 的网络结构 还是其巨大的参数数量」30。书里的小结同样公平:AE 只有 P、C、S 三个旋钮, 「AE 可以看作一个带有正则项的进化策略」31

判断(我们的,不是书里的): 把三代 NAS 排成一排,进步全部来自搜索空间的 设计(学单元、删废选项、定淘汰规则),而不是来自强化学习本身——控制器从 REINFORCE 换成 PPO 再换成进化算法,增益都排在空间设计之后。评价任何新的 AutoML 工作, 先问它把搜索空间砍成了什么样。 如果错,会错在: 如果某类任务的结构先验极少、搜索空间本来就小, 更新方法本身的效率(比如代理函数的准确性)可能重新变成主导因素。

4. 作者的判断与证据

书里给了实验证据的: PolyNet 的 18 组对照与阶段 B 结论;NAS-RNN 胜过 LSTM、 NAS-CNN 像 DenseNet;NASNet 快 7 倍;PNASNet 的 1/8 训练时间与排序相关性对照 (LSTM 对 MLP);AmoebaNet 的 AE/RL/随机搜索三条收敛曲线。

书里署名的推测: 「我相信 500 GPU 这类门槛会随硬件下降」式的展望; 「基于 ImageNet 的 NASNet 一定会出现」;以及「Quoc V. Le 团队……可能在将来引领 模型自动生成的方向」——这些是 2022 年时点的判断,读的时候要带上这一年。

5. 边界与局限

  • 算力门槛是真实的:NAS 一族的一切结论都建立在「每个候选都真训练一遍」上,算力的花销, 代理函数只是打折,没有取消;
  • 书里反复出现的「小数据集搜出、大数据集验证」的相关性,PNASNet 用实验背书, 但那是 CIFAR-10 对 ImageNet;跨到完全不同的任务族,单元可迁移性没有保证;
  • 本章的「准确率唯一」标准,下一章 MnasNet 立刻推翻——响应快慢、训练开销 都会变成搜索目标之一。

6. 可带走的

  1. 结构选择没有梯度,所以结构搜索必须绕开反向传播——这是 NAS 存在的全部理由;
  2. 强化学习版 NAS 的循环:控制器采样 → 真训练 → 验证集精度当奖励 → 更新控制器; 基线(历史平均)用来压抖动;
  3. 递进式搜索的标准姿势:先把小空间的所有情况列一遍,拟合代理函数,之后只真训 top-K;
  4. 删选项和加结构同样重要:NASNet 的 13 个操作有 5 个从未被选中—— 你的搜索空间里大概率也躺着这种死重;
  5. 淘汰规则决定多样性:淘汰最差会导致「近亲繁殖」,流放最老反而保住探索;
  6. 搜索器的换装(RL→进化)收益有限,搜索空间的设计才是大头;
  7. PolyNet 的多项式视角提醒:在搜索之前,先把结构族写成一个可展开的表达式, 往往能直接推出一批候选。

7. 原文地图

主题原书节原文位置
PolyNet 多项式视角3.1 PolyNettext/06-p101-120.txt:427(搜「多项式」) · text/06-p101-120.txt:435(搜「非常不经济的」) · text/06-p101-120.txt:464(搜「I + F + F」)
DenseNet 也是多项式、对照结论3.1.2 / 3.1.3text/06-p101-120.txt:477(搜「多项式模型」) · text/06-p101-120.txt:495(搜「最有效」)
Very Deep PolyNet 与小技巧3.1.4 Very Deep PolyNettext/06-p101-120.txt:507(搜「Very Deep PolyNet」) · text/06-p101-120.txt:513(搜「插入初始化」) · text/06-p101-120.txt:522(搜「值是 0.3」) · text/06-p101-120.txt:534(搜「4.25%」)
NAS 动机与超参数死结3.2 NAStext/06-p101-120.txt:547(搜「依靠开发者的经验」) · text/06-p101-120.txt:554(搜「超参数而不是参数」)
控制器循环与 REINFORCE3.2 NAStext/06-p101-120.txt:559(搜「以概率 P 随机采样」) · text/07-p121-140.txt:13(搜「指数移动平均值」)
锚点与边角处理3.2.1 NAS-CNNtext/07-p121-140.txt:19(搜「锚点」) · text/07-p121-140.txt:29(搜「作为输入层」)
主走查:base2 采样与结果3.2.2 NAS-RNNtext/07-p121-140.txt:70(搜「base2」) · text/07-p121-140.txt:89(搜「base8」) · text/07-p121-140.txt:92(搜「Penn Treebank」)
NAS-CNN 像 DenseNet、基石3.2 小结text/07-p121-140.txt:40(搜「相通的地方」) · text/07-p121-140.txt:102(搜「基石级别论文」)
NASNet 单元与五步3.3 NASNettext/07-p121-140.txt:114(搜「500 块 GPU」) · text/07-p121-140.txt:135(搜「缩减单元」) · text/07-p121-140.txt:150(搜「合并操作」)
速度与定性3.3.5 小结text/07-p121-140.txt:225(搜「快 7 倍」) · text/07-p121-140.txt:226(搜「更复杂的 Inception」)
计划 DropPath、固定超参3.3.3 / 3.3.4text/07-p121-140.txt:191(搜「线性增加」) · text/07-p121-140.txt:201(搜「ELU 非线性效果略差于 ReLU」)
删选项、空间对比3.4.1 更小的搜索空间text/07-p121-140.txt:257(搜「2.0 × 1034」) · text/07-p121-140.txt:279(搜「5.6 × 1014」)
SMBO 与代理函数3.4.2 / 3.4.3text/07-p121-140.txt:288(搜「递进」) · text/07-p121-140.txt:299(搜「top-K」) · text/07-p121-140.txt:334(搜「样本有效」)
代理函数实现与对照3.4.3 代理函数text/07-p121-140.txt:340(搜「独热」) · text/07-p121-140.txt:349(搜「LSTM 过拟合了」)
1/8 与强相关3.4 小结text/07-p121-140.txt:242(搜「1/8」) · text/07-p121-140.txt:362(搜「强相关性」)
AE 寓言与算法3.5.2 年龄进化text/07-p121-140.txt:378(搜「无性繁殖」) · text/07-p121-140.txt:464(搜「先进先出」) · text/07-p121-140.txt:481(搜「效果最好的值是 25」)
NAE 与近亲繁殖3.5.2 年龄进化text/07-p121-140.txt:492(搜「非年龄进化」) · text/07-p121-140.txt:499(搜「近亲繁殖」)
结果与小结3.5.3 / 3.5.4text/07-p121-140.txt:515(搜「收敛速度是要明显」) · text/07-p121-140.txt:517(搜「4.69」) · text/07-p121-140.txt:534(搜「带有正则项的进化策略」)

Footnotes

  1. 出处:「3.2 NAS」(text/06-p101-120.txt:547,搜「依靠开发者的经验」)。

  2. 出处:「3.2 NAS」(text/06-p101-120.txt:554,搜「超参数而不是参数」)。 2

  3. 出处:「3.1.2 多项式模型」(text/06-p101-120.txt:448,搜「(I + F)·x」)。

  4. 出处:「3.1.2 多项式模型」(text/06-p101-120.txt:464,搜「计算」)。原文:因为参数共享,I+F+F² 的等价形式「这种形式的网络的计算量少了 1/3」。

  5. 出处:「3.1.2 多项式模型」(text/06-p101-120.txt:477,搜「多项式模型」)。

  6. 出处:「3.1.3 对照实验」(text/06-p101-120.txt:494,搜「阶段 B 的替换最有效」)与(text/06-p101-120.txt:498,搜「混合模型」)。

  7. 出处:「3.1.4 Very Deep PolyNet」(text/06-p101-120.txt:534,搜「4.25%」)。

  8. 出处:「3.1.4 Very Deep PolyNet」(text/06-p101-120.txt:518,搜「随机路径」)与(text/06-p101-120.txt:521,搜「β」)。

  9. 出处:「3.2.1 NAS-CNN」(text/07-p121-140.txt:306,搜「卷积核的数量」)。控制器每段输出:卷积核数量、高、宽、步长等。

  10. 出处:「3.2.1 NAS-CNN」(text/07-p121-140.txt:10,搜「无偏估计」)与(text/07-p121-140.txt:13,搜「指数移动平均值」)。

  11. 出处:「3.2.1 NAS-CNN」(text/07-p121-140.txt:19,搜「锚点」)与(text/07-p121-140.txt:29,搜「作为输入层」)。

  12. 出处:「3.2.2 NAS-RNN」(text/07-p121-140.txt:70,搜「base2」)与(text/07-p121-140.txt:79,搜「单位加和 tanh」)。走查五个中间结果全部来自书里对该图的逐节点分析。

  13. 出处:「3.2.2 NAS-RNN」(text/07-p121-140.txt:89,搜「base8」)与(text/07-p121-140.txt:92,搜「Penn Treebank」)。

  14. 出处:「3.2.1 NAS-CNN」(text/07-p121-140.txt:40,搜「相通的地方」)。

  15. 出处:「3.3 NASNet」(text/07-p121-140.txt:114,搜「500 块 GPU」)。

  16. 出处:「3.2.3 小结」(text/07-p121-140.txt:102,搜「基石级别论文」)。

  17. 出处:「3.3 NASNet」(text/07-p121-140.txt:134,搜「普通单元」)与(text/07-p121-140.txt:135,搜「缩减单元」)。

  18. 出处:「3.3.1 NASNet 控制器」(text/07-p121-140.txt:147,搜「为隐层 B 选择一个输入」)与(text/07-p121-140.txt:157,搜「空洞卷积」)。

  19. 出处:「3.3.5 小结」(text/07-p121-140.txt:225,搜「快 7 倍」)与(text/07-p121-140.txt:226,搜「更复杂的 Inception」)。

  20. 出处:「3.3.3 计划 DropPath」(text/07-p121-140.txt:191,搜「线性增加」)。

  21. 出处:「3.4.1 更小的搜索空间」(text/07-p121-140.txt:262,搜「从未被使用过」)与(text/07-p121-140.txt:279,搜「5.6 × 1014」)。

  22. 出处:「3.4.2 SMBO」(text/07-p121-140.txt:288,搜「递进」)与(text/07-p121-140.txt:299,搜「top-K」)。

  23. 出处:「3.4.3 代理函数」(text/07-p121-140.txt:329,搜「变长数据」)与(text/07-p121-140.txt:334,搜「样本有效」)。

  24. 出处:「3.4.3 代理函数」(text/07-p121-140.txt:348,搜「LSTM 优于 MLP」)与(text/07-p121-140.txt:349,搜「LSTM 过拟合了」)。

  25. 出处:「3.4 PNASNet」(text/07-p121-140.txt:242,搜「1/8」)。

  26. 出处:「3.5 AmoebaNet」(text/07-p121-140.txt:378,搜「无性繁殖」)。

  27. 出处:「3.5.2 年龄进化」(text/07-p121-140.txt:464,搜「先进先出」)与(text/07-p121-140.txt:481,搜「效果最好的值是 25」)。

  28. 出处:「3.5.2 年龄进化」(text/07-p121-140.txt:492,搜「非年龄进化」)与(text/07-p121-140.txt:499,搜「近亲繁殖」)。

  29. 出处:「3.5.3 AmoebaNet 的网络结构」(text/07-p121-140.txt:515,搜「收敛速度是要明显」)与(text/07-p121-140.txt:525,搜「随机搜索」)。

  30. 出处:「3.5.3 AmoebaNet 的网络结构」(text/07-p121-140.txt:517,搜「4.69」)。

  31. 出处:「3.5.4 小结」(text/07-p121-140.txt:534,搜「带有正则项的进化策略」)。