深度强化学习算法与实践:基于PyTorch的实现
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 强化学习的探索和利用

在2.1节的介绍中可以看到,策略的选取总是以状态价值函数或者状态-动作价值函数为先决条件的。尤其是我们使用贪心策略的时候,智能体的决策原则是永远要到达具有更高状态价值函数值的一个状态,这就导致了一个问题:因为使用的状态价值函数的估计方法是一个迭代方法,所以虽然算法本身能够保证收敛,但是无法保证收敛到的状态价值函数永远正确。假如初始的估算以及后续的策略选择有问题,可能最终收敛到的状态价值函数也有问题。这种情形在简单的强化学习环境中可能不常见,在复杂的强化学习环境中却比比皆是。举个简单的例子,假如训练一个博弈游戏的智能体(可以是各种棋类,或者扑克类等有胜负的游戏),规定智能体在对决中胜出获得奖励为+1,平局获得奖励为0,输掉游戏获得奖励为-1。假如跟游戏智能体博弈的对手足够强,可以预见到智能体一开始奖励都为负,直到在后续的尝试中智能体发现了如何能够在游戏里打平。由于打平获得的奖励比输掉游戏的奖励要大,甚至可能游戏打平的概率很大,相对而言一直打平游戏是智能体的一个较好的选择,于是智能体的策略可能会收敛到一直打平这个策略上。但这个强化学习算法得到的智能体并不是最优的,换言之,需要一个能够获得正奖励的智能体,而不是一直获得零的奖励的智能体。出现这种情况的原因一般是智能体对环境的探索程度不够。这也引出了本节的主题,即智能体对环境的探索(Exploration)和利用(Exploitation)。

1.环境的探索

下面讨论对于环境的探索。这里首先定义智能体在马尔可夫决策过程中经过的一系列的状态(和动作、奖励)为轨迹(Trajectory)。对于1.2.2节中介绍的片段任务来说,在一个片段中智能体经历的决策对应的状态(和动作、奖励)可以认为是一条轨迹;相对而言,如果是连续任务,可以对这个连续任务进行拆分,按照一定的长度对这些状态(和动作、奖励)拆分成多条片段,每条片段对应一条轨迹。对于智能体来说,一开始对环境的信息总是比较少的,为了能够了解环境,感知到哪些状态能够获取更多的奖励,智能体需要考虑如何对周围的环境进行探索。根据前面介绍的贪心策略,在探索的初始阶段,因为智能体对环境的了解比较少,可以预见到,每个状态的状态价值函数基本上都为零或者接近于零,于是智能体的探索就接近于随机探索,同时,在这个阶段对应的轨迹应该是随机化的,其中每条轨迹各不相同。在随机探索的阶段过后,随着智能体对环境探索的增加,智能体获取了更多对环境的信息,可以预见到的是智能体会逐渐找到一条相对来说奖励比较高的决策过程,并且到最后这个轨迹逐渐收敛作为智能体认为最优的轨迹固定下来。这是由前面介绍的最优策略的迭代算法的收敛性决定的。虽然最优策略的迭代算法能够保证收敛,但是我们无法确定最后收敛的轨迹是最优的,因为对于很多环境来说,智能体能够通过迭代经历到的可能的状态往往是环境可能状态的一小部分,换言之,智能体很难经历所有的状态。在这种状态下,智能体选择的轨迹是局部最优的(相对于邻近的其他轨迹而言最优),而不是全局最优的。

为了缓解这种状况,这里引入一种新的策略称为ϵ-贪心策略(ϵ-Greedy),这种策略可以在保证收敛的同时,增加智能体找到全局最优的概率。具体实现的思想很简单,智能体在选择最大化价值函数的动作以外,有一定的概率选择随机的动作。一般来说,在实际的算法中会选取一个比较小的概率ϵ,使得算法按照1的概率选择正常的贪心策略,而按照ϵ的概率选择随机的策略。为了保证算法的收敛性,可以逐步对概率ϵ做衰减,直到衰减到接近于0,这样就能兼顾探索新的状态和让算法收敛到最优策略的特性。除了上面所述的ϵ-贪心策略,还有其他算法来增加智能体对周围环境的探索。在基于策略的模型中,往往会加入熵(Entropy)这个概念来衡量模型策略选择的随机性。熵的定义如式(2.8)所示。其中x是随机变量,i是随机变量的可能值,对应的式(2.8)的数学含义是随机变量所有可能状态的概率乘以概率的自然对数的和(这里定义0log0=0)。为了演示熵对于决策的影响,这里考虑一个具有两个取值ab的随机变量x。假设px=a)=p,则px=b)=1-p,代入式(2.8),可以计算得到式(2.9)。

根据式(2.9),以p为自变量,可以得到图2.4。在图2.4中可以看到,当p=0.5时,随机变量的熵值最大,这意味着随机变量在取值过程中如果让两个不同值的概率相等,则随机变量的熵达到最大。换句话说,也就是随机变量取不同值的概率要尽可能均匀,才能让熵达到最大。读者可以证明,同样的单个变量有多个不同取值的情况下,一定是各个取值概率相等的情况熵最大。而在策略函数πa|s)中,同样的熵最大意味着采取不同的动作的概率相等,这就和前面介绍的随机探索的概念相符合,即在熵最大的情况下智能体的探索行为应该是完全随机的。在实际应用中,会在策略梯度的损失函数中加入熵相关的项,这样在优化策略的时候会同时考虑尽可能让每次决策的动作有一定的随机性,我们会在后续的策略梯度的章节介绍如何实现对应的代码。

