强化学习(Reinforcement Learning)学习笔记
前言
根据讲义为网易云课堂的强化学习(Python):https://study.163.com/course/courseMain.htm?courseId=1003598006
github代码:https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/tree/master/contents
Q-learning
Tips:此处的Q(s,a)表示在s状态下进行a动作的得分,ε-greedy的意思是我们面对每个状态的Q表时,有ε的概率直接按照表中最优值选择下一步行动,而1-ε概率随机动作。这时候对每步的Q进行更新,α为学习率。Q(s1,a2)现实的意思是,假设s1时选择了a2到达s2,然后采取某种行为,这里取大得分的行为,然后把该行为即Q(s2,a2)乘上γ并加上奖励r,这样得到的R表示我从s1开始实实在在选择a2这一步能得到的奖励R,其中γ表示记忆程度,再用现实的Q减去估计的Q来进行更新
Sarsa
Sarsa(0)
Tips:Sarsa跟Q-learning的区别在于Q-learning每步都会取下一步现实的最大值,而Sarsa不会,相比来说可以理解为Q-learning为到达目标永远最优(付出一切代价)而Sarsa则会尽量避开大代价。下一个 state_, 和下一个 action_ 将会变成他真正采取的 action 和 state. 和 Qlearning 的不同之处就在这. Qlearning 的下个一个 state_ action_ 在算法更新的时候都还是不确定的 (off-policy). 而 Sarsa 的 state_, action_ 在这次算法更新的时候已经确定好了
Sarsa(λ)
Tips:λ为脚步衰减值,当λ为0时,即只记在reward前的最后一步,λ为1时即记住reward前的每一步,而我们的要求是离reward前的步骤越近它记得越好
Tips:此处第一行的意思是每个结点访问的次数,第二三行的意思是累积访问它的eligibility trace,简单来说就是访问某结点次数越多,说明得到reward途中访问该点的可能性越高,即不可或缺性。
Tips:相比之上多了一个δ错误差即真实值与估计值之差,E即为上文提到的不可或缺值,这样对于每个结点的Q值进行跟不可或缺值有关的更新,再对不可或缺值进行λ的缩减,意思就是对于得到reward前,经过的每个点都进行标记,越近表示不可或缺值越高且λ缩减越少,进行Q表更新时更新幅度更大,对于达到reward途中经历的点根据到达的次数即不可或缺值E和距离reward的距离进行λ衰减
Deep Q Network
Nature DQN
Tips:相比于Q-learning的Q表,此处每步的Q值由神经网络计算出来,此为Q估计,而为了更新神经网络的参数需要Q现实,需要 a1,a2正确的Q值, 这个Q值我们就用之前在Q-learning中的 Q现实来代替,后文提到的target-net得到的就是,这样就能通过Q现实和Q估计来更新网络
Tips:首先初始化网络等,选择动作a时和上文方法一样根据概率或者随机选,执行action接受reward和新的state,将新的transition(当前状态,行动,奖励,下一个状态)样本存入D中,从D中随机抽取一个minibatch的transition,根据Q表得到Q现实的值y,再由y和Q估计的差值来对网络参数θ进行梯度下降,每C步执行一次更新
Tips:搭建两个神经网络,target_net用于预测q_target值,他不会及时更新参数。eval_net用于预测q_eval,这个神经网络拥有最新的神经网络参数。不过这两个神经网络结构是完全一样的,只是里面的参数不一样,两个神经网络是为了固定住一个神经网络(target_net)的参数,target_net是eval_net的一个历史版本,拥有eval_net很久之前的一组参数,而且这组参数被固定一段时间,然后再被eval_net的新参数所替换,而eval_net是不断在被提升的。eval_net是得出Q估计,与Q现实得到误差而更新网络的参数
Double DQN
Tips:过估计是指估计得值函数比真实值函数要大,其根源主要在于Q-Learning中的最大化操作,相比nature DQN,DDQN的Q现实进行了更改,原本的Qnext=max(Qnext(s’,a_all)),现在的Qnext=Qnext(s’,argmax(Qeval(s’,a_all)),意思就是使用现成的eval_net估计除Q现实中的Qmax(s’,a’)的最大值,然后用这个值来选择Q现实中的Q(s’)
Prioritized replay
Tips:Prioritized replay多了一个重要程度排序,也就是对Q现实-Q估计进行排序,该差值越大,则说明预测精度不高,则重要度就高。举个例子就是一个行动的某一步reward为10,某一步reward为-1,则Prioritized replay则会使算法更多的重视reward为10的那一步,采取优先级的算法为SumTree
Tips:这就是Sumtree,最下层存放样本的所有p,二叉树的其余结点皆为两个子结点的和,先将p的总和除以batch-size,然后在每个区间里随机选取一个数。比如在第区间[21-28]里选到了24,就按照这个24从最顶上的42开始向下搜索。首先看到最顶上42下面有两个child nodes,拿着手中的24对比左边的child 29,如果左边的child比自己手中的值大,那我们就走左边这条路,接着再对比29下面的左边那个点13,这时,手中的24比13大,那我们就走右边的路,并且将手中的值根据13修改一下,变成24-13=11.接着拿着11和13左下角的12比,结果12比11大,那我们就选12当做这次选到的priority,并且也选择12对应的数据。该方法只多了一个ISWeights,这个正是刚刚算法中提到的Importance-Sampling Weights,用来恢复被Prioritized replay打乱的抽样概率分布。
Dueling DQN
Tips:简单来说意思就是nature DQN每个网络比如eval_net直接输出的是Q_eval,现在更改eval_net里的结构,输出的是新的Q(value+advantage),即Q(s,a) = 状态的所有动作Q期望+action-value的优势程度,即前者是对某个state的价值,此时动作选择的影响不大,后者更关心动作的选择。
Policy Gradient
Tips:相比于前面的Q-learning和DQN,该方法跳过了每步计算value的步骤,它的做法是直接输出action而不是action的value。好的行为会被增加下一次被选中的概率,不好的行为会被减弱下次被选中的概率。这里也用了神经网络的方式,所以第一步也是初始化θ,然后对每一步进行遍历更新θ,Πθ的意思是在某一状态采取某一个行为的概率,概率取决于神经网络的输出,log(prob)表示若概率越小,则反向越大,vt是梯度下降的幅度也就是下降趋势也就是当前当前状态s下采取动作a获得的奖励,这样结果就是如果在prob很小的情况下得到了一个大的reward也就是大的vt,那么就是选择了一个概率小的动作,但得到了一个好的reward,此时大幅度更新参数
Tips:使用Policy Gradients的好处是能够对连续型进行评估,坏就坏在它是回合制更新的方式,也就是整轮结束后才对每步进行更新,而不是单步更新
Actor-Critic
Tips:Actor-Critic算法分为两部分,我们分开来看actor的前身是policy gradient他可以轻松地在连续动作空间内选择合适的动作,value-based的Qlearning做这件事就会因为空间过大而爆炸,将他们合并就成了Actor-Critic。这样的意思就是,Actor根据Critic网络提供的评分修改选择行为的概率,也就是Policy Gradients中的概率,如果critic表示该行为是好的,则加大幅度它的更新,反之则减小,而Critic则基于Actor的选择行为评判行为的得分(先有鸡还是有蛋的问题那么就来了)
Tips:td_error即是critic告诉它该步的好坏程度
Deep Deterministic Policy Gradient
Tips:此处的两个网络相比dqn复杂了一些
Tips:相比于Policy Gradient中选择action的根据prob的方式,Deterministic事直接选择某个行为,而不用根据分布随机筛选
Actor更新
Critic更新
Tensorboard说明
Tips:actor和critic中都有两个网络,这两个网络结构一样
Tips:简单来说,actor和critic中的target_net跟dqn的类似,都是隔几次跟eval_net同步。然后开始,我们的目的就是对c和a进行更新,对于每一步,actor中,更新eval_net,输入当前状态state,根据当前网络计算出动作,此时获得critic得出的该动作的价值,也就是Policy Gradient一样的利用critic的动作梯度和actor的参数梯度更新eval_net。接下来是critic,一样也是两个网络,更新critic的方法就是TD-error,Q_target-Q_eval的过程,前者就是根据critic中的target_net中得出,输入的是动作action(由actor提供),Q_eval就是输入当前状态state和当前动作action决定。说完了两个,最后的C_train由td_error和当前c也就是状态state来更新,a_train则由policy_grads和当前动作action来更新
Tips:总而言之,学习critic需要输入当前状态state和动作action和奖励reward和下个状态s_,action学习需要当前状态state和动作action
Asynchronous Advantage Actor-Critic
Tips:A3C的算法实际上就是将Actor-Critic放在了多个线程中进行同步训练. 可以想象成几个人同时在玩一样的游戏,而他们玩游戏的经验都会同步上传到一个中央大脑。然后他们又从中央大脑中获取最新的玩游戏方法。
Tips:简单来说,有一个中央大脑Global_net和四个工人local_net,每个local_net就是上文的actor_critic模型中的一个,每个相互独立,相互独立的a_loss即actor_loss,c_loss即critic_loss。
Distributed Proximal Policy Optimization
Tips:普通的Policy Gradient中学习率也就是step size不好控制,该方法就是解决它的,简单来说就是更新之后的新策略做到和老策略差别不会太大
Tips:第一个for更新actor,该处加入了At也就是每步的优势,更新的时候是用新的policy除以旧的policy,再加上At(优势)来控制更新的幅度,后面的KL是一个惩罚项,来判断新旧policy差的程度,来控制新policy的更新幅度,也就是控制幅度在一定比例之内。第二个for更新critic,该部分跟上文相似,也就是使用td-error来更新。
Tips:每次更新时把oldpi复制成pi,此处的pi其实就是actor,然后根据上文的更新方法更新pi,此处的loss则是通过pi和oldpi和advantage也就是At决定。最后,这也可以采用多线程的方法,也就是类似A3C的更新方法,一个总的大脑PPO_net