跳到主要内容

把模型推到极限 — 超参数优化、集成与训练加速

这一章讲三件事: 怎么把模型的性能从「不错」推到「最佳」(超参数优化); 怎么把多个模型的答案合成一个更好的答案(集成); 怎么让训练快几倍(混合精度、多 GPU、TPU)。 前面十二章练的都是「能在数据集上跑通」,这一章补的是从学生到工程师的最后一段路1

1. 顶层全景

到这一章为止,你训的模型都有两个共同点:规模小(小数据集、单块 GPU), 性能没到顶(「不错」而已)。原书把这一章定位为帮你跨越两道鸿沟1:

鸿沟一:性能没到最佳
├─ 超参数优化 把「层数、单元数、学习率……」的选择交给搜索算法
└─ 模型集成 把多个不同模型的预测汇成一个

鸿沟二:训练太慢、规模太小
├─ 混合精度 一块 GPU 就能用,白捡速度
├─ 多 GPU 数据并行:复制模型、拆批量、合并梯度
└─ TPU 谷歌专用芯片,要喂特别大的批量

图说:上半章管「更好」,下半章管「更快」。更快的意义是
第 04 章那个「取得进展的循环」(想法 → 写成实验 → 跑出结果 →
看结果 → 激发下一个想法)转得更快——每天能跑的实验更多。

本章的主走查是一个 MNIST 模型的完整自动化收尾:先让 KerasTuner 在 「单元数 16~64、优化器二选一」的搜索空间里跑最多 100 组试验, 再用大耐心的提前终止找出最佳训练轮数,最后在全部 6 万训练样本上 按「最佳轮数 × 1.2」重训——每一步的数都来自原书代码。 混合精度(1e-6 的更新装进最小间隔 1e-3 的容器)和数据并行(512 拆成 4×128) 两处短走查各有具体数字,随文给出。

2. 超参数优化:把调旋钮这件事也自动化

2.1 为什么这件事偏偏很难

层数、每层的单元数、dropout 比率、激活函数选谁——这些不由训练学、要由人来定的选择, 就是第 06 章见过的超参数2。工程师的日常工作大半是在手动试这些组合, 而作者的态度很直接:这不应该是人类的工作,最好留给机器去做3

留给机器,就得承认这个优化问题和训练权重完全不是一个物种4:

训练权重调超参数
空间连续、可微离散(层数只能是整数),梯度下降用不上
一次反馈的成本一个小批量,毫秒级从头训一个模型,几分钟到几小时
信号质量低噪声含噪声:这次提升 0.2%,是配置更好还是初始化运气好?

所以超参数搜索只能用不以梯度为生的优化方法——效率天然低一截, 这就是它为什么值得单独讲一节。

2.2 KerasTuner:主走查第 ① 步——定义搜索空间

KerasTuner 的做法是把硬编码的值换成一个范围。 原来写 Dense(32),现在写成「units 从 16 到 64、步长 16」—— 也就是候选值 {16, 32, 48, 64};优化器从「rmsprop 写死」换成 「rmsprop / adam 二选一」。这组可选择项合起来叫搜索空间(search space)5

具体形式是一个模型构建函数:它接收一个 hp 对象,从中采样出具体的值, 返回一个编译好的模型。书里的例子有两个超参数 (units 四个候选 × optimizer 两个候选),search_space_summary() 显示 「Default search space size: 2」——2 指的是两个待搜的超参数5

2.3 主走查第 ② 步:调节器跑搜索

真正干活的叫调节器(tuner),原理上它就是一个 for 循环: 挑一组超参数 → 建模型 → 训练 → 记录验证指标 → 挑下一组。 内置三种:随机搜索、贝叶斯优化、Hyperband。书里用贝叶斯优化—— 它的特点是会利用已有试验的结果,去猜下一组更可能赢的配置, 而不是纯蒙6

走查的关键参数,全是书里那几行代码的真值7:

tuner = kt.BayesianOptimization(
build_model,
objective="val_accuracy", ← 优化目标是验证精度(要的是能泛化的模型)
max_trials=100, ← 最多试 100 组配置
executions_per_trial=2, ← 每组配置训 2 次取平均,压掉噪声
overwrite=True)
tuner.search(..., epochs=100, validation_data=(x_val, y_val),
callbacks=[EarlyStopping(monitor="val_loss", patience=5)])

