咱们前面介绍了第一个Model Free的模型蒙特卡洛算法。蒙特卡罗法在估计价值时使用了完整序列的长期回报。并且蒙特卡洛法有较大的方差,模型不是很稳定。本节咱们介绍时序差分法,时序差分法不须要完整的序列,而且利用Bellman公式和动态规划进行迭代。python
前面提到蒙特卡罗的计算方法因为使用了完整的采样获得了长期回报值,因此在价值的估计上的误差更小,但同时它须要收集完整序列的信息,而序列存在必定的波动,因此价值的方差会比较大。git
而时序差分法只考虑了当前一步的回报值,其他的计算均使用了以前的估计值,因此当总体系统没有达到最优时,这样的估计都是存在误差的,可是因为它只估计了一步,因此它在估计值方面受到的波动比较小,所以方差也会相应减少许多github
因此前人发现,蒙特卡罗法和TD算法象征着两个极端:一个为了追求极小的偏差使方差变大,一个为缩小方差使偏差变大算法
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})\),公式以下:spa
\[ q_{t}(s_{t},a_{t}) = q_{t-1}(s_{t-1},a_{t-1}) + \frac{1}{N}(r_t + \gamma*q_{t-1}(s_t,a_t) - q_{t-1}(s_{t-1},a_{t-1})) \]code
从上面的公式能够看出SARAS的字母的意思,分别表明了\(s_{t-1},a_{t-1},r_t,a_t,s_t\)这5个状态值。内存
SARAS的强化学习的过程也分为策略评估和策略提高。get
策略提高和以前的Model Base都差很少,借鉴策略迭代和价值迭代。it
策略评估中有比较大的区别,下面给出策略评估的代码,完整代码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
SARSA法和动态规划法比起来,不须要环境的状态转换模型(Model Free),和蒙特卡罗法比起来,不须要完整的状态序列,所以比较灵活。在传统的强化学习方法中使用比较普遍。
可是SARSA算法也有一个传统强化学习方法共有的问题,就是没法求解太复杂的问题。在SARSA算法中,\(q(s,a)\)的值使用一张大表来存储的,若是咱们的状态和动做都达到百万乃至千万级,须要在内存里保存的这张大表会超级大,甚至溢出,所以不是很适合解决规模很大的问题。固然,对于不是特别复杂的问题,使用SARSA仍是很不错的一种强化学习问题求解方法。