注意
此示例與 Gymnasium 1.2.0 版相容。
處理時間限制¶
本教程解釋瞭如何正確處理帶有終止和截斷訊號的時間限制。
從 env.step 接收到的 done 訊號(在 OpenAI Gym 之前的版本 < 0.26 中)表示一個回合是否結束。然而,此訊號並未區分回合是由於終止還是截斷而結束的。
終止¶
終止是指回合在達到作為環境定義一部分的終止狀態後結束。例如:任務成功、任務失敗、機器人跌倒等。值得注意的是,這也包括在有限時域環境中因環境固有的時間限制而結束的回合。請注意,為了保持馬爾可夫性質,在有限時域環境中,智慧體的觀測中必須包含剩餘時間的表示。(參考文獻)
截斷¶
截斷是指回合在外部定義條件(超出馬爾可夫決策過程範圍)後結束。這可能是一個時間限制,機器人超出邊界等。
無限時域環境是需要此功能的一個明顯例子。我們不能永遠等待回合完成,因此我們設定一個實際的時間限制,在此之後我們強制中止回合。在這種情況下,最後一個狀態不是終止狀態,因為它根據定義RL問題的馬爾可夫決策過程,具有非零的轉移到另一個狀態的機率。這與有限時域環境中的時間限制也不同,因為在這種情況下,智慧體不知道這個時間限制。
在學習程式碼中的重要性¶
自舉(使用一個或多個變數的估計值來更新同一變數的估計)是強化學習的一個關鍵方面。價值函式將告訴你,如果你遵循給定策略,從特定狀態將獲得多少折扣獎勵。當一個回合在任何給定點停止時,透過檢視最終狀態的價值,智慧體能夠估計如果回合繼續下去,可以獲得多少折扣獎勵。這是處理截斷的一個例子。
更正式地說,強化學習中自舉的一個常見例子是更新 Q-價值函式的估計,
在經典強化學習中,新的 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