引用来自ShangtongZhang的代码chapter11/counterexample.py
通过Baird’s counterexample来分析off-policy的approximation方法的性能。
问题描述
这是第11章唯一使用的一个例子,使用了一个MRP如下:
其中虚线dashed action对应从任意state到1-6th state的跳转,实线solid action对应从任意state到7th state的跳转,所有action的reward都是0。off-policy的behavior policy b 选取实线action和虚线action按照概率6/7和1/7,所以由behavior policy产生的next-state的分布是均匀的;target policy π 是只选择solid(实线) action的,所以on-policy 分布更集中于7th state,这里的on-policy分布是指的会产生weight更新的state的分布。
每个state的value都是通过圆圈里的linear function来描述的,如果weight vector是零向量,那么可以精确的推出true value都是0。
通过使用不同的off-policy approximation方法,来讨论off-policy面临的两大挑战,就是和on-policy相比,update target和update distribution的改变,例子里我们可以看到,直接从on-policy推广得到的off-policy,如果没有解决好这两个问题,效果大都差强人意。
引入模块,定义常量
1 | import numpy as np |
定义target policy和behavior policy,并使用step函数来建立agent和environment之间的交互
1 | # take @action at @state, return the new state |
使用semi-gradient off-policy TD方法完成一次weight update
1 | # Semi-gradient off-policy temporal difference |
使用semi-gradient DP方法完成一次weight update
1 | # Semi-gradient DP |
绘制使用semi-gradient off-policy TD和semi-gradient DP方法的weight收敛曲线
1 | # Figure 11.2(left), semi-gradient off-policy TD |
100%|██████████| 1000/1000 [00:00<00:00, 38275.13it/s]
100%|██████████| 1000/1000 [00:00<00:00, 13016.09it/s]
可见使用semi-gradient off-policy TD和semi-gradient DP方法训练weight均未收敛
使用TDC方法训练
1 | # state distribution for the behavior policy |
使用expectedTDC训练
1 | # expected temporal difference with gradient correction |
使用ETD方法训练
1 | # interest is 1 for every state |
计算RMSVE和RMSPBE
1 | # compute RMSVE for a value function parameterized by @theta |
绘制图像比较TDC和expected TDC性能
1 | # Figure 11.6(left), temporal difference with gradient correction |
100%|██████████| 1000/1000 [00:00<00:00, 10149.88it/s]
100%|██████████| 1000/1000 [00:00<00:00, 4183.01it/s]
可以看到虽然最后结果收敛到了PBE为0,但是VE仍然是2,即和w=(0,0,0,0,0,0,0,0)的true weight仍然有差距。
绘制图像测试ETD算法性能
1 | # Figure 11.7, expected ETD |
100%|██████████| 1000/1000 [00:00<00:00, 12319.59it/s]
使用ETD方法训练时使用的期望值,可以看到最后VE收敛到了0,但是实际应用时,即实际sample造成的方差会很大,所以这种方法理论收敛但是实际一般不能收敛。