MADDPG 分析及其更新策略见解
引⼦
深度强化学习可以分为两类:单智能体算法和多智能体算法,单智能体算法从DQN开始有policy gradient、actor critic、dpg、ppo、ddpg、sac等等,它们解决的是环境中存在⼀个智能体的情况(或者是多个智能体可以转化为⼀个智能体决策的情况),但是在某些环境(environment)下,似乎单智能体算法就有些⼼有余⽽⼒不⾜,例如⾜球⽐赛亦或是追逐游戏。如果依旧对每个agent采⽤单智能体算法会出现如下情况:在第个agent做出动作的情况下由于其余agent的动作未知,会导致第个agent收到的奖励不稳定,也就是对于单个agent来说,环境是不稳定(unstable)的。
从另⼀个⽅⾯来考虑,⼤多数DRL算法都沿⽤了其开⼭⿐祖DQN的replay buffer机制,即在⼀个合适的时机通过sample buffer得到⽆序的训练数据⽤以训练⽹络,但在⼀个不稳定的环境下可能出现下⾯情况:buffer中存在相同状态、相同动作下奖励reward却不同的数据,这会直接导致训练的震荡,甚⾄是崩溃。
多智能体深度强化学习的算法应运⽽⽣,这篇blog主要介绍⼀种DDPG算法的多智能体版本,即MADDPG算法(Multi-Agent Deep Deterministic Policy Gradient)。
核⼼思想
不想讲很多没⽤的。如果有DDPG基础的应该知道DDPG有4个⽹络:actor,target_actor,critic,target_critic。其中带target的⽹络是定期由其对应⽹络复制参数⽽来(可以全复制也可以采⽤soft update机制)。actor⽹络我们也可以叫它策略⽹络,负责为agent做决策,其输⼊为agent的状态state,critic⽹络我们⼀般称其为批评家,负责评估actor做这个决策的价值,⽤Movan的⼀句话就是critic像是坐在actor头上的指挥家⼀样,凭借其长远的⽬光教导actor做出越来越好的决策。因此critic⽹络的输⼊为状态加动作即state+action,⽤RL的通⽤术语讲,这个critic就是常听到的函数。值得注意的是,单智能体DDPG的critic⽹络输⼊的仅仅是该agent的state和action,并不涉及其他agent的信息,因此直接使⽤单智能体算法在多智能体环境中会出现因⽆法获取够信息从⽽训练效果不好的问题。 MADDPG与DDPG的最⼤不同在于critic⽹络,你不是说信息获取得不够吗?⾏,我给你critic更多的信息,这⾥给出原论⽂的更新critic⽹络的公式加以说明:
观察它函数的输⼊为其中很好理解,为其他所有agent的动作,在原⽂中的描述如下:In the simplest ca,x could consist of the obrvations of all agents, x = (o1, …, oN), however we could also include additional state information if available. 在⼀般的情况下取所有agent的状态。讲到这⾥其实发现MADDPG看着复杂其实简单,就是critic从原来的只注重⾃⾝的经验到现在的注重全局经验。⼀句话概括:分布式的actor和集中式的critic 。何谓分布式actor,即actor的输⼊只使⽤了其⾃⾝的状态state ⽽没有其他agent状态的输⼊,在测试阶段只需要每个actor对每个agent做出指导即可。何谓集中式critic,critic集中了环境中的所有信息
⽤以指导其actor。引⽤原⽂的⼀张图加以说明MADDPG的思想:
更新⽅式
critic的更新⽅式之前已经给出公式了,说⽩了就是TD式更新,与单智能体的DDPG如出⼀辙。
既然critic是对actor的“评委”,即critic输出的是对actor的“认可度”,那么actor的更新⽅向⾃然是向着让critic给⾃⼰打更⾼分的⽅向,即:
个⼈不太喜欢这种⾼深的公式表达,⼀句话说明⽩就是actor的loss是对应critic输出的值加个负号(深度学习架构是最⼩化loss,即最⼤化值,即最⼤化critic的打分)。
普林斯顿大学简介>厘米的英文附上⼀段torch更新MADDPG⽹络的核⼼代码(可能没有上下⽂会难懂⼀点):i a i a ,j =j i i reward Q L θ=(i )E Q x ,a ,…,a −y ,y =x ,a ,r ,x ′[(i μ(1N ))2]r +i γQ x ,a ,…,a i μ′(′1′N ′)∣∣∣
a =μo j ′j ′(j )Q x ,a ,…,a 1N a ,…,a 1N x x ∇J μ=θi (i )E ∇μa ∣o ∇Q x ,a ,…,a ,
x ,a ∼D [θi i (i i )a i i μ
(1N )∣a =μo i i (i )]Q Q
for agent_idx,(actor_c, actor_t, critic_c, critic_t, opt_a, opt_c)in \
enumerate(zip(actors_cur, actors_tar, critics_cur, critics_tar, optimizers_a, optimizers_c)):
_obs_n_o, _action_n, _rew_n, _obs_n_n, _done_n = memory.sample(
arglist.batch_size, agent_idx)
rew = sor(_rew_n, device=arglist.device, dtype=torch.float)
done_n = sor(_done_n, device=arglist.device, dtype=torch.float)
action_cur_o = torch.from_numpy(_action_n).to(arglist.device, torch.float)
obs_n_o = torch.from_numpy(_obs_n_o).to(arglist.device, torch.float)
obs_n_n = torch.from_numpy(_obs_n_n).to(arglist.device, torch.float)
action_tar = torch.cat([a_t(obs_n_n[:, obs_size[idx][0]:obs_size[idx][1]]).detach() \
for idx, a_t in enumerate(actors_tar)], dim=1)
q = critic_c(obs_n_o, action_cur_o).reshape(-1)# q
_grad():
q_ = critic_t(obs_n_n, action_tar).reshape(-1)# q_
tar_value = q_ * arglist.gamma *(1- done_n)+ rew # q_*gamma*done + reward
mojing
loss_c = MSELoss()(q, tar_value)# bellman equation
_grad()
loss_c.backward()
opt_c.step()
testmode# --u the data to update the ACTOR
zimu# There is no need to cal other agent's action
步步高英语学习机
policy_c_new = actor_c(
obs_n_o[:, obs_size[agent_idx][0]:obs_size[agent_idx][1]])
# update the aciton of this agent
action_cur_o[:, action_size[agent_idx][0]:action_size[agent_idx][1]]= policy_c_new
loss_a = torch.mul(-1, an(critic_c(obs_n_o, action_cur_o)))
_grad()
loss_a.backward()
opt_a.step()
伪代码
在具体实现细节上⽹上的代码都会存在些许出⼊,但整体框架按照上图来就是没错的。
优势和劣势
原⽂给出了⼀些实验结果:scream什么意思
在这个环境的实验中传统的单智能体算法基本就不work。
这个环境中单智能体算法work但效果不如多智能体算法。
多智能体算法MADDPG也存在⼀个严重的问题,当agent数量增多时critic的输⼊维度也线性增长,导致⽹络更难训练和收敛,这也是原⽂对未来⼯作的阐述。⽽单智能体可没这问题,因此在⼀些多智能体的环境下可以先试试单智能体的效果如何,如果不⾏再尝试多智能体。英语词霸
调参与⼀些帮助加速收敛的trick
如果发现reward收敛出现⼤范围震荡,或者训练出来的⽹络输出恒值,可能是学习率有点⼤,⼀般设置成1e-3不会出⼤问题。
深度强化学习加速⽹络收敛的trick(针对确定性策略算法,像基于策略的算法就不需要这样了):
1. 初期直接sample动作空间,不⽤actor,这样保证了样本较⼤的探索空间。
2. 中后期使⽤actor选择动作,并加⾼斯噪声,且让噪声的⽅差逐渐减⼩(定期乘以衰减引⼦0.999…),当噪声越⼩,reward收敛越
稳定。
3. 前期只采样不学习,等buffer储存了⾜够样本后开始边采样边学习。
4. 如果发现reward收敛还是不理想,可以试着增加⽹络的中间单元个数(注意不是层数,在DRL中层数多了反⽽不⾏,⼀般3-4层即
可)
ipam>圣诞快乐的英文