콘텐츠로 이동
Study Note강화학습

5. 정책 기반 — 정책 경사와 액터-크리틱

좋았던 행동의 확률을 올리고 나빴던 행동의 확률을 내린다 — 정책 경사는 이 한 문장이 전부다

이 장에서 처음 나오는 말6개
정책 경사Policy Gradient
정책을 신경망으로 두고 리턴이 커지는 방향으로 직접 파라미터를 미는 방법.
확률적 정책Stochastic Policy · π(a|s)
행동을 하나로 정하지 않고 확률 분포로 내놓는 정책. 탐색이 정책 안에 내장된다.
REINFORCE리인포스
가장 단순한 정책 경사 알고리즘. 에피소드가 끝난 뒤 받은 리턴으로 확률을 밀고 당긴다.
베이스라인Baseline
리턴에서 빼 주는 기준값. 평균을 빼는 것만으로 분산이 크게 준다 — 정답은 안 바뀐다.
어드밴티지Advantage · A(s,a)
Q(s,a) − V(s). "평균보다 얼마나 나은 행동인가" — 정책 경사가 실제로 쓰는 신호.
액터-크리틱Actor-Critic
행동하는 쪽(액터)과 채점하는 쪽(크리틱)을 두 신경망으로 나눈 구조. 오늘날 주류의 골격.

4장의 방식은 Q를 배우고 argmax로 행동을 골랐다. 여기에 걸림돌이 셋 있다.

걸림돌무슨 일
연속 행동관절 토크가 실수 7개면 argmax를 못 구한다
확률적 정책이 필요할 때가위바위보에서 최선은 “무작위”다. argmax는 항상 하나만 고른다
행동 수가 폭발할 때이산화하면 관절 수에 따라 곱셈으로 는다 (2장)

그래서 가치를 거치지 말고 정책 자체를 학습 대상으로 두자는 것이 이 장이다.

π(a | s ; θ) 상태를 넣으면 행동의 확률(또는 연속 분포)을 내놓는 신경망
행동 형태신경망이 내놓는 것
이산각 행동의 확률 (softmax)
연속가우시안 분포의 평균과 표준편차 — 거기서 뽑아 쓴다

연속 행동이 자연스럽게 나오는 것이 이 접근의 결정적 장점이다. 연속 제어 로봇 RL에서 정책 기반·액터-크리틱 방법이 널리 쓰이는 이유가 이것이다.

목표는 “정책이 만드는 리턴의 평균을 키우는 것”이다. 그 목표를 θ로 미분한 결과가 정책 경사 정리인데, 결론만 보면 놀랄 만큼 단순하다.

∇J(θ) = E[ ∇ log π(a|s ; θ) · G ]
└── 그 행동을 ──┘ └ 그래서 ┘
더 자주 하게 얼마나 좋았나

그 행동을 할 확률을 올리는 방향에, 그 행동이 실제로 얼마나 좋았는지를 곱한다. 좋았으면 확률을 올리고, 나빴으면 (음수가 곱해져) 확률을 내린다.

수학적으로는 로그를 쓰는 트릭이 들어가지만, 실무에서 기억할 것은 이 문장 하나다. 구현도 짧다 — 손실을 −log π(a|s) · G로 두고 평범하게 역전파하면 된다.

for episode in range(N):
# 1) 지금 정책으로 한 판 끝까지 돈다
states, actions, rewards = rollout(env, policy)
# 2) 각 시점의 리턴을 뒤에서부터 계산
G, returns = 0, []
for r in reversed(rewards):
G = r + gamma * G
returns.insert(0, G)
# 3) 좋았던 행동의 로그 확률을 키운다
loss = 0
for s, a, Gt in zip(states, actions, returns):
loss += -policy.log_prob(s, a) * Gt
loss.backward(); optimizer.step()

REINFORCE는 맞기는 맞는데 너무 흔들린다. 이유가 둘이다.

원인무슨 일
에피소드 통째로 채점한 판을 잘 끝냈으면 그 안의 나쁜 수까지 전부 확률이 올라간다
기준선이 없다모든 리턴이 양수인 환경(예: 매 스텝 +1)이면 모든 행동의 확률을 올리려 한다

두 번째가 특히 나쁘다. 리턴이 전부 양수면 방향은 결국 상대적 크기로만 정해지는데, 그러려면 표본이 아주 많이 필요하다.

처방 ① 베이스라인 — 평균을 뺀다

섹션 제목: “처방 ① 베이스라인 — 평균을 뺀다”
∇J(θ) = E[ ∇ log π(a|s) · (G − b(s)) ]

리턴에서 그 상태의 평균적인 성적 b(s) 를 빼 준다. “잘한 것”이 아니라 “평균보다 잘한 것” 만 확률을 올린다.

