qcoding

[AI논문리뷰-강화학습] A3C - Experience Replay 없이 멀티스레드 병렬 학습으로 Atari 최고 성능을 달성한 비동기 강화학습 본문

AI논문리뷰-강화학습

[AI논문리뷰-강화학습] A3C - Experience Replay 없이 멀티스레드 병렬 학습으로 Atari 최고 성능을 달성한 비동기 강화학습

Qcoding 2026. 5. 1. 14:32
반응형
논문  Asynchronous Methods for Deep Reinforcement Learning 저자  Volodymyr Mnih, Alex Graves, David Silver et al. (DeepMind) 학회/연도  ICML 2016 arXiv  1602.01783

📄 한 문단 요약

A3C(Asynchronous Advantage Actor-Critic)는 DeepMind가 2016년 ICML에 발표한 딥강화학습 프레임워크다. 핵심 아이디어는 단순하다. GPU와 Experience Replay 없이, 16개 CPU 스레드에서 각자 독립적인 환경을 실행하는 Actor-Learner들이 비동기적으로 공유 신경망을 업데이트한다. 병렬 실행으로 경험 데이터 간의 시간 상관관계가 자연스럽게 제거되어 Replay Buffer가 필요 없고, 온-폴리시(on-policy) 알고리즘인 Actor-Critic도 안정적으로 학습된다. 정책 기울기에 엔트로피 정규화(β=0.01)를 추가해 탐험을 장려한다. n-step 어드밴티지 함수로 편향과 분산의 균형을 잡는다. 결과적으로 DQN이 GPU 8일 걸리던 Atari 성능을 CPU 1일 만에 달성하고, 4일 학습 시 당시 모든 방법을 능가하는 평균 623% (LSTM 버전)을 기록했다.

이 논문은 무엇을 해결하려고 했나?

DQN, DDPG 등 당시 딥강화학습의 성공은 공통적으로 Experience Replay에 의존했다. Replay Buffer는 연속된 경험 간의 상관관계를 제거하고 데이터 재사용을 가능하게 해 신경망 학습을 안정화한다. 그런데 이 구조에는 두 가지 근본적인 제약이 있다.

첫째, 오프-폴리시(off-policy) 알고리즘만 쓸 수 있다. Q-learning처럼 현재 정책과 다른 과거 경험을 재사용하는 알고리즘에만 적용 가능하다. Actor-Critic이나 SARSA처럼 현재 정책으로 수집한 데이터로만 학습하는 온-폴리시 알고리즘은 버퍼의 오래된 데이터가 현재 정책과 달라 직접 사용할 수 없다.

둘째, 메모리와 계산 비용이 크다. 100만 프레임 버퍼는 수 GB의 RAM을 소모하고, GPU가 필요하다. 분산 학습(Gorila)은 100대 이상의 기계가 필요하다.

이 논문이 제안하는 답은 놀랍도록 단순하다. "여러 스레드에서 동시에 서로 다른 게임을 플레이하면, 각 스레드의 경험들이 자연스럽게 다양해져 상관관계가 깨진다." Replay Buffer의 역할을 비동기 병렬화로 대체한 것이다. 이것으로 온-폴리시 방법도 안정적으로 학습할 수 있게 된다.

배경지식과 핵심 키워드

핵심 개념 카드

