跳到主要内容

用机器换时间 — 并行架构与一个真跑起来的项目

这一章讲三件事: 为什么这一行「换块好显卡」没用; 多台机器一起干时,等不等最慢的那一台,各要付什么代价; 以及一堆名字各异的分布式架构,拆开看只有几个零件。

它在全书链条里的位置:第 11 章那八个障碍的最后一味药,治的是「规模」。 而它同时兑现第 08 章第 8 节欠下的那笔债 —— 那里讲完「一个演员配一个批判者」就停了,并行版整块交给了这一章。

顶层全景:一条经验从产生到被用上,走完整条链

这一章从头到尾用同一个项目:书里第 13 章那个赛跑任务。

任务是让一个人体骨骼模型尽可能快地跑完一段路。它的规格全部是书里给的1:

观察:41 个数 —— 骨盆的位置与速度、两腿各关节的角度与角速度、
质心的位置与速度、头/骨盆/躯干/脚趾/踝的位置(共 14 个)
动作:18 个数 —— ★ 每条腿 9 块肌肉的发力程度 ★
奖励:骨盆沿前进方向的位移,减去使用韧带的惩罚
结束:跑满 1000 步,★ 或者骨盆高度低于 0.65 米(摔了)★

★ 一条经验从产生到被用上,要走完这条链:★

┌─ 某台 CPU 上的一个工作者 ─────────────────────────────┐
│ 跑一个片段。★ 书里说这个环境「至少耗时几十秒完成一个模拟片段」★ │ §1
│ 产出一条 (41 维观察, 18 维动作, 奖励, 下一个观察) │
└───────────────────┬─────────────────────────────┘
│ 传的是「一条经验」 §5

┌─ 共享的回放缓存 ─────────────────────────────────────┐
│ ★ 多个进程内存不共享,所以这个缓存必须显式地做成共享的 ★ │ §8
└───────────────────┬─────────────────────────────┘
│ 学习者从这里抽一批

┌─ 某块 GPU 上的学习者 ────────────────────────────────┐
│ 反向传播,更新网络参数 │
│ ★ 而这一步谁等谁,就是 §3 那个同步与异步的分野 ★ │
└───────────────────┬─────────────────────────────┘
│ 传的是「新参数」 §5

采样进程读到新参数,开始下一轮

★ 这一章后面每一节,都是在改这条链上的某一段。★
图说:这就是本章的主走查。规格与「几十秒一个片段」都是书里的。

1. 换块好显卡为什么没用

这一节回答:这一行的慢,慢在哪里。

先看现象:两个数

书里开篇给的例子:某个大型游戏的系统,「每两秒钟就大概有 2 百万组数据被用来训练模型」2

★ 而这一章那个赛跑项目,跑完一个片段要「至少几十秒」★3 —— 先说两种芯片:CPU 是机器里那颗什么活都能干的通用芯片; GPU(专门用来同时算成千上万个乘加的那种芯片,神经网络的训练几乎全靠它)。

书里还说,用普通的无模型算法解决它「需要至少上百个 CPU/GPU 计算小时」才能拿到一个好策略3

★ 把这两个数摆在一起:一边每两秒要吃掉两百万组数据,
一边生产一组数据要几十秒。★
(这个对照是我们摆的;两个数各自都是书里的。)

病根:采样这一步天生不能并行

书里说得很直接:由于智能体和环境的交互「限制于在时间上顺序执行」, 强化学习在采集数据上往往存在低效率的问题4

★ 这一句是这一章存在的全部理由。★ 你不能一边跑第 5 步一边跑第 6 步 —— 第 6 步的画面要等第 5 步做完才知道。

书里还对照了监督学习:那边「一种简单的提升学习速度的方法是同时训练多种不同的训练数据」; 而这边「不可能把所有数据集合在一起让模型同时学习」5

所以能并行的是这两件事

书里把并行性拆成两个方面6:

并行在哪意思★ 它的天花板 ★
计算的并行性多个计算单元一起干★ 书里说:随着越来越多的计算单元投进同一个任务,「完成任务的效率会先上升,然后会因为一些瓶颈的环节而逐渐收敛」★
数据传输的并行性多个单元之间怎么传数据书里说:计算资源充足时,「计算资源之间的数据传输会成为解决问题效率的瓶颈」

★ 记住这两句:加机器的收益会先涨后平;而平掉之后,瓶颈通常在传输上。★

书里给的对策也在这里:在计算资源充足的前提下,把一个计算任务 「拆分成多个相互独立的子任务」,再给每个子任务分配合适的资源6

2. 最常见的摆法:一个主节点,一堆干活的

这一节讲这一章的基本盘,后面所有架构都是它的变形。

那个形状

书里说最普及的做法采用类似星形的拓扑结构 —— 由一个主节点和多个从属节点组成7

┌───────────┐
│ 主 节 点 │ ← 管理参数、分发与收集
└─────┬─────┘
┌────────┬────┴────┬────────┐
▼ ▼ ▼ ▼
节点1 节点2 节点3 节点4 ← 各自与自己的环境交互

★ 一轮是这么走的(书里给的流程):★[^8]
① 每个从属节点开始时先从主节点同步一份网络参数
② 它「独立与环境交互学习」
③ 交互完再和主节点通信,把学到的东西提交上去
④ 主节点更新参数,再同步给所有从属节点,进入下一轮

★ 而 ③ 里提交的「学到的东西」是什么,书里明说了它随架构而变:★
可以是单步探索的经验、连续探索的轨迹、带权重的经验,或者网络参数的梯度。[^8]
★ 这一句是第 5 节那张分辨表的来源 —— 记住它。★

3. 等不等最慢的那一台

这一节兑现第 08 章第 8 节欠下的那笔债。

