處理時間限制¶
在使用 Gymnasium 環境與強化學習程式碼時,常見的問題是如何不正確地處理時間限制。從 env.step
收到的 done
訊號(在舊版本的 OpenAI Gym < 0.26 中)指示了回合是否結束。然而,此訊號無法區分回合結束是由於 termination
還是 truncation
。
終止¶
終止指的是回合在達到終端狀態後結束,而終端狀態被定義為環境定義的一部分。範例包括 - 任務成功、任務失敗、機器人摔倒等。值得注意的是,這也包括由於環境固有的時間限制而在有限視野環境中結束的回合。請注意,為了保持馬可夫性質,剩餘時間的表示必須存在於有限視野環境中代理人的觀察中。 (參考文獻)
截斷¶
截斷指的是回合在外部定義的條件(即在馬可夫決策過程範圍之外)之後結束。這可能是時間限制、機器人超出邊界等。
無限視野環境是需要截斷的一個明顯例子。我們不能永遠等待回合完成,因此我們設定了一個實際的時間限制,在此之後我們強制停止回合。在這種情況下,最後的狀態不是終端狀態,因為根據定義 RL 問題的馬可夫決策過程,它具有移動到另一個狀態的非零轉移機率。這也與有限視野環境中的時間限制不同,因為在這種情況下,代理人不知道這個時間限制。
在學習程式碼中的重要性¶
自舉法(使用一個或多個變數的估計值來更新相同變數的估計值)是強化學習的關鍵方面。價值函數會告訴您,如果您遵循給定的策略,您將從特定狀態獲得多少折價獎勵。當回合在任何給定點停止時,通過查看最終狀態的價值,代理人能夠估計如果回合繼續進行,可以獲得多少折價獎勵。這是處理截斷的一個例子。
更正式地說,RL 中自舉法的一個常見例子是更新 Q 值函數的估計值,
在傳統 RL 中,新的 Q
估計值是先前 Q
估計值和 Q_target
的加權平均值,而在深度 Q 學習中,Q_target
與先前 Q
估計值之間的誤差被最小化。
然而,在終端狀態,不進行自舉法,
這就是終止和截斷之間的區別變得重要的地方。當回合由於終止而結束時,我們不進行自舉法;當回合由於截斷而結束時,我們進行自舉法。
在使用 gymnasium 環境時,done
訊號(< v0.26 的預設值)經常被用於判斷是否進行自舉法。然而,這是錯誤的,因為它沒有區分終止和截斷。
下面顯示了一個價值函數的簡單範例。這是一個說明性範例,並非任何特定演算法的一部分。
# INCORRECT
vf_target = rew + gamma * (1 - done) * vf_next_state
在回合由於截斷而結束的情況下,這是錯誤的,因為在這種情況下需要進行自舉法,但實際上沒有進行。
解決方案¶
從 v0.26 版本開始,Gymnasium 的 env.step
API 明確返回終止和截斷資訊。在之前的版本中,截斷資訊是通過 info 鍵 TimeLimit.truncated
提供的。現在處理終止和截斷的正確方法是,
# terminated = done and 'TimeLimit.truncated' not in info
# This was needed in previous versions.
vf_target = rew + gamma * (1 - terminated) * vf_next_state