비동기 학습 (Asynchronous Learning)
여러 Actor-Learner 스레드가 각자 독립적인 환경 인스턴스에서 경험을 수집하고, 중앙 공유 파라미터를 잠금(lock) 없이 비동기적으로 업데이트하는 방식이다. 각 스레드는 공유 파라미터의 최신 복사본을 가져다 t_max(=5) 스텝의 기울기를 누적한 후 공유 파라미터에 적용한다.
DQN의 Replay Buffer와 동일한 효과(데이터 다양성 확보)를 달성한다. 스레드마다 서로 다른 환경 상태를 탐험하므로, 동시에 공유 파라미터를 업데이트하는 기울기들이 자연스럽게 비상관화된다.
16 스레드 기준으로 A3C는 12.5배, 1-step Q-learning은 24.1배의 학습 속도 향상을 보인다. 슈퍼선형(super-linear) 가속이 나타나는 이유는 더 많은 다양한 경험이 편향(bias)을 줄이기 때문이다.
어드밴티지 함수 A(s,a)
어드밴티지 A(s,a) = Q(s,a) - V(s)는 행동 a가 상태 s의 평균적 가치보다 얼마나 더 좋은지를 나타낸다. 양수면 평균보다 좋은 행동, 음수면 나쁜 행동이다.
A3C에서 어드밴티지를 n-step 리턴으로 추정한다: A(s_t, a_t) = Σ_{i=0}^{k-1}[γⁱr_{t+i}] + γᵏV(s_{t+k}) - V(s_t). k ≤ t_max=5. n이 클수록 편향은 감소하지만 분산이 증가한다. t_max=5는 이 트레이드오프의 실용적 타협점이다.
순수 V(s) 대신 어드밴티지를 사용하면 분산이 크게 줄어든다. "이 행동이 기대보다 얼마나 좋은가"를 기준으로 학습하므로 서로 다른 상태의 절대적 보상 차이 영향을 제거한다.
엔트로피 정규화 (Entropy Regularization)
정책의 엔트로피 H(π) = -Σ_a π(a|s) log π(a|s)를 목적 함수에 더해 정책이 너무 일찍 확정적으로 수렴하는 것을 방지한다. 목적 함수: J = E[log π(a|s) · A(s,a)] + β·H(π).
A3C에서 β=0.01 (Atari, 이산 행동), β=10⁻⁴ (연속 제어). 엔트로피가 높을수록 정책이 더 무작위적이므로 탐험이 촉진된다. ε-greedy의 역할을 엔트로피 항이 대신한다.
실험에서 β=0으로 설정하면(엔트로피 없음) 여러 게임에서 조기에 나쁜 정책으로 수렴해 성능이 저하된다. 특히 탐험이 중요한 게임에서 엔트로피 정규화의 효과가 크다.
공유 RMSProp (Shared RMSProp)
RMSProp의 이동평균 통계 g를 모든 스레드가 공유한다. 업데이트: g ← αg + (1-α)Δθ², θ ← θ - η(Δθ/√(g+ε)). 감쇠율 α=0.99.
스레드별 g를 유지하는 방식보다 공유 g가 학습률의 넓은 범위에서 더 안정적으로 동작한다. 50개의 무작위 학습률에서 테스트했을 때 공유 RMSProp이 완전 실패(zero score) 빈도가 가장 낮다.
잠금(lock) 없이 비동기 업데이트하므로 스레드 간 경쟁 조건이 발생할 수 있지만, 기울기 업데이트가 충분히 작으면 실용적으로 문제없다. Hogwild! 알고리즘과 같은 원리다.
On-Policy vs Off-Policy
온-폴리시: 현재 정책으로 수집한 데이터로만 학습. 오프-폴리시: 다른 정책으로 수집한 과거 데이터도 재사용 가능. DQN, DDPG는 오프-폴리시라 Replay Buffer를 사용할 수 있다.
A3C는 온-폴리시이지만, 비동기 업데이트로 인해 스레드가 가져온 파라미터와 업데이트 시점의 파라미터가 살짝 달라 "약한 오프-폴리시" 특성을 가진다. 이 정도 차이는 학습에 영향이 없다고 분석한다.
온-폴리시의 장점은 수집된 데이터가 항상 현재 정책을 반영해 학습 목표와 일치한다는 것이다. 오프-폴리시처럼 오래된 데이터의 분포 불일치 문제가 없다.
LSTM (Long Short-Term Memory)
시퀀스 데이터에서 장기 의존성을 학습하는 RNN의 한 종류. 셀 상태(cell state)와 게이트(forget, input, output gate)로 정보를 선택적으로 유지·삭제한다. A3C에서는 256 LSTM 셀이 FC 레이어 이후에 추가된다.
Atari 게임 중 일부는 시간 흐름에 따른 기억이 중요하다. 예를 들어 공이 어느 방향으로 움직이는지는 현재 단일 프레임만으로 알기 어렵다. LSTM이 이 시간 맥락을 유지한다.
실험 결과 A3C+LSTM(4일)은 평균 623.0%로, A3C 피드포워드(4일) 496.8%보다 25% 높다. 특히 부분 관측성이 높은 게임에서 LSTM의 효과가 크게 나타난다.
n-step Return (다단계 리턴)
n 스텝 후의 상태 가치를 부트스트래핑으로 추정하는 대신, n 스텝의 실제 보상을 먼저 합산한다: G_t^(n) = r_t + γr_{t+1} + ... + γ^{n-1}r_{t+n-1} + γⁿV(s_{t+n}). A3C에서 t_max=5.
1-step return(TD 학습)은 편향이 크고 분산이 낮다. Monte Carlo return(에피소드 끝까지 실제 보상)은 편향이 없지만 분산이 크다. n-step은 그 중간이다. t_max=5는 경험적으로 좋은 균형점이다.
A3C에서 각 스레드는 t_max 스텝 또는 에피소드 종료 때까지 경험을 수집한 후, 해당 경험으로 계산한 기울기를 공유 파라미터에 반영한다. 이것이 DQN의 미니배치 업데이트와 다른 핵심 차이다.
Gorila (Go Reinforcement Learning Architecture)
DeepMind의 분산 DQN 시스템. 100개의 Actor 프로세스가 Replay Buffer에 경험을 채우고, 30개의 파라미터 서버가 DQN 학습을 분산 처리한다. 총 130개 이상의 기계가 필요하다.
A3C와의 비교에서 Gorila는 4일 학습으로 평균 215.2% 달성. A3C는 같은 4일에 623.0%. 단일 기계 16코어로 130대 분산 시스템을 능가한다.
자원 효율 면에서 A3C의 압도적 우위를 보여주는 비교다. 논문이 제시하는 핵심 메시지 중 하나: 복잡한 분산 인프라 없이도 병렬화의 이점을 얻을 수 있다.
인간 정규화 점수 (Human-Normalized Score)
점수 = (알고리즘 점수 - 무작위 점수) / (인간 점수 - 무작위 점수) × 100%. 100%가 인간 수준, 0%가 무작위, 100% 초과는 인간 능가다.
평균(mean)과 중앙값(median)을 모두 보고한다. 소수의 게임에서 매우 높은 점수가 평균을 왜곡할 수 있어 중앙값이 더 안정적인 지표다. A3C(LSTM 4일): 평균 623.0%, 중앙값 112.6%.
중앙값 112.6%는 절반 이상의 게임에서 인간을 능가한다는 의미다. DQN의 중앙값 47.5%와 비교하면 두 배 이상 향상이다.
네 가지 비동기 알고리즘
논문은 하나의 비동기 프레임워크에서 네 가지 알고리즘을 구현한다: (1) Async 1-step Q-learning, (2) Async 1-step SARSA, (3) Async n-step Q-learning, (4) A3C. 모두 동일한 병렬화 구조를 공유한다.
Q-learning/SARSA 계열은 오프-폴리시이므로 이론적으로 Replay Buffer 없이도 가능하다. A3C는 온-폴리시이지만 비동기화로 데이터 다양성을 확보해 안정적 학습이 가능함을 처음 보였다.
최고 성능은 A3C이지만, 1-step Q-learning이 스레드 수에 비해 가장 큰 속도 향상(16 스레드에서 24.1배)을 보인다. 이것은 슈퍼선형 가속으로, 단순 병렬화 이상의 학습 효율 향상이 있다는 증거다.

