Dyna와 SARSA로 보는 모델 기반·온폴리시 강화학습 운영

Dyna와 SARSA의 학습 방식, 모델 기반 계획과 온폴리시 제어의 차이, 운영 환경별 선택 기준을 정리한다.

2026-08-14 · 최초 발행 2024-04-29

실제 경험을 어떻게 더 활용할 것인가

Dyna와 SARSA는 강화학습에서 서로 다른 방향을 택한다. Dyna는 실제 환경 상호작용으로 전이 (p(s’|s,a))와 보상 (r) 모델을 학습한 뒤, 모델이 만든 가상 경험까지 학습에 사용한다. 대표 구현인 Dyna-Q에서는 실제 경험 1회마다 실제 업데이트와 모델 기반 가상 업데이트 (n)회를 수행한다. 표본 효율을 높이는 대신 모델 불확실성과 model bias를 통제해야 한다.

SARSA는 환경 모델을 만들지 않는다. 현재 정책으로 수집한 5튜플 ((s, a, r, s’, a’))을 이용하는 온폴리시 TD 제어 알고리즘이며, 갱신식은 다음과 같다.

(Q(s,a) ← Q(s,a) + α [r + γ Q(s’,a’) − Q(s,a)])

정책과 가치 추정이 같은 정책에 묶여 있어 보수적으로 수렴하는 성격을 가진다. 구현과 운영 구조는 단순하지만, 학습에 필요한 실제 상호작용은 늘어날 수 있다.

Dyna는 모델 학습과 계획을 포함하고, SARSA는 모델 없이 가치를 직접 학습한다. 따라서 Dyna에서는 모델 검증과 모니터링 파이프라인이 필요하며, SARSA는 로깅과 하이퍼파라미터 관리가 운영의 중심이 된다.

학습 루프에서 갈리는 운영 부담

Dyna의 경로는 실환경 경험, 모델 업데이트, 계획용 샘플링, Q 업데이트로 이어지는 이중 루프다. 실시간 제어에서는 계획 횟수 (n)과 지연(latency) 사이의 균형이 필요하다.

전이·보상 모델은 이산 환경에서 테이블이나 카운트 방식으로 구성할 수 있고, 연속 환경에서는 함수 근사나 다이나믹스 모델을 사용할 수 있다. 모델 불확실성을 추정해 계획 샘플의 중요도를 조절할 수 있으며, 우선순위 스윕(priority sweeping), 가상 에피소드 롤아웃, 에러 기반 재방문은 수렴을 가속하는 계획 전략이다.

SARSA는 경험 수집과 온폴리시 업데이트가 하나의 루프로 이어진다. 정책과 가치의 일치를 유지하는 일이 안정성의 핵심이다. 탐색에는 ε-탐욕(ε-greedy)이나 볼츠만 탐색을 쓸 수 있고, ε 감쇠 스케줄은 선형 또는 지수 형태로 설계한다. SARSA(λ)에서는 자격 추적(eligibility trace)을 적용할 수 있으며, 스텝사이즈 α의 감소 스케줄도 고려 대상이다. 경험 재현은 온폴리시 특성을 위반할 수 있으므로 제한적으로 적용한다.

함수 근사를 도입하면 Dyna는 모델과 가치 함수 모두에 근사를 적용할 수 있지만 모델 오류가 누적될 수 있다. 불확실성 반영(MBPO류)이나 혼합 모델 앙상블이 그 대응 수단이다. SARSA도 선형 근사나 신경망을 사용할 수 있으나 배치 재사용에는 제약이 있다. 낮은 α, 타깃 스무딩, 리워드 클리핑은 안정화에 활용할 수 있다.

Dyna-Q와 SARSA의 갱신 경로

Dyna-Q는 환경 E, 학습률 α, 할인율 γ, 탐색 ε, 계획 횟수 n, 모델 구조 M을 입력으로 받는다. 상태 s에서 ε-greedy(Q)로 행동 a를 고른 뒤 ((r, s’))를 관측해 Q(s,a)를 1회 갱신한다. 이어 ((s,a,r,s’))로 모델 M을 갱신하고, M에서 가상 전이 ((ŝ, â, r̂, ŝ’))를 (n)회 샘플링해 Q(ŝ, â)를 갱신한다. 결과물은 갱신된 Q, 모델 M, 정책 π(ε-greedy(Q))다.

