官术网_书友最值得收藏!

2.1 剖析智能體

正如上章所述,RL的世界中包含很多實體:

  • 智能體:主動行動的人或物。實際上,智能體只是實現了某些策略的代碼片段而已。這個策略根據觀察決定每一個時間點執行什么動作。
  • 環境:某些世界的模型,它在智能體外部,負責提供觀察并給予獎勵。而且環境會根據智能體的動作改變自己的狀態。

我們來探究一下如何在簡單的情景下,用Python實現它們。先定義一個環境,限定交互步數,并且不管智能體執行任何動作,它都給智能體返回隨機獎勵。這種場景不是很有用,卻能讓我們聚焦于環境和智能體類中的某些方法。先從環境開始吧:

036-01

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

037-01

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

037-02

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

037-03

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

037-04

action()方法是環境的核心功能。它做兩件事——處理智能體的動作以及返回該動作的獎勵。在示例中,獎勵是隨機的,而動作被丟棄了。另外,該方法還會更新已經執行的步數,并拒絕繼續執行已結束的片段。

現在該來看一下智能體的部分了,它更簡單,只包含兩個方法:構造函數以及在環境中執行一步的方法:

037-05

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

037-06

step函數接受環境實例作為參數,并允許智能體執行下列操作:

  • 觀察環境。
  • 基于觀察決定動作。
  • 向環境提交動作。
  • 獲取當前步驟的獎勵。

對于我們的例子,智能體比較愚笨,它在決定執行什么動作的時候會忽視得到的觀察。取而代之的是,隨機選擇動作。最后還剩下膠水代碼,它創建兩個類并執行一次片段:

038-01

你可以在本書的GitHub庫中找到上述代碼,就在https://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On- Second-Edition的Chapter02/01_agent_anatomy.py文件中。它沒有外部依賴,只要稍微現代一點的Python版本就能運行。多次運行,智能體得到的獎勵總數會是不同的。

前面那簡單的代碼就展示了RL模型的重要的基本概念。環境可以是極其復雜的物理模型,智能體也可以輕易地變成一個實現了最新RL算法的大型神經網絡(NN),但是基本思想還是一致的——每一步,智能體都會從環境中得到觀察,進行一番計算,最后選擇要執行的動作。這個動作的結果就是獎勵和新的觀察。

你可能會問,如果基本思想是一樣的,為什么還要從頭開始實現呢?是否有人已經將其實現為一個通用庫了?答案是肯定的,這樣的框架已經存在了,但是在花時間討論它們前,先把你的開發環境準備好吧。

主站蜘蛛池模板: 北安市| 郸城县| 延津县| 云林县| 五莲县| 翁牛特旗| 灵寿县| 桐乡市| 临海市| 博湖县| 天峻县| 宁海县| 佛教| 壤塘县| 长垣县| 垫江县| 杂多县| 绥中县| 米林县| 鹤庆县| 高州市| 什邡市| 铅山县| 石渠县| 平陆县| 汽车| 浦东新区| 杨浦区| 紫云| 德钦县| 望都县| 全南县| 资源县| 固始县| 商水县| 武强县| 鹤岗市| 平谷区| 海城市| 岳普湖县| 海口市|