文章目录
COMA 是一种基于 Policy-Based 的多智能体算法,其核心思想是在于 “独立回报分配”。当多个智能体在执行任务时,获得的奖励分数是由所有智能体的行为共同决定的,那么怎么把一个奖励分数合理的分配给每一个智能体呢?这就是 COMA 算法要解决的关键问题。在网络结构上,COMA 沿用了 Actor-Critic 架构,其中 Actor 使用基于 Policy-Based 的 RNN 网络。
1. COMA 解决了什么问题(Motivation)
COMA 是一种解决多智能体强化学习问题的算法,对于大多数多智能体强化学习问题(MARL)都面临着同样一个问题:信度分配(也叫回报分配)。
这是指,当多个 Agent 在同时执行任务时,我们应该怎样合理的去评价每一个 Agent 的行为效用,举个例子:
假设我们现在正在训练一个算法模型,使用该算法模型去玩 MOBA 类游戏(DOTA 或者 LOL),算法模型需要同时操控 5 个英雄。在训练过程中遇到了这样一个情况:我方 3 个英雄迎面撞上了敌方 1 个英雄。此时,算法模型控制 1 号英雄和 2 号英雄对敌方英雄发起进攻,但却让 3 号英雄撤退。那么最终,因为 2 打 1 的局面,我方成功击败对方英雄,获得了 10 分的奖励分(Reward),那么我们该怎样为我方的这 3 个英雄进行奖励分配?
在上面案例中,我们很明显能看出,在人数占优势的情况下,算法选择让 1 号和 2 号英雄一起发起进攻是一次正确的尝试,而让 3 号英雄尝试撤退显然就不那么明智了。由于对 1 号和 2 号的正确决策,使得整个指挥策略得到了正向的奖励分(Positive Reward),但显然我们不能直接将这个正向奖励分同时应用到这 3 个英雄上。
我们希望被正确决策的英雄(1 号和 2 号)获得较高的奖励分,而被错误决策的英雄(3 号)获得负的惩罚分,即最后的期望得分可能为:1 号(8分),2 号(8分),3 号(-6分)。
三个英雄的得分总和加起来还是 10 分,只是每个英雄能够按照自己的实际情况获得对应的合理奖励分。
这就是 回报分配 的概念。
为了解决 Individual Reward Assignment 的问题,COMA 引入了一种叫做 “反事实准则(counterfactual baseline)” 的概念,这个概念是整篇论文的重点。
反事实准则提出,每个 agent 应该拥有自己独立的 reward,这样才能知道在这一次的全局行为决策中单个 agent 的 action 贡献是多少。即,通过 counterfactual baseline 来解决 “回报分配” 的问题。
2. COMA 怎么解决独立回报分配问题(Method)
2.1 核心思想 counterfactual baseline 的提出
在第一章节中我们提到,要想成功进行模型训练,我们就需要知道每个 agent 的独立回报究竟是多少。那么单个 agent 的 reward 该怎么去计算呢?
COMA 提出:可以将当前情况下的全局 reward 和将该 agent 行为替换为一个 “默认行为” 后的全局 reward 做差。我们可以这样理解:该回报值其实计算的是 Agent a a a 采取行为 u u u 会比采取默认行为 c a c_a ca 要更好( D a D^a Da > 0)还是更坏( D a D^a Da < 0)。
我们用 D a D^a Da 来表示单个 Agent 采取行为后的独立回报,计算公式如下:
D a = r ( s , u ) − r ( s , ( u − a , c a ) ) D^a = r(s, \textbf{u}) - r(s, (\textbf{u}^{-a}, c_a)) Da=r(s,u)−r(s,(u−a,ca))
其中, u − a \textbf{u}^{-a} u−a 代表联合动作空间除去当前Agent a a a 这一时刻采取的行为。 ( u − a , c a ) (\textbf{u}^{-a}, c_a) (u−a,ca) 代表当前Agent a a a 采取"默认行为" c a c_a ca 后所有Agent的联合动作空间。
上述 特定agent 的 特定动作 的 reward ( D a D^a Da)就被称为 counterfactual baseline,COMA 使得每一个 agent 的每一个 action 都会被计算出一个 counterfactual baseline。我们将在后面的章节结合代码来讲解这个 counterfactual baseline 究竟怎么计算。
2.2 算法大框架 —— 基于 AC 框架的 CTDE(Centralized Training Distributed Execution)模式
和主流多智能体强化学习算法一样,COMA 也利用 Center-Critic 和 Actor 来实现 “中心式学习,分布式执行” 的模式。即,在训练阶段输入全局信息给中心式 Critic,通过 中心 Critic 教会 Actor 如何来进行行为决策。
但和传统 AC 或是 QMIX 不一样,COMA 中的 Critic 并不直接估计状态值函数 V V V 或是全局总回报 Q t o t Q_{tot} Qtot,而是去估计一个 agent 在指定状态下所有可执行行为的 Q 值,并通过这些 Q 值完成 counterfactual baseline 的计算。在 2.4 章中我会详细讲解计算过程。
算法网络结构如下:
下面我们分别来看看 Actor 和 Critic 的详细设计。
2.3 Actor 网络设计
COMA 中每一个 Agent 都由 RNN 网络控制,在训练时你可以为每一个 Agent 个体都训练一个独立的 RNN 网络,同样也可以所有 Agent 复用同一个 RNN 网络,这取决于你自己的设计。
RNN 网络一共包含 3 层,输入层(MLP)→ 中间层(GRU)→ 输出层(MLP),实现代码如下:
class RNN(nn.Module):
# 所有 Agent 共享同一网络, 因此 input_shape = obs_shape + n_actions + n_agents(one_hot_code)
def __init__(self, input_shape, args):
super().__init__()
self.fc1 = nn.Linear(input_shape, args.rnn_hidden_dim)
self.rnn = nn.GRUCell(args.rnn_hidden_dim, args.rnn_hidden_dim) # GRUCell(input_size, hidden_size)
self.fc2 = nn.Linear(args.rnn_hidden_dim, args.n_actions)
def forward(self, obs, hidden_state):
x = F.relu(self.fc1(obs))
h_in = hidden_state.reshape(-1, self.args.rnn_hidden_dim)
h = self.rnn(x, h_in)
2898




被折叠的 条评论
为什么被折叠?



