С учетом вышесказанного я хотел бы отойти от одного- преобразование «в один» в версию, которая распространяется на большее количество типов сред и легко подключается к существующей базе кода TorchRL.
Мои вопросы следующие:
- Где лучше всего добавить такую функцию в базу кода TorchRL?
- Каковы хорошие практики для такой реализации? то есть классы и метаклассы для наследования (или ссылки на них в кодовой базе TorchRL) или декораторы.
Код: Выделить всё
DEVICE = 'cuda' if torch.cuda.is_available() else 'cpu'
env = GymEnv('Pendulum-v1', device=DEVICE)
env = TransformedEnv(env, lambda x: x) # Arbitrary transformation that does nothing
obs_dim = 3
action_dim = 1
mlp_actor = MLP(num_cells=64, depth=3, in_features=obs_dim,
out_features=action_dim).to(DEVICE)
actor = TensorDictModule(
mlp_actor, in_keys=['observation'], out_keys=['action'])
mlp_value = MLP(num_cells=64, depth=2, in_features=obs_dim + action_dim,
out_features=action_dim).to(DEVICE)
critic = TensorDictSequential(TensorDictModule(
mlp_value, in_keys=['observation', 'action'], out_keys=['state_action_value']))
loss_fn = DDPGLoss(actor, critic).to(DEVICE)
collector = SyncDataCollector(env, AdditiveGaussianWrapper(
actor, spec=env.action_spec), frames_per_batch=1_000, total_frames=1_000_000)
buffer = TensorDictReplayBuffer(
storage=LazyTensorStorage(100_000, device=DEVICE))
optim = torch.optim.Adam(loss_fn.parameters(), lr=2e-4)
for data in tqdm(collector):
buffer.extend(data)
sample = buffer.sample(50)
loss = loss_fn(sample)
loss = loss['loss_actor'] + loss['loss_value']
loss.backward()
optim.step()
optim.zero_grad()
Я рассмотрел пример RLHF в репозитории TorchRL, который, насколько я понимаю, не совсем применим, поскольку RLHF выполняется после обучения, а DRLHP выполняется в начале. этапы обучения. Я также попробовал прямой перевод; однако, как уже упоминалось, я пытаюсь разработать программное обеспечение таким образом, чтобы оно больше соответствовало Torch и TorchRL.
Подробнее здесь: https://stackoverflow.com/questions/790 ... -predictor