- 深度強化學習實踐(原書第2版)
- (俄)馬克西姆·拉潘
- 1464字
- 2021-08-18 17:39:28
6.2 表格Q-learning
首先,真的需要遍歷狀態空間中的每個狀態嗎?我們有一個環境,該環境可以用作真實狀態樣本的來源。如果狀態空間中的一些狀態沒有展示出來,我們為什么要關心這些狀態的價值呢?我們可以用從環境中獲得的狀態來更新狀態價值,這可以節省很多工作。
如前所述,這種價值迭代的更新方法稱為Q-learning,對于有明確的狀態價值映射的情況,它具有以下步驟:
1)從空表開始,將狀態映射到動作價值。
2)通過與環境交互,獲得元組(s, a, r, s')(狀態、動作、獎勵和新狀態)。在此步驟中,要確定所需采取的動作,并且沒有單一的正確方法來做出此決定。在第1章中,我們探討了探索與利用的問題。本章將進行詳細討論。
3)使用Bellman近似更新Q(s, a)值:

4)從步驟2開始重復。
與價值迭代一樣,終止條件可能是更新的某個閾值,或者也可以執行測試片段以估計策略的預期獎勵。
這里要注意的另一件事是如何更新Q值。當從環境中取樣時,將新值直接賦給現有的值通常是一個壞主意,因為訓練可能會變得不穩定。
在實踐中,通常使用“混合”技術用近似值更新Q(s, a),該技術使用值為0~1的學習率α將新舊Q值平均:

即使環境包含噪聲,也可以使Q值平滑收斂。該算法的最終版本如下:
1)從一個Q(s, a)的空表開始。
2)從環境中獲取(s, a, r, s')。
3)進行Bellman更新:。
4)檢查收斂條件。如果不符合,則從步驟2開始重復。
如前所述,這種方法稱為表格Q-learning,因為我們維護了一個帶有其Q值的狀態表。我們在FrozenLake環境中嘗試一下。完整示例代碼在Chapter06/01_frozenlake_q_learning.py
中。

首先,導入包并定義常量。這里的新內容是α值,α將用作價值更新中的學習率?,F在,Agent
類的初始化更加簡單,因為不需要跟蹤獎勵和轉移計數器的歷史記錄,只需跟蹤價值表即可。這將使內存占用空間更小,這對于FrozenLake而言不是一個大問題,但對于較大的環境可能至關重要。

前面的方法可用來從環境中獲取下一個狀態轉移。在動作空間中隨機選取動作,并返回由舊狀態、所采取動作、所獲得獎勵和新狀態組成的元組。該元組將在后續的訓練循環中使用。

下一個方法接收環境中的狀態,并通過表格查找在當前狀態下可以獲得最大價值的動作。如果沒有與動作和狀態對關聯的價值,就將其設為零。該方法將被使用兩次:第一次在測試方法中,使用當前價值表運行一個片段(用來評估策略的質量);第二次使用是在執行價值更新時,用于獲取下一個狀態的價值。

在此,我們在環境中前進一步來更新價值表。為此,通過將立即獎勵與下一個狀態的折扣價值相加來計算狀態s和動作a的Bellman近似。然后,獲得狀態和動作對以前的價值,并使用學習率將這些值混合平均。其結果就是存儲在表中的針對狀態s和動作a的價值的新近似值。

Agent
類中的最后一個方法使用提供的測試環境運行一整個片段。每一步的動作都是根據當前Q值表決定的。該方法用于評估當前的策略,以檢查學習進度。請注意,此方法不會更改價值表,只是用它查找要采取的最佳動作。
該示例的其余部分是訓練循環,它與第5章中的示例非常相似:創建測試環境、智能體和SummaryWriter
。然后在循環中,在環境中執行一步,并使用獲取的數據執行價值更新。接下來,通過運行幾個測試片段來測試當前的策略。如果獲得了足夠好的獎勵,就停止訓練。

該示例的運行結果如下:

你可能已經注意到,與上一章的價值迭代方法相比,此版本使用了更多的迭代來解決問題,原因是不再使用測試中獲得的經驗數據。(在示例Chapter05/02_frozenlake_q_iteration.py
中,定期測試導致Q表統計信息的更新。而此處,測試過程中不觸及Q值,這導致在解決環境問題之前會有更多的迭代。)總體而言,從環境中獲取的樣本總數幾乎相同。TensorBoard中的獎勵圖也展示了訓練動態,這與價值迭代方法非常相似(見圖6.1)。

圖6.1 FrozenLake的獎勵動態