从零开始《深度强化学习》——(四)多智能体强化学习

· · 科技·工程

前情回顾:从零开始《深度强化学习》——(三)策略学习

并行计算

并行计算基础

并行梯度下降

下面的对并行计算的讲解都以梯度下降为具体例子。

对于训练数据 (x_1,y_1),(x_2,y_2),...,(x_n,y_n) 定义最小二乘问题

\min_w\quad \left\{L(w)\overset{\underset{\triangle}{}}{=}\frac{1}{2n}\sum_{j=1}^n(x_j^\top w-y_j)^2\right\}

可以用梯度下降方法

w\leftarrow w-\eta\nabla_w L(w)

我们令

g(s_j,y_j;w)\overset{\underset{\triangle}{}}{=}(x_j^\top w-y_j)x_j

则有

\nabla_w L(w)=\frac{1}{n}\sum_{j=1}^ng(x_j,y_j;w)

我们假设 x_j,w\in\mathbb R^d,有 m 块处理器做并行计算,时间复杂度为 \mathcal O(\frac{nd}{m}),实操中,将 n 个数据均分为 m 份分给 m 个处理器并行计算对应份中数据的 g 即可。

MapReduce

并行计算需要在计算机集群上完成。一个集群有很多处理器和内存条,它们被划分到多个节点 (Compute Node) 上。一个节点上可以有多个处理器,处理器可以共享内存。节点之间不能共享内存,即一个节点不能访问另一个节点的内存。

为了协调节点的计算和通信,需要有相应的软件系统。MapReduce 是由 Google 开发的一种软件系统,用于大规模的数据分析和机器学习。MapReduce 原本是软件系统的名字,但是后来人们把类似的系统架构都称作 MapReduce。

用 MapReduce 实现并行梯度下降

我们需要把数据集 (x_1,y_1),(x_2,y_2),...,(x_n,y_n) 划分到 m 个 Worker 节点上,每个节点上存一部分数据,这种划分方式叫做数据并发(与数据并发相对的是模型并发 (Model Parallelism),即将模型参数 w 划分到 m 个 Worker 节点上)。

那么我们假设 \mathcal I_1,\mathcal I_2,...,\mathcal I_m 是集合 \{1,2,...,n\} 的一个划分,则并行梯度下降的步骤:

  1. 广播 (Broadcast):服务器将当前的模型参数 w 广播到 m 个 Worker 节点。

  2. 映射 (Map): 这一步让 m 个 Worker 节点做并行计算,用本地数据计算梯度。这样第 k 号 Worker 节点得到向量集合 \{(x_j^\top w-y_j)x_j\}_{j\in\mathcal I_k}

  3. 规约 (Reduce):在做完映射之后,每个 Worker 节点首先会规约自己本地的梯度和:

\tilde g^k\overset{\underset{\triangle}{}}{=}\sum_{j\in\mathcal I_k}(x_j^\top w-y_j)x_j

再将 \tilde g^k(k=1,2,...,m) 发送给服务器,求

\nabla_w L(w)=\frac{1}{n}\sum_{k=1}^m \tilde g^k

这样只需要传递 md 个(浮点)数,而非不采用并行计算时的 nd 个。

  1. 梯度下降:
w\leftarrow w-\eta\nabla_w L(w)

并行计算的代价

一般有两种时间:

定义加速比 (Speedup Ratio) 来衡量并行计算带来的速度提升:

\text{加速比}=\frac{\text{使用一个节点所需的钟表时间}}{\text{使用}\;m\;\text{个节点所需的钟表时间}}

通信量 (Communication Complexity) 的意思是有多少个比特或者浮点数在服务器与 Worker 节点之间传输,并行梯度下降的通信量是 \mathcal O(nd)

延迟 (Latency) 是由计算机网络的硬件和软件系统决定的。

通信时间主要由通信量和延迟造成。我们无法准确预估通信时间(指的是钟表时间),除非实际做实验测量。但我们不妨用下面的公式粗略估计通信时间:

\text{通信时间}\approx\frac{\text{通信量}}{\text{宽带}}+\text{延迟}

同步与异步

上文介绍的并行梯度下降属于同步算法 (Synchronous Algorithm),即在所有 Worker 节点都完成映射 (Map) 的计算之后,系统才能执行规约 (Reduce) 通信。