모델 검증 MSE > θ로 모델 오차가 상승하면 계획 횟수 n을 줄이거나 가상 샘플에 페널티를 적용할 수 있다. 드리프트가 감지되면 최근 데이터 가중치를 높이고 오래된 데이터 가중치를 낮추는 EMA 방식을 쓴다.

SARSA는 환경 E, α, γ, ε를 입력으로 받는다. s에서 ε-greedy(Q)로 a를 선택하고, r과 s’를 관측한 다음 s’에서 a’를 선택한다. 이후 Q(s,a)를 온폴리시 방식으로 갱신하고, 종료될 때까지 s ← s’, a ← a’를 반복한다. 출력은 Q와 π(ε-greedy(Q))다.

보상 변동이 크면 리워드 클리핑 또는 표준화를 적용할 수 있다. 가치가 발산하는 징후가 보이면 α를 감쇠하고 ε를 높이며 상태 특성 스케일링을 다시 점검한다.

SARSADyna실환경 상호작용상태 s행동 a 선택 (ε-greedy)보상 r, 다음 상태 s'Q(s,a) 1회 갱신모델 M 갱신계획 n회: 가상 전이 샘플Q 다중 갱신다음 행동 a' 선택Q(s,a) 온-폴리시 갱신

선택 기준은 모델 신뢰도와 온라인 안전성이다

항목 Dyna (Model-Based) SARSA (Model-Free)
성능(표본 효율) 실경험 1회당 n+1 업데이트, 초기 수렴 빠름 실경험 의존, 수렴 속도 느림
확장성 모델·계획 비용 증가, 병렬 시뮬레이션로 완화 단순 스케일아웃 용이
안정성 모델 편향 리스크, 불확실성 관리 필요 온-폴리시로 보수적·안정적
일관성(수렴) 모델 품질에 종속, 비정상성에 취약 마코프·탐색 조건 하 수렴 경향
운영 편의 모델 검증/모니터링 필요 하이퍼파라미터 관리 중심, 단순 운영

로보틱스나 제조 공정처럼 실제 상호작용 비용이 높고 다운타임 위험이 있는 환경에서는 Dyna의 데이터 절약형 학습이 맞을 수 있다. 이 경우 시뮬레이터 정합도를 추적하고, 모델 불확실성 임계치를 기준으로 계획을 축소한다.

네트워크, 캐시, 자원 스케줄링은 온라인 안정성과 SLA 준수가 제약이다. SARSA의 온폴리시 제어를 사용하고 ε 스케줄을 보수적으로 운영하며, 지연과 SLA 위반 페널티를 중심으로 리워드를 설계할 수 있다.

시뮬레이터 비용이 낮아 대량 롤아웃이 가능한 게임과 시뮬레이션에서는 Dyna 또는 하이브리드 구성이 가능하다. 모델 앙상블로 편향을 낮추고 우선순위 스윕으로 수렴을 가속한다. 온라인 마케팅과 추천에서는 Dyna로 오프라인 모델을 학습한 뒤 제한된 온라인 미세조정을 수행하고, 오프폴리시 검증과 IPS/DR 평가를 병행한다.

계획 횟수는 효율과 지연을 함께 바꾼다

계획 횟수 n을 사용할 때 이론상 유효 업데이트 수는 n+1배가 된다. GridWorld/Taxi 등 이산 태스크에서는 n=10일 때 초기 수렴 에피소드 수가 5~8배 절감된다고 보고되며, 환경 의존적이다.

계획 스텝당 (O(1)O(log S)) 업데이트를 가정하면 실시간 제어에서는 지연이 늘어난다. 20ms 제어 루프에서는 n 상한을 35로 권장하며, 이는 하드웨어에 의존한다.

SARSA는 온폴리시 방식으로 행동과 평가 사이의 괴리를 줄여 온라인 안전성을 높일 수 있다. Dyna는 모델 검증 게이트로 안전계층을 구현하기 쉽다. 운영 관점에서 Dyna는 오프라인 모델 갱신 파이프라인과 A/B 게이팅으로 배포를 통제할 수 있고, SARSA는 단순 롤백과 스테이지드 배포에 유리하다.

테이블 기반 구현 예시

전제조건은 다음과 같다.

  • Python 3.10+, numpy>=1.23, gymnasium>=0.29 (환경/버전 최신 정보 확인 필요)
  • 이산 상태/행동 환경 예시: FrozenLake-v1 (is_slippery=False)

모델과 계획을 함께 사용하는 Dyna-Q

