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還是很不錯的一種強化學習問題求解方法。