핵심 인사이트

A3C의 가장 큰 개념적 기여는 "Replay Buffer = 데이터 다양화 장치"라는 관점에서, "병렬 환경 탐험 = 데이터 다양화 장치"로의 패러다임 전환이다. 이 전환은 메모리·GPU 비용을 제거하고 온-폴리시 알고리즘의 문을 열었다. 엔트로피 정규화와 n-step 어드밴티지가 그 위에서 탐험과 편향-분산 균형을 잡는다.

기존 방법의 한계

Experience Replay의 구조적 제약. DQN과 DDPG는 Replay Buffer에 의존한다. 이 접근은 오프-폴리시 알고리즘(Q-learning 계열)에만 직접 적용 가능하다. 온-폴리시 방법(Actor-Critic, SARSA 등)은 현재 정책으로 수집한 최신 데이터만 써야 하므로 버퍼의 오래된 데이터를 그대로 사용할 수 없다. 결과적으로 당시 딥강화학습 연구는 Q-learning 계열에 치우쳐 있었다.

막대한 계산 자원 요구. DQN은 NVIDIA K40 GPU에서 50M 프레임을 학습하는 데 8일이 걸린다. Gorila는 더 빠르지만 130대 이상의 기계가 필요하다. 일반적인 연구자나 개발자가 접근하기 어렵다.

