강화 학습 알고리즘 선택: Q-Learning·DQN·PPO·Actor-Critic
강화 학습의 Q-Learning, DQN, PPO, Actor-Critic 원리와 적용 조건을 비교하고 자원 스케줄링·운영 자동화의 안정화 전략을 정리한다.
2026-08-15 · 최초 발행 2024-04-29
보상 신호를 운영 의사결정으로 연결하는 방법
강화 학습(Reinforcement Learning, RL)은 에이전트가 환경과 상호작용하면서 보상을 크게 만드는 정책을 학습하는 방식이다. 로보틱스와 게임 AI뿐 아니라 자원 스케줄링, 운영 최적화처럼 결과가 불확실한 의사결정 문제에도 적용할 수 있다.
기본 모델은 마코프 의사결정과정(MDP)이다. 상태 s, 행동 a, 보상 r, 전이 확률 P, 할인율 γ를 바탕으로 누적 할인 보상을 극대화하는 정책 π를 구한다.
알고리즘은 가치 기반, 정책 기반, 정책과 가치 추정을 함께 쓰는 Actor-Critic 계열로 나뉜다. 가치 기반 방식은 Q(s,a)를 추정해 행동을 정하고, 정책 기반 방식은 π(a|s; θ)를 직접 최적화한다. REINFORCE와 PPO는 정책 기반 접근에 놓이며, Actor-Critic은 Actor가 정책을 갱신하고 Critic이 가치 또는 어드밴티지를 제공해 정책 그라디언트의 분산을 줄이는 결합 구조다. 시간차 학습(TD), 온폴리시·오프폴리시 여부, 신경망을 통한 함수 근사 도입이 안정성과 샘플 효율성에 직접 영향을 준다.
상태 공간과 제어 방식에 따른 알고리즘 선택
Q-Learning은 이산 공간에서 출발한다
Q-Learning은 테이블 기반 오프폴리시 TD 제어 알고리즘이다. 벨만 최적 방정식에 따라 Q(s,a)를 반복적으로 갱신하며, 충분한 탐색과 감소하는 학습률 조건에서 최적 정책으로 수렴한다.
탐험과 활용의 균형은 ε-탐욕 정책으로 잡는다. 연속 상태나 연속 행동 공간에는 직접 적용하기 어렵기 때문에, 상대적으로 작은 이산 상태·행동 공간에서 먼저 검토할 수 있다.
DQN은 Q함수를 신경망으로 확장한다
DQN(Deep Q-Network)은 Q함수에 심층 신경망을 적용한 오프폴리시 방식이다. 리플레이 버퍼는 데이터 간 상관성을 낮추고 로그 데이터를 재활용하게 하며, 타깃 네트워크는 목표 값을 고정해 학습을 안정화한다.
Double DQN, Dueling Network, Prioritized Replay, Noisy, Distributional 같은 확장 기법은 Q값 과추정을 다루거나 탐색을 개선하는 방향으로 사용할 수 있다. 픽셀처럼 고차원 관측을 입력으로 받고 불연속 행동을 선택해야 하는 문제에서 강점을 보인다. 연속 행동 공간에는 DQN이 부적합하므로 PPO나 Actor-Critic 계열을 선택하는 편이 낫다.
PPO는 정책 갱신 폭을 제한한다
PPO(Proximal Policy Optimization)는 온폴리시 정책 경사 알고리즘이다. 클리핑된 서러게이트 목적함수로 정책 업데이트 크기를 제한해 학습 안정성을 확보한다.
GAE(Generalized Advantage Estimation)는 분산과 바이어스의 균형을 조절한다. KL과 Entropy는 탐색과 활용의 균형을 유지하는 데 쓰이며, 벡터라이즈 환경과 미니배치 SGD를 조합해 대규모 학습을 수행할 수 있다. 연속 제어나 제약이 많은 실환경, 대규모 병렬 학습과 운영 안정성이 중요한 경우에 적용하기 적합하다.
Actor-Critic은 정책과 가치 추정을 함께 학습한다
Actor-Critic 계열은 액터가 정책을, 크리틱이 가치를 학습하는 구조다. 가치 추정이 정책 경사의 분산을 줄여 수렴을 가속한다. 이 구조는 분산(variance)과 편향(bias)을 균형화하는 하이브리드 접근으로 볼 수 있다.
동기식 A2C, 비동기식 A3C, 분산 학습 구조로 확장하기 쉽다. 환경 상호작용과 업데이트를 병렬화하면 처리량을 개선할 수 있다.
학습 파이프라인에서 확인할 지점
학습은 상태와 보상을 받아 정책 또는 가치 기반으로 행동을 고르고 손실을 계산한 뒤, 파라미터를 갱신하는 흐름으로 진행된다. DQN은 ε-탐욕 정책으로 행동한 전이 (s,a,r,s′,done)을 리플레이 버퍼에 저장하고, 버퍼에서 샘플을 꺼내 동결된 타깃 네트워크로 TD 타깃을 계산한다. 타깃 네트워크는 주기적으로 동기화한다.
PPO는 트라젝토리를 수집한 뒤 GAE를 계산하고 어드밴티지를 정규화한다. 이어 클립드 오브젝티브를 기준으로 mini-batch와 epochs에 걸쳐 정책과 가치 함수를 갱신한다. A2C/A3C는 n-step 롤아웃을 수집한 뒤 어드밴티지와 가치 손실을 사용해 Actor와 Critic을 갱신하며, A2C는 동기식, A3C는 비동기식으로 동작한다.
발산이 감지되면 학습률을 낮추고 그라디언트 클리핑을 적용하며, 리워드 정규화를 다시 검토한다. NaN이 발생하면 초기화와 배치 정규화를 확인한다. 관측과 보상은 스케일 정규화, 리워드 클리핑, 프레임 스택(DQN) 관점에서 점검한다.
분산 수집 환경에서는 경험 버퍼에 쓰기 락을 두거나 멀티 프로듀서 큐를 사용한다. 체크포인트는 원자적으로 저장해야 한다. 공통 인프라는 경험 수집기(rollout), 재현 버퍼, 학습기(trainer), 로거·모니터, 체크포인트·배포 파이프라인으로 구성한다.
표현력과 운영 조건을 함께 비교하기
| 알고리즘 | 성능(표현력) | 확장성(분산/대규모) | 안정성(수렴/분산) | 일관성(재현성) | 운영 편의 |
|---|---|---|---|---|---|
| Q-Learning | 낮음(이산 한정) | 중간(상태 분할 필요) | 높음(이론 수렴) | 높음 | 높음 |
| DQN | 중간~높음 | 높음(분산 수집/학습) | 중간(트릭 필수) | 중간 | 중간 |
| PPO | 높음(연속 제어 강점) | 높음(롤아웃 병렬화) | 높음(클리핑/GAE) | 중간 | 높음 |
| Actor-Critic | 중간~높음 | 높음 | 중간(하이퍼 민감) | 중간 | 중간 |
특정 도메인, 보상 설계, 네트워크 아키텍처에 따라 결과는 달라질 수 있다. 이산 제어, 추천 정책 탐색, 네트워크 라우팅에는 DQN 또는 Rainbow(DQN 확장)를 적용할 수 있고, 오프폴리시 특성 덕분에 로그 데이터를 재활용할 수 있다. 실험 비용이 높은 제한적 데이터 환경에서도 DQN 같은 오프폴리시 기법으로 샘플 효율을 높이고, 보수적 오프폴리시 평가(COPE/OPE)를 함께 적용한다.
로보틱스, 모션 제어, 금융 액션 연속화처럼 연속 제어가 필요한 경우에는 PPO, TD3, SAC가 선호된다. 이 중 PPO는 구현과 튜닝이 용이하다. 광고 실험, AB 테스트 자동화, 시뮬레이터 활용처럼 대규모 시뮬레이션이 필요한 환경에서는 PPO와 벡터 환경, 분산 샘플러를 조합해 처리량을 높일 수 있다.
제어 대상에 맞춰 적용 범위를 좁힌다
게임과 시뮬레이션에서는 DQN이 픽셀 입력 기반의 불연속 행동 선택에 쓰이며, 리플레이 버퍼와 타깃 네트워크가 안정 학습을 뒷받침한다. PPO와 A2C는 로봇 팔이나 차량 조향 같은 연속 제어에서 샘플 효율성과 안정적인 업데이트를 확보하는 데 활용할 수 있다.
자원 스케줄링과 오토스케일링에서는 Actor-Critic 또는 PPO가 CPU·메모리 지표를 상태로 받고 스케일 인·아웃을 행동으로 선택한다. 보상에는 SLA 위반 페널티를 포함하며, 제약을 반영한 정책 학습으로 비용 대비 성능을 최적화한다.
추천·순위와 마케팅 배정에서는 컨텍스추얼 bandit 또는 PPO로 장기 전환율을 극대화할 수 있다. 안전 탐색을 위한 클립·신뢰영역과 오프라인 평가를 위한 IPS·DR 추정을 함께 둔다.
캐시·큐 관리와 회로 차단기 튜닝 같은 운영 자동화에서는 Q-Learning 또는 DQN으로 임계치와 정책을 자동 조정한다. 비정상 탐지와 결합할 때는 보수적인 업데이트를 적용한다.
보상 설계와 배포 안전장치를 분리하지 않는다
지연 보상은 분해할 수 있고, 쉐이핑은 수렴을 빠르게 만들 수 있지만 목표 왜곡 위험도 함께 가진다. 페널티와 제약은 명시적 항으로 넣고 라그랑지 승수 또는 KL 페널티를 활용한다.
재현성을 위해 시드를 고정하고, 관측·리워드 정규화, 학습률 스케줄, 그라디언트 클리핑을 적용한다. DQN 계열에서는 타깃 업데이트 주기, 버퍼 크기, ε-디케이가 핵심 하이퍼파라미터다. DQN에서는 ε 스케줄과 NoisyNet으로, PPO에서는 엔트로피 코효율 β 조절로 탐색과 활용을 조절한다.
롤아웃 워커와 학습기를 분리하고 큐 기반으로 경험을 수집하며 체크포인트를 주기적으로 저장한다. 온라인 배포에는 정책 게이팅, 섀도 모드, 단계적 트래픽 전환 같은 안전 장치가 필요하다.
PPO 같은 온폴리시 방식은 데이터를 다시 쓰는 데 제약이 있어 비용이 늘어날 수 있지만 안정성이 우수하다. DQN 같은 오프폴리시 방식은 샘플 효율성이 좋고 분산 수집·재현 측면의 편의성이 높지만, 안정화 기법이 필수다. PPO는 대배치와 벡터 환경에, DQN은 메모리(IO) 최적화에 더 민감하다.
학습 루프를 코드로 점검하기
전제: pip install "stable-baselines3[extra]==2.3.0" gymnasium[box2d]==0.29.1 torch==2.3.0
DQN으로 CartPole 학습하기
import gymnasium as gym
from stable_baselines3 import DQN
env = gym.make("CartPole-v1")
model = DQN(
"MlpPolicy", env,
learning_rate=1e-3, buffer_size=100_000,
learning_starts=1_000, batch_size=64,
tau=1.0, target_update_interval=1_000,
gamma=0.99, train_freq=4, gradient_steps=1,
exploration_fraction=0.2, exploration_final_eps=0.05,
verbose=0,
)
model.learn(total_timesteps=200_000)
mean_reward, _ = model.evaluate_policy(model.policy, env, n_eval_episodes=10)
print("DQN mean reward:", mean_reward)
PPO로 LunarLander 학습하기
import gymnasium as gym
from stable_baselines3 import PPO
env = gym.make("LunarLander-v2")
model = PPO(
"MlpPolicy", env,
n_steps=2048, batch_size=64, n_epochs=10,
gamma=0.999, gae_lambda=0.95,
clip_range=0.2, ent_coef=0.01, vf_coef=0.5,
max_grad_norm=0.5, verbose=0,
)
model.learn(total_timesteps=1_000_000)
mean_reward, _ = model.evaluate_policy(model.policy, env, n_eval_episodes=10)
print("PPO mean reward:", mean_reward)
PyTorch Actor-Critic 스켈레톤
import torch, torch.nn as nn, torch.optim as optim
import gymnasium as gym
import numpy as np
env = gym.make("CartPole-v1")
obs_dim = env.observation_space.shape[0]
act_dim = env.action_space.n
class ActorCritic(nn.Module):
def __init__(self):
super().__init__()
self.shared = nn.Sequential(nn.Linear(obs_dim, 128), nn.ReLU())
self.pi = nn.Linear(128, act_dim)
self.v = nn.Linear(128, 1)
def forward(self, x):
h = self.shared(x)
return torch.log_softmax(self.pi(h), -1), self.v(h)
net = ActorCritic()
opt = optim.Adam(net.parameters(), lr=3e-4)
gamma, lam = 0.99, 0.95
def collect_episode():
obs, _ = env.reset()
traj = []
done = False
while not done:
x = torch.tensor(obs, dtype=torch.float32).unsqueeze(0)
logp, v = net(x)
a = torch.distributions.Categorical(logits=logp).sample().item()
next_obs, r, term, trunc, _ = env.step(a)
done = term or trunc
traj.append((obs, a, r, v.item()))
obs = next_obs
# GAE-like advantage with terminal bootstrap = 0
adv, ret, A = 0.0, 0.0, []
for (_, _, r, v) in reversed(traj):
delta = r - v + gamma * 0.0 # terminal
adv = delta + gamma * lam * adv
A.append(adv)
A = list(reversed(A))
return traj, A
for _ in range(500):
traj, A = collect_episode()
obs = torch.tensor([t[0] for t in traj], dtype=torch.float32)
act = torch.tensor([t[1] for t in traj], dtype=torch.int64)
ret = torch.tensor(np.array(A) + [t[3] for t in traj], dtype=torch.float32)
logp, v = net(obs)
logp_a = logp[range(len(act)), act]
adv = (ret - v.squeeze()).detach()
policy_loss = -(logp_a * adv).mean() - 0.01 * torch.distributions.Categorical(logits=logp).entropy().mean()
value_loss = 0.5 * (ret - v.squeeze()).pow(2).mean()
loss = policy_loss + value_loss
opt.zero_grad()
loss.backward()
nn.utils.clip_grad_norm_(net.parameters(), 0.5)
opt.step()
이 코드는 교육용 스켈레톤이다. 실전 환경에서는 배치 수집, 부트스트래핑, 정규화, GAE의 정확한 구현이 필요하다.
PPO의 하이퍼파라미터는 ε=0.1~0.3, γ=0.99, λ=0.95, 64~2048 batch가 제시된다. DQN은 γ=0.99, 타깃 업데이트 1~10k 스텝, 버퍼 1e5+를 기준으로 둔다.
운영 결과를 관측하며 선택을 조정한다
누적 보상을 높이고 SLA 위반과 지연 비용을 낮추며 정책 일관성을 개선할 수 있다. 휴리스틱 튜닝을 자동화하면 운영 인건비와 실험 비용 절감으로 이어진다. 환경 변화에 대한 온라인 적응 속도와 배포 반복 주기도 개선할 수 있으며, 분산 롤아웃과 학습은 대규모 상태 공간 문제에 대응하는 기반이 된다.
PPO 기준으로 CartPole과 LunarLander는 10^5~10^6 스텝 내 수렴할 수 있으며, 분산 환경에서는 워커 수에 근사 비례해 샘플 처리량이 5~20배 향상 가능하다. 시드, 타깃 네트워크, 클리핑은 학습 안정성과 재현성 개선에 기여하고, PPO의 하이퍼파라미터 기본값 강건성은 운영 복잡도를 완화한다.
이산 문제와 상대적으로 작은 상태 공간에서는 Q-Learning을 먼저 검토할 수 있다. 고차원 관측과 이산 행동, 로그 데이터 재활용에는 DQN 및 파생 기법이 맞고, 연속 제어와 생산 안정성이 우선이면 PPO가 적합하다. 분산 학습에서 표현력과 속도의 균형이 필요할 때는 Actor-Critic(A2C/A3C)을 적용한다.
전처리(정규화), 버퍼와 배치 설계, 클리핑과 탐색 조절, 분산 벡터 환경 구축이 결과를 좌우한다. 평균 리턴, 에피소드 길이, KL, Entropy를 학습 커브와 함께 상시 점검한다.