★ 这就是第 08 章第 8 节欠下的 A2C 与 A3C。★ 那里讲完「一个演员配一个批判者」就停住了,并且当场声明并行版整块交给这一章。 现在还这笔债 —— 而答案就是下面这两种通信模式: ★ A2C 是同步版(等齐了再更新),A3C 是异步(不等人:谁算完谁提交)版。★

同步:所有人对齐

书里的描述:在同步模式中,所有从属节点使用完全相同的时间区间进行信息交互, 主节点用相同固定的时间段同时与所有节点通信8

时间轴 →

节点1(快) ███████░░░░░░░░ |通信| ← ★ 算完了,干等 ★
节点2(快) ██████░░░░░░░░░ |通信| ← ★ 干等 ★
节点3(慢) ███████████████ |通信| ← 大家等它
节点4(中) ██████████░░░░░ |通信| ← 干等

█ 在算 ░ 在等 | 在通信

★ 书里的判词:「有更强算力的奴隶节点不得不等待其他所有弱算力的节点
完成本轮计算任务之后才能继续和主节点通信」;
所以同步模式虽然对主节点更清晰固定,「但是在奴隶节点中会有大量计算资源
因为等待同步而造成浪费」。★[^9]

异步:谁算完谁提交

书里的描述:只要一个从属节点完成了本轮任务,就可以立刻把信息提交给主节点; 主节点收到之后才用它更新参数、并只和这一个节点同步9

时间轴 →

节点1(快) ███████|通信|██████|通信|███ ← ★ 不用等别人 ★
节点2(快) ██████|通信|███████|通信|████
节点3(慢) ███████████████|通信|██████
节点4(中) ██████████|通信|█████████

★ 书里的结论:主节点需要「不定时地与不同的奴隶节点进行通信」,
这样能「确保奴隶节点中的计算资源得到了充分的利用」。★[^10]

异步的代价,以及一个意外的副作用

★ 代价:节点 3 提交梯度时,它算这个梯度用的参数已经是好几轮之前的了。★ 因为在它慢慢算的这段时间里,节点 1 和 2 各提交了两次,主节点的参数早变了。

判断(我们的,不是书里的): 这个「拿旧参数算出来的梯度」是异步方案的核心代价, 而这一章没有正面处理它 —— 它在第 09 章那条线上有一个对应的名字: 拿旧策略采的样去更新新策略,靠的是重要性加权(第 09 章第 4 节)。 ★ 而这一章第 6 节那个 IMPALA,做的正是这件事。★ 如果错,会错在: 参数的过期和策略的过期不是一回事 —— 前者是优化层面的,后者是采样分布层面的。判据是:过期的是「梯度算在哪套参数上」, 还是「这批样本是哪个策略采的」—— IMPALA 治的是后者,而前者书里没治。

★ 但书里在别处提到过一个很有意思的副作用(第 11 章第 4 节那个上下文里):★ 异步更新意外地产生了类似动量的效果 —— 因为「过期的梯度」相当于把过去几步的方向也掺了进来。 这一点书里在讲挑战那一章提过,不在这一章。

4. 主节点是最薄弱的一环

这一节讲星形结构的三个死穴,以及两种去掉主节点的通信形状。

三个死穴

书里对主节点的评价很不客气10:

死穴书里的说法
它得比谁都快为了保证性能,主节点「需要在处理数据上比奴隶节点更具效率」
它得比谁都宽所有节点可能同时向它传数据,所以「主节点的数据传输带宽**(每秒能传多少数据)**需要足够大」
★ 它一停,全停 ★「如果主节点有任何的停机事件,整个系统将停止工作,即使所有的奴隶节点存在大量可用的计算资源。」

那去掉它呢?通信成本会爆炸

书里给的替代思路:多个相互独立的进程,每个维护一个相同的网络,进程之间频繁通信以保持同步11

★ 但书里当场指出问题:由于每个进程需要与所有其他进程通信, 「当进程的数量增加时,进程间通信的成本将指数级上升」。★11

所以要用更聪明的通信形状。书里给了两种:

树形:一个进程要广播给所有人

做法:先发给身边几个,那几个再各自并行地发给下一批12

★ 4 个进程要通知 15 个人(每轮每人发给 1 个):★

轮 1: A ──→ B 1 个人知道了 → 2 个
轮 2: A ──→ C B ──→ D 2 个 → 4 个
轮 3: A→E C→F B→G D→H 4 个 → 8 个
轮 4: …… 8 个 → 16 个

★ 书里给的结论:所需的迭代次数是对数级的 ——
N 个进程只要大约 log N 轮,信息就到所有人手上。★[^13]

对照星形:主节点要一个一个发,发 N − 1 次。
★ 书里的说法:树形通信「通过提高迭代次数使用并行通信的方式,
大大降低了所有进程发送信息的总数」。★[^13]

蝴蝶形:所有人同时要广播给所有人

书里说:当所有进程都要把自己的信息广播给所有其他进程时, 把树形叠起来就成了蝴蝶形13

做法上多了一步:每个进程在每轮里,不只发,还要「收集并处理其他进程发来的信息, 用于下一次迭代中信息的发送」13

★ 而它有一条非常值钱的性质,书里明写了:★

「在这个系统中,无论其中哪一个进程出现故障中断, 其他进程之间仍可以继续完成信息的同步而不受到影响。」13

★ 对照星形那第三个死穴 —— 这就是去掉主节点买到的东西。★

5. 分辨那一堆架构,只看一件事

这一节是这一章最实用的一节。

那一件事

★ 书里第 2 节那句话就是钥匙:从属节点提交给主节点的「学到的东西」,可以是好几种不同的东西。★14

