今天继续强化学习的学习,这些内容的学习主要参考了李宏毅的强化学习教程,在此基础上加入了个人的理解和总结。好,废话少说下面开始进入正题。
首先我们要介绍的就是Q-learning的方法,Q-learning是一种value-based 的方法,在这一类的方法中我们不需要进行策略的学习,需要学习只是价值函数。
以小蜜蜂的游戏为例,状态s就是其中一个画面,a为其动作,而我们预测的 V π V^{\pi} Vπ就是指在某一状态s时,从这一时刻开始到游戏结束时奖励的预估。
那么怎么计算这个state value function V π ( s ) V^{\pi}(s) Vπ(s)呢,有两种方法,分别为蒙特卡洛法(Monte-Carlo based)以及基于TD时序差分的方法。
在 MC based 的方法中,每次我们都要算accumulated reward,也就是从某一个 state s a s_a sa一直玩到游戏结束的时候,得到的所有 reward 的总和。所以你要 apply MC based 的 approach,你必须至少把这个游戏玩到结束。但有些游戏非常长,你要玩到游戏结束才能够 update network,花的时间太长了,因此我们会采用 TD based 的方法。
TD based 的方法不需要把游戏玩到底,只要在游戏的某一个情况,某一个 state s t s_t st 的时候,采取 action a t a_t at 得到 reward r t r_t rt,跳到 state s t + 1 s_{t+1} st+1,就可以 apply TD 的方法。
TD方法基于公式 V π ( s ) = V π ( s t + 1 ) + r t V^{\pi}(s)=V^{\pi}(s_{t+1})+r_t Vπ(s)=Vπ(st+1)+rt更新。
MC 跟 TD 各有优劣,其中MC的方法由于每一计算的 G a G_a Ga为从当前状态累计到游戏结束的奖励总和,所以容易造成高方差的问题,TD方法虽然没有这一类的问题,但是容易估计的不准。今天其实 TD 的方法是比较常见的,MC 的方法其实是比较少用的。
还有另外一种 critic,这种 critic 叫做 Q-function。它又叫做state-action value function。
Q-function 有两种写法:
input 是 state 跟 action时,output 就是一个 scalar;
input 是一个 state s,output 就是好几个 value。
那你要注意的事情是,上图右边的 function 只有有限的 action 才能够使用。如果 action 是无法穷举的,你只能够用上图左边这个式子,不能够用右边这个式子。
这是 state-action value 的一个例子。
首先我们按既定策略 π \pi π选取动作与环境进行交互,然后学习Q函数,之后我们产生一个新策略 π ′ \pi' π′,为了保证 π ′ \pi' π′策略优于 π \pi π,这里用了取Q函数最大值动作的方法,之后更新策略,再进行下一个循环。
由上图的公式可以证明新产生的策略优于原来的。
这里讲到是DQN中用到的一个技巧叫Target Network,什么意思呢,就是在用TD法进行Q函数的神经网络训练时实际训练了两个神经网络,Target网络和policy网络,policy网络用于参数更新,Target网络用于fixed value的计算,没经过若干步后,Target网络会将网络参数更新为policy网络的参数。
为什么要这样做的,主要是因为我们在拟合一个目标时希望这个目标时固定的,然而Q函数的参数是时刻更新的,这就会造成一个问题,就是我们拟合的是一个不断变化的目标,为了解决这个问题,我们将目标进行固定。以上图的猫和老鼠为例,相当于猫在开始动作前进行了各种动作的假设,最后选择一个最佳的动作执行,而在这个过程中老鼠是不动的。
第二个需要注意的点是Exploration,当我们进行策略优化是由于每一次选取的都是最佳策略,会造成策略的固定;然而因为尝试的动作是有限的,所以当前的策略不一定是最优的,在这种情况下我们就需要有一定的概率选取到已知最优策略以外的策略。
有两个方法解这个问题,一个是 Epsilon Greedy。Epsilon Greedy(ε-greedy) 的意思是说,我们有 1 − ε 1-\varepsilon 1−ε 的概率会按照 Q-function 来决定 action,通常 ε 就设一个很小的值, 1−ε 可能是 90%,也就是 90% 的概率会按照 Q-function 来决定 action,但是你有 10% 的机率是随机的。通常在实现上 ε 会随着时间递减。在最开始的时候。因为还不知道那个 action 是比较好的,所以你会花比较大的力气在做 exploration。接下来随着 training 的次数越来越多。已经比较确定说哪一个 Q 是比较好的。你就会减少你的 exploration,你会把 ε 的值变小,主要根据 Q-function 来决定你的 action,比较少做 random,这是 Epsilon Greedy。
还有一个方法叫做 Boltzmann Exploration,这个方法就比较像是 policy gradient。在 policy gradient 里面我们说network 的output 是一个 expected action space 上面的一个的 probability distribution。再根据 probability distribution 去做 sample。那其实你也可以根据 Q value 去定一个 probability distribution,假设某一个 action 的 Q value 越大,代表它越好,我们采取这个 action 的机率就越高。但是某一个 action 的 Q value 小,不代表我们不能try。
上图是基于经验回放的方法,与state-action value方法的区别主要在于其构建了一个缓存Buffer,在每次与环境进行互动后都会将互动的结构存入缓存Buffer中,在进行Q函数的更新时再从缓存Buffer中取出一批数据进行更新。
这么做有两个好处:
(1)第一个好处,其实在做 reinforcement learning 的时候, 往往最花时间的 step 是在跟环境做互动,train network 反而是比较快的。因为你用 GPU train 其实很快, 真正花时间的往往是在跟环境做互动。用 replay buffer 可以减少跟环境做互动的次数,因为在做 training 的时候,你的 experience 不需要通通来自于某一个policy。一些过去的 policy 所得到的 experience 可以放在 buffer 里面被使用很多次,被反复的再利用,这样让你的 sample 到 experience 的利用是比较 efficient。
(2)第二个好处,在 train network 的时候,其实我们希望一个 batch 里面的 data 越 diverse 越好。如果你的 batch 里面的 data 都是同样性质的,你 train 下去是容易坏掉的。如果 batch 里面都是一样的 data,你 train 的时候,performance 会比较差。我们希望 batch data 越 diverse 越好。那如果 buffer 里面的那些 experience 通通来自于不同的 policy ,那你 sample 到的一个 batch 里面的 data 会是比较 diverse 。
DQN可以理解为加入了经验回放和Target Network后的Q-learning方法,与常规的Q-learning方法的修改有两点,一是在更新Q函数是从缓存中sample数据,而是采用了Target Network,设置目标Q函数和policy Q函数,其具体解释如上图所示。
在DQN的实现过程中通常存在着value被高估的情况,这是为什么呢?主要是由于在预估的过程中。总是会有一些action的value是会被高估的,由于Q函数的计算过程总是会加上状态s后所有的reward,所以偏差就累积起来了。
那么怎么解决这个问题呢,一个解决方案就是Double DQN,其实Double DQN与之前的DQN差别不大,唯一的区别就是选取a的函数不用Q’来计算,而是使用Q来计算。这么做的话a就是实时更新的,一定程度上避免了偏差累积的情况。
在Dueling DQN中,相较于原来的 DQN,它唯一的差别是改了 network 的架构。Q-network 就是 input state,output 就是每一个 action 的Q value。Dueling DQN 唯一做的事情是改了 network 的架构。主要是分出了一个V(s)向量,这个向量中代表了各个状态对动作的偏向。
此方法为蒙特卡洛法与TD法的结合,有两种方法的好处和坏处,可以理解为原来的TD法target部分只是在原状态下往后走一步,而此方法是往后走了N步。
我们还可以 improve exploration。Epsilon Greedy 这样的 exploration 是在 action 的 space 上面加 noise,但是有一个更好的方法叫做Noisy Net,它是在参数的 space 上面加 noise。
Q-learning最大的问题是它不太容易处理连续action。很多时候 action 是连续的。那么怎么解决这个问题呢?
第一个 solution 是假设你不知道怎么解这个问题,因为 a 是没有办法穷举的。怎么办?用 sample 的。Sample 出 N 个 可能的 a,一个一个带到 Q-function 里面,看谁最快。
第二个 solution 是什么呢?既然要解的是一个 optimization problem,其实是要 maximize objective function,要 maximize 一个东西, 就可以用 gradient ascent。 把a当做参数,用梯度上升法进行学习,但这样做相当于在本来的神经网络训练的基础上还要计算每一步动作的梯度,会算的比较慢。
**第三个 solution 是特别 design 一个 network 的架构,特别 design 你的 Q-function,使得解 arg max 的 problem 变得非常容易。**也就是这边的 Q-function 不是一个 general 的 Q-function,特别设计一下它的样子,让你要找让这个 Q-function 最大的 a 的时候非常容易
演员-评论员算法(Actor-Critic Algorithm)是一种结合策略梯度和时序差分学习的强化学习方法,其中:
(1) 演员(Actor)是指策略函数 π θ ( a ∣ s ) \pi_{\theta}(a∣s) πθ(a∣s),即学习一个策略来得到尽量高的回报。
(2) 评论员(Critic)是指值函数 V π ( s ) V^{\pi}(s) Vπ(s),对当前策略的值函数进行估计,即评估演员的好坏。
(3) 借助于值函数,演员-评论员算法可以进行单步更新参数,不需要等到回合结束才进行更新。
在 Actor-Critic 算法 里面,最知名的方法就是A3C(Asynchronous Advantage Actor-Critic)。
如果去掉 Asynchronous,只有 Advantage Actor-Critic,就叫做 A2C。
如果加了 Asynchronous,变成 Asynchronous Advantage Actor-Critic,就变成 A3C。
这里是对Policy Gradient的一个回顾,在Policy Gradient中,当s与a固定时,G可以看做以个随机变量,这样的情况下每次更新参数有可能取到偏差过大的结果,在采样足够多的情况下可以避免,可在很多情况下这是不能实现的。
为了让训练的过程稳定一下,我们可以用G的期望值代替G,这样的话G会变的比较稳定。
Actor-Critic方法主要做的就是将G换成了G的期望,而b换成了当前状态的V,这样计算下来可以将红框内的式子转换成:
E [ G t n ] = Q π θ ( s t n , a t n ) E[G_t^n]=Q^{\pi_{\theta}}(s_t^n,a_t^n) E[Gtn]=Qπθ(stn,atn)减去 V π θ ( s t n ) V^{\pi_{\theta}}(s_t^n) Vπθ(stn)
然后,我们对上式继续进行简化,用V函数替代掉Q函数,然后我们就可以用这个式子更新梯度。
因为 r t n + V π ( s t + 1 n ) − V π ( s t n ) r_{t}^{n}+V^{\pi}\left(s_{t+1}^{n}\right)-V^{\pi}\left(s_{t}^{n}\right) rtn+Vπ(st+1n)−Vπ(stn)叫做 Advantage function。所以这整个方法就叫 Advantage Actor-Critic。