處理時間限制

在使用 Gymnasium 環境與強化學習程式碼時,常見的問題是如何不正確地處理時間限制。從 env.step 收到的 done 訊號(在舊版本的 OpenAI Gym < 0.26 中)指示了回合是否結束。然而,此訊號無法區分回合結束是由於 termination 還是 truncation

終止

終止指的是回合在達到終端狀態後結束,而終端狀態被定義為環境定義的一部分。範例包括 - 任務成功、任務失敗、機器人摔倒等。值得注意的是,這也包括由於環境固有的時間限制而在有限視野環境中結束的回合。請注意,為了保持馬可夫性質,剩餘時間的表示必須存在於有限視野環境中代理人的觀察中。 (參考文獻)

截斷

截斷指的是回合在外部定義的條件(即在馬可夫決策過程範圍之外)之後結束。這可能是時間限制、機器人超出邊界等。

無限視野環境是需要截斷的一個明顯例子。我們不能永遠等待回合完成,因此我們設定了一個實際的時間限制,在此之後我們強制停止回合。在這種情況下,最後的狀態不是終端狀態,因為根據定義 RL 問題的馬可夫決策過程,它具有移動到另一個狀態的非零轉移機率。這也與有限視野環境中的時間限制不同,因為在這種情況下,代理人不知道這個時間限制。

在學習程式碼中的重要性

自舉法(使用一個或多個變數的估計值來更新相同變數的估計值)是強化學習的關鍵方面。價值函數會告訴您,如果您遵循給定的策略,您將從特定狀態獲得多少折價獎勵。當回合在任何給定點停止時,通過查看最終狀態的價值,代理人能夠估計如果回合繼續進行,可以獲得多少折價獎勵。這是處理截斷的一個例子。

更正式地說,RL 中自舉法的一個常見例子是更新 Q 值函數的估計值,

\[Q_{target}(o_t, a_t) = r_t + \gamma . \max_a(Q(o_{t+1}, a_{t+1}))\]

在傳統 RL 中,新的 Q 估計值是先前 Q 估計值和 Q_target 的加權平均值,而在深度 Q 學習中,Q_target 與先前 Q 估計值之間的誤差被最小化。

然而,在終端狀態,不進行自舉法,

\[Q_{target}(o_t, a_t) = r_t\]

這就是終止和截斷之間的區別變得重要的地方。當回合由於終止而結束時,我們不進行自舉法;當回合由於截斷而結束時,我們進行自舉法。

在使用 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