★ 而所有分布式架构的差别,基本就在这一件事上:节点之间传的到底是什么。★ (这句归纳是我们的;那个清单是书里的。)

下面反复出现的「演员」,就是第 06 章第 4 节和第 08 章第 8 节那个演员 —— 负责真的去做动作的那一半。 这一节里它换了个身份:在单机上它是网络的一部分,在这里它是一台单独跑环境的机器。 (书里管它叫「行动者」;本组文档统一叫演员,只有逐字引原书的句子里保留原词。)

架构传的是什么关键设计
A3C★ 梯度 ★每个演员-学习者自己算完梯度,提交给参数服务器(一台专管参数的机器,见 §7)15
GA3C★ 请求与经验 ★智能体自己不带网络,把「该怎么做」当请求发出去16
DPPO梯度领导者等到够多的工人交了梯度,取平均17
IMPALA★ 整条轨迹 ★演员把经验整条送走,不算梯度18
SEED★ 一步的经验 ★连「该怎么做」的推断都搬到学习者那边了19
Ape-X带优先级的经验中间夹一个回放缓存,按优先级挑数据20

三个值得单独说的

★ GA3C:智能体自己不维护策略网络。★[^16]
它把「我现在该怎么做」当成一个请求发到一个队列里,
由一个专门的角色批量地拿去问网络、再把答案发回来。
★ 为什么要这么绕:因为「批量的数据输入使得模型在推论时可以利用 GPU 的并行计算能力」。★[^16]
→ 一次问一个,GPU 大部分时间在闲着;攒一批再问,GPU 才吃得饱。

★ SEED:比 GA3C 更彻底 —— 连策略网络的推断都从演员搬到了学习者那一侧。★[^19]
书里给的收益写得很清楚:这「降低了行动者的算力要求和通信延时」,
于是「很多弱算力的计算资源可以加入架构中并成为独立的行动者」。[^19]
★ 也就是说:演员可以是一堆很便宜的机器,它们只负责跑环境。★

★ Ape-X:在链条中间插了一个回放缓存。★[^20]
它「维护并更新每一个存储经验的优先级」,再按优先程度批量发给学习者。
★ 这就是第 07 章第 7 节那个偏心抽样,被搬到了分布式的中间层。★

6. 传轨迹要付一笔时差的钱

这一节讲那个「传整条轨迹」的架构为什么需要一个额外的修正。

先看现象

演员传的是整条轨迹,而不是梯度。这带来一个新问题:

演员用参数版本 100 的策略,采了一条 20 步的轨迹
→ 传给学习者
→ 而这段时间里学习者已经更新到版本 103 了

★ 于是:这批样本是「版本 100 那个策略」采的,而要更新的是「版本 103 那个策略」。★
★ 这正是第 09 章第 4 节那个问题 —— 拿旧策略采的样,估新策略的成绩。★

解法:两个截断的比值

书里给的价值估计式子里有两个系数,而它们都是「新旧策略的概率比值,再截一个上限」18

★ 这就是「重要性加权」这个名字的来历,也是这个架构名字里那几个字的来历。★ 它就是第 09 章第 4 节那个重要性采样 —— 只是这里的「旧策略」不是上一轮的策略, 而是「几步之前那个版本的参数」。

书里还说明了一处细节:学习者的策略,是「上一轮同步时所有行动者的策略的均值」18

★ 为什么要截断:第 09 章第 4 节算过 —— 比值可能飙到 19 倍。★ 不截住,一条极端的样本能把整批更新带偏。

7. 拆开看只有五个零件

这一节收口上半章,而这张零件表是这一章最值得带走的东西。

书里在最后总结了一般性的分布式架构由哪些部分组成21:

零件它干什么(书里的说法)
① 环境「智能体需要与其交互的场景」;大规模并行时它「可能会存在多个复制版本」,各对应一个演员
② 演员「直接和环境进行交互的部分」;它的决策可以来自自己的网络,也可以来自参数服务器或旁边学习者共享的网络(★ 这一句正是 GA3C 和 SEED 的位置 ★)
③ 回放缓存从所有演员收集轨迹、整理后给学习者;书里建议它「分配在学习者的周围并高效连通」
④ 学习者「深度强化学习的关键组成部分」;拿缓存里的数据训网络,训练前后与参数服务器通信
⑤ 参数服务器收集所有学习者的信息、维护参数;并且「能够在行动者和环境交互时帮助其制定决策策略」(★ 又是 GA3C 和 SEED ★)

书里的收口句:一般性的分布式计算架构「可以采纳其中元素组合形成」21

★ 拿这五个零件回头看 §5 那张表,每一行都能被摆出来:★

A3C = ①环境 + ②演员(自带网络,自己算梯度) + ⑤参数服务器 ← 没有③
GA3C = ①环境 + ②演员(不带网络) + ④学习者 + ⑤参数服务器(代做推断)
IMPALA = ①环境 + ②演员(自带网络,只采样) + ④学习者 ← ③是学习者内部的
Ape-X = ①环境 + ②演员 + ★③回放缓存(带优先级)★ + ④学习者

★ 也就是说:那一堆名字不是一堆算法,是这五个零件的不同摆法和不同连线。★
(这张对照是我们按书里给的各架构描述整理的,不是书里的一张表。)

8. 真写一个并行版本,会撞上什么

这一节走主走查的中段,讲的是书里第 13 章那个真项目。

为什么非并行不可

书里给了两个理由3:

  • ★ 慢 ★ —— 这个环境「至少耗时几十秒完成一个模拟片段」;
  • ★ 复杂 ★ —— 用普通的无模型算法「需要至少上百个 CPU/GPU 计算小时」才能拿到好策略。

而书里还点了一件很实在的事:采样一般在 CPU 上、反向传播一般在 GPU 上, 所以两者之间的平衡很关键 —— 「整个过程的训练效率在实践中满足短板效应」22