图说:最多 100 组 × 每组 2 次 = 最多 200 次训练。
patience=5 是小耐心——搜索阶段求快,宁可欠拟合。

executions_per_trial=2 回应的就是 2.1 节那个「信号含噪声」: 同一配置训两次取平均,方差就小一半8。搜索中断也不怕, overwrite=False 就能从磁盘上的试验日志接着跑9

2.4 主走查第 ③ 步:搜完之后的完整收尾

搜索结束只给了你「最佳配置」,模型还没训好。书里的收尾是三步, 每一步都有讲究10:

  1. 查最佳配置:get_best_hyperparameters(top_n=4) 取前 4 组;
  2. 找最佳轮数:搜索时 patience=5 是为了省时间,可能欠拟合。 所以用大耐心(patience=10)带着验证集重训一次, 看验证损失在第几轮最低——那就是最佳轮数;
  3. 全数据重训:超参数已定,验证集完成了使命,把它并回训练集 (MNIST 从 5 万回到 6 万);数据变多了,轮数也相应加一点—— 书里的做法是 最佳轮数 × 1.211

最后才在测试集上评一次。想省事也有捷径: get_best_models() 直接把搜索过程中保存的最佳权重拿来用,代价是性能略降12

2.5 收尾的代价与搜索空间的艺术

这套流程有一个必须记住的副作用,书里专门加了注意框13:

你用验证数据的信号来更新超参数,等于在验证数据上训练超参数—— 搜得越久,模型对验证集过拟合得越厉害。

这是第 06 章「信息泄露」的放大版:泄露从「调几次参」升级成了「系统性地搜上百次」。 对策还是那个:测试集只在最后碰一次。

另一个经验是别把一切都变成超参数:搜索空间随选择数量急剧增大, 全扔给调节器就是组合爆炸。正确的分工是——人做高层次的架构决策 (「要不要用残差连接」这类可迁移的判断),机器做微观决策 (「这层 32 还是 64 个单元」)。KerasTuner 甚至预置了 HyperXception、HyperResNet 这类现成的搜索空间,加数据就能搜14

这条路的终点是自动化机器学习(AutoML):从搜超参数到搜整个架构, 再到自动生成整条流水线。作者的判断是工程师不会失业, 而是转向更创造价值的工作:数据管理、设计真正反映业务目标的损失函数、 理解模型对它所部署的生态系统的影响15

3. 模型集成:多样性才是力量

3.1 机制与走查

模型集成(model ensembling)就是把一组不同模型的预测汇集在一起, 得到一个更好的预测。Kaggle 竞赛的优胜者几乎都在用它—— 它必然打败任何单一模型,无论那个模型多好16

书里的比方是盲人摸象:每个模型只摸到大象的一个部位, 得到的都是「部分真相」;把鼻子、腿、耳朵的描述拼起来, 才接近完整的大象。用第 06 章的话说,每个模型都从自己的角度 对数据流形建了一个近似17

最简单的集成是平均。走查:4 个模型对同一批验证样本各出一组预测 preds_apreds_d,最终预测 final_preds = 0.25 × (a+b+c+d)。 但这招有个前提:这组模型性能得差不多好—— 如果其中一个明显拖后腿,平均反而不如单用最好的那个18

更聪明的是加权平均:权重不拍脑袋,在验证数据上学出来 (用随机搜索或 Nelder-Mead 这类简单优化算法)。 书里的例子:(0.5, 0.25, 0.1, 0.15)——好的模型权重大,差的权重小19

3.2 关键不是「好」,是「不同」

集成有效的真正条件是多样性(diversity)。道理用一句话就说完了20:

如果所有模型的偏差都在同一个方向,集成会保留同样的偏差; 偏差方向各不同,才会互相抵消。

直接推论,也很反直觉:对同一个网络换几个随机初始化分别训练再集成, 基本不值得做——模型之间只差初始化和读数据的顺序,多样性太弱, 比起单模型只有微小改进21

作者自己的战绩是最好的例证:2014 年 Kaggle 希格斯玻色子探测挑战赛, 他和队友拿了第 4 名,用的是多种树模型加深度神经网络的集成。 其中有一个来自完全不同方法的模型(正则化的贪婪森林), 单独得分远低于其他模型,权重自然很小—— 但它把整体集成分数提高了一大截,因为它提供了别人都没有的信息。 作者的总结:「集成不在于你的最佳模型有多好,而在于模型集合的多样性。」22

