时序差分学习(Temporal-Difference Learning)
时序差分学习算法结合了动态规划和蒙特卡洛算法特点。一方面像蒙特卡洛算法一样,它不需要知道具体的环境模型,可以直接从经验中学习;另一方面,继承了动态规划算法的自举(bootstrap)方法,可以利用之前学到的估计值来更新值函数,而不用等到一个episode 结束后再更新。
1 时间差分预测(TD Prediction)
蒙特卡罗算法一般需要拿到完整的轨迹,才能对策略进行评估并更新模型,因此效率也比较低。时序差分学习算法是模拟一段轨迹 \(\tau\),即每行动一步或者几步就利用贝尔曼方程来估计值函数。
先来回顾一下蒙特卡罗算法:假设一个 episode 的起始状态和动作分别为 \(s,a\). 现在把计算动作值函数的公式改成增量计算的方式:
其中这个 \(G\left(\tau_{s_{0}=s, a_{0}=a}^{(N)}\right)\) 就是在状态 \(s\) 下新的一轮 (第 \(N\) 轮) 所得到的 return,可以看出动作值函数 \({Q^\pi }\left( {s,a} \right)\) 在第 \(N\) 次试验后的平均等于第 \(N-1\) 次实验后的平均加上一个增量。公式中第二行到第三行是因为:\(\frac{{\rm{1}}}{{N - 1}}\sum\limits_{n = 1}^{N - 1} G \left( {\tau _{{s_0} = s,{a_0} = a}^{(n)}} \right){\rm{ = Q}}_{N - 1}^\pi \left( {s,a} \right)\)
邱锡鹏老师的神经网络与深度学习书上应该是为了容易理解才假设每个初始状态是这样。一般而言,取到状态为\(s\)时可能已经是\(s_t\)时刻了。不过这个应该无所谓,其实效果都一样。
更一般性地,把权重系数 \(\frac{1}{N}\) 改写成一个比较小的正数 \(\alpha\),这样每次采样了一个新的轨迹 \(\tau\),就可以更新动作值函数为:
可以看出这个更新策略,因为 \(G\left(\tau_{s_{0}=s, a_{0}=a}\right)\) 是需要把这一次的实验做完后才能得到的汇报,这个过程是比较缓慢的。而时间差分预测算法借助动态规划的思想,不需要得到完整的轨迹,而是在一次实验中每经过一个 time step 就去更新一次。
具体的做法是,从状态和动作 \(s,a\) 开始,采样下一步的状态和动作 \((s^{\prime},a^{\prime})\),并得到奖励 \(r(s,a,s^{\prime})\),然后利用贝尔曼方程近似估计上面的 \(G\left(\tau_{s_{0}=s, a_{0}=a}\right)\).
结合(\(1\)-\(2\)) 以及(\(1\)-\(3\)) 可得:
个人理解:
- 这个为什么要用约等于呢?因为我们现在有的数据(因为这一步其实还没执行,所以用的是以前的数据)是以往的状态和动作\((s^{\prime},a^{\prime})\)下的\(Q\)函数(其实严格来说我觉得并不算是\(Q\)函数,而是对\(Q\)函数的经验平均,只是一个近似的\(Q\)函数)。而这个\(G\)却是一个新的实验,他是有一定的随机性的,所以只能说是个近似
- 注意这里是已经知道了下一步的状态和动作,而不是对所有可能的\(s^{\prime},a^{\prime}\)再去求个期望
2 On-policy control - SARSA
现在来看,我们更新动作值函数 \({Q}^{\pi}(s, a)\) 只需要知道当前的状态 \(s\) 和动作 \(a\),奖励 \(r(s,a,s^{\prime})\),下一步的状态 \(s^{\prime}\) 和动作 \(a^{\prime}\). 即只需要 \((s,a,r,s^{\prime},a^{\prime})\),这也就是 SARSA 算法。
可以看一下 \(Sutton\) 书上的伪代码,意思是一样的,不过要注意的是在根据下一步状态 \(s^{\prime}\) 选下一步动作 \(a ^{\prime}\) 时是 \(\varepsilon-greedy\) 的。
SARSA 算法中进行采样 (生成 episode 每一步) 的策略与要改进的策略都是 \({\pi ^\varepsilon }\) ,所以也称为同策略算法。
3 Off-policy control - Q learning
\(Q-learning\) 算法是一种异策略的时序差分学习方法,在 \(Q\) 学习中,对动作值函数的估计改为:
可以看出与 SARSA 算法不同的是:在进行下一个动作 \(a^{\prime}\) 的选择时,不再是通过策略 \({\pi ^\varepsilon }\) 了,而是直接选择最优的那个 \(Q\) 函数 (这一步是 \(greedy\) 的)。因此这个更新后的动作值函数是关于策略 \(\pi\) 的,而不是关于策略 \({\pi ^\varepsilon }\).
参考资料\([3]\)中给详细解读了 \(Q-learning\) 的过程,参考资料\([4]\)中有个小视频更形象。链接:🔗
其实就相当于有个\(Q\)值的表,然后不断地去更新它。