今天,当我尝试在openai-gym环境下实现一个rl-agent时,我发现一个问题,似乎所有的agent都是从最初始的状态开始训练的:env.reset()
, i.e.
import gym
env = gym.make("CartPole-v0")
initial_observation = env.reset() # <-- Note
done = False
while not done:
action = env.action_space.sample()
next_observation, reward, done, info = env.step(action)
env.close() # close the environment
因此代理可以沿着路线行事是很自然的env.reset() -(action)-> next_state -(action)-> next_state -(action)-> ... -(action)-> done
,这是一集。但是智能体如何从中间状态等特定状态开始,然后从该状态采取行动呢?例如,我从重播缓冲区中采样体验,即(s, a, r, ns, done)
,如果我想直接从状态开始训练代理怎么办ns
,并采取行动Q-Network
,那么对于一个n-step
向前迈出一步。像这样的东西:
import gym
env = gym.make("CartPole-v0")
initial_observation = ns # not env.reset()
done = False
while not done:
action = DQN(ns)
next_observation, reward, done, info = env.step(action)
# n-step later or done is true, break
env.close() # close the environment
但即使我设置了一个变量initial_observation
as ns
,我认为代理人或env
根本不会意识到这一点。我怎样才能告诉gym.env
我想将初始观察设置为ns
并让代理知道特定的开始状态,直接从特定的观察中获得继续训练(从特定的环境开始)?