1. 개요
A2C는 Advantage Actor-Critic의 약자이며, 정책 기반 방법과 가치 기반 방법의 장점을 결합한 강화학습 알고리즘이다.
기본적으로 다음 두 가지 구성요소를 함께 학습한다.
- Actor: 현재 상태에서 어떤 행동을 할지 결정하는 정책 $\pi(a \mid s)$를 학습
- Critic: 현재 상태가 얼마나 좋은 상태인지 평가하는 가치함수 $V(s)$를 학습
A2C는 기존의 Actor-Critic 구조를 더 안정적으로 학습시키기 위해 Advantage 개념을 도입하고, A3C의 비동기 구조를 동기식으로 단순화한 알고리즘으로 이해할 수 있다.
2. 왜 A2C가 필요한가
강화학습에서 대표적인 접근은 크게 두 가지가 있다.
2.1 가치 기반 방법
대표적으로 Q-Learning, DQN이 있다.
이 방법은 상태나 상태-행동 쌍의 가치를 추정한 뒤, 그 값을 바탕으로 행동을 선택한다.
장점은 다음과 같다.
- 학습 대상이 비교적 명확하다
- 행동 가치 $Q(s,a)$를 기준으로 최적 행동을 선택할 수 있다
단점은 다음과 같다.
- 행동 공간이 연속적일 때 적용이 어렵다
- 정책을 직접 학습하는 것이 아니다
2.2 정책 기반 방법
대표적으로 REINFORCE가 있다.
이 방법은 행동을 직접 확률적으로 출력하는 정책 $\pi_\theta(a \mid s)$를 학습한다.
장점은 다음과 같다.
- 연속 행동 공간에서도 자연스럽게 확장 가능하다
- 정책을 직접 학습하므로 행동 선택이 직관적이다
단점은 다음과 같다.
- 분산이 크다
- 학습이 불안정할 수 있다
2.3 Actor-Critic의 등장
Actor-Critic은 위 두 방식을 결합한다.
- Actor는 정책을 학습한다
- Critic은 Actor의 행동을 평가한다
즉, Critic이 Actor에게 "방금 한 행동이 좋았는지 나빴는지"를 알려주고, Actor는 그 평가를 바탕으로 정책을 업데이트한다.
하지만 기본 Actor-Critic도 학습 신호가 noisy할 수 있다.
이를 줄이기 위해 Advantage를 사용한 방식이 A2C다.
3. 핵심 아이디어
A2C의 핵심은 다음 한 문장으로 요약할 수 있다.
행동의 절대적인 좋고 나쁨이 아니라, 현재 상태에서 기대했던 것보다 얼마나 더 좋았는지를 기준으로 정책을 업데이트한다.
여기서 등장하는 값이 바로 Advantage다.
4. Advantage란 무엇인가
4.1 상태가치함수
상태가치함수는 다음과 같다.
$
V^\pi(s) = \mathbb{E}\pi \left[ \sum{t=0}^{\infty}\gamma^t r_t \mid s_0=s \right]
$
이 값은 현재 상태 $s$에서 시작했을 때 앞으로 얻을 것으로 기대되는 누적보상이다.
4.2 행동가치함수
행동가치함수는 다음과 같다.
$
Q^\pi(s,a) = \mathbb{E}\pi \left[ \sum{t=0}^{\infty}\gamma^t r_t \mid s_0=s, a_0=a \right]
$
이 값은 현재 상태 $s$에서 특정 행동 $a$를 했을 때 기대되는 누적보상이다.
4.3 Advantage 함수
Advantage는 다음과 같이 정의된다.
[
A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s)
]
즉, 현재 상태 평균보다 그 행동이 얼마나 더 좋았는지를 나타낸다.
- $A(s,a) > 0$: 평균보다 좋은 행동
- $A(s,a) < 0$: 평균보다 나쁜 행동
이 개념 덕분에 Actor는 단순히 보상이 컸다는 이유만으로 업데이트되지 않고, 그 상태에서 상대적으로 좋은 행동인지를 기준으로 업데이트된다.
5. A2C의 정책 업데이트
정책 경사 정리에 따르면 정책은 다음 방향으로 업데이트할 수 있다.
$
\nabla_\theta J(\theta) = \mathbb{E} \left[ \nabla_\theta \log \pi_\theta(a \mid s) Q^\pi(s,a) \right]
$
하지만 실제 구현에서는 $Q(s,a)$ 대신 Advantage를 자주 사용한다.
$
\nabla_\theta J(\theta) = \mathbb{E} \left[ \nabla_\theta \log \pi_\theta(a \mid s) A(s,a) \right]
$
이 식의 의미는 다음과 같다.
- 좋은 행동이면 그 행동 확률을 높인다
- 나쁜 행동이면 그 행동 확률을 낮춘다
실제 손실 함수 형태로 쓰면 보통 다음과 같다.
$
L_{\text{actor}} = - \log \pi_\theta(a_t \mid s_t) \cdot \hat{A}_t
$
여기서 $\hat{A}_t$는 실제 학습에 사용하는 Advantage 추정값이다.
6. Critic의 역할
Critic은 상태가치함수 $V(s)$를 학습한다.
학습 목표는 현재 상태의 가치가 실제 target에 가깝도록 만드는 것이다.
보통 1-step TD target은 다음과 같다.
[
y_t = r_t + \gamma V(s_{t+1})
]
종료 상태라면 다음 상태 가치가 없으므로
[
y_t = r_t
]
가 된다.
Critic loss는 보통 다음처럼 정의된다.
[
L_{\text{critic}} = \left( y_t - V(s_t) \right)^2
]
또는 Huber loss를 사용하기도 한다.
Critic이 잘 학습될수록 현재 상태의 평균적인 기대보상을 더 정확히 추정할 수 있고, Actor는 더 안정적인 Advantage 신호를 받게 된다.
7. A2C에서 Advantage를 어떻게 구하는가
실전에서는 진짜 $Q(s,a)$를 정확히 알 수 없으므로 Advantage를 추정해서 사용한다.
가장 기본적인 방법은 TD 오차를 사용하는 것이다.
[
\hat{A}t = r_t + \gamma V(s{t+1}) - V(s_t)
]
이 값은 다음을 의미한다.
- 실제로 한 스텝 진행한 결과
- Critic이 원래 예상했던 값
의 차이
즉, 예상보다 좋았는지 나빴는지를 나타낸다.
이 값은 흔히 TD error라고도 부른다.
8. A2C의 전체 손실 함수
A2C는 보통 Actor loss, Critic loss, Entropy bonus를 함께 사용한다.
8.1 Actor loss
[
L_{\text{actor}} = - \log \pi_\theta(a_t \mid s_t)\hat{A}_t
]
8.2 Critic loss
[
L_{\text{critic}} = \left( y_t - V_\phi(s_t) \right)^2
]
8.3 Entropy bonus
정책이 너무 빨리 한 행동으로만 수렴하지 않도록 엔트로피를 추가한다.
[
H(\pi(\cdot \mid s)) = - \sum_a \pi(a \mid s)\log \pi(a \mid s)
]
엔트로피를 보상처럼 더하면 정책이 다양한 행동을 유지하도록 도와준다.
8.4 최종 손실
보통 다음과 같이 합친다.
[
L = L_{\text{actor}} + c_v L_{\text{critic}} - c_e H(\pi)
]
여기서
- $c_v$: 가치 손실 가중치
- $c_e$: 엔트로피 가중치
이다.
9. A2C의 학습 흐름
A2C의 기본 흐름은 다음과 같다.
- 현재 정책으로 환경에서 몇 step rollout 수행
- 상태, 행동, 보상, 다음 상태를 저장
- Critic으로 TD target 계산
- Advantage 계산
- Actor와 Critic을 동시에 업데이트
- 반복
이를 의사코드로 쓰면 다음과 같다.
for update in range(num_updates):
trajectories = collect_rollout(policy, env, n_steps)
states, actions, rewards, next_states, dones = trajectories
values = critic(states)
next_values = critic(next_states)
td_target = rewards + gamma * next_values * (1 - dones)
advantage = td_target - values
actor_loss = -(log_prob(actions | states) * advantage.detach()).mean()
critic_loss = mse(values, td_target.detach())
entropy_loss = entropy(policy(states)).mean()
loss = actor_loss + value_coef * critic_loss - entropy_coef * entropy_loss
optimizer.zero_grad()
loss.backward()
optimizer.step()
10. A2C에서 detach()가 중요한 이유
A2C 구현에서 자주 등장하는 코드가 있다.
actor_loss = -(log_prob * advantage.detach()).mean()
critic_loss = mse(value, td_target.detach())
이때 detach()는 다음 의미를 가진다.
10.1 Actor loss에서의 advantage.detach()
Advantage는 Critic이 만든 평가 신호다.
Actor는 이 값을 참고만 해서 정책을 업데이트해야 한다.
즉, Actor loss를 계산할 때 Critic 쪽 그래프까지 역전파되면 안 되므로 detach()로 연결을 끊는다.
10.2 Critic loss에서의 td_target.detach()
TD target은 Critic이 맞춰야 하는 목표값이다.
이 target 자체를 움직이면 안 되므로 상수처럼 사용해야 한다.
따라서 td_target.detach()를 사용한다.
11. A2C와 A3C의 차이
A2C를 이해하려면 A3C와 비교하는 것이 좋다.
11.1 A3C
A3C는 Asynchronous Advantage Actor-Critic이다.
- 여러 worker가 병렬 환경에서 각자 rollout 수행
- 비동기적으로 글로벌 파라미터 업데이트
장점은 다음과 같다.
- 탐색 다양성이 커질 수 있다
- CPU 기반 병렬화에 유리하다
단점은 다음과 같다.
- 구현이 복잡하다
- 비동기 업데이트 때문에 디버깅이 어렵다
11.2 A2C
A2C는 A3C의 동기식 버전이다.
- 여러 환경에서 데이터를 동시에 수집
- 일정 step 수만큼 모은 뒤 한 번에 업데이트
장점은 다음과 같다.
- 구현이 더 단순하다
- 벡터화 환경과 GPU 활용이 쉽다
- 실험 재현성이 비교적 좋다
즉 A2C는 A3C의 아이디어를 유지하면서도 학습 구조를 정리한 버전으로 볼 수 있다.
12. A2C의 장점
12.1 REINFORCE보다 분산이 낮다
Critic이 baseline 역할을 하므로 단순 정책경사보다 학습이 더 안정적이다.
12.2 정책과 가치를 동시에 학습한다
행동 선택과 상태 평가를 함께 학습하므로 효율적이다.
12.3 연속 행동 공간으로 확장 가능하다
정책을 직접 출력하는 구조이므로 DQN류보다 확장성이 좋다.
12.4 구현이 비교적 단순하다
PPO, SAC 같은 알고리즘에 비해 개념적으로 단순한 편이다.
13. A2C의 한계
13.1 샘플 효율이 아주 높은 편은 아니다
환경과 상호작용을 많이 해야 할 수 있다.
13.2 학습 안정성이 PPO보다 떨어질 수 있다
정책 업데이트를 직접 크게 하면 성능이 흔들릴 수 있다.
13.3 Critic 품질에 크게 의존한다
Critic이 부정확하면 Advantage 추정도 부정확해져 Actor 학습이 흔들린다.
14. A2C와 PPO의 관계
PPO는 A2C 이후 실전에서 더 자주 쓰이는 알고리즘이다.
둘의 관계를 간단히 정리하면 다음과 같다.
- A2C: Advantage를 이용해 직접 정책 업데이트
- PPO: Advantage를 이용하되, 정책이 너무 급격히 바뀌지 않도록 제한
즉 PPO는 A2C의 아이디어를 더 안정적으로 만든 알고리즘으로 볼 수 있다.
A2C를 이해하면 PPO도 훨씬 쉽게 읽을 수 있다.
15. A2C의 신경망 구조
보통 하나의 backbone을 공유하고, 마지막에서 Actor head와 Critic head로 나눈다.
15.1 입력
현재 상태 $s$
15.2 공통 은닉층
상태를 feature로 변환
15.3 Actor head
행동 확률 출력
- 이산 행동: softmax
- 연속 행동: 평균과 분산 출력 등
15.4 Critic head
상태 가치 $V(s)$ 출력
간단한 구조 예시는 다음과 같다.
import torch
import torch.nn as nn
import torch.nn.functional as F
class A2CNet(nn.Module):
def __init__(self, state_dim, action_dim):
super().__init__()
self.fc1 = nn.Linear(state_dim, 128)
self.fc_pi = nn.Linear(128, action_dim)
self.fc_v = nn.Linear(128, 1)
def forward(self, x):
x = F.relu(self.fc1(x))
policy_logits = self.fc_pi(x)
value = self.fc_v(x)
return policy_logits, value
16. CartPole 기준으로 A2C를 해석하면
CartPole에서는 상태가 다음과 같이 들어온다.
- 카트 위치
- 카트 속도
- 막대 각도
- 막대 각속도
Actor는 이 상태를 보고
- 왼쪽으로 밀 확률
- 오른쪽으로 밀 확률
을 출력한다.
Critic은 이 상태가 얼마나 좋은 상태인지 숫자로 평가한다.
학습 과정은 다음처럼 해석할 수 있다.
- 막대가 넘어질 것 같은 상태에서 특정 행동을 했는데 예상보다 오래 버텼다
- 그러면 Advantage가 양수가 된다
- Actor는 그 행동 확률을 높인다
반대로
- 예상보다 빨리 실패했다
- Advantage가 음수가 된다
- Actor는 그 행동 확률을 낮춘다
즉 Critic의 평가를 이용해 Actor의 정책을 점점 개선한다.
17. A2C에서 rollout과 n-step target
A2C는 한 step만 보고 학습할 수도 있지만, 보통은 여러 step rollout을 사용한다.
예를 들어 $n$ step target은 다음처럼 쓸 수 있다.
[
R_t^{(n)} = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \cdots + \gamma^{n-1} r_{t+n-1} + \gamma^n V(s_{t+n})
]
그리고 Advantage를
[
\hat{A}_t = R_t^{(n)} - V(s_t)
]
로 둘 수 있다.
1-step TD보다 더 먼 미래를 반영할 수 있다는 장점이 있다.
18. A2C 학습이 직관적으로 의미하는 것
A2C를 아주 직관적으로 보면 다음과 같다.
- Actor: "이 상태에서는 어떤 행동을 할까?"
- Critic: "그 행동은 이 상태 평균보다 괜찮았나?"
- Advantage: "생각보다 좋았나, 나빴나?"
그리고 최종적으로
- 생각보다 좋았으면 그 행동을 더 자주 하게 만들고
- 생각보다 나빴으면 그 행동을 덜 하게 만든다
이 구조 덕분에 단순한 몬테카를로 정책경사보다 훨씬 안정적인 학습이 가능하다.
19. A2C 구현 시 자주 보는 코드 패턴
A2C 코드에서는 보통 다음 구성요소가 반복된다.
19.1 정책 확률 계산
prob = policy(state)
dist = Categorical(prob)
action = dist.sample()
log_prob = dist.log_prob(action)
19.2 가치 예측
value = critic(state)
next_value = critic(next_state)
19.3 Advantage 계산
td_target = reward + gamma * next_value * (1 - done)
advantage = td_target - value
19.4 손실 계산
actor_loss = -(log_prob * advantage.detach()).mean()
critic_loss = F.mse_loss(value, td_target.detach())
19.5 엔트로피 추가
entropy = dist.entropy().mean()
loss = actor_loss + value_coef * critic_loss - entropy_coef * entropy
20. 정리
A2C는 Actor-Critic 구조에 Advantage 개념을 결합한 강화학습 알고리즘이다.
핵심은 다음과 같다.
- Actor는 정책 $\pi(a \mid s)$를 학습한다
- Critic은 상태가치 $V(s)$를 학습한다
- Advantage는 특정 행동이 현재 상태 평균보다 얼마나 더 좋았는지 나타낸다
- Actor는 Advantage를 기반으로 행동 확률을 조정한다
- Critic은 TD target에 맞게 가치함수를 학습한다
정책경사 계열 강화학습을 공부할 때 A2C는 매우 중요한 중간 단계다.
REINFORCE보다 안정적이고, PPO보다 단순하기 때문에 정책기반 강화학습의 구조를 이해하기 좋은 알고리즘이라고 할 수 있다.
21. 함께 보면 좋은 주제
A2C를 이해한 뒤 이어서 공부하면 좋은 내용은 다음과 같다.
- REINFORCE
- Actor-Critic
- TD Learning
- n-step return
- GAE(Generalized Advantage Estimation)
- PPO
- A3C
22. 한 줄 요약
A2C는 Critic이 계산한 Advantage를 이용해 Actor의 정책을 더 안정적으로 업데이트하는 동기식 Actor-Critic 강화학습 알고리즘이다.
'AI 공부' 카테고리의 다른 글
| 결정트리를 이용해서 서울 자전거 공유 수요 예측해보기 (0) | 2026.03.16 |
|---|---|
| 선형 회귀 모델을 사용해서 주택 임대료 예측해보기 (0) | 2026.03.16 |
| 내가 보려고 만든 사이킷런 정리 (0) | 2026.03.13 |
| 머신 러닝 (1) | 2026.03.13 |
| Attention Is All You Need 논문 공부 (0) | 2026.03.13 |