정책 그래디언트의 배치 업데이트

Python으로 배우는 Deep Reinforcement Learning

Timothée Carayol

Principal Machine Learning Engineer, Komment

단계별 vs 배치 그래디언트 업데이트

에피소드를 나타내는 큰 상자.

Python으로 배우는 Deep Reinforcement Learning

단계별 vs 배치 그래디언트 업데이트

큰 상자 안에 step 1을 나타내는 작은 상자. 그 안에 '행동 선택' 상자.

Python으로 배우는 Deep Reinforcement Learning

단계별 vs 배치 그래디언트 업데이트

step 1 상자에 '환경 반복' 텍스트의 작은 상자가 추가됩니다.

Python으로 배우는 Deep Reinforcement Learning

단계별 vs 배치 그래디언트 업데이트

step 1 상자 아래에 '손실 계산'과 '경사 하강' 라벨이 있는 상자.

Python으로 배우는 Deep Reinforcement Learning

단계별 vs 배치 그래디언트 업데이트

두 번째 단계에 대해 동일한 상자 쌍이 동일한 내용으로 나타납니다.

Python으로 배우는 Deep Reinforcement Learning

단계별 vs 배치 그래디언트 업데이트

3단계와 4단계도 표시됩니다.

Python으로 배우는 Deep Reinforcement Learning

A2C / PPO 배치 업데이트

큰 에피소드 상자; 그 절반을 차지하는 'rollout 1' 상자; 그 안에 'step 1'과 'step 2' 빈 상자

Python으로 배우는 Deep Reinforcement Learning

A2C / PPO 배치 업데이트

step 1 상자에 '행동 선택', '환경 반복' 라벨이 표시됩니다.

Python으로 배우는 Deep Reinforcement Learning

A2C / PPO 배치 업데이트

step 2도 동일합니다.

Python으로 배우는 Deep Reinforcement Learning

A2C / PPO 배치 업데이트

step 1과 step 2 아래에 단일 '손실 계산', 단일 '경사 하강' 라벨이 나타납니다.

Python으로 배우는 Deep Reinforcement Learning

A2C / PPO 배치 업데이트

에피소드 영역의 나머지 절반에 두 단계가 있는 동일한 'rollout 2' 상자가 추가됩니다.

Python으로 배우는 Deep Reinforcement Learning

배치 업데이트가 있는 A2C 학습 루프

 

# Set rollout length
rollout_length = 10

# Initiate loss batches
actor_losses = torch.tensor([]) critic_losses = torch.tensor([])
  • 손실 배치 초기화
  • 에피소드와 단계를 기존대로 반복

 

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)
    ...
Python으로 배우는 Deep Reinforcement Learning

배치 업데이트가 있는 A2C 학습 루프

  ...
  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

 

  • 단계별 손실을 배치에 추가
  • 롤아웃이 가득 차면:
    • .mean()으로 배치 평균 손실 계산
    • 경사 하강 수행
    • 배치 손실 재초기화
Python으로 배우는 Deep Reinforcement Learning

다중 에이전트 A2C / PPO

 

두 개의 가로 줄이 에이전트 1과 에이전트 2를 나타냅니다. 각 에이전트는 길이가 다른 에피소드를 각각 4개와 3개 경험합니다. 각 에피소드 안에는 이전 슬라이드와 같은 단계 상자가 보입니다. 두 줄 아래에는 8단계 구간을 덮는 롤아웃 상자 3개가 보입니다. 각 롤아웃 상자에는 '손실 계산'과 '경사 하강' 라벨이 있습니다. 상단 범례: "롤아웃 길이: 8단계; 에이전트 수: 2"

Python으로 배우는 Deep Reinforcement Learning

롤아웃과 미니배치

이전 슬라이드와 동일한 두 에이전트 줄. 아래에는 다시 3개의 롤아웃 상자가 있으나 내용이 바뀌었습니다. 상단에 '셔플' 긴 상자가 있고, 그 아래는 길이 방향으로 4개의 '미니배치'로 분할되어 각 미니배치에 '손실 계산'과 '경사 하강' 상자가 있습니다. 상단 범례: '롤아웃 길이: 8단계; 미니배치 크기: 4 (2x2); 에이전트 수: 2'

Python으로 배우는 Deep Reinforcement Learning

다중 에폭 PPO

이전 그림과 유사하나, 롤아웃 배치가 수직으로도 4영역으로 분할됩니다: 상단 '셔플', 두 번째 큰 상자 '에폭 1'(길이 방향 4개 미니배치 포함), 세 번째 '리셔플', 마지막 큰 상자 '에폭 2'(역시 4개 미니배치). 범례: '롤아웃 길이: 8단계; 미니배치 크기: 4 (2x2); 에이전트 수: 2; 에폭 수: 2'.

Python으로 배우는 Deep Reinforcement Learning

연습해 봅시다!

Python으로 배우는 Deep Reinforcement Learning

Preparing Video For Download...