정책 경사 방법 — REINFORCE

가치(value) 추정을 멈춥니다. 정책(policy)을 직접 파라미터화하고, 기대 리턴(expected return)의 경사(gradient)를 계산한 뒤, 올라가는 방향으로 한 걸음 내딛습니다. Williams(1992)는 이를 단 하나의 정리(theorem)로 정리해 두었습니다. PPO, GRPO, 그리고 모든 LLM RL 학습 루프가 존재하는 이유가 바로 여기에 있습니다.

유형: Build 언어: Python 선수 지식: Phase 3 · 03 (역전파; Backpropagation), Phase 9 · 03 (몬테카를로; Monte Carlo), Phase 9 · 04 (TD 학습; TD Learning) 예상 시간: 약 75분

문제

Q-러닝(Q-learning)과 DQN은 가치(value) 함수를 파라미터화합니다. 행동(action)은 argmax Q로 고릅니다. 이 방식은 이산 행동(discrete actions)과 이산 상태(discrete states)에서는 잘 동작합니다. 하지만 행동이 연속(continuous)일 때는 곤란해집니다. 예를 들어 10차원 토크(torque) 위에서 argmax를 어떻게 취하라는 것일까요? 확률적 정책(stochastic policy)을 원할 때도 문제가 됩니다. argmax는 구조상 결정론적(deterministic)이기 때문입니다.

정책 경사(policy gradient) 방법은 가치 대신 정책(policy) 자체를 파라미터화합니다. π_θ(a | s)는 행동에 대한 분포(distribution)를 출력하는 신경망(neural net)입니다. 행동할 때는 이 분포에서 표본을 추출(sample)합니다. θ에 대한 기대 리턴의 경사를 계산합니다. 위쪽으로 한 걸음 내딛습니다. argmax도 없고, 벨만 재귀(Bellman recursion)도 없습니다. 그저 J(θ) = E_{π_θ}[G] 위에서 경사 상승(gradient ascent)을 할 뿐입니다.

REINFORCE 정리(Williams 1992)는 이 경사가 계산 가능하다고 말해 줍니다. ∇J(θ) = E_π[ G · ∇_θ log π_θ(a | s) ]. 에피소드(episode)를 한 번 굴립니다. 리턴(return)을 계산합니다. 매 단계마다 ∇ log π_θ(a | s)에 곱합니다. 평균을 냅니다. 경사 상승을 적용합니다. 끝입니다.

2026년의 모든 LLM-RL 알고리즘, 즉 PPO, DPO, GRPO는 REINFORCE를 다듬은 변형(refinement)입니다. 이것을 손에 익히는 일은 이 단계(phase)의 나머지 내용과 Phase 10 · 07(RLHF 구현), Phase 10 · 08(DPO)을 따라가기 위한 선수 조건입니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.Q-learning과 DQN은 가치 함수를 파라미터화하고 argmax로 행동을 선택합니다. 10차원 로봇 토크(torque) 같은 연속 행동 공간(continuous action space)에서 이 방식이 어려운 이유는 무엇인가요?

2.REINFORCE의 경사(gradient)는 nabla J(theta) = E[G_t * nabla log pi_theta(a_t|s_t)]입니다. 로그 미분 트릭(log-derivative trick)이 이 경사를 계산 가능하게 만드는 데 어떤 역할을 하나요?

0/2 답변 완료

개념

REINFORCE — gradient ascent on expected return policy gradient theorem grad J(theta) = E_pi [ sum_t G_t * grad_theta log pi_theta(a_t | s_t) ] one rollout, one update roll out tau ~ pi_theta, compute returns G_0, G_1, ..., G_T for each (s_t, a_t): theta += lr * (G_t - b(s_t)) * grad log pi_theta(a_t | s_t) sample action logits = f_theta(s) p = softmax(logits) a ~ Categorical(p) stochastic by design credit assignment G_t = sum_{k>=t} g^{k-t} r_{k+1} reward-to-go only baseline: G_t - V(s_t) unbiased, lower variance apply gradient grad log pi = e_a - p theta += lr * adv * grad + entropy bonus on-policy, batched PPO = REINFORCE + clipped IS ratio · GRPO = REINFORCE + group-relative baseline · DPO = REINFORCE without sampling

정책 경사 정리(Policy Gradient Theorem). θ로 파라미터화된 임의의 정책 π_θ에 대해 다음이 성립합니다.

∇J(θ) = E_{τ ~ π_θ}[ Σ_{t=0}^{T} G_t · ∇_θ log π_θ(a_t | s_t) ]

