RL算法主要分为三类:基于值(value-based)系列,基于策略梯度(Policy-gradient)系列,以及两者相结合的Actor-Critic系列。今天主要介绍这三类中典型的算法的核心思想以及它们各自的优缺点。
首先从基于值这类算法说起,这类算法的特点是计算状态价值V(s)或者是状态动作价值Q(s,a),通过提高价值来优化策略。其中典型的算法有Q-learning、Sarsa、DQN,DDQN。
从Q-learning算法说起,它算是DQN这一系列算法的根基,核心思想就是建立和状态动作有关的奖励表格,我们称为Q表。根据表格选择动作,与环境进行交互,根据反馈回来的奖励再次更新表格,如此循环直到Q表收敛为止。它的优势就是简单,收敛快,因为是采用单步更新的方法,不用等到一个回合结束才去更新。同时它还是离线策略,即它选动作的行动策略和计算Q值的目标策略不一样,选动作采用epsilon贪婪策略,计算Q值采用贪婪策略。保证了探索性,不会收敛到局部最优。当然Q-learning的缺点也很显著,它只适用于状态,动作空间是离散,并且较小的场景。当状态,动作空间太大时,Q表就会变得很大,更新起来也很慢。
对比Q-learning算法来看Sarsa就很简单,它与Q-learning的核心思想一样也是建立Q表,只有一点不同,它是在线策略,即它的行动策略和目标策略都是采用的epsilon贪婪策略。
前面也说了Q-learning是DQN系列的鼻祖,人们考虑到Q-learning不能用在状态空间较大的场景,因为Q值的计算会很麻烦,但是深度学习的神经网络最擅长的就是这种输入巨大量的计算。于是把深度神经网络与Q-learning一结合就得到了DQN,这也开启了深度强化学习这个领域的研究。它的主要优势就是适用于状态空间较大的场景,缺陷就是稳定性差,因为网络要去拟合的Q值会在采样更新网络之后立马变动,即要到达的目标不是一个固定值,所以稳定性差。然后就是Q值估计过高,伪代码中可以看到yj是取的最大Q值,当我们从经验池中取yj相当于取平均,Q的最大值取平均一定大于Q的平均值取最大。
为解决DQN稳定性不好这一点,产生了Natural DQN,在DQN的基础上另外在加一个网络用来计算目标Q值,定期更新目标Q值,而不是像DQN一样一直更新,这样就能使目标在一定时间内是不动的,就能更好的收敛。
为解决DQN过估计问题,产生了Double DQN,yj不再求最大Q值,而是采用目标Q网络求Q值最大对应的动作,把这个动作放到Q网络中求出一个Q值用于yj的计算。即让选动作和评价动作的网络分隔开。
为了进一步提高收敛速度,我们引入了优先经验回放PER,核心思想是:让训练的不太好的数据(就是哪些Q值与目标Q值相差太大的数据)多训练几次,能明显提高学习速率。
为了让策略评估更简单,我们改变了Q网络的架构,让它输出平均价值函数和优势函数。这样我们更能清楚的看到选择某个动作对于平均价值存在的优势。同时也可以通过优势函数A和平均价值函数V相加获得Q值,为了保证是唯一的A和V相加组成Q,可以让A减去它的平均值或者最大值。
基于值函数的方法是先计算出Q值,然后根据Q值选动作。而基于策略的方法,直接计算出选各个动作的概率或者动作空间满足的概率分布。其中典型的算法是策略梯度(Policy Gradient,PG)算法、信任域策略优化(Trust Region Policy Optimization,TRPO)。
首先说一下策略梯度算法,它的核心思想就是:先随机选动作,若这个动作使得最终的奖励变大,则增加这个动作的概率,反之则减小这个动作的概率。具体做法就是建立一个策略网络(输出是动作的概率或者概率分布),以负的奖励函数作为网络的损失函数,通过随机梯度下降等方法,优化网络参数。使得损失最小,即奖励最大。相比于基于值的方法,策略梯度方法可以适用于动作空间较大,甚至是连续的动作的场景。在某些场景下,策略函数比价值函数更易计算。可以通过在输出的动作概率分布上加上噪声来实现随机化策略,增加一定的探索性。策略梯度最大的缺点就是学习率(步长)不好确定,太大,策略不一定是单调的,可能不收敛。太小收敛慢。
针对这一缺陷,人们就提出了信任域策略优化TRPO,它的核心思想就是让学习率在一定限制条件下尽可能的大。这个限制条件就是KL散度,一个用来衡量新旧策略差距的东西。让KL散度小于某个值,就是让新旧策略变化控制在一定范围内。这样即使学习率较大,策略也不会更新得太夸张,保证是单调的。同时这个算法还用到了两个技巧:一个是重要度采样,我们从经验池中获取的状态数据是来自于旧的策略对应的,要把它用在新的策略上,需要对最终的结果乘一个权重,来减小两个策略动作分布的差异。这个技巧在后面很多off-policy算法中都会用到。另一个技巧就是由于KL散度的限制,新旧策略差别不大,在计算损失函数时可以直接用旧的策略的概率分布代替新的策略的概率分布。
为了方便计算,我们对TRPO进行了改进,把它的限制条件加到了函数式子里面,这样就得到了PPO,PPO主要有两种形式,一种是可变的惩罚因子型,式子中的β,当KL散度过大时,即新旧策略相差太大时,惩罚因子β就会变大;当KL散度过小时,β也相应减小。还有另一种形式是截断型,这种形式也被称为PPO2,就像图展示的那样当新旧策略的比值在0-1之间是,就取这个比值,当超过1时,就给他截断。从openal他们实验的结果来看 ϵ \epsilon ϵ 取0.2效果最好,网上大部分代码都取的0.2。PPO的优势很大,引入经验池所以数据利用率高,能适用于连续动作空间的场景。openal把它应用在mujoco中,取得了较好的效果。并且PPO适用范围很广,不需要大幅度改变参数就能在另一个新的场景中应用起来;所以我们也能看到PPO在很多场景下应用的论文。
上面介绍了基于值和基于策略的方法,基于值的方法能单步更新,收敛速度快;基于策略的方法能应用在动作空间较大的场景。人们把这两种方法一结合就有了Actor-Critic这一类算法,即更新快,又能应用在连续动作空间。其中Actor与基于策略的方法一样,计算出动作的概率分布;Critic同基于值的方法一样,计算Q值。重要的是两者的交互,Actor产生动作,环境状态发生改变,Critic求出对应的Q值,然后把Q值同目标Q值的差值,我们称为TD-error,反馈给actor,指导actor调整策略。如果Critic网络输出Q值减掉一个平均价值函数,就得到优势函数A,这也是我们所说的A2C算法。AC,A2C算法都存在一个缺陷,那就是我们就用这一个Actor持续性地与环境交互来产生数据,这些数据是有很强的相关性的,这就导致不收敛。
关于减弱数据相关性这点,DQN采用了经验池+随机采样的方法。但是考虑到经验池存储和采样都会花掉大量的内存和计算时间,并且经验池方法只适用于离线策略。于是我们想到了异步的思想。经验池属于"一个智能体不同时刻的交互数据",异步是用"多个智能体在同一时刻的交互数据"。这样就诞生了A3C算法。它由多个A2C网络组成,分为多个worker和一个target网络,worker们负责与环境交互产生一些数据,并计算好梯度,给target网络更新参数。target网络定期把网络参数复制给worker们。论文里面说的A3C的优势就是:无需使用GPU,只需要用CPU多线程就能完成实验。(可能在几乎所有RL算法都使用GPU的情况下来看,这的确是一个优势。)
A3C的论文主要强调了一个异步的思想,异步的思想不仅可以应用在像A2C这种在线策略算法中,也可以应用在离线策略算法中。讲完了A3C,就会想到和A3C特别像的DPPO,它也是由多个PPO组成,分成了多个worker PPO和一个global PPO,但是worker PPO只负责与环境交互,获取数据,将数据传给global PPO计算梯度,更新网络参数,global PPO也要定期将网络参数复制给worker PPO。
上面就简单介绍了RL的一些基础算法,其他大部分算法,都是在这些基础算法上的结合、优化。像Rainbow算法就是把DQN的三大改进都用上了,得到了较好的效果。还有西交的这篇文章《基于多智能体强化学习的无人机集群攻防对抗策略研究》中用的算法是在PPO上的改进,借鉴了A3C,DPPO的分布式思想,设计了一个MPPO,可以应用在多智能体场景中。多智能体场景中关于状态奖励的处理还设计到多智能体强化学习这一领域的相关知识,我最近也正在看MARL的相关知识。