Replay Buffer 메모리 비용. 100만 프레임 버퍼는 84×84×4 그레이스케일 이미지 기준으로 약 4~8GB RAM을 차지한다. 픽셀 기반 학습에서는 병목이 된다.

제안 방법의 핵심 아이디어

A3C 알고리즘의 핵심은 세 가지다.

1. 비동기 병렬 Actor-Learner. N개의 스레드(실험에서 N=16)가 각자 독립 환경 사본에서 동시에 플레이한다. 각 스레드는 공유 파라미터 θ의 로컬 복사본 θ'을 가져와 t_max=5 스텝의 기울기를 계산한 후 공유 파라미터를 업데이트한다. 이 과정을 잠금 없이 반복한다. 서로 다른 스레드가 서로 다른 상태를 탐험하므로 기울기들이 자연스럽게 비상관화된다.

2. Advantage Actor-Critic. Actor는 정책 π(a|s; θ)를 출력하고, Critic은 상태 가치 V(s; θv)를 출력한다. 정책 기울기는 단순 Q값 대신 어드밴티지 A(s,a) = R_t - V(s_t)를 가중치로 쓴다:

∇θ log π(a_t|s_t; θ) · (R_t - V(s_t; θv))

여기서 R_t = Σ_{i=0}^{k-1}[γⁱr_{t+i}] + γᵏV(s_{t+k}; θv) (n-step return).

3. 엔트로피 정규화. 최종 손실 함수에 정책 엔트로피를 추가해 탐험을 유지한다:

L = -∇θ log π(a_t|s_t) · A(s_t, a_t) - β · H(π(s_t; θ))

β=0.01이 Atari에서 최적. 엔트로피가 높을수록 정책이 다양한 행동을 고르게 시도한다.

모델 구조/알고리즘 흐름

Atari 네트워크 (이산 행동, 피드포워드):

입력: 84×84 그레이스케일 (전처리)
Conv1: 16 필터, 8×8 커널, 스트라이드 4 → ReLU
Conv2: 32 필터, 4×4 커널, 스트라이드 2 → ReLU
FC:    256 유닛 → ReLU
         ├─ Actor 헤드: softmax → π(a|s) [행동 수만큼]
         └─ Critic 헤드: 선형 → V(s) [스칼라]

Atari 네트워크 (LSTM 버전):

(위 Conv → FC 동일)
FC 256 → LSTM 256 셀
         ├─ Actor 헤드: softmax → π(a|s)
         └─ Critic 헤드: 선형 → V(s)

A3C 알고리즘 수도코드 (단일 스레드 관점):

# 공유 파라미터 초기화 (메인 스레드)
θ (공유), θv (공유) 무작위 초기화

# 각 스레드 실행 (N=16 개 동시)
def thread_worker():
    while not done:
        θ_local ← θ (공유에서 복사)
        θv_local ← θv (공유에서 복사)
        
        # t_max 스텝 수집
        experiences = []
        for t in range(t_max):
            a_t ~ π(·|s_t; θ_local)   # 정책에서 행동 샘플
            r_t, s_{t+1} ← env.step(a_t)
            experiences.append((s_t, a_t, r_t))
            if terminal: break
        
        # n-step 리턴 계산 (역방향)
        R = 0 if terminal else V(s_{t+1}; θv_local)
        d_θ, d_θv = 0, 0
        for (s_i, a_i, r_i) in reversed(experiences):
            R ← r_i + γ * R
            advantage = R - V(s_i; θv_local)
            # Actor 기울기
            d_θ += ∇θ log π(a_i|s_i; θ_local) * advantage
            d_θ += β * ∇θ H(π(s_i; θ_local))  # 엔트로피
            # Critic 기울기
            d_θv += ∂(R - V(s_i; θv_local))²/∂θv
        
        # 공유 파라미터 비동기 업데이트 (잠금 없음)
        θ  ← θ  + α_actor  * d_θ   (Shared RMSProp)
        θv ← θv + α_critic * d_θv  (Shared RMSProp)

논문 그림/표로 이해하기

