咱們前面介紹了第一個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仍是很不錯的一種強化學習問題求解方法。