实际软硬件系统中存在负载不平衡、软硬件不稳定、I/O 速度不稳定 等因素。因此 Worker 节点会有先后、快慢之分,不会恰好在同一时刻完成任务。同步要求每一轮都必须等待所有节点完成计算,这势必导致“短板效应”,即任务所需时间取决于最慢的节点。会出现 Straggler Effect,意思是一个节点的速度远慢于其余节点,导致整个系统长时间处于 空闲状态,等待最慢的节点。

而将同步屏障去掉,得到的算法就叫做异步算法 (Asynchronous Algorithm)。在异步算法中,一个 Worker 节点无需等待其余节点完成计算或通信。当一个 Worker 节点完成计算,它立刻跟 Server 通信,然后开始下一轮的计算。异步算法避免了等待,节点几乎没有空闲的时间,因此系统的利用率很高。利用一步算法计算梯度下降的步骤为:

在理论上,异步梯度下降的收敛速度慢于同步算法,即需要更多的计算量才能达到相同的精度。但是实践中异步梯度下降远比同步算法快(指的是钟表时间),这是因为异步算法无需等待,Worker 节点几乎不会空闲,利用率很高。

并行强化学习

异步并行双 Q 学习

w\leftarrow w-\alpha \tilde g^k

A3C: 异步并行 A2C

\hat y_t=r_t+\gamma v(s_{t+1};w^-) \delta_t=v(s_t;w)-\hat y_t

做累积梯度,即将 \delta_t\nabla_\theta\ln \pi(a_t|s_t;\theta)\delta_t\nabla_w v(s_{t};w) 分别相加,记为 \tilde g^k_\theta\tilde g^k_w(也可以取 b 个样本的平均值),发送给服务器。

多智能体系统

智能体系统 (Multi-Agent System,缩写 MAS) 中包含 m 个智能体,智能体共享环境,智能体之间会相互影响。具体地,一个智能体的动作会改变环境状态,从而影响其余所有智能体。

与并行计算不同,智能体之间会相互影响,而并行计算中智能体之间完全独立,不会相互影响。

多智能体强化学习 (Multi-Agent Reinforcement Learning,缩写 MARL) 是指让多个智能体处于相同的环境中,每个智能体独立与环境交互,利用环境反馈的奖励改进自己的策略,以获得更高的回报(即累计奖励)。

多智能体强化学习有四种常见设定:

专业术语和单智能体一致,只需要用上标表示智能体编号即可。

合作关系设定下的多智能体强化学习

在多智能体系统中,一个智能体未必能观测到全局状态 S,设第 i 号智能体有一个局部观测,记为 O^i,它是 S 的一部分,不妨假设所有的局部观测的总和构成全局状态,即

S=[O^1,O^2,...,O^m]

MARL 的文献大多采用这种假设,用一张图形象说明各种术语以及设定:

合作关系设定下的策略学习

由前面所讲:

R^1=R^2=...=R^m\overset{\underset{\triangle}{}}{=}R

那么

U^1=U^2=...=U^m\overset{\underset{\triangle}{}}{=}U

进一步地,每个智能体的 Q_\piV_\pi 都相同。

通常来说,对于策略函数 \pi(A^1|S;\theta^1),\pi(A^2|S;\theta^2),...,\pi(A^m|S;\theta^m)i\not=j,有 \theta^i\not=\theta^j

策略学习的目标函数

J(\theta^1,...,\theta^m)=\mathbb E_S[V_\pi(S)]

那么策略学习可以写作

\max_{\theta^1,...,\theta^m} J(\theta^1,...,\theta^m)

只需让第 k(1\leq k\leq m) 号智能体执行

\theta^k\leftarrow \theta^k+\alpha^k \nabla_{\theta^k}J(\theta^1,...,\theta^m)

合作设定下的多智能体 A2C (MAC-A2C)

我们无法直接计算 \nabla_{\theta^k}J(\theta^1,...,\theta^m),可以仿照从零开始《深度强化学习》——(三)策略学习中的 A2C 方法进行近似。

我们 m 个智能体公用一个价值网络 v(s;\theta),用于对 V_\pi(s;\theta) 近似。每个智能体都有一个自己的策略网络 \pi(a^i|s;\theta^i)