4. 混合精度:白捡的三倍速度

4.1 问题:1e-6 的更新装不进 float16

计算机里的数是有限精度的——精度之于数字,就像分辨率之于图像。 常用的三档:float16(16 位)、float32(32 位)、float64(64 位)。 可以安全区分两个相邻数的最小距离,float32 约 1e-7,float64 约 1e-16, float16 只有约 1e-323

现在对照训练的实际需求:典型学习率是 1e-3, 一次典型的权重更新只有 1e-6 量级。 假如权重和计算都用 float16,1e-6 的更新小于 float16 的最小可表示间隔, 等于每次更新都被四舍五入成零——梯度下降直接瘫掉。 这就是不能全线 float16 的原因24

4.2 解法:16 位计算,32 位存权重

混合精度的思路是把两种精度各用在对的地方25:

  • 前向与反向的计算用 float16——新 GPU 和 TPU 有专门硬件, 16 位运算更快、更省内存;
  • 权重用 float32 存储和更新——每一层内部仍拿着 float32 的权重变量 (variable_dtype 不变),优化器给出的微小更新才不会被抹掉;
  • 数值上不稳的运算留在 float32——特别是 softmax 和交叉熵, 想手动指定就给那一层传 dtype="float32"

收益是:新款 NVIDIA GPU 上训练速度提高约 3 倍,TPU 上约 60%, 而模型质量不变——作者称之为「基本上是免费的」26。 在 Keras 里开启只要一行: keras.mixed_precision.set_global_policy("mixed_float16")

顺带一个书里点名的坑:Keras/TensorFlow 默认 float32, NumPy 默认 float64——把 NumPy 数组转成张量时不指定 dtype, 会悄悄变成 float64,平白多做一倍工作27

5. 多 GPU 与 TPU:把批量拆开,把芯片喂饱

5.1 数据并行:主走查第 ④ 步

分布式训练有两条路。模型并行把一个大模型的不同部分放上不同设备, 只用于「大到单卡装不下」的模型;平时用的是数据并行: 模型完整复制到每块卡上,各吃一部分数据,再合并结果28

TensorFlow 里就是 MirroredStrategy(镜像策略,单主机多卡同步训练)。 书里把一个训练步骤拆成四步,数字全是真的29:

① 抽一个全局批量:512 个样本
② 拆成 4 个局部批量:每块 GPU 各得 128 个
③ 每块卡上的模型副本独立跑前向+反向,各自算出一个「权重增量」
(这 128 个样本上,损失对每个权重的更新量)
④ 把 4 份局部增量合并成一个全局增量,应用到所有副本
→ 每步结束各副本权重重新一致,永远同步

图说:副本之间只在第 ④ 步通信。合并要花时间,这就是加速比吃亏的地方。

理想情况 N 块卡快 N 倍,实际要打点折:2 卡约 2 倍、4 卡约 3.8 倍、 8 卡约 7.3 倍——合并开销随卡数涨。前提是全局批量够大, 每块卡分到手的局部批量能让它满负荷运转30。 配套要求:数据走 tf.data.Dataset 管道,并开预取 (prefetch(tf.data.AUTOTUNE)),让数据加载和训练重叠31

5.2 TPU:专用芯片的脾气

GPU 是通用并行芯片,TPU(张量处理单元)是谷歌为深度学习专门设计的 专用集成电路(ASIC)——只为这一类计算存在,所以快: TPU V2 比 NVIDIA P100 快约 15 倍,对多数模型成本效益约为 GPU 的 3 倍32

用法和多 GPU 同一个模板:先 TPUClusterResolver.connect() 连上集群, 再在 TPUStrategy 作用域里建模型,模型在每个 TPU 核上复制、保持同步33。 但 Colab 的 TPU 有个古怪的脾气:它是双虚拟机设置—— 跑笔记本的机器和 TPU 所在的机器不是同一台,TPU 读不到你的本地磁盘。 数据只有两条路:小数据集直接放内存(NumPy 数组就行), 大数据集放谷歌云存储(GCS)让 TPU 直接读34