놀라운 점은 어떤 b(s)를 빼도 정답(기대 경사)은 안 바뀐다는 것이다. 분산만 줄어든다. 공짜 개선이라 안 쓸 이유가 없다.

가장 널리 쓰이는 상태 의존 베이스라인은 가치 V(s)다. 정확한 최소 분산 베이스라인은 문제와 경사 크기에 따라 달라질 수 있지만, V(s)는 유용하고 계산하기 쉬운 표준 선택이다. 그러면 —

G − V(s) ≈ Q(s,a) − V(s) = A(s,a) 어드밴티지

“이 행동은 이 자리의 평균보다 얼마나 나은가.”

처방 ② 크리틱 — 끝까지 안 기다린다

섹션 제목: “처방 ② 크리틱 — 끝까지 안 기다린다”

V(s)를 알아야 하는데, 그걸 또 하나의 신경망으로 배운다. 그게 크리틱이다. 동시에 리턴을 끝까지 기다리지 않고 TD로 대체하면 매 스텝 학습할 수 있다.

A(s,a) ≈ r + γ·V(s') − V(s) ← 3장의 TD 오차와 같은 식이다

여기서 액터-크리틱 구조가 완성된다.

상태를 받은 액터가 행동을 고르고 환경의 보상으로 어드밴티지를 계산해 액터의 확률과 크리틱의 예측을 함께 고치는 액터-크리틱 구조
역할배우는 것신호
액터 (정책)무엇을 할까어드밴티지 — 평균보다 좋았으면 확률을 올린다
크리틱 (가치)이 자리가 얼마짜리인가TD 오차 — 예측을 실제 쪽으로 옮긴다

3장의 “평가 → 개선” 구조가 그대로 신경망 두 개로 구현된 것이다.

액터-크리틱을 실전에서 돌릴 때 두 가지가 추가된다.

추가왜
환경 여러 개를 동시에 (벡터화)한 환경에서 순차로 모은 데이터는 상관이 높다. 16~4096개를 병렬로 돌려 배치를 만든다
엔트로피 보너스정책이 한 행동으로 쏠려 탐색이 죽는 것을 막는다
전체 손실 = 정책 손실 − c₁·엔트로피 + c₂·가치 손실
▲ ▲
다양성을 유지하는 항 크리틱 학습

세 항을 한 손실로 묶어 한 번에 역전파한다. c₁(엔트로피 계수)은 탐색 손잡이, c₂는 크리틱 학습 세기다.

액터-크리틱에는 아직 큰 구멍이 하나 있다. 정책을 얼마나 밀어야 하는가이다.

정책을 조금 밀어 데이터를 모으는 순환에서, 너무 많이 밀면 나쁜 정책이 나쁜 데이터를 모아 회복 불가로 붕괴하는 경로

지도학습이라면 학습률을 크게 잡아 손실이 튀어도 다음 배치에서 회복한다. 강화학습은 데이터를 정책 자신이 만들기 때문에, 한 번 크게 잘못 밀면 그다음 데이터가 통째로 나빠져 회복하지 못한다.

이 문제를 정면으로 다룬 것이 TRPO이고, 그걸 훨씬 간단하게 근사한 것이 PPO다. 다음 장이 그 이야기다.

알고리즘스텝 크기를 어떻게 다루나오늘의 위치
REINFORCE안 다룬다교육용
A2C / A3C안 다룬다 (작은 학습률로 버틴다)옛 표준
TRPO분포 변화량(KL)에 엄격한 제약을 건다이론적 기준. 구현이 무겁다
PPO비율을 잘라서 간단히 근사널리 쓰임
  • 정책 경사는 가치를 거치지 않고 정책을 직접 민다 — 연속 행동과 확률적 정책이 자연스럽다
  • 핵심 문장 하나 — 좋았던 행동의 확률을 올리고 나빴던 행동의 확률을 내린다
  • REINFORCE는 맞지만 분산이 지독하다. 한 판을 잘 끝내면 그 안의 나쁜 수까지 올라간다
  • 행동에 의존하지 않는 베이스라인을 빼면 기대 경사는 그대로다. V(s)가 널리 쓰이는 표준 선택이다
  • 그래서 실제 학습 신호는 어드밴티지 A = Q − V — “평균보다 얼마나 나은가”다
  • V를 신경망으로 배우면 액터-크리틱이 되고, 이는 3장의 평가 → 개선 구조 그대로다
  • 실전 형태(A2C)에는 환경 벡터화와 엔트로피 보너스가 붙는다
  • 바닐라 on-policy 추정기는 정책이 바뀐 데이터를 보정 없이 재사용할 수 없다 — 샘플 비용이 크다
  • 남은 구멍은 한 걸음의 크기다. 학습률로는 못 막고, 분포 변화량을 직접 제한해야 한다