总结回顾一下近期学习的RL算法,并给部分实现算法整理了流程图、贴了代码。
基于价值算法是通过对agent所属的environment的状态或者状态动作对进行评分。对于已经训练好的模型,agent只需要根据价值函数对当前状态选择评分最高的动作即可;对于正在训练的模型,我们通常将目标值(真实行动带来的反馈)和价值函数的预测值的差距作为loss训练价值函数。通常使用两种价值函数:
value-based通常和贪婪策略一起使用,网络输出动作的价值后选择最大价值的方法,当最优策略是随机策略(比如环境是剪刀石头布)时,往往效果不佳;同时由于需要输出奖励使得无法将动作映射到一个分布中,因此对于连续动作无能为力。
"""ReplayMemoryofNetureDQN"""classReplayMemory:def__init__(self,max_size):self.buffer=collections.deque(maxlen=max_size)defappend(self,exp):self.buffer.append(exp)defsample(self,batch_size):mini_batch=random.sample(self.buffer,batch_size)obs_batch,action_batch,reward_batch,next_obs_batch,done_batch=[],[],[],[],[]forexperienceinmini_batch:s,a,r,s_p,done=experienceobs_batch.append(s)action_batch.append(a)reward_batch.append(r)next_obs_batch.append(s_p)done_batch.append(done)returnnp.array(obs_batch).astype('float32'),\np.array(action_batch).astype('int32'),np.array(reward_batch).astype('float32'),\np.array(next_obs_batch).astype('float32'),np.array(done_batch).astype('float32')def__len__(self):returnlen(self.buffer)后续优化版本:
SumTree以及记忆库代码如下:
神经网络模型的代码如下:
PolicyGradient这种基于策略算法要做的,就是最大化奖励期望`Rθ;而像dqn这种基于价值要做的,是最大化奖励Rθ。policy-based流程如下:更新网络参数θ--如何更新使得期望最大化--朝梯度上升方向更新
PolicyGradient算法可以根据更新方式分为两大类:MC更新方法:Reinfoce算法;TD更新方法:Actor-Critic算法;
与value-based方法的区别:
细节:
优点:
缺点:
优化:
代码如下:
A2C代码如下:
DDPG常见的问题是已经学习好的Q函数开始显著地高估Q值,然后导致策略被破坏了,因为它利用了Q函数中的误差。为了解决这个问题,TD3的作者使用了三个技巧来优化:
TD3代码如下(我的TD3实验效果不好,这里放出原作者的代码,带一点注释):