★ 「短板效应」翻译成一句话:GPU 再快,CPU 供不上数据也没用。★

架构

书里的摆法:一个智能体和一个环境被封装进一个「工作者」,跑在一个进程里; 多个工作者可以共享同一块 GPU,因为「有时单个工作者无法完全占用整个 GPU 内存」23

三个坑,一个比一个具体

★ 这是全书难得的、把工程坑写出来的地方。★

★ 坑一:多进程之间内存不共享。★[^24]
书里的话:「由于多进程的内存之间互相不共享,需要用特殊的模块来处理
信息交流和参数共享。」
→ 回放缓存要显式地共享出去;网络也要显式地共享出去。

★ 坑二:连优化器内部那两份统计量都得手动共享。★[^25]
书里说:「由于 Adam 优化器在训练中也有一些统计量」,
所以专门写了一个函数把它们放进共享内存。
→ 「Adam 的两个动量」是第 05 章第 7 节那两个数(一份记方向、一份记幅度)。
★ 只共享网络参数、不共享这两份统计量,几个进程各自记一套 ——
它们会互相打架,而且这个错很难被发现。★

★ 坑三:为了让子进程能用显卡,启动方式必须换成一种特定的模式,★[^26]
★ 而这直接导致「在 Windows 10 上无法进行这样的并行训练」。★
→ 书里明写了这一句。
★ 一个纯粹的实现细节,直接砍掉了一整个操作系统。★

9. 光有架构还不够:五个调法

这一节讲那个项目在架构之外做的事,而它是通往第 20 章的桥。

书里很坦白:即便使用了上面的并行架构,「我们仍旧不能在这个任务上取得很好的表现」24

书里给的理由是任务复杂加上模型非线性:损失函数上的局部最优(附近都比它差、 但全局还有更好的那种坑;第 11 章第 3 节讲非凸时见过)、 以及「非平滑甚至不可微的曲面」都容易让优化陷入困境24

于是有了五个调法25:

调法做什么★ 它在救什么 ★
① 奖励缩放把奖励除以这一批样本的标准差书里说最大熵那类算法「可能对奖励函数的缩放敏感」,而这不同于其他传统算法
② 换激活函数把隐藏层的 ReLU 换成 ELU★ ELU「有负数值」,能把激活的平均值拉到接近 0 ★ —— 效果类似批标准化,但计算更便宜
③ 层标准化按单个样本、在一层内部做标准化★ 这就是第 05 章第 8 节那个批标准化欠下的债 ★
④ 动作重复每个动作连做 3 次减少策略与环境交互所需的正向推理时间
⑤ 更新重复用小学习率,同一批样本重复学 3 次把每批数据榨得更干

第三条值得单独说:那个 RL 专用的替代品

★ 第 05 章第 8 节说过:批标准化会在第 17 章有一个强化学习专用的替代品。这就是它。★

批标准化(第 05 章第 8 节): 拿 ★ 一批样本 ★ 在同一个位置上的数,算均值和方差来拉齐
→ ★ 问题:强化学习里一批样本之间高度相关(第 06 章第 2 节),
而且批量大小经常变 —— 这个统计量不可靠。★

层标准化(这里): 拿 ★ 单个样本 ★ 在某一层所有神经元上的数,算均值和方差
→ 书里的话:它「对单个训练样本在某神经网络层上的神经元的累加输入
计算均值和方差来进行标准化」;
每个神经元还有自己的偏差和增益,在标准化之后、非线性激活之前加上去。[^29]
→ ★ 它完全不依赖「这一批有多少个样本」,也不依赖样本之间独立。★
书里说这「在实际中可以帮助加速训练过程」。[^29]

(「为什么批标准化在这一行不可靠」这一段因果是我们的解释;两种做法都是书里的。)

结果:这笔账值多少

书里给的最终数字:通过以上设置和这些调法,智能体「能够在 3 天的训练时长下 学会用人类的方式奔跑很长的一段距离」;而训练是在「一个 4GPU 和 56CPU 的服务器上」进行的26

★ 把这笔账算一下(参照物是我们加的):★
3 天 × 24 小时 = 72 小时
× 56 个 CPU 核 = ★ 约 4000 个 CPU 小时 ★
× 4 块 GPU = 另加 288 个 GPU 小时

对照 §8 那句「普通无模型算法需要至少上百个 CPU/GPU 计算小时」——
★ 实际花掉的是它的几十倍。★
★ 一句话:这就是「用机器换时间」的真实汇率。★

★ 而书里在这一章之后就转向第 18 章那份工程清单 —— 也就是我们的第 20 章。★ 这五个调法属于「那个项目的」,第 20 章那些属于「普遍的」,两者不要混。

作者的判断与证据

书里给了明确机制或完整伪代码的:

  • 同步与异步的时间线图与各自的代价89;
  • 树形与蝴蝶形通信的轮数,以及蝴蝶形的容错性质1213;
  • 六种分布式架构的结构与伪代码1520;
  • ★ 五个零件的清单 ★21 —— 这是全章最值得带走的东西;
  • 那个项目的三个工程坑与五个调法2725;
  • ★「4GPU 和 56CPU、3 天」★26 —— 全书少有的具体规模数字。

作者的判断与经验说法:

  • 「加机器的收益先升后被瓶颈卡住」6 —— 一句机理判断,没有曲线;
  • ELU 的好处(把激活均值拉到接近 0、加速学习)25 —— 转述的是原论文的说法;
  • 层标准化「在实际中可以帮助加速训练过程」28 —— 一句经验;
  • ★「即便使用了上面的并行架构,我们仍旧不能在这个任务上取得很好的表现」★24 —— 这是一句很实在的自曝,值得记住。

