通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole( 二 )


class CartPoleAbstractAgent(metaclass=abc.ABCMeta): @abc.abstractmethod def update_q(self, s: State, a: Action, r, s_next: State, a_next: Action): pass
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
TD Learning的精髓MC需要在环境中模拟直至最终结局 。 若为
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
为t步以后的最终return , 则 MC online update 版本更新为:
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
可以认为
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
向着目标为更新了一小步 。
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
另外一个和Monte Carlo的区别在于一般TD方法保存更精细的Q值 , 并用Q值来boostrap , 而MC一般用V值也可用Q值 。
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
SARSA: On-policy TD 控制SARSA的命名源于一次迭代产生了五元组
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
。 SARSA利用五个值做 action-value的 online update:
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
对应的Q table更新实现为:
class SarsaAgent(CartPoleAbstractAgent): def update_q(self, s: State, a: Action, r, s_next: State, a_next: Action): self.q[s][a] += self.lr * (r + self.discount * (self.q[s_next][a_next]) - self.q[s][a])SARSA 在执行policy 后的Q值更新是对于针对于同一个policy的 , 完成了一次策略迭代(policy iteration) , 这个特点区分于后面的Q-learning算法 , 这也是SARSA 被称为 On-policy 的原因 。 下面是完整算法伪代码 。
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
SARSA 训练分析SARSA收敛较慢 , 1000次episode后还无法持久稳定 , 后面的Q-learning 和 Expected Sarsa 都可以在1000次episode学习长时间保持不倒的状态 。
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
Q-Learning: Off-policy TD 控制Q-Learning 是深度学习时代前强化学习领域中的著名算法 , 它的 online update 公式为:
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
对应的 update_q 方法具体实现
class QLearningAgent(CartPoleAbstractAgent): def update_q(self, s: State, a: Action, r, s_next: State, a_next: Action): self.q[s][a] += self.lr * (r + self.discount * np.max(self.q[s_next]) - self.q[s][a])本质上用现有的Q table中最好的action来bootrap 对应的最佳Q值 , 推导如下:
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
Q-Learning 被称为 off-policy 的原因是它并没有完成一次policy iteration , 而是直接用已有的 Q 来不断近似
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
对比下面的Q-Learning 伪代码和之前的 SARSA 版本可以发现 , Q-Learning少了一次模拟后的
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
, 这也是Q-Learning 中执行policy和预估Q值(即off-policy)分离的一个特征 。
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
Q-Learning 训练分析Q-Learning 1000次episode就可以持久稳定住 。
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
SARSA 改进版 Expected SARSAExpected SARSA 改进了 SARSA 的地方在于考虑到了在某一状态下的现有策略动作分布 , 以此来减少variance , 加快收敛 , 具体更新规则为:
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图
注意在实现中 , update_q 不仅更新了Q table , 还显示更新了执行policy
通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole文章插图