这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
本文是强化学习入门系列的第4篇,主要介绍强化学习当中非常常见的两个时序差分算法:Q-learning和Sarsa。
时序差分TD
首先,啥是时序差分学习?
时序差分学习可以直接从与环境互动的经验中学习策略,无需构建关于环境动态特性的模型,也就是常说的model-free方法。像上文的动态规划方法就需要已知环境的动态特性,属于model-based方法。
时序差分学习利用经验来解决预测。也就是说需要根据给定策略学习来的一些经验数据,来对状态价值函数 进行更新。
本文介绍两种经典的时序差分学习方法,Q-learning和Sarsa。
Q-Learning
Q-Learning是一种off-policy的算法,它可以学习当前的数据也可以学习过去的数据。
如何学习?
首先是有个Q-table,通过迭代来对表进行更新。Q-learning的核心在于它有一张Q表格,所有的value更新都是在这张表格上进行的。表格储存了历史的数据,所以Q-learning不仅可以学习当前的数据,也可以学习过去经历的数据。
举个例子
假设现在有3个状态,每个状态有3个动作,假设动作 对应的奖励为 +1, 对应的奖励为 -1, 对应的奖励为0。那Q表可以用矩阵来表示。
首先是初始化Q表,每个Q值也就是动作价值初始为0。
第一步:决策。
假设初始状态是 。根据 策略选取动作,由于初始Q值都是0,所以这时候就是随机选取,假设选择了动作 ,进入到 ,奖励是+1,此时根据更新公式:
第二步:更新Q值。
我们假设学习率是1,折扣系数 为0.8。那么 的值应该更新为 ,Q表也更新如下:
这样就完成了一次更新。可以发现,Q-learning是属于单步更新。
接下来的步骤跟上面是一样,如此迭代,更新,就是Q-learning。
算法流程
伪代码如下:
如何决策?
在选择动作的策略上,基于epsilon-greedy的方法从当前状态选择价值最大的动作a。
Q值如何更新?
在Q表的更新上,动作a产生的奖励r,以及下一状态s',但下一状态s'上的动作使用的是max值来进行update。
值得注意的是,因为max这个操作,使得Q-learning不适用于连续动作问题。
Sarsa
Sarsa是属于on-policy算法。它只能学习当前的数据。
如何学习?
Sarsa算法与Q-learning相似,Sarsa也有一个Q表,在对动作的选择也就是决策部分与Q-learning是一样的。 不同的是在Q值的更新上,Q-learning中对下一个状态和动作采取的是max的操作,比较贪婪,而Sarsa则相对保守,在更新 时基于的是下一个 。
两个算法都用了epsilon-greedy来选择action。但是,Sarsa 是在learn之前是用epsilon-greedy选中一个action,并确定用这个action进行learn,所以下一步update的action就是要learn的action。所以当前learn的不一定是最大奖励的。而Q-learning对下一步的action取max,每步learn的都是眼前奖励最大的,但由于epsilon-greedy存在随机性,可能会跳出贪心,转变为随机选择,所以下一步update的action大概率不是要learn的。
接Q-learning的例子
我们沿用上面例子的setting,假设现在的Q表如下:
假设当前时刻状态是 ,选择了动作 ,进入到了下一时刻状态 ,然后下一时刻的 状态下根据贪心策略选择了动作 。
那么,在更新Q值的时候,因为Sarsa是要考虑下一时刻的 的,也就是 ,所以根据公式:
的值应该更新为 ,
而如果是Q-leaning,对 下的Q值取最大值,那就是 ,此时的更新则是 。
算法流程
伪代码如下:
Sarsa因为更新的时候考虑的连续时刻的值,所以Sarsa适用于连续性问题。
小结
Q-learning和Sarsa一个是off-policy算法,一个是on-policy算法。两者在算法上的区别就在于Q值更新的不同。换句话说,Q-learning在下一步更新时,考虑的是下一时刻中的最大Q值,而Sarsa是即时更新,在更新的时候,只考虑下一时刻的Q值。
参考