喂饱 TPU 还有两个讲究35:

  • 批量要特别大:小模型每个批量可能超过 10000 个样本; 批量大了,梯度算得更准,学习率要相应调大;
  • 步骤融合(step fusing):小模型单步算得太快,时间都花在 虚拟机和 TPU 之间的往返上。compile(..., steps_per_execution=8) 让一次往返连跑 8 个训练步骤,对小模型提速明显。

6. 作者的判断与证据

实测与代码: KerasTuner 的全流程(搜索空间摘要、最佳轮数、×1.2 重训)、 混合精度的一行开启、MirroredStrategy 的四步、TPU 的连接与步骤融合—— 都是可直接运行的书内代码;3 倍 / 60% / 15 倍这些数字标明了硬件前提 (新款 NVIDIA GPU、TPU V2 对 P100)2632;

作者亲历: 2014 年 Kaggle 希格斯赛第 4 名、贪婪森林的故事, 是作者本人的参赛经历,当「一种有效做法的例证」读,不当普遍定律读—— 他自己也注明「不能推广到所有问题领域」22;

作者的立场声明: 「调超参数不应该是人类的工作」以及 AutoML 那段 「工程师转向数据管理与损失函数设计」,是作者的职业观判断,书里没给证据; 说它是乐观判断还是务实判断,取决于你信不信自动化会按他预想的速度到来15

7. 边界与局限

  • 验证集过拟合是这套流程的内生代价,书里只给了「记住这一点」, 没给系统解法——大规模搜索时,测试集的「一次性」变得格外珍贵13;
  • 书里只演示贝叶斯优化调节器;Hyperband(用低保真度试验快速淘汰差配置) 只列了名字,没展开;
  • 模型并行整节略过,书里只给了一句「用于大到单卡装不下的模型」;

判断(我们的,不是书里的): 书里把模型并行当成罕见的特例、数据并行当成常规, 这个主次关系在今天的大模型训练上已经倒过来了。 理由就是书里自己给的那个判据—— 模型并行用于「大到单卡装不下」的模型,而今天真正要训的模型普遍装不下单卡, 于是「特例」变成了常态,还长出了把网络按层切段、像流水线一样接力的做法。 这一节因此是全章时效性最强的一节(这段是通用知识,不在书里)。 如果错,会错在: 如果显存容量的增长速度超过模型规模的增长速度, 「装不下单卡」重新变回特例,那书里的主次关系就仍然成立,倒过来的是我们。 我们没有引用任何具体的训练系统作为证据,这条判断只靠「模型规模比显存涨得快」这个印象。

  • 「3 倍加速」依赖硬件代际;混合精度在新架构上已是默认,而非「技巧」;
  • TPU 一节绑定了谷歌云与 Colab 的具体形态,操作细节(双虚拟机、GCS)随平台改版会过时, 但「专用芯片要喂大批量、减少往返」的道理不变。

8. 可带走的

  1. 超参数优化难在三处:空间离散不可微、反馈要重训一次、信号含噪声;
  2. KerasTuner 三步:hp 定义搜索空间 → 调节器跑搜索(记得 executions_per_trial 压噪声) → 大耐心找最佳轮数,全数据按轮数 ×1.2 重训;
  3. 用验证信号调超参 = 在验证集上训练超参数——搜得越狠,验证集越不可信;
  4. 人做高层架构决策,机器做微观决策;别把一切都变成超参数;
  5. 集成有效的前提是性能差不多好;提升的关键是多样性—— 同网络换初始化不值得集成,最「怪」的弱模型反而可能提分最多;
  6. float16 的最小间隔(约 1e-3)装不下典型的权重更新(约 1e-6)—— 所以混合精度 = 16 位计算 + 32 位存权重,softmax/交叉熵留 32 位;
  7. NumPy 默认 float64,转张量时显式指定 dtype;
  8. 数据并行四步:全局批量 → 局部批量 → 各副本算权重增量 → 合并同步; 加速比永远小于卡数,瓶颈在合并;
  9. TPU 要快:大批量(可过万)+ 相应调大学习率 + steps_per_execution 步骤融合;
  10. 加速的终极理由不是省时间,是让「想法 → 实验 → 分析」的循环每天多转几圈

9. 原文地图