书里没有给的:

  • ★ 六种架构之间一个性能对照都没有。★ 谁比谁快多少、在什么条件下,全无数据;
  • 同步和异步该怎么选,书里给了各自的代价,没有给判据;
  • 异步带来的「梯度过期」这件事,这一章完全没有处理(见 §3 那个判断块);
  • 五个调法各值多少,书里没有做消融。

边界与局限

  • ★ 这一章讲的全是「怎么摆机器」,不是「怎么改算法」。★ 前面十六章那些毛病一个都没消失,只是被摊到了更多机器上;
  • 书里的通信部分给的是拓扑和轮数,没有讨论真实网络里的带宽、丢包、延时抖动;
  • 原书第 13 章有相当一部分是代码清单(共享内存怎么写、命令怎么敲), 这些属于随书代码,我们只搬了其中体现工程判断的那几条;
  • 那个项目用的是简化过的环境 —— 书里明说了:相比竞赛用的环境有所简化, 腰肌强度被设为 0、障碍物被去掉了29;
  • 「上百个 CPU/GPU 计算小时」和实际花掉的「约 4000 个 CPU 小时」差了几十倍, 而书里没有解释这个差距 —— 前者可能指的是别的配置;
  • ★ 这一章没有回答「多少机器算够」。★ 它给了架构和坑,没有给规模的判据。

可带走的

全章那条走查,一行写完: 一条经验从某台 CPU 上的工作者产生 (41 维观察、18 维动作、跑一个片段几十秒) → 写进必须显式共享的回放缓存 → GPU 上的学习者抽一批做反向传播 → 新参数写回共享内存 → 采样进程读到新参数。 这条链上每一步都要问三件事:在哪台机器上、传的是什么、谁在等谁。 而那六种架构的差别,全在「传的是什么」这一格上。 最终这个项目跑了 3 天,用的是 4 块 GPU 加 56 个 CPU 核。 (规格、片段耗时、机器规模全部是书里的。)

  1. ★ 这一行的慢,慢在采样;而采样天生只能一步接一步 —— 这是这一章存在的全部理由。★
  2. 加机器的收益会先涨后平,而平掉之后瓶颈通常在传输上;
  3. 基本盘是星形:一个主节点 + 一堆干活的,一轮是「同步参数 → 各自跑 → 提交 → 更新 → 再同步」;
  4. ★ 同步等最慢的那一台,算力强的白等;异步不等人,代价是提交的梯度基于旧参数。★ 这就是第 08 章欠下的 A2C(同步)与 A3C(异步);
  5. 主节点三个死穴:得最快、得最宽、★ 它一停全系统停 ★;
  6. 完全去中心化时两两通信成本爆炸,所以要用形状 —— 树形把广播轮数降到对数级;蝴蝶形还多一条:★ 任何一个进程故障,其余照常同步 ★;
  7. ★ 分辨那一堆分布式架构只看一件事:节点之间传的到底是什么 ★ —— 梯度、整条轨迹、带优先级的经验,或者干脆连「怎么决策」也搬走;
  8. 把推断搬到学习者那边,演员就可以是一堆很便宜的机器(它们只负责跑环境);
  9. 传轨迹要付时差的钱:样本是几步之前那个版本采的, 要用两个截断的比值纠回来 —— 这就是「重要性加权」这个名字的来历;
  10. ★ 拆开看只有五个零件:环境、演员、回放缓存、学习者、参数服务器。★ 所有架构不过是这五个零件的不同摆法与不同连线;
  11. 真写并行版会撞上:多进程内存不共享(缓存和网络都要显式共享);
  12. ★ 连优化器内部那两份统计量都得手动共享 —— 不共享的话几个进程各记一套,会互相打架。★
  13. ★ 为了让子进程能用显卡换的那种启动方式,直接导致这套代码在 Windows 上跑不了。★
  14. 架构对了也未必能跑出来:书里明说「仍旧不能在这个任务上取得很好的表现」;
  15. 五个调法:奖励除以标准差、ReLU 换成 ELU、层标准化、动作重复 3 次、同一批学 3 次;
  16. ★ 层标准化就是第 05 章那个批标准化欠下的债:它按单个样本在一层内部算, 完全不依赖批量大小、也不依赖样本之间独立 —— 而强化学习恰恰两条都不满足。★

原文地图

