Batchuppdateringar i policy gradient

Djup förstärkningsinlärning i Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

Stegvisa vs. batchade gradientuppdateringar

En stor ruta som representerar ett avsnitt.

Djup förstärkningsinlärning i Python

Stegvisa vs. batchade gradientuppdateringar

I den stora rutan syns en mindre ruta för steg 1, med en inre ruta med texten 'välj åtgärd'.

Djup förstärkningsinlärning i Python

Stegvisa vs. batchade gradientuppdateringar

I rutan för steg 1 syns en liten ruta med texten 'iterera miljö'.

Djup förstärkningsinlärning i Python

Stegvisa vs. batchade gradientuppdateringar

Under rutan för steg 1 syns en ruta med etiketterna 'beräkna förlust' och 'gradientnedstigning'.

Djup förstärkningsinlärning i Python

Stegvisa vs. batchade gradientuppdateringar

Ett identiskt par rutor visas för steg 2, med samma innehåll.

Djup förstärkningsinlärning i Python

Stegvisa vs. batchade gradientuppdateringar

Steg 3 och steg 4 visas också.

Djup förstärkningsinlärning i Python

Batchning av A2C / PPO-uppdateringar

En stor avsnittsruta; i halva ytan en ruta märkt 'rollout 1' med två tomma rutor märkta 'steg 1' och 'steg 2'.

Djup förstärkningsinlärning i Python

Batchning av A2C / PPO-uppdateringar

I rutan för steg 1 syns etiketterna 'välj åtgärd' och 'iterera miljö'.

Djup förstärkningsinlärning i Python

Batchning av A2C / PPO-uppdateringar

Samma sak för steg 2.

Djup förstärkningsinlärning i Python

Batchning av A2C / PPO-uppdateringar

Under rutorna för steg 1 och steg 2 syns en gemensam etikett 'beräkna förlust' och en gemensam etikett 'gradientnedstigning'.

Djup förstärkningsinlärning i Python

Batchning av A2C / PPO-uppdateringar

Den återstående halvan av avsnittsytan upptas nu av en identisk rollout-ruta med två steg, märkt 'rollout 2'.

Djup förstärkningsinlärning i Python

A2C-träningsloopen med batchuppdateringar

 

# Set rollout length
rollout_length = 10

# Initiate loss batches
actor_losses = torch.tensor([]) critic_losses = torch.tensor([])
  • Initialisera förlustbatcher
  • Iterera igenom avsnitt och steg som vanligt

 

for episode in range(10):
  state, info = env.reset()
  done = False
  while not done:
    action, action_log_prob = select_action(actor, 
                                            state)                
    next_state, reward, terminated, truncated, _ = (
                                   env.step(action))
    done = terminated or truncated    
    actor_loss, critic_loss = calculate_losses(
        critic, action_log_prob, 
        reward, state, next_state, done)
    ...
Djup förstärkningsinlärning i Python

A2C-träningsloopen med batchuppdateringar

  ...
  actor_losses = torch.cat((actor_losses, actor_loss))
  critic_losses = torch.cat((critic_losses, critic_loss))

# If rollout is full, update the networks if len(actor_losses) >= rollout_length:
actor_loss_batch = actor_losses.mean() critic_loss_batch = critic_losses.mean()
actor_optimizer.zero_grad() actor_loss_batch.backward() actor_optimizer.step() critic_optimizer.zero_grad() critic_loss_batch.backward() critic_optimizer.step()
actor_losses = torch.tensor([]) critic_losses = torch.tensor([])
state = next_state

 

  • Lägg till stegförlust i förlustbatcherna
  • När rollout är full:
    • Beräkna genomsnittlig batchförlust med .mean()
    • Utför gradientnedstigning
    • Återinitialisera förlustbatcherna
Djup förstärkningsinlärning i Python

A2C / PPO med flera agenter

 

Två horisontella fält representerar agent 1 och agent 2. Varje agent genomgår 4 respektive 3 avsnitt av varierande längd. I varje avsnitt syns stegrutorna som i tidigare bilder. Under de två fälten visas tre rollout-rutor, var och en täcker ett intervall på 8 steg. I varje rollout-ruta syns etiketterna 'beräkna förlust' och 'gradientnedstigning'. Överst i diagrammet anges en förklaring: "rollout-längd: 8 steg; antal agenter: 2"

Djup förstärkningsinlärning i Python

Rollouts och minibatcher

Samma två agentfält som i föregående bild. Under dem syns 3 rollout-rutor, men innehållet har förändrats. Överst i varje ruta finns en lång ruta märkt 'blanda'; under den är rutan uppdelad på längden i 4 delar märkta 'minibatch', var och en med en 'beräkna förlust'- och en 'gradientnedstigning'-ruta. Överst i diagrammet anges: 'Rollout-längd: 8 steg; minibatch-storlek: 4 (2x2); antal agenter: 2'

Djup förstärkningsinlärning i Python

PPO med flera epoker

En bild som liknar den föregående, men rollout-batcherna är nu också delade vertikalt i 4 områden: överst en etikett 'blanda'; därunder en stor ruta märkt 'epok 1' med 4 minibatcher längs med rutan; sedan en etikett 'blanda om'; sist en stor ruta märkt 'epok 2' med 4 minibatcher. Förklaringen lyder: 'Rollout-längd: 8 steg; minibatch-storlek: 4 (2x2); antal agenter: 2; antal epoker: 2'.

Djup förstärkningsinlärning i Python

Nu kör vi en övning!

Djup förstärkningsinlärning i Python

Preparing Video For Download...