A3C와 DQN 계열 비동기 알고리즘들의 5개 Atari 게임 학습 속도 비교 그래프
Figure 1. 5개 Atari 게임에서 비동기 알고리즘들(1-step Q, n-step Q, SARSA, A3C)의 학습 속도 비교. 가로축은 학습 시간(시간), 세로축은 에피소드 점수. A3C가 대부분의 게임에서 빠르게 높은 성능에 도달한다. 출처: Mnih et al., "Asynchronous Methods for Deep Reinforcement Learning", ICML 2016. arXiv:1602.01783 — arXiv 라이선스 하에 인용.
방법 학습 시간 평균 점수 중앙값 점수 하드웨어
DQN 8일 121.9% 47.5% GPU 1개
Gorila DQN 4일 215.2% 71.3% 130대 분산
Double DQN 8일 332.9% 110.9% GPU 1개
Dueling DDQN 8일 343.8% 117.1% GPU 1개
A3C FF (1일) 1일 344.1% 68.2% CPU 16코어
A3C FF (4일) 4일 496.8% 116.6% CPU 16코어
✦ A3C LSTM (4일) 4일 623.0% 112.6% CPU 16코어
논문 Table 1 재구성. 인간 정규화 점수(%), Atari 57개 게임 기준. FF=피드포워드 네트워크. 출처: Mnih et al., ICML 2016.
스레드 수(1, 2, 4, 8, 16)에 따른 A3C 학습 데이터 효율성 비교
Figure 3. Actor-Learner 스레드 수(1, 2, 4, 8, 16)에 따른 학습 속도 비교. 스레드 수가 늘수록 같은 프레임 수 내에서 더 높은 점수에 도달한다. 단순 1개 스레드 대비 16개 스레드에서 12.5배(A3C) 이상의 가속이 나타난다. 출처: Mnih et al., arXiv:1602.01783 — arXiv 라이선스 하에 인용.

실험 설정과 결과 해석

Atari 57개 게임. DQN과 동일한 전처리(84×84 그레이스케일, 4프레임 스택)를 사용한다. 학습률은 10⁻⁴~10⁻²의 로그 균등 분포에서 선택하고 학습 종료까지 선형 감쇠한다. 동일한 하이퍼파라미터를 57개 게임 전체에 적용한다.

1-step Q-learning의 슈퍼선형 가속. 16 스레드에서 24.1배 속도 향상을 보인다. 이것은 단순 16배 병렬화를 초과한다. 논문은 이것을 "스레드 수 증가가 편향을 줄이는 효과"로 분석한다. 더 많은 스레드 → 더 다양한 상태 경험 → 더 나은 Q값 추정 → 더 빠른 수렴.

MuJoCo 연속 제어. DDPG와 동일한 태스크에서 A3C도 경쟁적인 성능을 보인다. 저차원 상태 입력은 수 시간, 픽셀 입력은 24시간 이내 학습 완료. A3C의 연속 행동 공간 적용은 Gaussian 정책(출력: 평균 μ, 분산 σ²)을 사용한다.

Labyrinth 3D 미로 탐험. 시각적으로 복잡한 3D 환경에서 LSTM A3C가 무작위 생성 미로를 탐험하는 정책을 학습한다. 이것은 단순 Atari나 MuJoCo를 넘어서는 일반화 능력의 증거다.

TORCS 레이싱. A3C가 4가지 설정(저속/고속 차량, 봇 유무) 모두에서 인간 성능의 75~90%를 약 12시간 학습으로 달성한다.

핵심 인사이트

A3C의 진짜 기여는 "DQN보다 좋은 성능"이 아니라 "접근성의 민주화"에 있다. 130대 분산 서버나 고가 GPU 없이, 개인용 멀티코어 CPU 하나로 당시 최고 성능을 달성했다. 이것은 강화학습 연구의 진입 장벽을 크게 낮췄고, 이후 학계에서 A3C가 광범위하게 채택되는 이유가 되었다.

한계와 비판적 관점

비동기 업데이트의 이론적 불안정성. 잠금 없는 비동기 업데이트는 경쟁 조건(race condition)을 만든다. 이론적으로 수렴을 보장하지 않는다. 실제로는 기울기 업데이트가 작아 무시 가능하지만, 매우 빠른 학습률이나 많은 스레드에서 불안정해질 수 있다.