主题原书章原文位置
数据量与顺序执行的矛盾第12章 并行计算text/17-ch12.txt:11(搜「每两秒钟就大概有 2 百万组数」) · text/17-ch12.txt:13(搜「智能体和环境的交互限制于在时间上」) · text/17-ch12.txt:32(搜「在监督学习的设定中」)
两种并行性与它们的天花板第12章 并行计算text/17-ch12.txt:17(搜「计算的并行性」) · text/17-ch12.txt:22(搜「完成任务的效率会先上升」) · text/17-ch12.txt:27(搜「计算资源之间的数据传输会成为解决问题」)
星形结构与它的一轮第12章 并行计算text/17-ch12.txt:41(搜「是由一个主节点和」) · text/17-ch12.txt:50(搜「其将独立与环境交互学习」) · text/17-ch12.txt:52(搜「网络参数的梯度信息」)
同步通信第12章 并行计算text/17-ch12.txt:60(搜「所有奴隶节点将使」) · text/17-ch12.txt:62(搜「有更强算力的奴隶节点不得不等待其他所有弱算力的节点完成本轮计算任务之后才能」) · text/17-ch12.txt:64(搜「但是在奴隶节点中会有大量计算资源因为等待同步而造成浪费」)
异步通信第12章 并行计算text/17-ch12.txt:69(搜「只要奴隶节点完成了本轮的计算或探索任务」) · text/17-ch12.txt:72(搜「确保奴」)
主节点的三个死穴第12章 并行计算text/17-ch12.txt:81(搜「样也是整个系统最薄弱的部分」) · text/17-ch12.txt:83(搜「主节点的数据传输带宽需要足够大」) · text/17-ch12.txt:84(搜「有任何的停机事件」)
去中心化的通信成本第12章 并行计算text/17-ch12.txt:88(搜「当进程的数量增加时」)
树形与蝴蝶形第12章 并行计算text/17-ch12.txt:93(搜「树形结构通信」) · text/17-ch12.txt:97(搜「次迭代即可将信息发送给所有其他」) · text/17-ch12.txt:103(搜「蝴蝶形结构通信」) · text/17-ch12.txt:109(搜「在这个系统中无论其中哪一个进程出现故障中」)
A3C第12章 并行计算text/17-ch12.txt:121(搜「是基于」) · text/17-ch12.txt:126(搜「将建立参数服务器」)
GA3C 的三部分第12章 并行计算text/17-ch12.txt:170(搜「每个智能体自身不」) · text/17-ch12.txt:172(搜「预测者则会根据整体策略网络顺序为预测序列中的请求提供决策建议」) · text/17-ch12.txt:177(搜「由于批量的数据输入使得模型在推论时可以利用 GPU 的并行计算能力」)
DPPO第12章 并行计算text/17-ch12.txt:186(搜「其中领导者和工人分别与 A3C 算法中的参数服务器和行动-学习者的功」) · text/17-ch12.txt:212(搜「者至少等待所有工人提交」)
IMPALA 与重要性加权第12章 并行计算text/17-ch12.txt:312(搜「在分布式计算中使用智能体探索轨迹的所有经验作为通信信息」) · text/17-ch12.txt:329(搜「表示时间差分」) · text/17-ch12.txt:333(搜「为上一轮同步时所有行动者的策略」)
SEED第12章 并行计算text/17-ch12.txt:339(搜「主要的区别在于策略网络的推断过程会从行动者部分转移到学习者中」) · text/17-ch12.txt:341(搜「很多弱算力的计算资源可以加入架构中并成为独立的行动者」)
Ape-X第12章 并行计算text/17-ch12.txt:350(搜「是典型的包含带有优先级的经验回放部分的分」) · text/17-ch12.txt:354(搜「维护并更新每一个存储经验的优先级」)
五个零件第12章 并行计算text/17-ch12.txt:436(搜「环境是智能体需要与其交互的场景」) · text/17-ch12.txt:442(搜「系统中行动者通常指直接和环境进行交互的部分」) · text/17-ch12.txt:450(搜「回放存储缓冲区将会从所有行动者中收集探索」) · text/17-ch12.txt:455(搜「学习者是深度强化学习的关键组成部分」) · text/17-ch12.txt:461(搜「参数服务器是从学习者中收集所有信息并维护管理策略」) · text/17-ch12.txt:467(搜「一般性的分布式计算架构可以采纳其中元素组合形成」)
赛跑环境的规格第13章 Learning to Runtext/19-ch13-13-learning-to-run.txt:4(搜「这个环境有 41 维的状」) · text/19-ch13-13-learning-to-run.txt:32(搜「观察量包括 41 个值」) · text/19-ch13-13-learning-to-run.txt:48(搜「动作包括 18 个标量值」) · text/19-ch13-13-learning-to-run.txt:61(搜「奖励函数由骨盆沿 x 轴运动距离减去由于使用韧带的惩罚计算得到」) · text/19-ch13-13-learning-to-run.txt:64(搜「低于 0.65 米时发生」)
为什么必须并行第13章 Learning to Runtext/19-ch13-13-learning-to-run.txt:142(搜「至少耗时几十秒完成一个模拟片段」) · text/19-ch13-13-learning-to-run.txt:145(搜「需要至少上百个 CPU」) · text/19-ch13-13-learning-to-run.txt:150(搜「整个过程的训练效率在实践中满足短板效应」)
工作者的摆法与三个坑第13章 Learning to Runtext/19-ch13-13-learning-to-run.txt:168(搜「一个智能体和一个环境被封装进一个」) · text/19-ch13-13-learning-to-run.txt:178(搜「由于多进程的内存之间互相不共享」) · text/19-ch13-13-learning-to-run.txt:184(搜「由于 Adam 优化器在训练中也有一些统计量」) · text/19-ch13-13-learning-to-run.txt:234(搜「所以在 Windows 10 上无法进行这样的并行训练」)
五个调法第13章 Learning to Runtext/19-ch13-13-learning-to-run.txt:245(搜「我们仍旧不能在这个任务上取得很好的表现」) · text/19-ch13-13-learning-to-run.txt:250(搜「即将奖励值除以训练过程中所采批样本」) · text/19-ch13-13-learning-to-run.txt:266(搜「ELU 有负数值」) · text/19-ch13-13-learning-to-run.txt:291(搜「我们使用 3 作」) · text/19-ch13-13-learning-to-run.txt:293(搜「从而策略以重复」)
层标准化第13章 Learning to Runtext/19-ch13-13-learning-to-run.txt:270(搜「我们也对价值网络和策略网络的每个隐藏层使用层标准化」) · text/19-ch13-13-learning-to-run.txt:271(搜「层标准化对单个训练样本在某神经网络层上的神经元」)
结果与机器规模第13章 Learning to Runtext/19-ch13-13-learning-to-run.txt:297(搜「智能体能够在 3 天的训练时长下学会用人类的」) · text/19-ch13-13-learning-to-run.txt:298(搜「训练是在一个 4GPU 和 56CPU 的服务器上进行的」)

