我们可以用状态动作价值来表达说在某个状态下,为什么动作 1 会比动作 2 好,因为动作 1 的价值比动作 2 要高,这个价值就叫 Q 函数。
如果 Q 表格是一张已经训练好的表格的话,那这一张表格就像是一本生活手册。 我们就知道在熊发怒的时候,装死的价值会高一点。在熊离开的时候,我们可能偷偷逃跑的会比较容易获救。
这张表格里面 Q 函数的意义就是我选择了这个动作之后,最后面能不能成功,就是我需要去计算在这个状态下,我选择了这个动作,后续能够一共拿到多少总收益。如果可以预估未来的总收益的大小,我们当然知道在当前的这个状态下选择哪个动作,价值更高。我选择某个动作是因为我未来可以拿到的那个价值会更高一点。所以强化学习的目标导向性很强,环境给出的奖励是一个非常重要的反馈,它就是根据环境的奖励来去做选择。
为什么可以用未来的总收益来评价当前这个动作是好是坏?
A: 举个例子,假设一辆车在路上,当前是红灯,我们直接走的收益就很低,因为违反交通规则,这就是当前的单步收益。可是如果我们这是一辆救护车,我们正在运送病人,把病人快速送达医院的收益非常的高,而且越快你的收益越大。在这种情况下,我们很可能应该要闯红灯,因为未来的远期收益太高了。这也是为什么强化学习需要去学习远期的收益,因为在现实世界中奖励往往是延迟的。所以我们一般会从当前状态开始,把后续有可能会收到所有收益加起来计算当前动作的 Q 的价值,让 Q 的价值可以真正地代表当前这个状态下,动作的真正的价值。
但有的时候把目光放得太长远不好,因为如果事情很快就结束的话,你考虑到最后一步的收益无可厚非。如果是一个持续的没有尽头的任务,即持续式任务(Continuing Task),你把未来的收益全部相加,作为当前的状态价值就很不合理。
股票的例子就很典型了,我们要关注的是累积的收益。可是如果说十年之后才有一次大涨大跌,你显然不会把十年后的收益也作为当前动作的考虑因素。那我们会怎么办呢,有句俗话说得好,对远一点的东西,我们就当做近视,就不需要看得太清楚,我们可以引入这个衰减因子γ 来去计算这个未来总收益,γ∈[0,1],越往后 γ^n就会越小,也就是说越后面的收益对当前价值的影响就会越小。
举个例子来看看计算出来的是什么效果。这是一个悬崖问题,这个问题是需要智能体从出发点 S 出发,到达目的地 G,同时避免掉进悬崖(cliff),掉进悬崖的话就会有 -100 分的惩罚,但游戏不会结束,它会被直接拖回起点,游戏继续。为了到达目的地,我们可以沿着蓝线和红线走。
最开始这张 Q 表格会全部初始化为零,然后 agent 会不断地去和环境交互得到不同的轨迹,当交互的次数足够多的时候,我们就可以估算出每一个状态下,每个行动的平均总收益去更新这个 Q 表格。怎么去更新 Q 表格就是接下来要引入的强化概念。
强化就是我们可以用下一个状态的价值来更新当前状态的价值,其实就是强化学习里面 bootstrapping 的概念。在强化学习里面,你可以每走一步更新一下 Q 表格,然后用下一个状态的 Q 值来更新这个状态的 Q 值,这种单步更新的方法叫做时序差分。
时间差分法的思路与蒙特卡罗法不同,它不希望机器人通过一个完整的 Episode 试探之后才对一个状态进行估算,它可以走一步就估算一次。
从结构上来看,Sarsa算法是 → → → → 的缩写。在状态S下。要想把动作的估值 (, ) 计算准确,需要研究这个序列: → → → ′ → ′,并对这个序列中的估值进行调整,从而使得方程收敛。
更新方程为:
解释:SARSA 算法的表现形式是 (, ),即对某个状态下的一个动作做估值计算。在状态 下,做一个动作 ,它的估值 (, ) 需要的迭代计算逻辑是当前的 (, )与一个 倍的叠加值相加。
对于,可以认为 值越小,说明“记忆”周期越长,也可以认为对于估值,“平均”的周期越长。
这个叠加值,是用瞬时回报 和 倍的下一个状态下的动作估值 (′, ′) 相减得到的。
是折扣系数,表示对于长期回报的好坏。 的值值在 0 和 1 之间:值越大,说明算法越“远视”,即对远期的回报越重视,越倾向于把它们的得失算在当前决策的头上;值越小,说明算法越“无视”长期回报。
的值越小,则估值变化越慢、越平滑,也就越能参考更长周期的变化平均值; 的
值越大,则变化越快、越剧烈,也就越关注最近几个时间周期的变化平均值。时间差分法走一步(一个 Step 循环)就进行一次更新,不必等到整个 Episode 结束再进行更新。 取得小一些,让变化的平滑度高一些。
首先,函数 (, ) 的初始化其实是一个随机性比较强的过程,其原因还是在于冷启动时没有参考数据。因此,不妨设置一个空列表,这样在查表的时候会得到任意一个状态的任意动作的估值 (, ) = 0。这个问题在实际应用中影响不大,反正最开始估值的准确性不是那么重要。终止状态必须是 (, ) = 0
接下来,让机器人在环境中不停地“玩游戏”(如图所示)——从“诞生”时就开始玩,直到出现 Terminal 的状态,也就是伪代码中所述的终止状态。这就是一个完整的 Episode 过程.
对每个 Episode 来说,都要初始化一个状态 ,让机器人开始学习(这可以通过 (, ) 和 ε-greedy 方法实现)。ε-greedy 方法的要点如下:
SARSA 算法是一种 On-Policy(在线)算法,也是基于一种已有策略的估算,如图所示。因此,在进化的过程中,机器人能知道 → → → ′ → ′ 这个确定的序列的样子,并能根它把估值计算准确。
在图中,1 到 13 只表示不同的状态,不表示严格意义上的次序。如果想要估算在 1 状态下做动作 1 、2 、3 的估值,除了要把过去学到的 (,) 保留下来,还要参考根据当前策略所到达的状态及在这个状态下动作的估值 (′,′),也就是
至于 (′,′) 的估值,仍旧通过在一次一次的 Episode 中学习得到。
简言之,SARSA 评估的内容是在一个策略下的 (,),方法是:评估当前状态的 (,),要参考当前策略下的下一个状态的 (′,′),通过这种将 的值(奖励值)层层回溯的方式,逐步调整状态 (,) 的估值。
Q-Learning 算法是强化学习中最为有效、最具普适性的算法。尽管从名字上看不出它是如何工作的,但它仍然是一个 TD 算法,并且是 Off-Policy(离线)的——这一点与 SARSA不同,SARSA 是 On-Policy 的。请看公式:
从形式上看,只有后半部分不同。SARSA 算法使用的是一个带有折扣的估值 (′,′),而Q-Learning 算法使用的是一个带有折扣的 max′(′,′),差别就在“max”上。
Q-Learning 算法对 (,) 的估值,同样参考了其后所能转移到的所有状态 ′ 可能做的所有动作 ′,并认为其中的最大估值才是当前 (,) 的估值。这个思路是非常明确的:当前状态(,) 的大小,取决于在它转移到的状态下,哪个 ′ 能够取得最大的估值(奖励值)及估值为多少。
用一句话概括:既然曾经有人在这么做之后能够达到某个估值,那么策略就应该将这个动作作为输出,以谋求“利益最大化”。
这段伪代码和 SARSA 算法的伪代码非常像,主要的差别在对估值函数进行更新的表达式上。相信有 SARSA 算法做铺垫,对 Q-Learning 算法的功能,我们能通过伪代码了解得差不多:
在 (,) 的估值中,除了当前的直接奖励值 ,还有 max ′( ′ , ′ )。在这里没有强调 ′和 是在同一个策略下产生的,相反,我们其实更希望这是不同策略下的 ′ 和 的行为估值。因为只有这样,才会有比较丰富的 (′,),在其中挑选“max”的时候,才能够发现比较好的 和 的值,从而把其时间序列前方的 (,) 估算得更“准确”,或者说,更容易发现比较好的策略行为路径,进而得到比较好的策略。