# python -m pip install gymnasium numpy
import numpy as np
import gymnasium as gym
from collections import defaultdict

env = gym.make("FrozenLake-v1", is_slippery=False)
n_states = env.observation_space.n
n_actions = env.action_space.n

Q = np.zeros((n_states, n_actions))
model = defaultdict(lambda: (0.0, 0, 0))  # (r, s', count)

alpha, gamma, epsilon = 0.1, 0.99, 0.1
planning_steps = 10
episodes = 500

rng = np.random.default_rng(0)

def epsilon_greedy(q, s, eps):
    return rng.integers(n_actions) if rng.random() < eps else np.argmax(q[s])

for ep in range(episodes):
    s, _ = env.reset(seed=ep)
    done = False
    while not done:
        a = epsilon_greedy(Q, s, epsilon)
        s2, r, terminated, truncated, _ = env.step(a)
        done = terminated or truncated

        # Real update
        td = r + gamma * (0 if done else np.max(Q[s2])) - Q[s, a]
        Q[s, a] += alpha * td

        # Model update (counts for simple averaging)
        r_old, s2_old, c = model[(s, a)]
        c_new = c + 1
        model[(s, a)] = ((r_old * c + r) / c_new, s2, c_new) if c else (r, s2, 1)

        # Planning
        keys = list(model.keys())
        for _ in range(planning_steps):
            ss, aa = keys[rng.integers(len(keys))]
            r_hat, s2_hat, _ = model[(ss, aa)]
            td_hat = r_hat + gamma * np.max(Q[s2_hat]) - Q[ss, aa]
            Q[ss, aa] += alpha * td_hat

        s = s2

# 정책 점검
policy = np.argmax(Q, axis=1)
print("Learned policy:", policy.reshape(4,4))

이 코드는 모델 품질 검증을 포함하지 않는다. 실무에서는 검증셋 MSE/Calibration 지표로 계획 수행 여부와 강도를 조절한다.

현재 정책으로 갱신하는 SARSA

import numpy as np
import gymnasium as gym

env = gym.make("FrozenLake-v1", is_slippery=False)
n_states = env.observation_space.n
n_actions = env.action_space.n

Q = np.zeros((n_states, n_actions))
alpha, gamma, epsilon = 0.1, 0.99, 0.1
episodes = 800
rng = np.random.default_rng(42)

def epsilon_greedy(q, s, eps):
    return rng.integers(n_actions) if rng.random() < eps else np.argmax(q[s])

for ep in range(episodes):
    s, _ = env.reset(seed=ep)
    a = epsilon_greedy(Q, s, epsilon)
    done = False
    while not done:
        s2, r, terminated, truncated, _ = env.step(a)
        done = terminated or truncated
        a2 = 0 if done else epsilon_greedy(Q, s2, epsilon)
        target = r if done else r + gamma * Q[s2, a2]
        Q[s, a] += alpha * (target - Q[s, a])
        s, a = s2, a2

policy = np.argmax(Q, axis=1)
print("Learned policy:", policy.reshape(4,4))

ε 스케줄은 ε_t = max(ε_min, ε_0 · decay^t)로 둘 수 있다. 안전 우선 환경에서는 ε_min을 상대적으로 크게 유지한다. 초기 학습을 가속한 뒤에는 α_t를 선형 또는 지수로 감쇠하며, 가치 폭증 같은 발산 징후가 나타나면 즉시 감쇠 또는 리셋한다.

배포 전후에 확인할 운영 조건

안전성이 우선인 환경에서는 SARSA를 먼저 채택하고 탐색 하한 ε_min을 보수적으로 설정한다. 배포 전 샌드박스나 시뮬레이터 검증도 필요하다.

데이터 비용이 높고 시뮬레이터 신뢰도가 높다면 Dyna를 선택할 수 있다. 앙상블 분산, 야코비안 노름 등의 모델 불확실성 추정으로 계획 강도를 조절한다. 관측 드리프트에는 주기적 리트레이닝과 최근 데이터 가중치 상향, 계획 시 오래된 모델 가중치 하향으로 대응한다.

운영 중에는 에피소드 리턴 분포, 정책 변동도(KL 또는 액션 변화율), 모델 검증 오차(MAE/MSE), 배포 게이팅 기준을 모니터링한다. Dyna는 CPU/GPU를 추가로 소모하므로 실시간 경로에 계획 횟수 상한을 두고 오프라인 배치 계획을 병행한다.

강화학습DynaSARSA모델 기반 학습온폴리시