tips:这部分的 s 都是 m 个智能体观测的集合,形如 [o^1,o^2,...,o^m],不再单独指出。

对于价值网络 v(s;\theta) 的训练,和单智能体 A2C 一致。

对于策略网络的训练,我们首先类比给出合作关系 MARL 的策略梯度定理:

\boxed{\nabla_{\theta^k}J(\theta^1,...,\theta^m)=\mathbb E_{S,A}\left[(Q_\pi(S,A)-b)\nabla_{\theta^k}\ln \pi(A^k|S;\theta^k)\right]}

其中 b 是是不依赖于 A 的任意函数(基线),期望中 A 的概率密度函数

\pi(A|S;\theta^1,...,\theta^m)\overset{\underset{\triangle}{}}{=}\prod_{k=1}^m\pi(A^k|S;\theta^k)

因此 \tilde g^k(s,a;\theta^k)=(Q_\pi(S,A)-b)\nabla_{\theta^k}\ln \pi(A^k|S;\theta^k) 是对 \nabla_{\theta^k}J(\theta^1,...,\theta^m) 的无偏估计,我们取 b=V_\pi(S),利用贝尔曼方程近似 Q_\pi(s_t,a_t)=r_t+\gamma v(s_{t+1};w),于是

g^k(s_t,a_t;\theta^k)&\overset{\underset{\triangle}{}}{=}(r_t+\gamma v(s_{t+1};w)-v(s_t;w))\ln \pi(a_t^k|s_t;\theta^k) \\&=-\delta_t\ln \pi(a_t^k|s_t;\theta^k) \end{aligned}

然后做梯度下降即可。

实际操作时可以添加目标网络减小误差,MAC-A2C 属于同策略 (On-policy),不能使用经验回收。

在 MARL 的常见设定下,第 i 号智能体只知道 o^i,但是观测不到全局的 s,为了解决这个局限性,一方面可以让智能体共享观测,每个智能体把自己的 o^i 传输给其他智能体;另一方面可以对策略网络和价值函数做近似,通常使用 \pi(a^i|o^i;\theta^i) 替代 \pi(a^i|s;\theta^i)。甚至可以进一步用 v(o^i;w^i) 代替 v(s;w)

tips:还可以用

Q^{-i}_\pi(s,a^{-i})\overset{\underset{\triangle}{}}{=}\mathbb E_{A^i}[Q_\pi(s,A^i,a^{-i})]

做基线 b(代替 V_\pi(s)),其中 a^{-i}=[a_1,...,a^{i-1},a^{i+1},...,a^m],这种方法叫 COunterfactual Multi-Agent,缩写 COMA。COMA 的表现略好于 MAC-A2C,但是 COMA 的实现很复杂。

三种架构

实际应用中,MAC-A2C 的实现有三种常见的架构(实现方法):

中心化训练 + 中心化决策

在时刻 tt+1,中央控制器收集到所有智能体的观测值

s_t=[o_t^1,o_t^2,...,o_t^m]\quad s_{t+1}=[o_{t+1}^1,o_{t+1}^2,...,o_{t+1}^m]

且中央控制器直接从环境中观测或知道所有智能体本地的奖励 \tilde r_t^i 的加和,即奖励 r_t

由于决策是中央控制器上的策略网络做出的,中央处理器也知道 a_t=[a_t^1,a_t^2,...,a_t^m]。于是可以直接利用上文所讲的 MAC-A2C 的训练方式训练即可。

在决策时,按照 \pi(\cdot|s_t;\theta^i)a_t^i 的决策,将其发送给对应的第 i 个智能体执行即可。

这种方式完全按照 MAC-A2C 的算法实现,没有做任何改动,因此可以确保正确性。信息的完整性使得算法作出的决策可以更好;但是可能会有较大的延迟(Latency),影响训练和决策的速度。

去中心化训练 + 去中心化决策

不再过于详细的赘述,实际上就是在第 i 个智能体上训练 \pi(a^i|o^i;\theta^i)v(o^i;w^i),这样每个智能体都可以独自地完成自己的训练过程,而不需要和中控制器做数据上的交互。这种训练方法在实践中效果往往不佳。

实际上,去中心化训练的本质就是单智能体强化学习 (SARL),而非多智能体强化学习 (MARL)。

