强化学习-时序差分算法(TD)和SARAS法
1. 前言
我们前面介绍了第一个Model Free的模型蒙特卡洛算法。蒙特卡罗法在估计价值时使用了完整序列的长期回报。而且蒙特卡洛法有较大的方差,模型不是很稳定。本节我们介绍时序差分法,时序差分法不需要完整的序列,并且利用Bellman公式和动态规划进行迭代。
2. 时序差分和蒙特卡洛比较
前面提到蒙特卡罗的计算方法由于使用了完整的采样得到了长期回报值,所以在价值的估计上的偏差更小,但同时它需要收集完整序列的信息,而序列存在一定的波动,所以价值的方差会比较大。
而时序差分法只考虑了当前一步的回报值,其余的计算均使用了之前的估计值,所以当整体系统没有达到最优时,这样的估计都是存在偏差的,但是由于它只估计了一步,所以它在估计值方面受到的波动比较小,因此方差也会相应减小许多
所以前人发现,蒙特卡罗法和TD算法象征着两个极端:一个为了追求极小的误差使方差变大,一个为缩小方差使误差变大
3. SARAS法
SARAS是时序差分法的一种。
SARAS假设前一时刻的状态价值的值是最优的\(q_{t-1}(s_{t-1},a_{t-1})\),利用当前的行动状态值\(q_{t-1}(s_t,a_t)\)和奖励值\(r_t\)来更新\(q_{t}(s_{t},a_{t})\),公式如下:
从上面的公式可以看出SARAS的字母的意思,分别代表了\(s_{t-1},a_{t-1},r_t,a_t,s_t\)这5个状态值。
4. SARAS代码介绍
SARAS的强化学习的过程也分为策略评估和策略提升。
策略提升和之前的Model Base都差不多,借鉴策略迭代和价值迭代。
策略评估中有比较大的区别,下面给出策略评估的代码,完整代码GitHub
# sarsa的策略评估
def sarsa_eval(self, agent, env):
state = env.reset()
prev_state = -1
prev_act = -1
while True:
act = agent.play(state, self.epsilon)
next_state, reward, terminate, _ = env.step(act)
if prev_act != -1:
# SARSA的迭代公式
return_val = reward + agent.gamma * (0 if terminate else agent.value_q[state][act])
agent.value_n[prev_state][prev_act] += 1
agent.value_q[prev_state][prev_act] += (return_val - agent.value_q[prev_state][prev_act]) / agent.value_n[prev_state][prev_act]
prev_act = act
prev_state = state
state = next_state
if terminate:
break
5. 总结
SARSA法和动态规划法比起来,不需要环境的状态转换模型(Model Free),和蒙特卡罗法比起来,不需要完整的状态序列,因此比较灵活。在传统的强化学习方法中使用比较广泛。
但是SARSA算法也有一个传统强化学习方法共有的问题,就是无法求解太复杂的问题。在SARSA算法中,\(q(s,a)\)的值使用一张大表来存储的,如果我们的状态和动作都达到百万乃至千万级,需要在内存里保存的这张大表会超级大,甚至溢出,因此不是很适合解决规模很大的问题。当然,对于不是特别复杂的问题,使用SARSA还是很不错的一种强化学习问题求解方法。