时序差分方法
基本思路
蒙特卡罗方法一般需要拿到完整的轨迹,才能对策略进行评估并更新模型,因此效率也比较低。时序差分学习(Temporal-Difference Learning)方法是蒙特卡罗方法的一种改进,其基本思想就是将蒙特卡罗的批量式更新改为增量式更新,在生成轨迹中,每执行一步策略后就进行值函数更新,做到更高效的免模型学习。
蒙特卡罗方法值函数的估计
v(s)=E[Gt∣St=s]=n1k=1∑ngk(s)
若直接根据上式计算平均奖赏,则需记录 n 个奖赏值。显然,更高效的做法是对均值进行增量式计算,即每执行一步就立即更新 v(s)。不妨用下标来表示执行的次数,初始时 v1(s)=0
vk+1(s)=vk(s)+k1[gk(s)−vk(s)]
更一般的,将 1/k 替换为步长 α
vk+1(s)=vk(s)+α[gk(s)−vk(s)]
显然,下一轮的估计值是本轮估计值和样本值的加权平均
vk+1(s)=(1−α)vk(s)+αgk(s)
更新步长 α 越大,则越靠后的累积奖赏越重要。可以证明 vk(s) 收敛
k→∞limvk(s)=E[v(s)]
由于 gk 为一次试验的完整轨迹所得到的总回报。为了提高效率,我们可以使用贝尔曼方程
vπ(s)=E[Rt+1+γvπ(St+1)∣St=s]
来近似估计。即使用样本集 {st,rt+1,v(st+1)}k=1n 增量更新
new estimatev(st)←current estimatev(st)+α[TD targetrt+1+γv(st+1)−v(st)TD error]
其中真实观测称为 TD target
v~t=rt+1+γv(st+1)
模型估计与真实观测之差称为 TD error
δ=v~t−v(st)=rt+1+γv(st+1)−v(st)
TD 算法的目的是通过迭代使得TD error最小,这实际上是损失函数为 (vt−v(st))2 的单样本随机梯度下降。
相比于蒙特卡洛方法,TD算法是增量式的,它不需要等到整条轨迹采集完成才能计算,而是在接收到一个经验样本 (experience sample) 后能立即更新值函数。
SARSA
动作值函数 q(s,a) 的贝尔曼方程为
qπ(s,a)=E[Rt+1+γqπ(St+1,At+1)∣St=s,At=a],∀(s,a)
这里我们学习的不是状态价值函数,而是动作价值函数 q(s,a)。更新该值的方法跟更新状态价值 v(s,a)的方式一致:
q(st,at)←q(st,at)+α[rt+1+γq(st+1,at+1)−q(st,at)]
这种策略学习方法称为SARSA算法,其名称代表了每次更新值函数时需知道数据 (St,At,Rt+1,St+1,At+1) 。
算法流程如下图:
时序差分学习方法和蒙特卡罗方法的主要不同为:蒙特卡罗方法需要一条完整的路径才能知道其总回报,也不依赖马尔可夫性质;而时序差分学习方法只需要一步,其总回报需要通过马尔可夫性质来进行近似估计。
n-step Sarsa:回顾下 action value的定义
qπ(s,a)=E[Gt∣St=s,At=a]
实际上折扣回报可以分解为不同的格式
Gt=Rt+1+γqπ(St+1,At+1)=Rt+1+γRt+2+γ2qπ(St+2,At+2)=Rt+1+γRt+2+⋯+γnqπ(St+n,At+n)=Rt+1+γRt+2+γ2Rt+2+⋯
当 n=1 时,便是Sarsa算法,当 n=∞ 时,则对应了MC算法,对于一般 n值对应的算法称为 n-step Sarsa。
Q-Learning
Q-learning 是一种 off-policy 的时序差分学习方法。与SARSA算法不同的是,Sarsa的目标是估计给定策略的动作值函数,而Q-learning目标是直接估计最优动作值函数,因此更新后的q-value 是关于目标策略的。
动作值函数的贝尔曼最优方程为
qπ(s,a)=E[Rt+1+γqπa′maxq(St+1,a′)∣St=s,At=a],∀(s,a)
Q-learning的单个样本的更新规则
q(st,at)←q(st,at)+α[rt+1+γa′maxq(st+1,a′)−q(st,at)]
off-policy 算法流程如下图:
Jupyter Notebook Code
附录
悬崖行走问题
悬崖行走问题:(Cliff Walking) 在一个网格世界中,每个网格表示一个状态。其中网格 (2,1) 到 (11,1) 是悬崖(Cliff)。有一个Agent,目标是如何安全地从左下角的开始位置 S,走到右下角的目标位置 G。Agent 在每一个状态都可以选择4种行走方向:⬆️ ⬅️ ⬇️ ➡️。但每走一步,都有一定的概率滑落到周围其他格子。如果掉入悬崖或到达目标状态都会结束动作并回到起点,也就是说掉入悬崖或者达到目标状态是终止状态。Agent 每走一步的奖励是 −1,掉入悬崖的奖励是 −100,到达终止状态奖励为 0。
Jupyter Notebook Code