这部分主要讲解一下Q-learning部分的知识
这里介绍一下critic:给定一个critic,并不会明确的指出需要做出什么动作,当给予一个actor一个策略Π的时候,critic会给出这个策略的分数,vΠ:当actor在状态s的时候选择策略Π,之后衡量这个actor在这个状态s的价值。中间这个图片的v值就是很大的,因为还有很多怪没有打,并且还有阻挡敌人的盾牌,但是右边这个图片的vΠ值就比较低,因为怪比较少,并且没有盾牌的防守了
(总而言之,vΠ是衡量这个智能体在状态s处的价值的)
v这个值是和actor有关系的,比如阿光在很弱的时候,佐为觉得阿光的大马步飞是很差的,但是当阿光变强以后,佐为就觉得阿光下大马步飞是很棒的。这个例子证明在计算vΠ的时候,actor自身也占据了很大的因素。
我们讲解一下如何去估计vΠ。有两种方法,一种是蒙特卡洛方法,一种是时间差分算法,先来介绍一下蒙特卡洛算法。
就是重复的去做实验,在状态s的时候,一直做实验到结尾,不断的重复实验,最后对其求均值,之后让均值作为vΠ的值。
因为很多时候,episode很长,所以如果全部跑完的话,会很浪费时间,这时候我们想到了一个新的方法,就是时间查分算法,我们使用自举的方法,我们把st投进去得到一个vst的结果,再把一个st+1投进去,得到一个vst+1,之后他们之间差距是r。通过这样计算loss function的方法来求出结果。
这样不断的迭代,各个s处的v的值就趋于稳定了。这样做的优点是会提高速度同时方差很小,但是缺点是有误差。(因为vst+1是估算出来的,所以具有误差)
相比较而言,蒙特卡洛方法会具有更大的方差(因为每一次实验都是不稳定的,G的计算是让很多的r加在一起,r是不稳定的,具有一定的方差的),但是相对而言蒙特卡洛方法是更为准确的方法,因为每一次的值都是真实的实验得到的均值。
时间差分算法得到的是方差更小,但是更为不准确的方法。r带来的不确定性会比G更小,因为G是将每个r都加在一起,所以r的不确定性肯定比G要小很多。
这里举一个MC和TD区别的例子。我们计算sb的v值,发现sb都是最终状态,并且十次出现sb,之后八次都是出现1的回报值,所以无论是使用MC还是TD的结果都是3/4
计算sa的时候,就出现不同了,首先是使用MC算法,因为只有一次sa,且这个回报r是0,所以在使用MC的时候,计算均值就是0.
但是在使用TD的时候,sa下一步是sb,虽然sa的临时回报值是0,但是在加上vst+1的时候,就要加上vsb了,也就是3/4.
这两种虽然不同,但是不存在孰对孰错。
另一种评价方法就是计算Q值,Q是以状态和动作对的函数,意义是在状态s进行动作a的价值,有两种形式,一种是输入a和s,输出Q值,另一种是输入一个s值,输出所有的Q值。
更新的方法就是先用现今的策略Π来进行实验,同时使用MC或TD算法来计算Q的值,之后会通过贪婪策略得到一个新的策略来,之后再用新的策略来进行实验,再求新的Q,之后再获得更优秀的Q,如此反复。
新的策略Π’和新的参数是没有任何关系的,仅仅是取决于Q的值
这种方法是不适合连续的动作的,因为连续的动作是难以建立q表的
在训练的时候,如果两个Q一起更新的话,是容易造成混乱的,这时候就要采用fix住一个Q,之后再更新另一个,这样才会稳定并且正确。
如果模型不具有探索性,那么只要之前计算出一个比较大的q值,以后就一直使用那个了,这样就永远不会知道有没有更加秀的策略了。所以我们要加入探索性
我们加入一个replay buffer,他的作用就是将训练过的数据加入到buffer中,之后用这些旧的数据来更新Q值,当这个buffer满了的时候,我们把数据删除,换一批数据进去。
这样做的结果就是把这个问题变为一个off policy的问题。
在每一次的训练中从buffer中sample出一段数据,之后进行训练。
接下来我们介绍一下Q-learning的算法,先是初始化一个Q,和一个target-Q。在每一个episode和每一个step中,对于给予的s,进行动作a,获得回报,并且到达下一个状态,将这些数据放到buffer中,之后再在buffer中sample数据,之后更新q,更新的时候fix住targetQ,之后更新ok之后再将更新好的Q赋值给targetQ。