主题原书章原文位置
两道鸿沟与本章定位适合现实世界的最佳实践text/20-ch13.txt:15(搜「跨越一些鸿沟」) · text/20-ch13.txt:6(搜「最佳实践」)
超参数定义与三难适合现实世界的最佳实践text/20-ch13.txt:32(搜「叫作超参数」) · text/20-ch13.txt:55(搜「离散的决策组成」) · text/20-ch13.txt:60(搜「可能包含噪声」)
搜索空间与构建函数适合现实世界的最佳实践text/20-ch13.txt:70(搜「min_value=16」)
调节器与搜索参数适合现实世界的最佳实践text/20-ch13.txt:128(搜「RandomSearch、BayesianOptimization」) · text/20-ch13.txt:136(搜「val_accuracy」) · text/20-ch13.txt:141(搜「减小指标方差」)
收尾:轮数与重训适合现实世界的最佳实践text/20-ch13.txt:217(搜「将验证数据纳入训练数据」) · text/20-ch13.txt:243(搜「增加了 20%」)
验证集过拟合警告适合现实世界的最佳实践text/20-ch13.txt:262(搜「根据这个信号更新超参数」)
搜索空间艺术与 AutoML适合现实世界的最佳实践text/20-ch13.txt:275(搜「不再是微观决策」) · text/20-ch13.txt:281(搜「HyperXception」) · text/20-ch13.txt:297(搜「数据管理」)
集成与多样性适合现实世界的最佳实践text/20-ch13.txt:306(搜「汇集在一起」) · text/20-ch13.txt:311(搜「盲人摸象」) · text/20-ch13.txt:345(搜「多样性就是力量」) · text/20-ch13.txt:352(搜「不同的随机初始化」)
加权平均适合现实世界的最佳实践text/20-ch13.txt:329(搜「性能差不多好」) · text/20-ch13.txt:333(搜「Nelder-Mead」)
希格斯第 4 名适合现实世界的最佳实践text/20-ch13.txt:356(搜「希格斯玻色子」) · text/20-ch13.txt:359(搜「提高了一大截」)
浮点精度与 1e-6 更新适合现实世界的最佳实践text/20-ch13.txt:396(搜「分辨率之于图像」) · text/20-ch13.txt:437(搜「梯度更新比较小」) · text/20-ch13.txt:441(搜「无法顺利运行」)
混合精度做法与收益适合现实世界的最佳实践text/20-ch13.txt:443(搜「不需要太高精度」) · text/20-ch13.txt:451(搜「提高 60%」) · text/20-ch13.txt:485(搜「在数值上不稳定」)
NumPy dtype 坑适合现实世界的最佳实践text/20-ch13.txt:456(搜「默认格式是 float64」)
数据并行四步适合现实世界的最佳实践text/20-ch13.txt:499(搜「太大而无法在单一设备上运行」) · text/20-ch13.txt:543(搜「512 个样本」) · text/20-ch13.txt:547(搜「权重增量」) · text/20-ch13.txt:549(搜「得到一个全局增量」)
加速比与数据管道适合现实世界的最佳实践text/20-ch13.txt:576(搜「速度约为 3.8 倍」) · text/20-ch13.txt:569(搜「AUTOTUNE」)
TPU 与步骤融合适合现实世界的最佳实践text/20-ch13.txt:585(搜「Tensor Processing Unit」) · text/20-ch13.txt:588(搜「快 15 倍」) · text/20-ch13.txt:631(搜「无法从本地磁盘进行读取」) · text/20-ch13.txt:666(搜「steps_per_execution」)

