RL回顧
首先先來回顧一下強化學習問題中,環境Env 和 代理Agent 分別承擔的角色和作用。
RL組成要素是Agent、Env
代理和環境 分別承擔的作用
- Agent:
由Policy 和 RL_Algorithm構成,這種對RL_algorithm的算法理解比較寬泛- policy負責將observation映射為action
- RL_Algorithm負責優化policy,具有學習和搜索(規划)的能力
- Enviroment:
- 輸入action
- 輸出reward、state
- 內部還需要完成執行狀態轉移、判斷是否終止等任務
- Agent的構成的另一種理解
組成要素:Policy、Value function、Model其中至少一個
gym
gym介紹
gym是一個熱門的學習庫,搭建了簡單的示例,其主要完成的功能,是完成了RL問題中Env的搭建。
- 對於強化學習算法的研究者,可以快速利用多種不同的環境驗證迭代自己的算法有效性。
- 對於強化學習應用的研究者,我們可以效仿gym中的接口,搭建自己的環境。
gym定義
gym是一個class 的形式,完成了接口定義和調用
gym的核心代碼寫在core.py
里,定義兩個最基本的基類Env
和Space
Space
Discrete
類,定義離散狀態、動作,初始化需要1個參數,維度nBox
類,定義連續狀態、動作,初始化需要2個array(size=維數n)
偽代碼如下:
- 環境Env
class Environment():
self.states # 所有可能的狀態集合
self.agent_cur_state # 記錄個體當前的狀態
self.observation_space # 個體的觀測空間
self.action_space # 個體的行為空間
def reward(self) -> reward # 根據狀態確定個體的即時獎勵
def dynamics(self, action) -> None # 根據當前狀態和個體的行為確定個體的新狀態
def is_episode_end(self) -> Bool # 判斷是否一個Episode結束
def obs_for_agent() -> obs # 環境把個體當前狀態做一定變換,作為個體的觀測
- 代理Agent
class Agent(env: Environment):
self.env = env # 個體依附於一個環境存在
self.obs # 個體的觀測
self.reward # 個體獲得的即時獎勵
def performPolicy(self, obs) -> action # 個體執行一個策略產生一個行為
def performAction(self, action) -> None # 個體與環境交互,執行行為
action = self.performPolicy(self.obs)
self.env.dynamics(action)
def observe(self) -> next_obs, reward # 個體得到從環境反饋來的觀測和獎勵
self.obs = self.env.obs_for_agent()
self.reward = self.env.reward()
gym調用
gym的調用框架
env = gym.make('x')
observation = env.reset()
for i in range(time_steps):
env.render() # 調用第三方庫刷動畫寫這里
action = policy(observation)
observation, reward, done, info = env.step(action)
if done:
……
break
env.close()
例子
例程是一個簡單的策略,桿左斜車左移,右斜則右移。
import gym
import numpy as np
env = gym.make('CartPole-v0')
t_all = [ ]
action_bef = 0
for i_episode in range(5):
observation = env.reset()
for t in range(100):
env.render()
cp, cv, pa, pv = observation
if abs(pa)<= 0.1:
action = 1 -action_bef
elif pa >= 0:
action = 1
elif pa <= 0:
action = 0
observation, reward, done, info = env.step(action)
action_bef = action
if done:
# print("Episode finished after {} timesteps".format(t+1))
t_all.append(t)
break
if t ==99:
t_all.append(0)
env.close()
print(t_all)
print(np.mean(t_all))
gym的搭建
函數接口
一個完整的gym環境包括以下函數:
- class Cartpoleenv(gym.env)
def __ init __(self)
:類構建def reset(self)
:初始化def seed(self, seed = None)
:隨機初始條件種子return [seed]
def step(self, action)
: 單步仿真observation, reward, done, info
def render(self, mode='human')
:圖像引擎調用繪制窗口return self.viewer.render()
def close()
:關閉窗口
功能函數
參數限位
vel = np.clip(vel, vel_min, vel_max)
action輸入校驗
self.action_space.contains(action)
action和observation空間定義
例子:
Discrete
: 0,1,2三個離散值
low = np.array([min_0,min_1],dtype=np.float32)
high = np.array([max_0,max_1],dtype=np.float32)
self.action_space = spaces.Discrete(3)
self.observation_space = spaces.Box(
self.low, self.high, dtype=np.float32)
agent 的構建
agent與環境進行交互,輸入是env的輸出(observation),輸出是env的輸入(action)
class Agent():
def __ init__(self,action_space):
self.action_space = action_space
def act(self, observation, reward, done):
return action
agent和env交互邏輯如下:
nb_episodes = xx
nb_steps = xx
reward = 0
done = False
for i in range(nb_episodes):
ob = env.reset()
sum_reward = 0
for j in range(nb_steps):
action = agent.act(ob, reward, done)
ob, reward, done, _ = env.step(action)
sum_reward += reward
if done:
break
添加自己寫的環境到gym,方便調用
設置過程
- 打開gym.envs目錄:
/usr/local/lib/python3.7/site-packages/gym/envs
- 將自己編寫的myenv.py拷貝至一個
custom
目錄 envs/custom
下__init__.py
添加from gym.envs.custom.myenv import MyEnv
,將子文件夾的.py
import到上層目錄- env下
__init__.py
添加
register(
id='myenv-v0',
entry_point='gym.envs.custom:MyEnv,
max_episode_steps=999, #限制了最大終止仿真步數
)
授權gym
的方法可以調用myenv.py
中的MyEnv
class
- 注意:
__init__.py
里的register
方法中env_name
版本號-v0
不能省略- 調用的時候,也要帶上環境相應的版本號
調用方法
env_name = 'myenv-v0'
env = gym.make('env_name')
env.reset() # 初始化環境
env.render() # 繪制環境,if necessary
env.step() # 單步仿真
env.close() # 關閉環境,一般涉及圖像繪制的任務,此步為必須