On-Policy의 샘플 효율. A3C는 수집한 데이터를 한 번만 쓰고 버린다. DQN의 Replay Buffer처럼 같은 데이터를 여러 번 재사용하지 않는다. 이것은 환경과의 상호작용 횟수 기준(샘플 효율) 측면에서 불리하다. 벽시계 시간 기준으로는 빠르지만, 환경 인스턴스가 비싼 실세계 로봇에서는 약점이다.

하이퍼파라미터 공유의 한계. 동일한 설정을 57개 게임에 적용하지만, 게임별로 최적 학습률이 크게 다를 수 있다. 실제로 실험에서 일부 게임의 점수 분산이 매우 크다.

A2C와의 비교. A3C의 비동기성이 실제로 필요한지 논란이 있다. 후속 연구인 A2C(동기식 Advantage Actor-Critic)는 동기식 업데이트만으로도 A3C와 동등하거나 더 나은 성능을 보인다. GPU 기반 A2C가 더 빠를 수 있다. 즉, 비동기성 자체보다는 병렬 경험 수집이 핵심이었을 수 있다.

재현성. 비동기 학습의 특성상 동일 시드에서도 결과가 달라질 수 있다. 타이밍과 스케줄링에 따라 업데이트 순서가 달라지기 때문이다.

구현하거나 응용한다면 무엇을 봐야 하나?

핵심 하이퍼파라미터:

파라미터 비고
스레드 수 16 CPU 코어 수와 동일하게
t_max (n-step) 5 기울기 누적 스텝 수
학습률 1e-4 ~ 1e-2 로그 균등 샘플링 후 선택
할인율 γ 0.99 표준값
엔트로피 계수 β 0.01 Atari/이산; 연속은 1e-4
RMSProp α 0.99 감쇠율
타겟 네트워크 갱신 40,000 프레임 Q-learning 계열에만

A2C로 구현하는 것이 실용적. 비동기 A3C를 직접 구현하면 복잡한 멀티스레딩 관리가 필요하다. 동기식 A2C(A3C의 동기 버전)가 GPU 환경에서 더 간단하고 빠르다. 실제 프로젝트에서는 Stable Baselines3의 A2C 구현을 참고하거나 사용하는 것이 좋다.

오픈소스 참고. OpenAI Baselines의 a3c, CleanRL의 ppo_atari(A3C의 후속인 PPO), 원 논문 코드(TensorFlow 0.x 기반, 구버전)가 있다. 현대적 구현은 RLlib, Sample Factory(극도로 빠른 비동기 Actor-Critic) 등을 참고.

적용 범위. A3C(또는 A2C)는 이산·연속 행동 모두 지원하고, LSTM으로 부분 관측 환경도 처리한다. Atari 같은 게임, 로봇 제어, 3D 탐험 등 다양한 도메인에 적용 가능하다.

한 줄 결론과 다음에 읽을 논문

한 줄 결론: A3C는 Experience Replay를 비동기 병렬 탐험으로 대체해 GPU·분산 인프라 없이 단일 CPU 16코어로 당시 모든 딥강화학습 방법을 능가했으며, 강화학습 연구의 접근성을 근본적으로 높인 알고리즘이다.

다음에 읽을 논문:

  • A2C/PPO (Schulman et al., 2017, arXiv:1707.06347): A3C의 동기 버전(A2C) 기반에 클리핑 기반 정책 업데이트를 추가한 PPO. 현재 가장 널리 쓰이는 온-폴리시 알고리즘.
  • ACKTR (Wu et al., 2017, arXiv:1708.05144): A3C에 2차 최적화(K-FAC)를 적용해 샘플 효율을 크게 향상.
  • IMPALA (Espeholt et al., 2018, arXiv:1802.01561): A3C를 진정한 대규모 분산 환경으로 확장하면서 오프-폴리시 보정(V-trace)을 추가. 수백~수천 Actor 스케일.
  • Rainbow (Hessel et al., 2018, arXiv:1710.02298): DQN 계열 개선 6가지를 통합. A3C 계열과 DQN 계열의 성능 비교를 종합적으로 정리.
  • Sample Factory (Petrenko et al., 2020): 비동기 Actor-Critic의 현대적 초고속 구현. 초당 수백만 프레임 처리.

출처:

반응형
Comments