我不理解以下内容:
-
env.close()
#这意味着什么? -
model.learn(total_timesteps=1000)
#是total_step吗?这里是神经网络模型参数更新后的步数(即每集的时间步数(? -
model = PPO(MlpPolicy, env, verbose=1)
#这里verbose=1的含义是什么? -
action, _state = model.predict(obs, deterministic=True)
#deterministic=True
在这里做什么?deterministic=True
是否意味着政策是确定性的而不是随机的? -
我在哪里可以说明我想运行实验的集数?
for i in range(1000):
`action, _states = model.predict(obs)`
`obs, rewards, dones, info = env.step(action)`
`env.render()`
这里有1000集吗?
请有人澄清这些。
- env.close((依赖于环境,因此它将为每个环境做不同的事情。它基本上是用来停止渲染游戏的,如这里的代码所示
def close(self):
if self.screen is not None:
import pygame
pygame.display.quit()
pygame.quit()
self.isopen = False
total_timesteps
是您希望培训代理的总时间步长。n_steps
是用于决定更新模型的频率的参数。如果您仍然感到困惑,请随意查看文档- 从文档中,详细程度是指每次更新时打印出的关于模型的内容:
verbose (int) – the verbosity level: 0 no output, 1 info, 2 debug
- 否。由于您只调用模型的
predict()
函数,所以这个问题没有意义,因为您可以很容易地在调用deterministic=False
之后立即调用predict()
函数,并且您将得到一个随机操作。模型本身既不是随机的,也不是确定性的。特别是,PPO通过首先向参与者的网络输入观察结果来获得行动,该网络将输出所谓的logits或未规范化的日志行动概率。然后,这些logits通过一个类别分布,该分布本质上是一个Softmax((操作,以获得动作概率分布。从策略的网络获取操作的一个简单伪代码示例如下:
logits = policy_network(observation)
probs = Categorical(logits=logits)
actions = probs.sample()
正如你从这个代码中看到的:
def get_actions(self, deterministic: bool = False) -> th.Tensor:
"""
Return actions according to the probability distribution.
:param deterministic:
:return:
"""
if deterministic:
return self.mode()
return self.sample()
稳定基线使用您提到的deterministic
输入来调用类别分布的mode()
函数或sample()
函数。两者的代码都在Pytorch的文档中:
def sample(self, sample_shape=torch.Size()):
if not isinstance(sample_shape, torch.Size):
sample_shape = torch.Size(sample_shape)
probs_2d = self.probs.reshape(-1, self._num_events)
samples_2d = torch.multinomial(probs_2d, sample_shape.numel(), True).T
return samples_2d.reshape(self._extended_shape(sample_shape))
def mode(self):
return self.probs.argmax(axis=-1)
正如你所看到的,范畴分布的sample()
函数只是调用Pytorch的torch.multinomial
分布,它将从多项式分布中返回一个随机样本,这就是deterministic=False
时你的行为随机的原因。另一方面,范畴分布的mode()
函数只执行argmax()
运算,它没有随机性,因此是确定性的。希望这个解释不会太复杂。
- 这不是简单地通过传递参数就能完成的,根据文档,您需要实现StopTrainingOnMaxEpisodes自定义回调。文档中还有一个简单的代码示例,为了清楚起见,我将在这里重复一下:
from stable_baselines3 import A2C
from stable_baselines3.common.callbacks import StopTrainingOnMaxEpisodes
# Stops training when the model reaches the maximum number of episodes
callback_max_episodes = StopTrainingOnMaxEpisodes(max_episodes=5, verbose=1)
model = A2C('MlpPolicy', 'Pendulum-v1', verbose=1)
# Almost infinite number of timesteps, but the training will stop
# early as soon as the max number of episodes is reached
model.learn(int(1e10), callback=callback_max_episodes)
如果你对PPO的工作原理感到困惑,或者想知道更多关于PPO的问题,我强烈建议你阅读这篇文章,它充分解释了PPO是如何在代码中实现的,链接了所有解释PPO创建背后直觉的论文,并配有非常有用的视频。