여기서 G_t = Σ_{k=t}^{T} γ^{k-t} r_{k+1}은 단계 t부터의 할인 리턴(discounted return)입니다. 기댓값은 π_θ에서 표본추출한 전체 궤적(trajectory) τ에 대해 취합니다.

증명은 짧습니다. 기댓값 안에서 J(θ) = Σ_τ P(τ; θ) G(τ)를 미분합니다. 이때 로그 미분 트릭(log-derivative trick)인 ∇P(τ; θ) = P(τ; θ) ∇ log P(τ; θ)을 사용합니다. 그리고 log P(τ; θ) = Σ log π_θ(a_t | s_t) + θ에 의존하지 않는 환경 항(environment terms)으로 분해(factorize)합니다. 환경 항은 미분에서 사라지고, 두 줄의 대수 계산으로 정리가 도출됩니다.

분산 감소(variance reduction) 기법. 기본형 REINFORCE는 분산이 매우 큽니다. 리턴 자체도 잡음이 많고, ∇ log π도 잡음이 많으며, 둘의 곱은 더욱 잡음이 큽니다. 표준 해결책은 두 가지입니다.

  1. 기준선 차감(Baseline Subtraction). G_tG_t - b(s_t)로 바꿉니다. 기준선 b(s_t)a_t에 의존하지 않는 임의의 함수면 됩니다. E[b(s_t) · ∇ log π(a_t | s_t)] = 0이므로 편향(bias)이 생기지 않습니다. 대표적인 선택은 비평가(critic)가 학습한 b(s_t) = V̂(s_t)이며, 이것이 액터-크리틱(actor-critic, Lesson 07)으로 이어집니다.
  2. 잔여 보상(reward-to-go). Σ_t G_t · ∇ log π_θ(a_t | s_t) 대신 Σ_t G_t^{from t} · ∇ log π_θ(a_t | s_t)을 사용합니다. 어떤 행동에 대해서는 그 이후의 미래 리턴만 의미가 있고, 과거 보상(past rewards)은 평균이 0인 잡음(zero-mean noise)을 보탤 뿐입니다.

두 기법을 합치면 다음 식을 얻습니다.

∇J ≈ (1/N) Σ_{i=1}^{N} Σ_{t=0}^{T_i} [ G_t^{(i)} - V̂(s_t^{(i)}) ] · ∇_θ log π_θ(a_t^{(i)} | s_t^{(i)})

이것이 기준선이 포함된 REINFORCE이며, A2C(Lesson 07)와 PPO(Lesson 08)의 직접적인 조상입니다.

소프트맥스 정책 파라미터화(Softmax Policy Parameterization). 이산 행동에서는 보통 다음 형태를 사용합니다.

π_θ(a | s) = exp(f_θ(s, a)) / Σ_{a'} exp(f_θ(s, a'))

여기서 f_θ는 행동별 점수(score)를 출력하는 임의의 신경망입니다. 이때 경사는 깔끔한 형태를 가집니다.