决策时,直接利用 a_t^i\sim\pi(\cdot\mid o^i;\theta^i) 做决策即可。

中心化训练 + 去中心化决策

对于策略网络 \pi(a^i|s;\theta^i),用 o^i 来代替 s;而对于价值网络 v(s;w) 的训练,s 则利用全局的观测 [o^1,o^2,...,o^m] 来代替,且 w 是中央控制器的统一参数。

决策仍是去中心化决策,直接利用 a_t^i\sim\pi(\cdot\mid o^i;\theta^i) 做决策即可。

tips:三方法均可以用目标网络进行优化;对与中心化训练方式,目标网络参数 w^- 是中央控制器统一的参数;而对于去中心化训练方式,每一个智能体都有不同的 w^{i-} 参数。

三种方式的对比如图:

非合作关系设定下的多智能体强化学习

此时不同智能体的 V_\pi^i(s) 不再相同,因此 J 也有多个

J^i(\theta^1,...\theta^m)=\mathbb E_S[V_\pi^i(S)]

i 个智能体目标

\max_{\theta^1,...,\theta^m} J^i(\theta^1,...,\theta^m)

可见不同智能体没有共同的目标,基本思想仍然是梯度上升法。

在非合作关系设定下,收敛标准是纳什均衡。在纳什均衡的情况下,每一个智能体都在以最优的方式来应对其他各方的策略。在纳什均衡的情况下,谁也没有动机去单独改变自己的策略,因为改变策略不会增加自己的收益。

公式地讲,在多智能体系统中,当其余所有智能体都不改变策略的情况下,一个智能体 i 单独改变策略 \theta^i ,无法让其期望回报 J^i(\theta^1,...,\theta^m) 变大,那么这个多智能体系统就达到了纳什均衡。

对于双智能体系统,我们可以让两个智能体的对立面互相对决,记录不同训练对象平均回报,作为评判训练模型优劣的手段。

非合作设定下的多智能体 A2C (MAN-A2C)

与 MAC-A2C 不同的是,每个智能体都有一个价值网络 v(s;w^i)。这个变化不影响策略网络的训练,因此和 MAC-A2C 一致,唯一不同的仍然是要对 w^i 分别做梯度下降。

三种架构

和 MAC-A2C 一致,MAN-A2C 也有三种架构(下面不再加以描述决策的区别):

  1. 中心化训练 + 中心化决策:中央控制器有 2m 个(或 3m 个神经网络),严格按照 MAN-A2C 训练即可。

  2. 去中心化训练 + 去中心化决策:将神经网络修改为 v(o^i;w^i)\pi(a^i|o^i;\theta^i),每个智能体上部署一个策略网络和一个价值网络(和一个目标网络)即可。

  3. 中心化训练 + 去中心化决策:将 \pi(s^i|o^i;\theta^i) 部署到第 i 个智能体上,在中央控制器上部署价值网络(和目标网络),不对 s 替代(直接用 [o^1,o^2,...,o^m])。

连续控制与 MADDPG

设系统里有 m 个智能体。每个智能体对应一个策略网络 \mu(o^i;\theta^i) 和一个价值网络 q(s,a;w)

由于

\nabla_{\theta^i}J^i(\theta^1,...,\theta^m)&=\nabla_{\theta^i}\mathbb E_{S=[O^1,...,O^m]}[q(S,[\mu(O^1;\theta^1),...,\mu(O^m,\theta^m)];w^i)] \\ &=\mathbb E_{S=[O^1,...,O^m]}[\nabla_{\theta^i}q(S,[\mu(O^1;\theta^1),...,\mu(O^m,\theta^m)];w^i)] \end{aligned}

我们实际操作中可以从经验回放数组(是异策略算法,取经验回放数组时可以取 a^i=\mu(o^i;\theta^i)+\epsilon)中抽取一个状态

s_t=[o_t^1,...,o_t^m]

计算 \forall i,\hat a_t=\mu(o_t^i;\theta^i),于是利用蒙特卡洛近似,将 \nabla_{\theta^i}J^i(\theta^1,...,\theta^m) 近似为

\tilde g^i_\theta&=\nabla_{\theta^i}q(s_t,[\hat a_t^1,...,\hat a_t^m];w^i) \\&=\nabla_{\theta^i}\mu(o_t^i;\theta^i)\nabla_{\hat a^i}q(s_t,[\hat a_t^1,...,\hat a_t^m];w^i) \end{aligned}

