Processing math: 100%

[RL Notes] 时序差分学习——一个例子

1. 问题

  使用《强化学习》(第二版)例 6.1 中开车回家的例子,在下班开车回家的路途中,不断地记录路上消耗的时间和估计到家的时间:

  • 18:00 – 离开办公室的时间记为时刻 0,估计 30 分钟后到家。
  • 18:05 – 5 分钟后到达车旁,发现开始下雨,估计路上会花更多时间,于是估计还要花 35 分钟到家(算上已经花费的 5 分钟,估计到家花费的总时间为 40 分钟)。
  • 18:20 – 开了 15 分钟下了高速,高速比往常顺畅,比预期少花了 5 分钟,于是将估计总时间减少到 35 分钟,估计剩余时间为 15 分钟。
  • 18:30 – 又开了 10 分钟,被堵在一辆缓慢的卡车后面,道路狭窄无法超车,估计到家要多花些时间,于是将估计总时间增加到 40 分钟,估计剩余时间为 10 分钟。
  • 18:40 – 又堵了 10 分钟终于抵达了居住的街道,估计还要花 3 分钟才能到家,于是将估计总时间增加到 43 分钟,估计剩余时间为 3 分钟。
  • 18:43 – 终于到家。

将上述过程记录如表 1 所示。

表 1

状态 消耗的总时间(分钟) 估计剩余时间 估计总时间
离开办公室 0 30 30
到车旁,开始下雨 5 35 40
下高速 20 15 35
在路上被堵在卡车后面 30 10 40
开到居住的街道 40 3 43
到家 43 0 43

  定义每个状态的收益为该步骤消耗的时间,过程不加折扣(γ=1),则每个状态的回报就是从这个状态开始到回家实际消耗的总时间。

  下面分别使用蒙特卡洛方法和时序差分方法对状态价值进行更新。

2. 蒙特卡洛方法

  蒙特卡洛方法使用下式对状态价值进行更新。

V(St)V(St)+α[GtV(St)]

本例中取 α=1。蒙特卡洛方法使用 Gt 更新估计值,Gt 只有在一幕结束时才能获得。也就是说,必须要等到家后才能更新对各个状态的估计。

  将各个时刻 t 下个状态 St、回报 Gt(从 St 开始到回家实际消耗的总时间)和状态价值的估计 V(St)(即表 1 中的估计剩余时间)列出如表 2 所示。

表 2

t St Gt V(St)
0 离开办公室 43 30
1 到车旁,开始下雨 38 35
2 下高速 23 15
3 在路上堵在卡车后面 13 10
4 开到居住的街道 3 3
5 到家 0 0

  如表 2 所示,G0 表示从离开办公室到抵达家中所消耗的时间,故有

G0=5+15+10+10+3=43

由式 (1),更新 V(S0)

V(S0)V(S0)+α[G0V(S0)]=30+(4330)=43

  类似地,计算其他状态的更新如下

V(S1)V(S1)+α[G1V(S1)]=35+(3835)=38V(S2)V(S2)+α[G2V(S2)]=15+(2315)=23V(S3)V(S3)+α[G3V(S3)]=10+(1310)=13V(S4)V(S4)+α[G4V(S4)]=3+(33)=3

3. 时序差分

  实际上,我们并不需要等到家后再更新对各个状态的估计。

  时序差分使用下式对状态价值进行更新。

V(St)V(St)+α[Rt+1+γV(St+1)V(St)]

本例中取 α=1γ=1

  将各个时刻 t 下个状态 St、收益 Rt(该步骤消耗的时间)和状态价值的估计 V(St)(即表 1 中的估计剩余时间)列出如表 3 所示。注意表 3 中并没有 Gt

表 3

t St Rt V(St)
0 离开办公室 0 30
1 到车旁,开始下雨 5 35
2 下高速 15 15
3 在路上堵在卡车后面 10 10
4 开到居住的街道 10 3
5 到家 3 0

  由式 (2),在到达状态 S1 后,即可更新 S0 的估计,此时

V(0)V(S0)+α[R1+γV(S1)V(S0)]=30+(5+3530)=40

这在直观上也容易理解:从离开办公室(S0)到抵达车旁(S1)花了 5 分钟(R1),发现下雨,估计到家还要花费 35 分钟(V(S1))。再次回到 S0,由于掌握了 S1 的信息,此时应该估计到家的时间为 5+35=40 分钟,更新估计值 V(St)30+(4030)=40 分钟。

  类似地,计算其他状态的更新如下

V(S1)V(S1)+α[R2+γV(S2)V(S1)]=35+(15+1535)=30V(S2)V(S2)+α[R3+γV(S3)V(S2)]=15+(10+1015)=20V(S3)V(S3)+α[R4+γV(S4)V(S3)]=10+(10+310)=13V(S4)V(S4)+α[R5+γV(S5)V(S4)]=3+(3+03)=3

可见时序差分方法的更新只需要下一个状态,而不需要等到一幕结束。