前置基础:
DDPG
多智能体深度强化学习 # 多智能体深度强化学习基础
Multi-Agent:多智能体
Deep:与DQN类似,使用目标网络+经验回放
Deterministic:直接输出确定性的动作
Policy Gradient: 基于策略Policy来做梯度下降从而优化模型
MADDPG其实是在DDPG的基础上做的修改,而DDPG可以看作在DPG的基础之上修改而来,DPG是确定性输出的Policy Gradient;也可以把DDPG理解为让DQN可以扩展到连续控制动作空间的算法。
DDPG不适用于多智能体的环境(详细原因见MADRL基础),MADDPG算法是对DDPG算法为适应多Agent环境的改进,最核心的部分就是每个Agent的Critic部分能够获取其余所有Agent的动作信息,进行中心化训练和非中心化执行,即在训练的时候,引入可以观察全局的Critic来指导Actor训练,而测试的时候只使用有局部观测的actor采取行动。
以两个agent为例, 当模型训练好后,只需要两个actor与环境交互,即只需要绿色的循环。这里区别于单个agent的情况,每个agent的输入状态是不一样的。环境输出下一个全信息状态S_all后,actor1和actor2只能获取自己能够观测到的部分状态信息S1,S2。
在训练过程中,critic1和critic2可以获得全信息状态,同时还能获得两个agent采取的策略动作a1,a2。也就是说,actor虽然不能看到全部信息,也不知道其他actor的策略,但是每个actor有一个上帝视角的导师,这个导师可以观测到所有信息,并指导对应的actor优化策略。
下载openai/MADDPG的源码
dependencies: Python (3.5.4),OpenAI gym (0.10.5), tensorflow (1.8.0), numpy (1.14.5)
实现:
conda create -n maddpg python=3.6
一定要用3.6,3.5导致grpcio无法安装,坑特别多。
(通过pip安装,conda install不行)
然后下载Multi-Agent Particle Environments (MPE)
在源码目录下执行:
pip install -e .
然后回到maddpg源码下,再次执行上述代码。
最后进入maddpg/experiments执行下面代码:
python train.py --scenario simple
另外,OpenAI开源的MADDPG官方源码有一个小错误,可能导致如下报错:
Traceback (most recent call last):File “train.py”, line 193, intrain(arglist)File “train.py”, line 182, in trainrew_file_name = arglist.plots_dir + arglist.exp_name + ‘_rewards.pkl’TypeError: can only concatenate str (not “NoneType”) to str
修改train.py第182行为
rew_file_name = str(arglist.plots_dir) + str(arglist.exp_name) +'_rewards.pkl'
第185行为:
agrew_file_name = str(arglist.plots_dir) + str(arglist.exp_name) +'_agrewards.pkl'
Traceback (most recent call last):File "train.py", line 193, in <module>train(arglist)File "train.py", line 183, in trainwith open(rew_file_name, 'wb') as fp:FileNotFoundError: [Errno 2] No such file or directory: './learning_curves/None_rewards.pkl'
他比较蠢,不能自己建目录,所以需要人为在experienments下面建子目录learning_curves。
显示可视化界面:
训练完数据后,进行可视化,只需运行代码:python train.py --scenario +环境的名称 --display即可。例如:
python train.py --scenario simple_tag --display
如果还想了解MADDPG的论文和原理部分请阅读后文。
假设现在有两个智能体A和B,对于A来说,B是它的环境中的一部分,当B采取动作改变了自身状态,那么对于A来说它的环境也变了,更何况两智能体之间存在竞争和合作的关系,如果一方的策略变了,那么另一方所做的估计(经验)也不能适用。
对于policy gradient方法,在要求多智能体协作的时候通常会有很高的方差,因为智能体的reward通常取决于许多智能体的动作,智能体自己的动作的reward表现出更多的可变性,从而增加了其梯度的方差。
但是如果我们能够知道其他agent的policy,action那么就有:
可以看到在Critic网络中有:obs_dim = dim_observation * n_agent
和act_dim = self.dim_action * n_agent
其他部分和DDPG几乎相同。
MADDPG存在哪些问题,可以怎么改进?
(1)因为我们需要知道其他agent的policy,这是一个很强的假设,为了解决它我们可以用一个函数来拟合其他agent的策略(inferring policy)。
(2)我们利用了其他agent的policy来学习,这样有可能会过拟合,比如说几个agent之间本来是合作的关系,如果突然变成了竞争关系那么之前学到的policy就会受到很大影响,为了解决这个问题,我们可以采用 ensemble policy,即每个episode都随机的选取一部分sub-policy。
Reference
《Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments》 NIPS from openaiopenai/MADDPG的githubLearning to Cooperate,Compete, and Communicate用多智能体强化学习算法MADDPG解决"老鹰捉小鸡"问题基于PARL的MADDPG实现多智能体深度强化学习——MADDPG算法代码分析(tensorflow)多智能体强化学习之MADDPG这篇讲了很多数学部分。