Как правильно обрабатывать состояния LSTM во время обучения с помощью SliceSampler в TorchRL?Python

Программы на Python
Ответить
Anonymous
 Как правильно обрабатывать состояния LSTM во время обучения с помощью SliceSampler в TorchRL?

Сообщение Anonymous »

Я реализую среду обучения с подкреплением, используя torchl, где агент использует политику на основе LSTM. Моя цель — обучить агента на последовательностях, выбранных из буфера воспроизведения. Хотя у меня все компоненты работают, я не уверен, как правильно проводить обучение буфера воспроизведения. Я пытался следовать руководству по pytorch, но это не совсем сработало.
Я использую собственную параллельную EnvBase и LSTMModule, завернутую в QValueActor. Я использую SliceSampler, чтобы гарантировать получение смежных последовательностей для LSTM.
Мой env возвращает на каждом этапе такой тензорный запрос:

Код: Выделить всё

TensorDict(
fields={
done: Tensor(shape=torch.Size([5, 1]), device=cpu, dtype=torch.bool, is_shared=False),
is_init: Tensor(shape=torch.Size([5, 1]), device=cpu, dtype=torch.bool, is_shared=False),
observation: Tensor(shape=torch.Size([5, 2, 3]), device=cpu, dtype=torch.int8, is_shared=False),
outcome_observation: Tensor(shape=torch.Size([5, 2, 3]), device=cpu, dtype=torch.int8, is_shared=False),
reward: Tensor(shape=torch.Size([5, 1]), device=cpu, dtype=torch.float32, is_shared=False),
state: Tensor(shape=torch.Size([5, 10, 3, 2, 3]), device=cpu, dtype=torch.int8, is_shared=False),
valid_action_mask: Tensor(shape=torch.Size([5, 3]), device=cpu, dtype=torch.bool, is_shared=False)},
batch_size=torch.Size([5]),
device=cpu,
is_shared=False)
Мой размер пакета равен 5 (т. е. у меня есть 5 параллельных окружений). Возможно, важно: все мои эпизоды имеют одинаковую фиксированную длину эпизода_длины , т.е. Done всегда для всех одно и то же.
У меня есть объект политики, который определяет мою действующую политику следующим образом (вызов этого объекта с помощью тензордиктов активирует политику актера).

Код: Выделить всё

         input_wrapper = InputWrapper(in_keys=["observation"],  out_keys=["flattened_observation"])

self.lstm = LSTMModule(
input_size=self.k * 2,
hidden_size=self.hidden_size,
num_layers=self.layers_n,
device=self.device,
in_key="flattened_observation",
out_key="embed",
)

mlp = MLP(
in_features=self.hidden_size,
out_features=self.k,
num_cells=[64],
device=self.device,
)
mlp[-1].bias.data.fill_(0.0)
mlp_module = TensorDictModule(mlp, in_keys=["embed"], out_keys=["action_value"])

net = TensorDictSequential(
input_wrapper,
self.lstm,
mlp_module,
).to(self.device)

self.actor = QValueActor(
module=net,
spec=self.action_spec,
action_mask_key="valid_action_mask",
)
а это мой настоящий цикл тренировок:

Код: Выделить всё

        policy = LSTMPolicy(
num_envs=num_envs,
layers_n=layers_n,
hidden_size=hidden_size,
exploration=True,
device=self.device,
)

env = SingleHighcardEnv.setup_single_env(
num_envs, self.device, seed
)
env.append_transform(policy.lstm.make_tensordict_primer())
env.reset()

buffer = TensorDictReplayBuffer(
storage=LazyMemmapStorage(replay_buffer_capacity),
sampler=SliceSampler(
slice_len=episode_length,
end_key=("next", "done"),
strict_length=False,
),
batch_size=minibatch_size,
)

collector = SyncDataCollector(
env,
policy=policy,
frames_per_batch=num_envs * episode_length,
total_frames=epochs * num_envs * episode_length,
device=self.device,
trust_policy=True,
replay_buffer=buffer,
)

for i, _ in enumerate(collector):
if len(buffer) >= minibatch_size:

batch = buffer.sample().to(self.device)
...training
Очевидно, что эта настройка не на 100% правильна, потому что из примера шага я получаю:

Код: Выделить всё

RuntimeError: Expected the end-of-trajectory signal to be 1-dimensional.  Got a tensor with shape[1]=2 instead
Для меня это не имеет особого смысла - глядя на тензорный запрос, выведенный в _step моей среды, готовый тензор имеет правильный размер пакета x 1 .
Любая помощь в том, как правильно выполнить это рекуррентное обучение, будет принята с благодарностью.>

Подробнее здесь: https://stackoverflow.com/questions/798 ... in-torchrl
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»