Footnotes

  1. 出处:「适合现实世界的最佳实践」第 15 段(text/20-ch13.txt:15,搜「跨越一些鸿沟」)与第 16-19 段(text/20-ch13.txt:16,搜「最佳实践」)。原书自陈「本书只是一本入门书」,本章帮读者跨越「最佳结果」与「训练规模」两道鸿沟。 2

  2. 出处:「适合现实世界的最佳实践」第 32 段(text/20-ch13.txt:32,搜「叫作超参数」)。「超参数」一词的完整讲解(和「参数」的对照、以及用验证集调它的泄露问题)见本书第 06 章。

  3. 出处:「适合现实世界的最佳实践」第 39-40 段(text/20-ch13.txt:39,搜「大部分时间」)与第 40 段(text/20-ch13.txt:40,搜「最好留给机器去做」)。

  4. 出处:「适合现实世界的最佳实践」第 55 段(text/20-ch13.txt:55,搜「离散的决策组成」)、第 58-59 段(text/20-ch13.txt:59,搜「从头开始创建并训练」)与第 60 段(text/20-ch13.txt:60,搜「可能包含噪声」)。

  5. 出处:「适合现实世界的最佳实践」第 69-71 段(text/20-ch13.txt:70,搜「min_value=16」)与代码清单 13-1;搜索空间摘要输出见第 150-151 段(text/20-ch13.txt:150,搜「Search space summary」)。 2

  6. 出处:「适合现实世界的最佳实践」第 123-129 段(text/20-ch13.txt:123,搜「看作一个 for 循环」)与第 128-129 段(text/20-ch13.txt:128,搜「RandomSearch、BayesianOptimization」)。原文对贝叶斯优化的描述是「已知之前所选超参数的结果,它试图明智地预测哪些新的超参数值可能得到最佳性能」。

  7. 出处:「适合现实世界的最佳实践」第 134-143 段(text/20-ch13.txt:136,搜「val_accuracy」)与第 187-197 段(text/20-ch13.txt:188,搜「patience=5」)。原文强调 objective 一定要指定验证指标,「因为搜索过程的目的是找到能够泛化的模型」。

  8. 出处:「适合现实世界的最佳实践」第 141-143 段(text/20-ch13.txt:141,搜「减小指标方差」)。

  9. 出处:「适合现实世界的最佳实践」第 203-206 段(text/20-ch13.txt:204,搜「一整夜甚至几天」)与第 206 段(text/20-ch13.txt:206,搜「恢复运行」)。

  10. 出处:「适合现实世界的最佳实践」第 211-241 段(text/20-ch13.txt:214,搜「get_best_hyperparameters」);小耐心可能欠拟合见第 221-222 段(text/20-ch13.txt:222,搜「导致模型欠拟合」);找最佳轮数的代码见第 239-240 段(text/20-ch13.txt:240,搜「Best epoch」)。

  11. 出处:「适合现实世界的最佳实践」第 217-219 段(text/20-ch13.txt:217,搜「将验证数据纳入训练数据」)与第 242-248 段(text/20-ch13.txt:243,搜「增加了 20%」)。

  12. 出处:「适合现实世界的最佳实践」第 256-259 段(text/20-ch13.txt:256,搜「一条捷径」)。

  13. 出处:「适合现实世界的最佳实践」第 261-263 段(text/20-ch13.txt:262,搜「根据这个信号更新超参数」)。原文:「你实际上是在验证数据上训练超参数,模型很快就会对验证数据过拟合。请始终牢记这一点。」 2

  14. 出处:「适合现实世界的最佳实践」第 271-281 段(text/20-ch13.txt:272,搜「急剧增大」)、第 275-276 段(text/20-ch13.txt:275,搜「不再是微观决策」)与第 281 段(text/20-ch13.txt:281,搜「HyperXception」)。

  15. 出处:「适合现实世界的最佳实践」第 290-302 段(text/20-ch13.txt:291,搜「AutoML」)、第 297 段(text/20-ch13.txt:297,搜「数据管理」)与第 302 段(text/20-ch13.txt:302,搜「调节旋钮」)。 2

  16. 出处:「适合现实世界的最佳实践」第 304-308 段(text/20-ch13.txt:306,搜「汇集在一起」)与第 307 段(text/20-ch13.txt:307,搜「优胜者」)。

  17. 出处:「适合现实世界的最佳实践」第 309-318 段(text/20-ch13.txt:311,搜「盲人摸象」)与第 315 段(text/20-ch13.txt:315,搜「部分」)。

  18. 出处:「适合现实世界的最佳实践」第 319-330 段(text/20-ch13.txt:327,搜「0.25」)与第 329 段(text/20-ch13.txt:329,搜「性能差不多好」)。

  19. 出处:「适合现实世界的最佳实践」第 331-341 段(text/20-ch13.txt:333,搜「Nelder-Mead」)与第 338 段(text/20-ch13.txt:338,搜「0.5 * preds_a」)。

  20. 出处:「适合现实世界的最佳实践」第 345-349 段(text/20-ch13.txt:345,搜「多样性就是力量」)与第 349 段(text/20-ch13.txt:349,搜「互相抵消」)。

  21. 出处:「适合现实世界的最佳实践」第 350-353 段(text/20-ch13.txt:352,搜「不同的随机初始化」)。

  22. 出处:「适合现实世界的最佳实践」第 354-361 段(text/20-ch13.txt:356,搜「希格斯玻色子」)、第 357-359 段(text/20-ch13.txt:358,搜「贪婪森林」)、第 359 段(text/20-ch13.txt:359,搜「提高了一大截」)与第 360 段(text/20-ch13.txt:360,搜「不在于你的最佳模型」)。「不能推广到所有问题领域」的限定也在第 354 段。 2

  23. 出处:「适合现实世界的最佳实践」第 396 段(text/20-ch13.txt:396,搜「分辨率之于图像」)、第 406-409 段(text/20-ch13.txt:407,搜「float16」)与第 433-434 段(text/20-ch13.txt:434,搜「对于半精度」)。

  24. 出处:「适合现实世界的最佳实践」第 435-442 段(text/20-ch13.txt:437,搜「梯度更新比较小」)与第 441 段(text/20-ch13.txt:441,搜「无法顺利运行」)。原文:「典型的学习率是 1e−3,常见的权重更新大小在 1e−6 量级」,而 float16 无法表示这么小的更新。

  25. 出处:「适合现实世界的最佳实践」第 443-449 段(text/20-ch13.txt:443,搜「不需要太高精度」)、第 480-484 段(text/20-ch13.txt:480,搜「variable_dtype」)与第 485-487 段(text/20-ch13.txt:485,搜「在数值上不稳定」)。

  26. 出处:「适合现实世界的最佳实践」第 390-391 段(text/20-ch13.txt:390,搜「训练速度提高 3 倍」)与第 450-451 段(text/20-ch13.txt:451,搜「提高 60%」)。「基本上是免费的」见第 390-391 段。 2

  27. 出处:「适合现实世界的最佳实践」第 453-472 段(text/20-ch13.txt:456,搜「默认格式是 float64」)。

  28. 出处:「适合现实世界的最佳实践」第 493-501 段(text/20-ch13.txt:493,搜「模型并行」)与第 499 段(text/20-ch13.txt:499,搜「太大而无法在单一设备上运行」)。

  29. 出处:「适合现实世界的最佳实践」第 523-551 段(text/20-ch13.txt:525,搜「MirroredStrategy」)、第 542-545 段(text/20-ch13.txt:543,搜「512 个样本」)、第 546-548 段(text/20-ch13.txt:547,搜「权重增量」)与第 549-551 段(text/20-ch13.txt:549,搜「得到一个全局增量」)。

  30. 出处:「适合现实世界的最佳实践」第 572-579 段(text/20-ch13.txt:576,搜「速度约为 3.8 倍」)与第 578 段(text/20-ch13.txt:578,搜「满负荷运转」)。

  31. 出处:「适合现实世界的最佳实践」第 564-570 段(text/20-ch13.txt:566,搜「tf.data.Dataset」)与第 569 段(text/20-ch13.txt:569,搜「AUTOTUNE」)。

  32. 出处:「适合现实世界的最佳实践」第 581-589 段(text/20-ch13.txt:584,搜「ASIC」)、第 585 段(text/20-ch13.txt:585,搜「Tensor Processing Unit」)、第 588 段(text/20-ch13.txt:588,搜「快 15 倍」)与第 589 段(text/20-ch13.txt:589,搜「成本效益」)。 2

  33. 出处:「适合现实世界的最佳实践」第 597-607 段(text/20-ch13.txt:599,搜「TPUClusterResolver」)与第 605-606 段(text/20-ch13.txt:606,搜「TPUStrategy」)。

  34. 出处:「适合现实世界的最佳实践」第 629-637 段(text/20-ch13.txt:629,搜「双虚拟机」)与第 631 段(text/20-ch13.txt:631,搜「无法从本地磁盘进行读取」)。

  35. 出处:「适合现实世界的最佳实践」第 657-667 段(text/20-ch13.txt:659,搜「10 000 个样本」)、第 660 段(text/20-ch13.txt:660,搜「增大优化器的学习率」)、第 662-663 段(text/20-ch13.txt:657,搜「步骤融合」)与第 666 段(text/20-ch13.txt:666,搜「steps_per_execution」)。