就可以做梯度上升:

\theta^i\leftarrow \theta^i+\beta \tilde g_\theta^i

而对于价值网络,计算 TD 目标和 TD 误差

\hat y_t^i=r_t^i+\gamma q(s_{t+1},[\hat a_{t+1}^1,...,\hat a_{t+1}^m];w^i)\quad \delta_t^i=q(s_t,[\hat a_{t}^1,...,\hat a_{t}^m];w^i)-\hat y_t^i

做梯度下降

w^i\leftarrow w_i-\alpha \delta_t^i\nabla_{w_i} q(s_t,[\hat a_{t}^1,...,\hat a_{t}^m];w^i)

可以看到,我们从经验回放数组中抽取一个四元组后,我们还需要所有的策略网络用于训练 \theta^i,于是必须采用中心化训练方式。

而决策时一般采用去中心化决策,取 a^i=\mu(o^i;\theta^i) 为第 i 个智能体基于本地观测的 o^i 的决策。

对于 MADDPG 算法,还有一些可行的优化思路:

注意力机制与多智能体强化学习

自注意力机制

注意力机制 (Attention) 最初用于改进循环神经网络 (RNN),提高Sequence-to-Sequence(Seq2Seq) 模型的表现。自注意力机制 (Self-Attention) 是注意力机制的一种扩展,不局限于 Seq2Seq 模型,可以用于任意的 RNN。

当一个问题有如此特点:

就要用到自注意力机制解决。

自注意力层有三个矩阵:W_q\in\mathbb R^{d_{q}\times d_{\text{in}}}W_k\in\mathbb R^{d_{q}\times d_{\text{in}}}W_v\in\mathbb R^{d_{\text{out}}\times d_{\text{in}}},参数数量与 m 无关(d_q 是一个需要调试的超参数)。

  1. 我们首先做映射,每个 x 对应三个变量:
q^i=W_qx^i\quad k^i=W_kx^i\quad v^i=W_vx^i
  1. 接下俩计算权重向量 (\alpha^1,...,\alpha^m),其中每个权重向量都是 m 维的列向量:
\alpha^i=\text{softmax}\left(\left\langle q^i,k^1\right\rangle,\left\langle q^i,k^2\right\rangle,...,\left\langle q^i,k^m\right\rangle\right) 3. 计算 $c^i$,即是 $v$ 按照 $\alpha^i$ 的加权平均: $$c^i=[v^1,v^2,...,v^m]\alpha^i=\sum_{j=1}^m\alpha_j^iv^j$$ 这种神经网络叫做单头自注意力层 (Single-Head Self-Attention Layer),简称“单头”。实际应用中更多采用多头自注意力层 (Multi-Head Self-Attention Layer)(简称“多头”)。 多头由 $l$ 个单头构成,记第 $k(1\leq k\leq l)$ 个单头的输出为 $(c_k^1,c_k^2,...,c_k^m)$,那么多头的输出是对这 $l$ 个单头输出的拼接,即 $$c^i=[c^i_1,c^i_2,...,c^i_l]$$ ## 自注意力在中心化训练中的应用 自注意力机制 (Self-Attention) 是改进多智能体强化学习 (MARL) 的一种有效技巧,可以应用在中心化训练或中心化决策当中。 我们考虑先用神经网络将 $[o^1,o^2,...,o^m]$(和 $[a^1,a^2,...,a^m]$(如果有的话))对应的项用神经网络得到 $x^i$,再用(多头)自注意力层输出 $c^i$,作为训练全连接层网络的特征。 tips:实际上实现了一定程度的降维(将要看所有的 $o$ 转变成看一部分重要的)。 在决策时也可以加一个自注意力层用来将 $[o^1,o^2,...,o^m]$ 做一定转化。 如果系统架构使用中心化训练,那么 $m$ 个价值网络可以用一个神经网络实现,其中使用自注意力层。如果系统架构使用中心化决策,那么 $m$ 个策略网络也可以实现成一个神经网络,其中使用自注意力层。 ------------ tips:后面还有一部分『应用与展望』,其中的核心内容基本就只有 MCTS(蒙特卡洛树搜索)了,这部分就不记录了。 完结撒花!!