RL 基礎 | 如何使用 OpenAI Gym 介面,搭建自定義 RL 環境(詳細版)

MoonOut發表於2024-11-11

參考:

  • 官方連結:Gym documentation | Make your own custom environment
  • 騰訊雲 | OpenAI Gym 中級教程——環境定製與建立
  • 知乎 | 如何在 Gym 中註冊自定義環境?
  • g,寫完了才發現自己曾經寫過一篇:RL 基礎 | 如何搭建自定義 gym 環境

(這篇部落格適用於 gym 的介面,gymnasium 介面也差不多,只需詳細看看介面定義 魔改一下即可)


安裝 openai gym:

# pip install gym
import gym
from gym import spaces

需實現兩個主要功能:

  • env.__init__()obs = env.reset() 函式;
  • obs, reward, done, info = env.step(action) 函式。

01 env 的初始化與 reset

env.__init__() 函式:

  • 輸入是 env 的一些初始化條件,比如環境的地圖多大、環境裡有多少個金幣以及每個金幣的位置。如果只訓練一個特定的任務,比如在 3×3 地圖中吃右上角的一個金幣,則這些設定都可以寫死,不需要在 env 初始化時傳遞引數。
  • env.__init__() 函式中,需要定義 self.observation_spaceself.action_space
    • 如果狀態空間 / 動作空間是離散的,則使用 spaces.Discrete([space dim])
    • 如果是連續的,則使用 spaces.Box(low=np.array([0,1]), high=np.array([100,50]), dtype=np.float32) ,其中 low high 都要符合狀態空間 / 動作空間的維度,分別代表每一維的最大最小值。
    • 連續空間也可以使用 spaces.Box(low=0, high=255, shape=(84, 84), dtype=np.uint8) 這種形式,其中空間的每個維度具有相同的最大最小值,shape 表示空間的維度。
    • gym.spaces 的具體使用:官方文件 Gym documentation | Spaces知乎 | Gym 中 Spaces 淺入淺出的理解
  • 可以在 env.__init__() 函式的最後呼叫一下 env.reset() 函式。

obs = env.reset() 函式:

  • 作用是初始化環境,比如把 agent 放到地圖左下角,金幣放在地圖右上角,內建的計步器 reset 到 0 之類。
  • 它的返回值 obs,應該是一個與狀態空間維度相同的 np.ndarray。

02 與環境互動的 step 函式

obs, reward, done, info = env.step(action) 函式:

  • 輸入 action,應該是一個與動作空間維度相同的 np.ndarray。(一般的環境應該不支援批次輸入 action,即 action.shape = (batch_size, action_dim)
  • step 函式被用在 agent 與 env 的互動;env 接收到輸入的動作 action 後,內部進行一些狀態轉移,輸出:
    • 新的狀態 obs:與狀態空間維度相同的 np.ndarray;
    • reward:獎勵值,實數;
    • done:bool 值,True 代表這個 episode 已經跑完(比如 agent 吃到了金幣,或 agent 已經走完了 1000 步)(此時該 reset 了),False 則代表這個 episode 還沒跑完。
    • info:python 的字典(dict),可以傳遞一些資訊,沒有資訊傳遞則可以設成 {}

03 高階用法

  • env.__init__(render_mode="human" or "rgb_array") 以及 rgb_frame = env.render() 。render mode = human 好像可以使用 pygame,rgb frame 則是直接輸出(比如說)shape = (256, 256, 3) 的 frame,可以用 imageio 儲存成影片。
  • 如何註冊 gym 環境:RL 基礎 | 如何註冊自定義 gym 環境


相關文章