图2.4 二值随机变量的熵随着概率的变化

2.智能体对环境的利用

介绍完探索之后,接下来介绍智能体对环境的利用。跟探索的过程相反,利用的过程着重是如何在智能体已知信息的范围内,让智能体尽可能获取最多的奖励。正如在前面介绍的那样,算法中使用比较多的是利用贪心策略获得尽可能多的奖励。在实际的强化学习过程中,为了能够尽可能准确地估计状态价值函数,智能体往往会多次到达某个状态,直到最后估计的状态价值函数收敛。在这个过程中,关于利用这个环节,对比前面介绍的探索环节,利用环节的目标主要是在短期内收获更多的奖励,而探索环节是在长期内看到能够获得更多奖励的可能性。一旦在探索环节中找到了一些潜在的具有高回报的状态,智能体通过多次到达这个状态能够准确估算出这个状态的价值函数,如果经过该状态的轨迹比原先选定的轨迹所收获的奖励要高,则利用环节会优先选择通过该状态的路径。可以看到,利用环节的主要目的是在已知的所有状态中选取一条路径,使得这条路径的奖励尽可能大。对于智能体来说,探索和利用是相互矛盾的,一方面,探索要尽可能找到新的状态,这些状态从长远来看能够获得更高的奖励;另一方面,利用则要尽可能从已知的状态中获取尽可能多的奖励,着重是短期的奖励。因此,对于一个强化学习算法,如何平衡探索和利用这两点非常关键。

3.探索和利用的作用

下面用经典的多臂赌博机问题(Multi-armed Bandit)来阐述探索和利用的作用。多臂赌博机是一种机器,它有N个摇杆,当智能体决策的时候,随机摇动其中的摇杆,能够从N个服从不同期望和方差正态分布的变量x1x2,…,xN中随机选取一个随机变量,并且对这个随机变量进行采样,以这个采样值作为智能体获取的奖励。可以预见到,在智能体的初始探索阶段,因为采样的随机变量不够多,智能体初始得到的奖励可能和正态分布的平均值差别很大,这样会导致智能体偏好选取初始奖励比较高的摇杆。如果在这个阶段采用贪心策略,就会收敛到一些期望的奖励不够高的状态上。用代码2.2的例子来阐述多臂赌博机的模型。在代码中使用了两个类,第一个类Env用来描述智能体所处的环境,第二个类EGreedyAgent用来描述智能体和对应的策略。可以看到,代码中采用了两种策略,第一种是贪心策略,在greedy_search方法中实现,这个方法就是选择具有最高价值函数的状态,并且选择该状态作为智能体的决策结果;第二种是随机策略,在这个策略中,智能体会随机选择一个状态作为智能体的决策结果。而ϵ-贪心策略是这两种策略的混合,代码在这里设置一个概率,用这个概率控制随机策略和贪心策略的比例,完全的贪心策略是一个特例,意味着EGreedyAgent采取随机策略的概率为0。

代码2.2 多臂赌博机的模型。

下面分析一下EGreedyAgent运行的结果(这里取1000个智能体的平均值,算法迭代100次的结果)。

图2.5展示了这个策略的结果,在ϵ=0.00时是完全贪心策略,智能体会永远选择获取奖励最高的状态。可以看到,这个策略的表现平均来说还是很不错的,特别是在迭代次数大于20的时候,基本上都能获得最高的奖励。这主要是因为状态数目相对较少(10个不同的状态),奖励的随机性比较强(正态分布),智能体在一定时间内可以探索所有的状态。但是贪心策略在迭代次数小于20的时候,效果比ϵ=0.01的ϵ-贪心策略要稍微差一点,原因是贪心策略的探索能力不够强。但是由于加入了随机策略,ϵ-贪心策略在迭代次数大于60的时候得到的奖励会小于贪心策略,这意味着在算法的后期ϵ-贪心策略在利用上会弱于完整的贪心策略。至于最后一个ϵ=0.1的状况,则是另外一种极端的情况。在这种情况下,智能体采取随机策略的概率会大大增加,同时智能体更加关注的是探索的过程,可见在大概10个迭代次数的时候这个策略能获得的奖励和前面的两种策略接近,但是在后续几个迭代后,由于智能体更侧重于探索而非利用,对于奖励的获取会减少,因此最终的效果会不如前两种策略。在这个例子中可以看到,一个合理的智能体应该能够让策略中探索和利用这两种不同的方面取得平衡。

图2.5 ϵ-贪心策略在多臂赌博机问题上的表现

有兴趣的读者可以考虑更改代码中策略的输入参数,观察不同的参数对于智能体探索和利用的影响,也可以实现一个EGreedyAgent,进行探索概率的衰减,观察探索概率衰减是否能够更有效地帮助算法找到一个更好的策略。