- 深度強化學習實踐(原書第2版)
- (俄)馬克西姆·拉潘
- 1313字
- 2021-08-18 17:39:17
2.1 剖析智能體
正如上章所述,RL的世界中包含很多實體:
- 智能體:主動行動的人或物。實際上,智能體只是實現了某些策略的代碼片段而已。這個策略根據觀察決定每一個時間點執行什么動作。
- 環境:某些世界的模型,它在智能體外部,負責提供觀察并給予獎勵。而且環境會根據智能體的動作改變自己的狀態。
我們來探究一下如何在簡單的情景下,用Python實現它們。先定義一個環境,限定交互步數,并且不管智能體執行任何動作,它都給智能體返回隨機獎勵。這種場景不是很有用,卻能讓我們聚焦于環境和智能體類中的某些方法。先從環境開始吧:

前面的代碼展示了環境初始化內部狀態。在示例場景下,狀態就是一個計數器,記錄智能體還能和環境交互的步數。

get_observation()
方法能給智能體返回當前環境的觀察。它通常被實現為有關環境內部狀態的某些函數。不知你是否對-> List[float]
感到好奇,它其實是Python的類型注解,是在Python 3.5版本引入的。在https://docs.python.org/3/library/typing.html的文檔中可以查看更多內容。在示例中,觀察向量總是0,因為環境根本就沒有內部狀態。

get_action()
方法允許智能體查詢自己能執行的動作集。通常,智能體能執行的動作集不會隨著時間變化,但是當環境發生變化的時候,某些動作可能會變得無法執行(例如在井字棋中,不是所有的位置能都執行所有動作)。而在我們這極其簡單的例子中,智能體只能執行兩個動作,它們被編碼成了整數0和1。

前面的方法給予智能體片段結束的信號。就像第1章中所述,環境–智能體的交互序列被分成一系列步驟,稱為片段。片段可以是有限的,比如國際象棋,也可以是無限的,比如旅行者2號的任務(一個著名的太空探測器,發射于40年前,目前已經探索到太陽系外了)。為了囊括兩種場景,環境提供了一種檢測片段何時結束的方法,通知智能體它無法再繼續交互了。

action()
方法是環境的核心功能。它做兩件事——處理智能體的動作以及返回該動作的獎勵。在示例中,獎勵是隨機的,而動作被丟棄了。另外,該方法還會更新已經執行的步數,并拒絕繼續執行已結束的片段。
現在該來看一下智能體的部分了,它更簡單,只包含兩個方法:構造函數以及在環境中執行一步的方法:

在構造函數中,我們初始化計數器,該計數器用來保存片段中智能體累積的總獎勵:

step
函數接受環境實例作為參數,并允許智能體執行下列操作:
- 觀察環境。
- 基于觀察決定動作。
- 向環境提交動作。
- 獲取當前步驟的獎勵。
對于我們的例子,智能體比較愚笨,它在決定執行什么動作的時候會忽視得到的觀察。取而代之的是,隨機選擇動作。最后還剩下膠水代碼,它創建兩個類并執行一次片段:

你可以在本書的GitHub庫中找到上述代碼,就在https://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On- Second-Edition的Chapter02/01_agent_anatomy.py
文件中。它沒有外部依賴,只要稍微現代一點的Python版本就能運行。多次運行,智能體得到的獎勵總數會是不同的。
前面那簡單的代碼就展示了RL模型的重要的基本概念。環境可以是極其復雜的物理模型,智能體也可以輕易地變成一個實現了最新RL算法的大型神經網絡(NN),但是基本思想還是一致的——每一步,智能體都會從環境中得到觀察,進行一番計算,最后選擇要執行的動作。這個動作的結果就是獎勵和新的觀察。
你可能會問,如果基本思想是一樣的,為什么還要從頭開始實現呢?是否有人已經將其實現為一個通用庫了?答案是肯定的,這樣的框架已經存在了,但是在花時間討論它們前,先把你的開發環境準備好吧。