Advantage Actor Critic

Python으로 배우는 Deep Reinforcement Learning

Timothée Carayol

Principal Machine Learning Engineer, Komment

왜 Actor-Critic인가?

 

  • REINFORCE의 한계:

    • 분산이 큼
    • 샘플 효율 낮음
  • Actor-Critic은 크리틱 네트워크를 도입해 TD 학습을 가능하게 함

큰 'agent' 사각형과 그 안의 'actor', 'critic' 두 사각형.

Python으로 배우는 Deep Reinforcement Learning

Actor-Critic의 직관

학생들이 테이블에 둘러앉아 대화하는 장면. 책과 펜이 흩어져 있음.

 

  • 액터 네트워크:

    • 의사결정 수행
    • 스스로 평가 불가
  • 크리틱 네트워크:

    • 매 스텝 액터에 피드백 제공
Python으로 배우는 Deep Reinforcement Learning

크리틱 네트워크

 

  • 크리틱은 상태가치 함수를 근사

크리틱 네트워크: 입력은 상태, 출력은 Value 함수. 출력 노드 1개.

  • 어드밴티지 또는 TD-오류로 행동 $a_t$ 평가

 

class Critic(nn.Module):
    def __init__(self, state_size):
        super(Critic, self).__init__()
        self.fc1 = nn.Linear(state_size, 64)
        self.fc2 = nn.Linear(64, 1)

def forward(self, state): x = torch.relu(self.fc1(torch.tensor(state))) value = self.fc2(x) return value
critic_network = Critic(8)
Python으로 배우는 Deep Reinforcement Learning

Actor-Critic의 동작

 

  • 매 스텝마다:
    • 액터가 행동 선택 (REINFORCE의 정책 네트워크와 동일)

위: 'agent'라벨의 큰 직사각형 안에 'actor'와 'critic' 두 작은 직사각형. 아래: 별도의 'environment' 직사각형.

Python으로 배우는 Deep Reinforcement Learning

Actor-Critic의 동작

 

  • 매 스텝마다:
    • 액터가 행동 선택 (REINFORCE의 정책 네트워크와 동일)
    • 크리틱이 보상과 상태 관측

빨간 화살표 'action'이 액터에서 환경으로 향함.

Python으로 배우는 Deep Reinforcement Learning

Actor-Critic의 동작

 

  • 매 스텝마다:
    • 액터가 행동 선택 (REINFORCE의 정책 네트워크와 동일)
    • 크리틱이 보상과 상태 관측
    • 크리틱이 TD 오류 계산
    • 액터와 크리틱이 TD 오류로 가중치 업데이트

빨간 화살표 두 개 'State'와 'Reward'가 환경에서 크리틱으로 향함.

Python으로 배우는 Deep Reinforcement Learning

Actor-Critic의 동작

 

  • 매 스텝마다:
    • 액터가 행동 선택 (REINFORCE의 정책 네트워크와 동일)
    • 크리틱이 보상과 상태 관측
    • 크리틱이 TD 오류 계산
    • 액터와 크리틱이 TD 오류로 가중치 업데이트
    • 업데이트된 액터가 새 상태 관측

'TD error' 화살표가 크리틱에서 액터로 향함.

Python으로 배우는 Deep Reinforcement Learning

Actor-Critic의 동작

 

  • 매 스텝마다:
    • 액터가 행동 선택 (REINFORCE의 정책 네트워크와 동일)
    • 크리틱이 보상과 상태 관측
    • 크리틱이 TD 오류 계산
    • 액터와 크리틱이 TD 오류로 가중치 업데이트
    • 업데이트된 액터가 새 상태 관측
  • ... 반복 시작

State 화살표가 이제 액터에도 향함.

Python으로 배우는 Deep Reinforcement Learning

A2C 손실 함수

 

크리틱

크리틱 손실 함수. 크리틱에는 제곱 TD 오류 사용: Lc(theta c) = ((r_t + gamma * V theta c (s t + 1)) - V theta c) squared

  • 크리틱 손실: TD 오류 제곱

 

액터

액터 손실 함수. 매 시점 t에서 액터 손실: L(theta) = - 행동 로그확률 × TD 오류(또는 어드밴티지).

  • TD 오류는 크리틱의 평가를 반영
  • TD 오류가 양수인 행동의 확률을 높임
Python으로 배우는 Deep Reinforcement Learning

손실 계산하기

 

def calculate_losses(critic_network, action_log_prob, 
                     reward, state, next_state, done):

# Critic provides the state value estimates value = critic_network(state)
next_value = critic_network(next_state)
td_target = (reward + gamma * next_value * (1-done))
td_error = td_target - value
# Apply formulas for actor and critic losses actor_loss = -action_log_prob * td_error.detach()
critic_loss = td_error ** 2
return actor_loss, critic_loss

 

 

  • TD 오류 계산
  • 액터 손실 계산
    • 크리틱으로의 그래디언트 전파를 막으려면 .detach() 사용
  • 크리틱 손실 계산
Python으로 배우는 Deep Reinforcement Learning

Actor-Critic 학습 루프

for episode in range(10):
  state, info = env.reset()
  done = False
  while not done:

# Select action action, action_log_prob = select_action(actor, state)
next_state, reward, terminated, truncated, _ = env.step(action) done = terminated or truncated
# Calculate losses actor_loss, critic_loss = calculate_losses(critic, action_log_prob, reward, state, next_state, done)
# Update actor actor_optimizer.zero_grad(); actor_loss.backward(); actor_optimizer.step()
# Update critic critic_optimizer.zero_grad(); critic_loss.backward(); critic_optimizer.step()
state = next_state
Python으로 배우는 Deep Reinforcement Learning

Ayo berlatih!

Python으로 배우는 Deep Reinforcement Learning

Preparing Video For Download...