Footnotes

  1. 出处:「第13章 Learning to Run」第 32 段(text/19-ch13-13-learning-to-run.txt:32,搜「观察量包括 41 个值」)、第 48 段(text/19-ch13-13-learning-to-run.txt:48,搜「动作包括 18 个标量值」)、第 61 段(text/19-ch13-13-learning-to-run.txt:61,搜「奖励函数由骨盆沿 x 轴运动距离减去由于使用韧带的惩罚计算得到」)与第 64 段(text/19-ch13-13-learning-to-run.txt:64,搜「低于 0.65 米时发生」)。原书还逐条列了 18 块肌肉的名字(每条腿 9 块)。

  2. 出处:「第12章 并行计算」第 11 段(text/17-ch12.txt:11,搜「每两秒钟就大概有 2 百万组数」)。原书还说,从优化角度看,大批量的训练数据能有效降低结果的方差。

  3. 出处:「第13章 Learning to Run」第 141 段(text/19-ch13-13-learning-to-run.txt:141,搜「至少有两个原因需要我们对这个任务进行并行训练」)、第 142 段(text/19-ch13-13-learning-to-run.txt:142,搜「至少耗时几十秒完成一个模拟片段」)与第 145 段(text/19-ch13-13-learning-to-run.txt:145,搜「需要至少上百个 CPU」)。 2 3

  4. 出处:「第12章 并行计算」第 13 段(text/17-ch12.txt:13,搜「智能体和环境的交互限制于在时间上」)。原文的完整因果是:顺序执行导致采集数据低效率,从而带来不理想的训练结果和缓慢的收敛速度。

  5. 出处:「第12章 并行计算」第 32 段(text/17-ch12.txt:32,搜「在监督学习的设定中」)与第 35 段(text/17-ch12.txt:35,搜「智能体在训练中同时并行学习多个训练轨迹」)。

  6. 出处:「第12章 并行计算」第 17 段(text/17-ch12.txt:17,搜「计算的并行性」)、第 22 段(text/17-ch12.txt:22,搜「完成任务的效率会先上升」)、第 25 段(text/17-ch12.txt:25,搜「将一个计算任务拆分成多个相互独立的子任务」)与第 27 段(text/17-ch12.txt:27,搜「计算资源之间的数据传输会成为解决问题」)。 2 3

  7. 出处:「第12章 并行计算」第 41 段(text/17-ch12.txt:41,搜「是由一个主节点和」)。原书用的是「主节点」与「奴隶节点」这两个词。

  8. 出处:「第12章 并行计算」第 60 段(text/17-ch12.txt:60,搜「所有奴隶节点将使」)、第 62 段(text/17-ch12.txt:62,搜「有更强算力的奴隶节点不得不等待其他所有弱算力的节点完成本轮计算任务之后才能」)与第 64 段(text/17-ch12.txt:64,搜「但是在奴隶节点中会有大量计算资源因为等待同步而造成浪费」)。 2

  9. 出处:「第12章 并行计算」第 69 段(text/17-ch12.txt:69,搜「只要奴隶节点完成了本轮的计算或探索任务」)与第 72 段(text/17-ch12.txt:72,搜「确保奴」)。 2

  10. 出处:「第12章 并行计算」第 81 段(text/17-ch12.txt:81,搜「样也是整个系统最薄弱的部分」)、第 83 段(text/17-ch12.txt:83,搜「主节点的数据传输带宽需要足够大」)与第 84 段(text/17-ch12.txt:84,搜「有任何的停机事件」)。

  11. 出处:「第12章 并行计算」第 86 段(text/17-ch12.txt:86,搜「我们假设有多个相互独立的进程」)与第 88 段(text/17-ch12.txt:88,搜「当进程的数量增加时」)。原书接着介绍了消息传递接口这一类进程间通信标准。 2

  12. 出处:「第12章 并行计算」第 93 段(text/17-ch12.txt:93,搜「树形结构通信」)、第 97 段(text/17-ch12.txt:97,搜「次迭代即可将信息发送给所有其他」)与第 99 段(text/17-ch12.txt:99,搜「树形结构通信通过提高迭代次数使用并行通信的方式」)。 2

  13. 出处:「第12章 并行计算」第 103 段(text/17-ch12.txt:103,搜「蝴蝶形结构通信」)、第 105 段(text/17-ch12.txt:105,搜「并同时收集并处理其」)与第 109 段(text/17-ch12.txt:109,搜「在这个系统中无论其中哪一个进程出现故障中」)。 2 3 4

  14. 出处:「第12章 并行计算」第 50 段(text/17-ch12.txt:50,搜「其将独立与环境交互学习」)、第 52 段(text/17-ch12.txt:52,搜「网络参数的梯度信息」)与第 53 段(text/17-ch12.txt:53,搜「主节点将更新其网络的参数」)。原文列的四种提交内容是:单步探索的经验、连续探索的轨迹、带权重的经验、网络参数的梯度。

  15. 出处:「第12章 并行计算」第 121 段(text/17-ch12.txt:121,搜「是基于」)与第 126 段(text/17-ch12.txt:126,搜「将建立参数服务器」)。原书写明 A3C 是 A2C 的分布式版本,每个行动-学习者维护一个策略网络和一个价值网络,并把两个梯度提交给参数服务器。 2

  16. 出处:「第12章 并行计算」第 170 段(text/17-ch12.txt:170,搜「每个智能体自身不」)、第 172 段(text/17-ch12.txt:172,搜「预测者则会根据整体策略网络顺序为预测序列中的请求提供决策建议」)与第 177 段(text/17-ch12.txt:177,搜「由于批量的数据输入使得模型在推论时可以利用 GPU 的并行计算能力」)。原书把这个架构的三部分叫智能体、预测者、训练者。

  17. 出处:「第12章 并行计算」第 186 段(text/17-ch12.txt:186,搜「其中领导者和工人分别与 A3C 算法中的参数服务器和行动-学习者的功」)与第 212 段(text/17-ch12.txt:212,搜「者至少等待所有工人提交」)。原书的伪代码里,领导者每次至少等到一定数目的工人交上梯度,取平均后更新。

  18. 出处:「第12章 并行计算」第 312 段(text/17-ch12.txt:312,搜「在分布式计算中使用智能体探索轨迹的所有经验作为通信信息」)、第 329 段(text/17-ch12.txt:329,搜「表示时间差分」)与第 333 段(text/17-ch12.txt:333,搜「为上一轮同步时所有行动者的策略」)。原书给的那两个系数都是「新旧策略概率之比再取一个上限」的形式。 2 3

  19. 出处:「第12章 并行计算」第 339 段(text/17-ch12.txt:339,搜「主要的区别在于策略网络的推断过程会从行动者部分转移到学习者中」)与第 341 段(text/17-ch12.txt:341,搜「很多弱算力的计算资源可以加入架构中并成为独立的行动者」)。

  20. 出处:「第12章 并行计算」第 350 段(text/17-ch12.txt:350,搜「是典型的包含带有优先级的经验回放部分的分」)与第 354 段(text/17-ch12.txt:354,搜「维护并更新每一个存储经验的优先级」)。原书还写明:由于容量限制,回放缓存会周期性地删掉优先级较低的数据。 2

  21. 出处:「第12章 并行计算」第 436 段(text/17-ch12.txt:436,搜「环境是智能体需要与其交互的场景」)、第 442 段(text/17-ch12.txt:442,搜「系统中行动者通常指直接和环境进行交互的部分」)、第 450 段(text/17-ch12.txt:450,搜「回放存储缓冲区将会从所有行动者中收集探索」)、第 455 段(text/17-ch12.txt:455,搜「学习者是深度强化学习的关键组成部分」)、第 461 段(text/17-ch12.txt:461,搜「参数服务器是从学习者中收集所有信息并维护管理策略」)与第 467 段(text/17-ch12.txt:467,搜「一般性的分布式计算架构可以采纳其中元素组合形成」)。 2 3

  22. 出处:「第13章 Learning to Run」第 149 段(text/19-ch13-13-learning-to-run.txt:149,搜「因为与环境交互采样的过程一般是在」)与第 150 段(text/19-ch13-13-learning-to-run.txt:150,搜「整个过程的训练效率在实践中满足短板效应」)。原书还说,并行训练中怎么均衡这两类资源,在原书第 12 与第 18 章里都有讨论。

  23. 出处:「第13章 Learning to Run」第 168 段(text/19-ch13-13-learning-to-run.txt:168,搜「一个智能体和一个环境被封装进一个」)与第 170 段(text/19-ch13-13-learning-to-run.txt:170,搜「同一个 GPU 的进程数量和工作者数量可以被手动设置」)。

  24. 出处:「第13章 Learning to Run」第 245 段(text/19-ch13-13-learning-to-run.txt:245,搜「我们仍旧不能在这个任务上取得很好的表现」)与第 246 段(text/19-ch13-13-learning-to-run.txt:246,搜「非平滑甚至不可微的曲面」)。 2 3

  25. 出处:「第13章 Learning to Run」第 250 段(text/19-ch13-13-learning-to-run.txt:250,搜「即将奖励值除以训练过程中所采批样本」)、第 253 段(text/19-ch13-13-learning-to-run.txt:253,搜「熵强化学习算法可能对奖励函数的缩放敏感」)、第 266 段(text/19-ch13-13-learning-to-run.txt:266,搜「ELU 有负数值」)、第 291 段(text/19-ch13-13-learning-to-run.txt:291,搜「我们使用 3 作」)与第 293 段(text/19-ch13-13-learning-to-run.txt:293,搜「从而策略以重复」)。原书还说明,这里的动作重复不用最大化算子、也不堆叠帧,跳过与未跳过的样本都存进缓存。 2 3

  26. 出处:「第13章 Learning to Run」第 297 段(text/19-ch13-13-learning-to-run.txt:297,搜「智能体能够在 3 天的训练时长下学会用人类的」)与第 298 段(text/19-ch13-13-learning-to-run.txt:298,搜「训练是在一个 4GPU 和 56CPU 的服务器上进行的」)。原书还给了学习曲线,纵轴是一个片段内的累计奖励。 2

  27. 出处:「第13章 Learning to Run」第 178 段(text/19-ch13-13-learning-to-run.txt:178,搜「由于多进程的内存之间互相不共享」)与第 182 段(text/19-ch13-13-learning-to-run.txt:182,搜「但是智能体内的网络实际在多个工作者间共享」)。原书写明回放缓存和网络参数分别用两个不同的模块共享。

  28. 出处:「第13章 Learning to Run」第 270 段(text/19-ch13-13-learning-to-run.txt:270,搜「我们也对价值网络和策略网络的每个隐藏层使用层标准化」)、第 271 段(text/19-ch13-13-learning-to-run.txt:271,搜「层标准化对单个训练样本在某神经网络层上的神经元」)与第 274 段(text/19-ch13-13-learning-to-run.txt:274,搜「这些值在标准化之后和非线性激活之前被添加到神经元的值上」)。

  29. 出处:「第13章 Learning to Run」第 27 段(text/19-ch13-13-learning-to-run.txt:27,搜「我们在这个项目中使用的环境相比挑战赛中使用的有所简化」)、第 42 段(text/19-ch13-13-learning-to-run.txt:42,搜「这些腰肌强度值被设为 0.0」)与第 46 段(text/19-ch13-13-learning-to-run.txt:46,搜「无障碍物出现」)。