∇_θ log π_θ(a | s) = ∇_θ f_θ(s, a) - Σ_{a'} π_θ(a' | s) ∇_θ f_θ(s, a')

즉, 선택한 행동의 점수에서 정책 아래의 기대 점수를 뺀 것입니다.

연속 행동을 위한 가우시안 정책(Gaussian Policy). π_θ(a | s) = N(μ_θ(s), σ_θ(s))입니다. ∇ log N(a; μ, σ)는 닫힌 형태(closed form)를 가집니다. Phase 9 · 07의 SAC가 필요한 것은 이것뿐입니다.

직접 만들기

Step 1: 소프트맥스 정책 신경망

def policy_logits(theta, state_features):
    return [dot(theta[a], state_features) for a in range(N_ACTIONS)]

def softmax(logits):
    m = max(logits)
    exps = [exp(l - m) for l in logits]
    Z = sum(exps)
    return [e / Z for e in exps]

표 형식 환경(tabular env)에는 선형 정책(linear policy)을 사용합니다. 행동마다 가중치 벡터(weight vector)를 하나씩 둡니다. 아타리(Atari)와 같은 영역에서는 CNN으로 바꾸되 softmax 출력층(head)은 그대로 유지합니다.

Step 2: 표본추출과 로그 확률

def sample_action(probs, rng):
    x = rng.random()
    cum = 0
    for a, p in enumerate(probs):
        cum += p
        if x <= cum:
            return a
    return len(probs) - 1

def log_prob(probs, a):
    return log(probs[a] + 1e-12)

Step 3: 로그 확률을 함께 저장하는 롤아웃(rollout)

def rollout(theta, env, rng, gamma):
    trajectory = []
    s = env.reset()
    while not done:
        logits = policy_logits(theta, s)
        probs = softmax(logits)
        a = sample_action(probs, rng)
        s_next, r, done = env.step(s, a)
        trajectory.append((s, a, r, probs))
        s = s_next
    return trajectory

Step 4: REINFORCE 갱신(update)

def reinforce_step(theta, trajectory, gamma, lr, baseline=0.0):
    returns = compute_returns(trajectory, gamma)
    for (s, a, _, probs), G in zip(trajectory, returns):
        advantage = G - baseline
        grad_log_pi_a = [-p for p in probs]
        grad_log_pi_a[a] += 1.0
        for i in range(N_ACTIONS):
            for j in range(len(s)):
                theta[i][j] += lr * advantage * grad_log_pi_a[i] * s[j]

∇ log π(a|s) = e_a - π(·|s)이라는 경사 식이 소프트맥스 정책 경사의 핵심입니다. 선택한 행동 a의 원핫(onehot)에서 정책 확률을 뺀 것이며, 반드시 몸에 익혀 두어야 합니다.

Step 5: 기준선

최근 에피소드들의 G에 대한 이동 평균(running mean)만으로도 4×4 그리드월드(GridWorld)를 풀 수 있을 만큼 분산이 줄어듭니다. 수렴까지 약 500 에피소드가 걸립니다. 기준선을 학습된 V̂(s)로 업그레이드하면 액터-크리틱이 됩니다.

주의할 점

  • 경사 폭발(Exploding Gradients). 리턴은 매우 클 수 있습니다. ∇ log π에 곱하기 전에 항상 배치(batch) 안에서 G를 대략 N(0, 1)로 정규화(normalize)합니다.
  • 엔트로피 붕괴(Entropy Collapse). 정책이 너무 일찍 거의 결정론적인 행동으로 수렴하면 탐험(exploration)을 멈추고 갇혀 버립니다. 해결책은 목표 함수에 엔트로피 보너스 β · H(π(·|s))를 더해 주는 것입니다.
  • 높은 분산(High Variance). 기본형 REINFORCE는 수천 에피소드가 필요합니다. 비평가 기준선(Lesson 07)이나 TRPO/PPO의 신뢰 영역(trust region, Lesson 08)이 표준 해결책입니다.
  • 표본 비효율(Sample Inefficiency). 온폴리시(on-policy)는 한 번 갱신한 뒤 모든 전이(transition)를 버립니다. 중요도 표본추출(importance sampling)을 통한 오프폴리시(off-policy) 보정은 데이터를 되살리지만 분산 비용을 치러야 합니다. PPO의 비율(ratio)은 잘라낸(clipped) 중요도 가중치(IS weight)입니다.
  • 비정상 경사(Non-stationary Gradients). 100 에피소드 전에 계산한 경사는 그 시점의 정책 π에 기반합니다. 온폴리시 방법이 몇 번의 롤아웃마다 갱신을 수행하는 이유가 바로 이것입니다.
  • 공로 배정(Credit Assignment). 잔여 보상(reward-to-go)을 쓰지 않으면 과거 보상이 잡음을 더합니다. 항상 잔여 보상을 사용합니다.

사용해보기

2026년에 REINFORCE를 직접 돌리는 경우는 드물지만, 그 경사 공식은 어디에나 등장합니다.

사용 사례파생 방법
연속 제어(Continuous Control)가우시안 정책을 사용하는 PPO / SAC
LLM RLHFKL 페널티(KL penalty)를 더한 PPO를 토큰 단위 정책에서 실행
LLM 추론(DeepSeek)GRPO — 그룹 상대 기준선(group-relative baseline)을 쓰고 비평가가 없는 REINFORCE
다중 에이전트(Multi-agent)중앙 비평가 기반 REINFORCE (MADDPG, COMA)
이산 행동 로보틱스A2C, A3C, PPO
선호도만 주어지는 환경(preference-only settings)DPO — REINFORCE를 선호 우도(preference likelihood) 손실로 다시 쓴 형태이며, 표본추출이 필요 없습니다.

2026년 학습 스크립트에서 loss = -advantage * log_prob을 보게 되면, 그것이 바로 기준선이 포함된 REINFORCE입니다. DPO, GRPO, RLOO 같은 논문 전체가 이 한 줄 위에서 분산 감소 기법을 다듬은 것에 해당합니다.

산출물 만들기

outputs/skill-policy-gradient-trainer.md로 저장합니다.

---
name: policy-gradient-trainer
description: Produce a REINFORCE / actor-critic / PPO training config for a given task and diagnose variance issues.
version: 1.0.0
phase: 9
lesson: 6
tags: [rl, policy-gradient, reinforce]
---

Given an environment (discrete / continuous actions, horizon, reward stats), output:

1. Policy head. Softmax (discrete) or Gaussian (continuous) with parameter counts.
2. Baseline. None (vanilla), running mean, learned `V̂(s)`, or A2C critic.
3. Variance controls. Reward-to-go on by default, return normalization, gradient clip value.
4. Entropy bonus. Coefficient β and decay schedule.
5. Batch size. Episodes per update; on-policy data freshness contract.

Refuse REINFORCE-no-baseline on horizons > 500 steps. Refuse continuous-action control with a softmax head. Flag any run with `β = 0` and observed policy entropy < 0.1 as entropy-collapsed.

연습문제

  1. 쉬움. 4×4 그리드월드에서 선형 소프트맥스 정책으로 REINFORCE를 구현합니다. 기준선 없이 1,000 에피소드를 학습합니다. 학습 곡선(learning curve)을 그리고 리턴의 표준편차(std)를 측정해 분산을 확인합니다.
  2. 중간. 이동 평균 기준선(running-mean baseline)을 추가합니다. 다시 학습한 뒤 표본 효율과 분산을 기본형 실행과 비교합니다. 기준선은 수렴까지 필요한 단계 수를 얼마나 줄여 주나요?
  3. 어려움. 엔트로피 보너스 β · H(π)를 추가합니다. β ∈ {0, 0.01, 0.1, 1.0} 범위를 훑어(sweep)봅니다. 최종 리턴과 정책 엔트로피를 그려 봅니다. 이 과제에서 가장 좋은 지점(sweet spot)은 어디인가요?

핵심 용어

용어흔한 설명실제 의미
정책 경사(Policy Gradient)"정책을 직접 학습한다"`∇J(θ) = E[G · ∇ log π_θ(a
REINFORCE"원조 정책 경사 알고리즘"Williams (1992). 몬테카를로 리턴에 로그 정책 경사를 곱한다.
로그 미분 트릭(Log-derivative Trick)"점수 함수 추정량(Score Function Estimator)"∇P(τ;θ) = P(τ;θ) · ∇ log P(τ;θ)이며, 기댓값의 경사를 다룰 수 있게 해 준다.
기준선(Baseline)"분산 감소"G에서 빼는 임의의 b(s)이다. E[b · ∇ log π] = 0이므로 편향이 없다.
잔여 보상(Reward-to-go)"미래 리턴만 센다"전체 G_0 대신 G_t^{from t}를 사용한다. 옳고 분산도 낮다.
엔트로피 보너스(Entropy Bonus)"탐험을 장려한다"`+β · H(π(·
온폴리시(On-policy)"방금 본 데이터로 학습한다"경사 기댓값이 현재 정책에 대한 것이므로 오래된 데이터를 그대로 재사용할 수 없다.
어드밴티지(Advantage)"평균보다 얼마나 나은가"A(s, a) = G(s, a) - V(s)이며, 기준선이 포함된 REINFORCE가 곱하는 부호 있는 양이다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

policy-gradient-trainer

Produce a REINFORCE / actor-critic / PPO training config for a given task and diagnose variance issues.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.기준선(baseline) 없는 기본형 REINFORCE는 단순한 GridWorld에서 5,000 에피소드가 걸립니다. 이동 평균 기준선 b(s)를 추가하면 500 에피소드에 수렴합니다. G_t에서 b(s)를 빼는 것이 편향(bias)을 도입하지 않으면서 도움이 되는 이유는 무엇인가요?

2.REINFORCE 에이전트의 정책 엔트로피(policy entropy)가 200 에피소드 후 거의 0에 가까워지고 개선이 멈춥니다. 에이전트가 상태와 무관하게 같은 행동만 선택합니다. 이 실패 모드와 표준적인 해결책은 무엇인가요?

3.REINFORCE는 모든 시간 단계에 에피소드 시작부터의 전체 리턴 G_0을 사용합니다. '잔여 보상(reward-to-go)'은 이를 G_t(스텝 t 이후의 리턴)로 바꿉니다. 잔여 보상이 엄격히 더 나은 이유는 무엇인가요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다