Aan de slagGa gratis aan de slag

A2C met batch-updates

Tot nu toe heb je in deze cursus variaties gebruikt op dezelfde kernlus voor DRL-training. In de praktijk zijn er verschillende manieren om deze structuur uit te breiden, bijvoorbeeld om batch-updates mogelijk te maken.

Je gaat nu de A2C-trainingslus in de Lunar Lander-omgeving opnieuw bekijken, maar in plaats van de netwerken bij elke stap te updaten, wacht je tot er 10 stappen zijn voorbijgegaan voordat je de gradient-descentstap uitvoert. Door de losses over 10 stappen te middelen, profiteer je van iets stabielere updates.

Deze oefening maakt deel uit van de cursus

Deep Reinforcement Learning in Python

Cursus bekijken

Oefeninstructies

  • Voeg de losses van elke stap toe aan de loss-tensors voor de huidige batch.
  • Bereken de batch-losses.
  • Initialiseer de loss-tensors opnieuw.

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

actor_losses = torch.tensor([])
critic_losses = torch.tensor([])
for episode in range(10):
    state, info = env.reset()
    done = False
    episode_reward = 0
    step = 0
    while not done:
        step += 1
        action, action_log_prob = select_action(actor, state)                
        next_state, reward, terminated, truncated, _ = env.step(action)
        done = terminated or truncated
        episode_reward += reward
        actor_loss, critic_loss = calculate_losses(
            critic, action_log_prob, 
            reward, state, next_state, done)
        # Append to the loss tensors
        actor_losses = torch.cat((____, ____))
        critic_losses = torch.cat((____, ____))
        if len(actor_losses) >= 10:
            # Calculate the batch losses
            actor_loss_batch = actor_losses.____
            critic_loss_batch = critic_losses.____
            actor_optimizer.zero_grad(); actor_loss_batch.backward(); actor_optimizer.step()
            critic_optimizer.zero_grad(); critic_loss_batch.backward(); critic_optimizer.step()
            # Reinitialize the loss tensors
            actor_losses = ____
            critic_losses = ____
        state = next_state
    describe_episode(episode, reward, episode_reward, step)
Code bewerken en uitvoeren