之前讲到强化学习在不基于模型时可以用蒙特卡罗方法求解,但是蒙特卡罗方法需要在每次采样时生产完整序列,而在现实中,我们很可能无法生成完整序列,那么又该如何解决这类强化学习问题呢?
由贝尔曼方程 vπ(s)=Eπ(Rt+1+γRt+2+γ2Rt+3+...|St=s) 推导可得 vπ(s)=Eπ(Rt+1+γvπ(st+1)|st=s),由此给我们的启发是,可以拿下一个状态的价值函数来表示当前状态的价值函数,即t+1时刻表示t时刻,这就引入了时序差分。
这样只需要两个连续的状态,就可以尝试解决强化问题了。
同蒙特卡罗一样,时序差分也可以解决预测和控制问题
从表现形式上对比分析TD与MC
1.时序差分不需要完整的状态序列
// 也就是说,时序差分可以在知道结果之前学习,或者说在没有结果时学习,还可以在持续进行的环境中学习 ;
// 而蒙特卡罗只能在知道结果时学习
2.蒙特卡罗是在真实的实验中用少数几次的值来近似真实值,而时序差分并没有真实的实验,而是完全瞎猜,即用随机数来初始化V (当然你也可以通过试验初始化)
3.正常情况下,蒙特卡罗的更新方式是 V(St)=V(St)+1/N(St) (Gt−V(St)),而时序差分没有N(状态s在完整序列中出现的次数),估只能用V(St)=V(St)+α (Gt−V(St)) 来更新
// 此处 Gt=Rt+1+γvπ(st+1),称为St状态的TD目标值,vπ(st)是估计值,Gt-vπ(st)叫误差,α就是学习率,这里类似梯度下降。
4.蒙特卡罗使用实际的收获来更新状态价值,是某一策略下状态价值的无偏估计;
而时序差分使用TD目标值,即基于即时奖励和下一状态的估计值来替代当前状态的收获,属于状态价值的有偏估计
// 常用 vπ(st) 表示当前状态的实际价值
// 常用Vπ(St) 表示当前状态的预估价值
// 一般为书写方便,随便写了
通常来讲,时序差分更加灵活,在主流的强化学习解决方法中,都是基于时序差分。
接下来我们看看时序差分解决预测问题
1.输入{S A R π γ}
2.生成两个连续状态
// 由于时序差分用下一个状态更新当前状态,故首先要有2个状态,或者先初始化一个状态,此时再取下一个状态
3.计算TD目标值,并更新当前状态价值
4.取下一个状态,直至终点
5.重新从起点开始迭代
// 当然第五步中不一定必须从起点开始迭代,可以随机取状态
// 第四步中也不一定要取下一个状态,也可以随机取状态 (后续会讲到q learning 和 sarsa时用到此点)
// 具体可以参考实际情况
6.直至收敛
实例对比TD和MC求解预测问题的不同
假设我们的强化学习问题有A,B两个状态,模型未知,不涉及策略和行为。只涉及状态转化和即时奖励。衰减因子为1。一共有8个完整的状态序列如下:
① A,0,B,0 ②B,1 ③B,1 ④ B,1 ⑤ B,1 ⑥B,1 ⑦B,1 ⑧B,0
1.对于MC
大体思路:MC是每次生成完整序列,然后计算该序列中每个状态的价值,最后根据完整序列个数进行累积均值更新。
换个更简单的说法,每个完整序列中该状态的价值,求和,再求平均
状态价值采用 Gt=Rt+1+γRt+2+γ2Rt+3+...γT−t−1RT
那么上例中 A 只存在于1个完整序列中,估v=0/1=0,B存在于8个序列,故v=(0+1+1+..+0)/8=6/8
2.对于TD
大体思路:找到当前状态的下一个状态,然后用下一个状态的预估值和即时奖励来更新该状态的价值,再取状态
换个更简单的说法,用下一个状态来更新当前状态,之后再取一个状态,迭代,求平均
状态价值采用 vπ(s)=Rt+1+γvπ(st+1)
由于B没有后续状态,故v=所有回报/总个数=6/8,v(A)=R+γv(B)=6/8
N步时序差分
上面讲到用后一个状态来表示当前状态,那么能不能用后两个状态来表示呢?后三个呢?N个呢?都是可以的
相应TD目标值是
后一个 Gt(1)=Rt+1+γvπ(St+1) TD(0)
后两个 Gt