CH 27 강화학습 · Part 5 보상을 사람에게서 배우다
모방학습과 역강화학습
26장까지 우리는 보상함수가 주어져 있다고 가정했다. 절벽은 −100, 목표는 +1, 한 걸음은 −1. 이제 그 가정을 버린다. "좋은 운전"의 보상함수를 적어 보라고 하면 누구도 적을 수 없고, 속도·안전·승차감의 교환비를 숫자로 박아 넣는 순간 이미 틀린 목표를 최적화하게 된다. 대신 우리가 할 수 있는 일은 보여 주는 것이다. 시연에서 정책을 얻는 세 가지 길 — 행동을 그대로 흉내기(BC), 보상을 거꾸로 추정하기(IRL), 점유분포를 맞추기(GAIL) — 을 끝까지 따라간다. BC 가 왜 O(εT2) 로 무너지는지 숫자로 보고, 보상함수가 원리적으로 하나로 정해지지 않는다는 사실을 퍼텐셜 정형화로 증명한다.
- 01 직관
- 02 수식 읽는 법
- 03 손으로 풀기
- 04 코드
- 05 시각화
약어 및 기호 정의
- 모방학습 imitation learning
- 보상 대신 전문가의 시연으로 정책을 얻는 문제 전체. 아래 세 계열을 포괄한다
- 전문가 πE
- expert. 시연을 만든 쪽. 사람일 수도, 값비싼 탐색기일 수도, 특권 정보를 쓰는 정책일 수도 있다
- 시연 𝒟
- demonstrations. {(si, ai)} 또는 궤적 {τj}. 보상 라벨은 없다
- 행동복제 BC
- behavior cloning. s ↦ a 를 지도학습으로 맞추는 것. 모방학습의 가장 단순한 답
- 공변량 이동 covariate shift
- 학습 때의 입력분포(dE)와 시험 때의 입력분포(dπ)가 다른 현상. BC 의 근본 결함
- DAgger
- Dataset Aggregation. 내 정책이 가는 곳에서 전문가에게 다시 라벨을 묻고 데이터에 더하는 반복법
- 역강화학습 IRL
- inverse RL. 시연이 최적이었다고 가정하고 보상함수를 역으로 찾는 문제
- 퍼텐셜 정형화 F
- potential-based shaping. F(s,a,s′) = γΦ(s′) − Φ(s) 꼴의 보상 덧붙임. 최적정책을 바꾸지 않는다
- 특징기대 μ(π)
- feature expectation. 𝔼π[∞Σt=0 γt φ(st)]. 선형 보상 r = w·φ 에서 가치는 w·μ 하나로 결정된다
- 점유분포 ρπ
- occupancy measure. (1−γ)𝔼π[Σ γt 𝟙(st=s, at=a)]. 정책이 어디에 얼마나 머무는지의 분포
- GAIL
- Generative Adversarial Imitation Learning. 보상을 거치지 않고 ρπ 를 ρE 에 맞추는 적대적 학습
- 판별기 D
- discriminator. (s,a) 가 전문가에서 왔을 확률을 내놓는 분류기. 정책의 보상 대용으로 쓰인다
- 후회 regret
- 여기서는 전문가 대비 누적 손실 J(πE) − J(π). 2장의 밴딧 후회와 같은 발상이다
직관: 보상함수를 적을 수 없는 문제들
"좋은 운전"의 보상함수를 적어 보자. 빠르면 좋으니 속도에 +1, 사고는 나쁘니 충돌에 −1000, 승객이 불편하면 안 되니 가속도 제곱에 −0.1. 세 줄을 적고 나면 곧 문제가 드러난다. 왜 −1000 인가. −100 이면 난폭해지고 −10000 이면 차가 아예 출발하지 않는다. 급제동 한 번과 2분 지연 중 무엇이 더 나쁜가. 노인을 태웠을 때와 응급환자를 태웠을 때 그 교환비가 같아야 하는가.
1장에서 본 보상가설(reward hypothesis) — 모든 목표는 누적 스칼라 보상의 최대화로 적을 수 있다 — 은 존재에 대한 주장이다. 그런 스칼라가 원리적으로 있다는 말과, 사람이 그것을 손으로 적어 낼 수 있다는 말은 전혀 다르다. 숫자 세 개의 교환비를 정하는 순간 우리는 "무엇이 좋은 운전인가"라는 물음에 답한 셈이 되는데, 우리는 그 답을 모른다. 아는 것은 한 가지뿐이다 — 좋은 운전을 보면 알아본다.
이 구조의 문제가 실은 대부분이다. 로봇이 컵을 자연스럽게 집는 동작, 문장을 읽기 좋게 다듬는 편집, 수술 도구의 부드러운 경로. 어느 것도 보상함수를 적을 수 없지만 어느 것도 시연은 줄 수 있다. 그래서 문제 설정을 바꾼다.
문제를 다시 적는다
주어진 것: MDP 에서 보상함수 R 만 빠진 것 M∖R = (𝒮, 𝒜, P, γ), 그리고 전문가의 시연 𝒟 = {τ1, …, τN}. 각 궤적은 상태와 행동의 나열이고 보상 숫자는 없다.
원하는 것: 전문가만큼 잘하는 정책 π. 경우에 따라서는 정책보다 보상함수 자체를 원한다 — 보상을 얻으면 환경이 달라져도 다시 풀 수 있고, 전문가보다 더 잘할 수도 있다.
여기서 길이 세 갈래로 나뉘는데, 갈리는 지점은 "무엇을 맞출 것인가"다.

도해 1 의 핵심은 "내가 데이터를 만든다"는 1장의 세 번째 문제가 여기서 가장 날카롭게 나타난다는 점이다. 지도학습의 독립동일분포(i.i.d.) 가정은 BC 에서 깨진다. 학습 때의 입력분포는 전문가가 방문한 상태들의 분포 dE 인데, 시험 때의 입력분포는 내 정책이 방문하는 dπ 다. 그리고 π 가 πE 와 조금이라도 다르면 두 분포는 시간이 갈수록 벌어진다.
자율주행의 초기 신경망 연구(Pomerleau 의 ALVINN, 1989)부터 이 문제는 알려져 있었고, 당시의 처방은 일부러 비뚤어진 상태를 데이터에 넣는 것이었다. 카메라를 좌우로 비스듬히 달아 "중앙선에서 벗어난 시야 + 돌아오는 조향각"을 합성해 학습시켰다. 이것이 바로 데이터 분포를 내 정책이 갈 곳까지 넓힌다는 DAgger 의 발상을 수작업으로 구현한 것이다.
왜 보상까지 거슬러 올라가려 하는가
BC 를 고치는 가장 곧은 길은 데이터를 넓히는 것(DAgger)이다. 그런데 그 길은 전문가를 계속 부를 수 있을 때만 된다. 그리고 BC 도 DAgger 도 행동만 복사할 뿐이라, 환경이 조금 달라지면(도로가 바뀌면, 로봇 팔 길이가 달라지면) 처음부터 다시다. 보상함수는 다르다. 보상은 "무엇이 좋은가"를 담고 있고 그것은 대체로 환경보다 오래 산다. 그래서 IRL 은 시연에서 정책이 아니라 의도를 추출하려 한다 — Ng 와 Russell 이 IRL 을 정식화한 2000년 논문의 표현대로, 보상함수야말로 과제의 가장 간결하고 이식 가능한 기술이다.
대가도 분명하다. IRL 은 안쪽에 강화학습 문제 전체를 품는다. 후보 보상 R̂ 하나를 시험하려면 그 보상 아래의 최적정책을 풀어야 하고, 바깥 루프가 R̂ 를 갱신할 때마다 그 일을 다시 해야 한다. 게다가 — 다음 단계에서 증명하겠지만 — 답이 하나가 아니다. 시연을 완벽히 설명하는 보상함수는 무한히 많고, 그중에는 R ≡ 0 처럼 쓸모없는 것도 있다.
수식 읽는 법: 복제·이동·비유일성·적대
행동복제는 지도학습 그 자체다
행동복제(behavior cloning, BC)에는 강화학습이 없다. 상태를 입력, 전문가 행동을 정답 라벨로 놓은 분류(또는 회귀) 문제다.
식 (27.1) 은 𝒟 아래의 기댓값이라는 점이 전부다. 𝒟 는 전문가가 방문한 상태들, 즉 s ~ dE 에서 뽑힌다. 그런데 우리가 정말 줄이고 싶은 것은 배포했을 때의 손실이다.
이 어긋남이 공변량 이동(covariate shift)이다. 지도학습에서도 훈련·시험 분포가 다르면 곤란하지만, 여기서는 시험 분포를 내가 만든다는 점이 다르다. 정책이 나쁘면 나쁜 곳에 가고, 나쁜 곳에 가면 더 나빠진다. 되먹임이 있다.
유도: 스텝당 ε 가 어떻게 εT2 가 되는가
정확한 상수까지 따지려면 조건이 여럿 필요하므로, 가장 투명한 모형으로 차수만 뽑자. 길이 T 의 유한지평, 스텝마다 최대 1 의 손실. 전문가와 다른 행동을 하는 확률이 어느 상태에서든 ε 이하라고 하자.
차수의 의미를 놓치지 말자. 지도학습이라면 오류율 ε 는 ε 만큼의 손해다. 순차 결정에서는 같은 ε 가 εT2, 즉 지평의 제곱으로 증폭된다. 지평이 10배 길어지면 손해는 100배다. 이것이 "BC 는 짧은 과제에서는 놀랍도록 잘 되고 긴 과제에서는 갑자기 무너진다"는 현장 경험의 정확한 근거다.
DAgger 가 O(εT) 로 낮추는 원리
문제의 원인은 하나였다 — dE 에서 학습하고 dπ 에서 시험한다. 그러면 처방도 하나다. dπ 에서 학습하면 된다.
DAgger 가 요구하는 것이 무엇인지 분명히 하자. 전문가가 임의의 상태에 대해 답할 수 있어야 한다. 시뮬레이터 안의 탐색기나 특권 정보를 쓰는 정책이라면 쉽다. 사람이라면 어렵다 — 화면을 멈추고 "지금 뭘 하시겠어요"를 수천 번 물어야 한다. 그리고 사람은 맥락에서 떼어 낸 한 장면에 답하는 걸 잘 못한다. 이 한계가 28장 RLHF 로 가는 문을 연다: 사람에게 행동을 묻는 대신 두 결과 중 어느 쪽이 나은지를 묻는 것.
IRL: 문제는 답이 너무 많다는 것
역강화학습(inverse RL, IRL)의 정의는 짧다. 시연 𝒟 가 어떤 보상 R 아래 최적이었다고 가정하고, 그런 R 을 찾아라. 3장의 벨만 최적성 조건을 그대로 미지수를 바꿔 읽으면 된다.
자유도가 많다는 말은 구체적으로 이렇다. R ≡ 0 을 넣어 보라. 모든 정책이 가치 0 으로 동률이므로 πE 도 최적이다. 부등식은 전부 등호로 만족된다. 아무것도 설명하지 못하는 답이 항상 존재하는 것이다. 이것을 비유일성(non-identifiability)이라 하고, IRL 의 모든 방법론은 결국 "이 많은 답 중 어느 것을 고를 것인가"에 대한 답이다.
비유일성의 세 가지 원천을 정확히 적는다. 셋 모두 아래 3단계에서 숫자로 확인한다.
증명 1 — 상수 덧셈과 양수배
증명 2 — 퍼텐셜 정형화 불변성
이것이 Ng·Harada·Russell 의 1999년 정리다. 진술부터 정확히 적는다.
∞Σt=0 γt F(st, at, st+1) = ∞Σt=0 γt [ γΦ(st+1) − Φ(st) ] = ∞Σt=0 [ γt+1Φ(st+1) − γtΦ(st) ]
= limT→∞ γTΦ(sT) − Φ(s0) = −Φ(s0) (Φ 가 유계이고 γ < 1 이면 첫 극한은 0)
VπR+F(s) = VπR(s) − Φ(s)
6번 줄이 정리의 심장이다. Φ 를 s 만의 함수로 제한했기 때문에 Q 의 같은 행 전체가 통째로 내려간다. 만약 Φ 가 a 에도 의존했다면 행 안에서 서로 다른 양만큼 움직여 순서가 깨진다. 그래서 정형화 항은 반드시 γΦ(s′) − Φ(s) 꼴 이어야 한다.
역도 성립한다
원논문은 더 강한 것을 증명했다. 모든 MDP 에서 최적정책을 보존하는 정형화 항은 퍼텐셜 기반 형태뿐이다. 즉 (27.6) 은 충분조건일 뿐 아니라 사실상 필요조건이다. "정책을 안 바꾸면서 보상을 만지는 방법"은 이 하나가 전부라는 뜻이다.
실무적 함의도 크다. 순방향 RL 에서 학습을 돕겠다고 보상을 손보는 것(reward shaping)은 위험한 일이지만, γΦ(s′)−Φ(s) 꼴로만 쓰면 목표를 훼손하지 않는다는 보장이 있다. 가장 좋은 Φ 는 Φ = V* 인데, 그걸 알면 문제가 이미 풀린 것이다. 그래서 V* 의 조잡한 근사(예: 목표까지의 직선거리)를 Φ 로 쓴다.
최대엔트로피 IRL: 답을 고르는 원리
답이 무한히 많으면 고르는 원리가 필요하다. Ziebart 의 2008년 최대엔트로피 IRL 은 21장에서 본 것과 정확히 같은 답을 낸다: 시연을 설명하는 분포 중 가장 덜 확신하는(엔트로피가 가장 큰) 것을 골라라.
보상을 특징의 선형결합으로 둔다. r(s) = w · φ(s). 그러면 궤적의 수익은 w · Σt γtφ(st) = w · μ(τ) 로 특징기대 하나에 압축된다. 이제 궤적 위의 분포를 이렇게 둔다.
w 는 시연의 로그가능도를 최대화해 정한다. 미분하면 놀랄 만큼 깨끗한 조건이 나온다.
4~5 번 줄이 모방학습 전체의 논리를 바꾼다. 보상을 정확히 알아낼 필요가 없다. 보상이 무엇이든 가치가 특징기대만의 함수라면, 특징기대를 맞추는 것으로 충분하다. 그런데 이 발상을 끝까지 밀면 특징도 필요 없어진다 — 바로 GAIL 이다.
GAIL: 점유분포를 직접 맞춘다
점유분포(occupancy measure) ρπ(s,a) 는 정책이 (s,a) 에 머무는 감가 빈도다. 세 가지 사실이 이 절의 전부다.
셋째가 목표를 정해 준다. 보상을 추정할 이유가 없다. 점유분포를 맞추면 끝이다. 그리고 두 분포를 맞추는 법은 생성모형에서 잘 알려져 있다 — 판별기를 세워 구별하지 못하게 만든다.
GAIL 이 IRL 과 다른 점은 보상을 남기지 않는다는 것이다. 학습이 끝나면 D 는 전문가와 정책을 구별하지 못하므로 D ≈ 0.5, 즉 r̃ ≈ log 2 로 평평해진다. 남는 것은 정책뿐이다. 원논문(Ho·Ermon, 2016)이 보고한 바로는 MuJoCo 연속제어 과제들에서 시연 궤적 몇 개만으로 전문가 수준에 도달했고, 같은 조건의 BC 는 훨씬 뒤처졌다. 대가는 환경 상호작용 — GAIL 은 안쪽에 정책경사 루프가 돌기 때문에 BC 보다 훨씬 많은 샘플을 쓴다.

손으로 풀기: 제곱으로 자라는 손실과, 하나로 정해지지 않는 보상
계산 1 — O(εT2) 를 숫자로
모형을 다시 적는다. 길이 T 의 복도를 걷는다. 매 스텝 확률 ε = 0.01 로 전문가와 다른 행동을 한다. 한 번이라도 다르면 복도 밖으로 떨어져 복구할 수 없고, 그때부터 매 스텝 손실 1 을 받는다(복도 안에서는 손실 0). 유도 4번 줄의 닫힌 꼴을 쓴다.
T = 10 을 손으로 해 보자. (0.99)10 = 0.9043820751… 이므로 J(10) = 10 − (1 − 0.90438208)/0.01 = 10 − 9.5617924 = 0.4382076. 상한 εT(T−1)/2 = 0.01·10·9/2 = 0.45 와 거의 같다 — εT = 0.1 로 작기 때문이다.
| T | (1−ε)T | 정확값 J(T) | 상한 εT(T−1)/2 | DAgger 급 εT | J(T) / εT |
|---|---|---|---|---|---|
| 10 | 0.904382 | 0.438208 | 0.4500 | 0.10 | 4.38배 |
| 50 | 0.605006 | 10.500607 | 12.2500 | 0.50 | 21.00배 |
| 200 | 0.133980 | 113.397967 | 199.0000 | 2.00 | 56.70배 |
| 1000 | 0.000043 | 900.004317 | 4995.0000 | 10.00 | 90.00배 |
표에서 읽어야 할 세 가지
(1) 제곱 성장. T 를 10 → 50 (5배)로 키우면 J 는 0.438 → 10.50 으로 약 24배 늘었다. 선형이면 5배여야 한다. 제곱이면 25배. 실제 24배는 제곱 쪽이다. 50 → 200 (4배)에서는 10.50 → 113.40 으로 10.8배 — 제곱(16배)보다는 작은데, 이 구간부터 (1−ε)T 가 0 에 가까워져 포화가 시작되기 때문이다. 포화 뒤에는 거의 모든 궤적이 이미 이탈해 있어 손실이 T 에 선형으로만 자란다(T=1000 에서 J ≈ T − 1/ε = 900).
(2) 상한의 쓸모. εT ≪ 1 인 T=10 에서는 상한 0.45 가 정확값 0.438 과 3% 차이다. T=200 에서는 199 대 113 으로 크게 벌어진다. 즉 O(εT2) 는 "아직 완전히 망가지기 전" 구간의 성장률을 정확히 잡는다.
(3) DAgger 와의 배수. 마지막 열이 J(T)/(εT), 즉 BC 가 DAgger 급 성능보다 몇 배 나쁜지다. T=10 이면 4.4배지만 T=200 이면 57배다. 근사식으로는 이 비율이 (T−1)/2 로 자란다 — T=10 에서 4.5, T=50 에서 24.5. 표의 4.38 과 21.00 이 그 근처다.
현장 감각으로 옮기면 이렇다. 5초짜리 집기 동작(50 스텝)이면 BC 는 그럭저럭 쓸 만하다. 20초짜리 조립 작업(200 스텝)이면 같은 ε 로도 손실이 100 스텝분을 넘는다 — 사실상 절반 이상을 망친 채로 끝난다는 뜻이다. BC 로 안 되는 과제는 대개 정확도가 부족해서가 아니라 지평이 길어서다.
계산 2 — 3상태 MDP 를 끝까지 푼다
비유일성을 확인하려면 먼저 정답이 있어야 한다. 손으로 풀 수 있는 가장 작은 순환 MDP 를 만든다. 상태 {0, 1, 2}, 행동 {a0, a1}, γ = 0.9, 전이는 결정론이다.
| s | a0 → s′ | R(s,a0) | a1 → s′ | R(s,a1) |
|---|---|---|---|---|
| 0 | 1 | 0.0 | 2 | 0.5 |
| 1 | 0 | 0.2 | 2 | 1.0 |
| 2 | 1 | 0.0 | 0 | 0.3 |
최적정책을 추측해 보자. 상태 1 에서 a1 은 즉시 1.0 을 주니 좋아 보인다. 상태 2 에서 a1 은 0.3 을 주지만 상태 0 으로 가고, a0 는 0 을 주지만 좋은 상태 1 로 간다. 여기가 갈리는 지점이다. π = (a1, a1, a0) 를 가정하고 벨만 방정식 세 개를 세운다.
계산 3 — 퍼텐셜 정형화 불변성 검산
이제 아무렇게나 고른 Φ 를 넣는다. 성질 좋은 함수가 아니라 정말 제멋대로여야 정리의 힘이 보인다. Φ = (3, −2, 5) 로 두자. 부호도 크기도 가치와 아무 관계가 없다. 새 보상은 R′(s,a) = R(s,a) + 0.9·Φ(s′) − Φ(s) 다.
보상이 완전히 달라졌다. 원래는 전부 [0, 1] 안의 작은 양수였는데 이제 −6.8 부터 +7.5 까지 퍼져 있고 음수가 셋이다. 보상만 보면 전혀 다른 과제다. 그런데 다시 풀면 이렇게 나온다.
| s | Q*(s,a0) | Q*(s,a1) | Q′*(s,a0) | Q′*(s,a1) | Q′ − (Q − Φ) | 여유 Q(·,a1)−Q(·,a0) |
|---|---|---|---|---|---|---|
| 0 | 4.736842 | 4.763158 | 1.736842 | 1.763158 | 0.000000 | +0.026316 → +0.026316 |
| 1 | 4.486842 | 5.263158 | 6.486842 | 7.263158 | 0.000000 | +0.776316 → +0.776316 |
| 2 | 4.736842 | 4.586842 | −0.263158 | −0.413158 | 0.000000 | −0.150000 → −0.150000 |
표가 말하는 것
Q 는 정확히 Φ(s) 만큼 이동했다. 상태 0 의 행은 3 만큼 내려갔고(Φ(0)=3), 상태 1 의 행은 2 만큼 올라갔고(Φ(1)=−2), 상태 2 의 행은 5 만큼 내려갔다(Φ(2)=5). 여섯째 열 Q′ − (Q − Φ) 이 전부 0 이다 — 식 (27.6) 이 부동소수 오차 범위에서 정확히 성립한다(수치 검산에서 최대 절대오차 1.3 × 10−15).
행 안의 여유는 하나도 변하지 않았다. 마지막 열의 세 숫자가 그대로다. 이동량 Φ(s) 가 행동에 의존하지 않으므로 뺄셈에서 상쇄된다. 그래서 π′* = (a1, a1, a0) = π*.
가치의 절대 크기는 아무 의미가 없다. V* = (4.763, 5.263, 4.737) 이 V′* = (1.763, 7.263, −0.263) 이 되었다. 상태 2 의 가치가 음수가 되었지만 여전히 최적이다. 가치는 Φ 라는 임의의 기준점 위에서만 뜻을 갖는다.
계산 4 — 같은 최적정책을 주는 보상 세 개
식 (27.5) 의 세 변환을 실제로 적용해 서로 전혀 닮지 않은 보상함수 셋을 만든다. 원본까지 넷이다.
| 보상 | R(0,·) | R(1,·) | R(2,·) | V* | π* |
|---|---|---|---|---|---|
| R0 원본 | 0.0 0.5 | 0.2 1.0 | 0.0 0.3 | (4.7632, 5.2632, 4.7368) | (a1, a1, a0) |
| R1 = R0 + 2 | 2.0 2.5 | 2.2 3.0 | 2.0 2.3 | (24.7632, 25.2632, 24.7368) | (a1, a1, a0) |
| R2 = 4 R0 | 0.0 2.0 | 0.8 4.0 | 0.0 1.2 | (19.0526, 21.0526, 18.9474) | (a1, a1, a0) |
| R3 = R0 + F | −4.8 2.0 | 4.9 7.5 | −6.8 −2.0 | (1.7632, 7.2632, −0.2632) | (a1, a1, a0) |
세 변환의 지문
상수 덧셈은 c/(1−γ) 만큼 평행이동. c = 2, γ = 0.9 이므로 2/0.1 = 20. 검산에서 Q1 − Q0 의 여섯 성분이 전부 정확히 20 이었다. 증명 1 의 1번 줄 그대로다.
양수배는 비례. Q2 / Q0 의 여섯 성분이 전부 정확히 4. 여유도 4배가 되므로 (+0.105, +3.105, −0.600), 부호가 같아 정책이 같다.
정형화는 행마다 다른 이동. 유일하게 상태별로 다른 양만큼 움직이는데도 정책이 보존된다. 앞의 둘은 "자명한" 자유도이고, 이것만이 |𝒮| 차원짜리 진짜 넓은 자유도다.
세 변환을 합치면 자유도는 1(상수) + 1(배율) + |𝒮|(퍼텐셜) 차원이다. 3상태 예에서 미지수는 |𝒮||𝒜| = 6 개인데 자유도가 5 차원이다. 시연에서 보상을 복원한다는 것이 어떤 일인지 보여 주는 숫자다.
덧붙여 R ≡ 0 도 여전히 답이다. 모든 Q 가 0 이라 모든 정책이 동률이고, 따라서 πE 도 최적이다. (27.4) 의 부등식을 등호로 만족시키는 퇴화 해이며, 이것을 배제하는 것이 IRL 알고리즘의 첫 임무다. Ng·Russell 의 원래 처방은 여유의 합을 최대화하는 것 — 전문가 행동과 차선 행동의 Q 격차가 가장 벌어지는 보상을 고른다. 최대엔트로피 IRL 은 다른 처방을 쓴다.
계산 5 — 최대엔트로피 IRL 의 특징 기대 일치
가장 작은 예로 (27.7) 의 조건이 무엇을 뜻하는지 본다. 궤적이 딱 둘뿐인 과제를 상상하자 — 길이 A 와 길이 B. 특징은 2차원 원핫이다.
전문가의 시연 100 개 중 70 개가 A, 30 개가 B 였다. 경험적 특징기대는 μ̂ = 0.7(1,0) + 0.3(0,1) = (0.7, 0.3) 이다. w = (w1, w2) 를 찾아야 한다.
최대엔트로피의 원리적 의미를 이 예로 못 박자. 조건 P(A) = 0.7 을 만족하는 분포는 이 예에서 유일하지만, 궤적이 셋 이상이면 무수히 많다. 그중 엔트로피가 최대인 것을 고르는 것이 (27.7) 의 지수족 형태이고, 이는 "시연이 알려 준 것 이상은 아무것도 가정하지 않는다"는 뜻이다. 20장 최대엔트로피 RL, 21장 소프트 Q러닝과 같은 수학이 여기서는 전문가 모형으로 쓰인다 — 사람은 최적이 아니라 대체로 최적이며, 좋은 선택지를 지수적으로 더 자주 고른다는 모형이다.
계산 6 — GAIL 의 최적 판별기를 손으로
상태·행동이 넷뿐인 세계에서 점유분포를 직접 적는다. 전문가는 앞의 세 칸만 쓰고, 현재 정책은 네 칸에 흩어져 있다.
| 칸 | ρE | ρπ | D* = ρE/(ρE+ρπ) | 보상 r̃ = −log(1−D*) | 정책에 주는 신호 |
|---|---|---|---|---|---|
| 1 | 0.5 | 0.2 | 0.5/0.7 = 0.714286 | 1.252763 | 더 오라 |
| 2 | 0.3 | 0.2 | 0.3/0.5 = 0.600000 | 0.916291 | 조금 더 오라 |
| 3 | 0.2 | 0.2 | 0.2/0.4 = 0.500000 | 0.693147 = log 2 | 이미 맞다 |
| 4 | 0.0 | 0.4 | 0/0.4 = 0.000000 | 0.000000 | 가지 마라 |
3번 칸의 r̃ = log 2 = 0.693147 이 평형값이다. 만약 모든 칸에서 ρπ = ρE 라면 D* ≡ 0.5, 보상은 어디서나 log 2 로 평평해져 정책경사가 0 이 된다. 학습이 끝났다는 신호다. 반대로 4번 칸은 전문가가 한 번도 간 적 없는 곳이라 보상이 0 — 최저값이다. 정책은 여기를 떠나 1·2번 칸으로 질량을 옮긴다.
2번 줄이 GAIL 의 정당성이다. 우리가 실제로 돌리는 것은 판별기와 정책의 줄다리기인데, 그것이 사실은 옌센-섀넌 발산의 최소화라는 깨끗한 목적을 풀고 있다. 그리고 (27.8) 에 의해 점유분포가 같으면 어떤 보상 아래에서도 성능이 같다. 보상을 한 번도 추정하지 않고 보상에 무관한 보장을 얻은 것이다.
코드: 절벽 격자에서 BC 가 무너지고 DAgger 가 고친다
4×8 절벽 격자(6장의 그 절벽걷기를 축소한 것)를 쓴다. 시작은 왼쪽 아래 (3,0), 목표는 오른쪽 아래 (3,7), 그 사이 아래줄 여섯 칸이 절벽이다. 전문가는 가치반복으로 얻은 최적정책이고, 실행할 때 확률 0.1 로 무작위 행동이 끼어든다 — 이것이 이탈의 씨앗이다. 절벽이 있으므로 한 번 벗어나면 회복이 아니라 즉시 실패다. 도해 1 의 모형이 그대로 구현된 셈이다.
import numpy as np
rng = np.random.default_rng(0)
# 4x8 절벽 격자: 시작 (3,0), 목표 (3,7), 아래줄 (3,1..6) 은 절벽(즉시 실패)
H, W, NA = 4, 8, 4 # 0 위 1 아래 2 왼 3 오른
MOVE = [(-1,0),(1,0),(0,-1),(0,1)]
cliff = {(3,c) for c in range(1,7)}
goal, start = (3,7), (3,0)
S = [(r,c) for r in range(H) for c in range(W)]
idx = {s:i for i,s in enumerate(S)}
def step(s, a):
r,c = s; dr,dc = MOVE[a]
s2 = (min(H-1,max(0,r+dr)), min(W-1,max(0,c+dc)))
if s2 in cliff: return s2, -100.0, True
if s2 == goal: return s2, 0.0, True
return s2, -1.0, False
# 전문가 = 가치반복 최적정책 (gamma=0.99). Q[s,a] = r + gamma*V[s'] 를 수렴까지
gamma, V = 0.99, np.zeros(len(S))
for _ in range(3000):
Q = np.array([[step(s,a)[1] + gamma*(0 if step(s,a)[2] else V[idx[step(s,a)[0]]])
for a in range(NA)] for s in S])
V = Q.max(1); V[[idx[s] for s in cliff|{goal}]] = 0.0
expert = Q.argmax(1) # 상태별 전문가 행동
def rollout(policy, slip=0.1, T=40, s0=start, rng=rng):
s = s0
for t in range(T):
a = policy(s)
if rng.random() < slip: a = rng.integers(NA) # 실행 잡음 = 이탈의 씨앗
s, r, done = step(s, a)
if s in cliff: return False, t+1, True # 붕괴
if s == goal: return True, t+1, False
return False, T, False
def demos(n, rng): # 무작위 시작점에서 전문가가 보여 준 (s, a)
D = {}
for _ in range(n):
s = S[rng.integers(len(S))]
while s in cliff or s == goal: s = S[rng.integers(len(S))]
for _ in range(20):
a = expert[idx[s]]; D[s] = a
s, r, done = step(s, a)
if done: break
return D
def bc(D, rng): # 본 상태는 전문가 행동, 못 본 상태는 무작위
guess = {s: int(rng.integers(NA)) for s in S}
return lambda s: D.get(s, guess[s])
BC 를 이렇게 모형화한 이유를 밝혀 둔다. 여기서는 신경망 대신 사전(dict) 을 썼다. 본 상태에서는 전문가 행동을 그대로 내놓고, 못 본 상태에서는 무작위다. 신경망이 일반화를 하긴 하지만, 훈련 분포에서 멀어질수록 그 일반화가 무의미해진다는 사실은 26장에서 본 그대로다. 이 모형은 그 극단을 택해 공변량 이동만 분리해 보여 준다 — 근사 오차나 최적화 오차가 섞이지 않는다.
시연수 덮은상태/25 BC성공률 절벽추락률
1 5.4 0.117 0.581
2 7.3 0.160 0.600
5 11.7 0.318 0.515
10 15.5 0.522 0.388
20 19.5 0.602 0.334
40 23.1 0.735 0.243
출력 읽기
천장이 0.823 이다. 전문가조차 실행 잡음 0.1 때문에 82.3% 만 성공한다. 절벽 옆을 지나가야 하므로 무작위 행동 한 번이면 떨어진다. BC 를 평가할 기준선은 1.0 이 아니라 0.823 이다.
덮은 상태 수가 전부를 설명한다. 절벽과 목표를 뺀 자유 상태는 25 개다. 시연 1 개면 평균 5.4 개(22%)만 덮고 성공률은 0.117. 시연 40 개면 23.1 개(92%)를 덮고 성공률 0.735 로 전문가 천장에 다가간다. BC 의 성능은 "얼마나 잘 맞추는가"가 아니라 "얼마나 넓게 덮는가"의 함수다.
실패의 모양이 중요하다. 마지막 열은 절벽 추락률이다. 시연 1 개일 때 58.1% 가 추락한다 — 시간 초과가 아니라 파국이다. BC 는 "조금 덜 잘하는" 방식으로 실패하지 않는다. 데이터 밖 상태에 들어가는 순간 아무 행동이나 하고, 그중 하나가 절벽이다. 도해 1 의 눈덩이가 여기서는 한 번에 굴러떨어진다.
이제 DAgger 를 붙인다. 시연 2 개(성공률 0.16 수준)에서 출발해, 내 정책으로 굴린 뒤 그 상태들을 전문가에게 다시 묻는다.
r2 = np.random.default_rng(8)
D = demos(2, r2); p = bc(D, r2)
for rd in range(3):
acc = np.mean([rollout(p, rng=r2)[0] for _ in range(400)])
print(f" 라운드 {rd} 데이터 {len(D):3d}개 상태 성공률 {acc:.3f}")
new = set()
for _ in range(20): # 내 정책이 실제로 가는 곳을 수집
s = start
for t in range(40):
new.add(s)
a = p(s)
if r2.random() < 0.1: a = r2.integers(NA)
s, r, done = step(s, a)
if done: break
for s in new: # 전문가에게 라벨만 묻는다
if s not in cliff and s != goal: D[s] = expert[idx[s]]
p = bc(D, r2)
라운드 0 데이터 7개 상태 성공률 0.010
라운드 1 데이터 16개 상태 성공률 0.385
라운드 2 데이터 18개 상태 성공률 0.807
라운드 3 데이터 20개 상태 성공률 0.828
두 라운드가 만든 차이
출발점은 7 개 상태, 성공률 0.010 이다. 시연 두 개가 하필 시작점 근처를 덮지 못해 거의 전멸이다. 라운드 1 에서 16 개, 라운드 2 에서 18 개, 라운드 3 에서 20 개로 늘고 성공률은 0.010 → 0.385 → 0.807 → 0.828 이 된다. 전문가 천장 0.823 을 이미 넘어섰다(표본 변동 범위 안이다).
결정적인 것은 어떤 상태가 추가되었는가다. 무작위로 13 개를 더 준 것이 아니라, 내 정책이 실제로 헤매던 칸을 준 것이다. 앞의 표에서 BC 가 20 개 시연(19.5 개 상태)으로 겨우 0.602 에 도달한 것과 비교하라. DAgger 는 20 개 상태로 0.828 이다. 같은 크기의 데이터라도 어느 분포에서 뽑았는가가 성능을 가른다.
이것이 (27.3) 의 O(εT2) → O(εT) 가 실제로 뜻하는 바다. BC 는 데이터를 늘려 모든 상태를 미리 덮으려 하고, DAgger 는 내가 갈 상태만 덮는다. 후자가 훨씬 적다.
마지막으로 같은 격자에서 퍼텐셜 정형화 불변성을 확인한다. Φ(s) = −(|행−3| + |열−7|), 즉 목표까지의 맨해튼 거리에 음수 부호를 붙인 것이다. 목표에 가까울수록 큰 값이니 그럴듯한 Φ 다. 단말 상태(절벽·목표)의 Φ 는 0 으로 둔다 — 유도 2번 줄의 γTΦ(sT) 항이 사라지려면 필요한 조건이다.
정책 일치 상태수 : 25 / 25
Q' - (Q - Phi) 최대절대오차 : 1.3322676295501878e-15
V(start) = -7.7255 V'(start) = -0.7255 V-Phi = -0.7255
25 개 자유 상태에서 모두 최적행동이 같고, Q′ = Q − Φ 가 10−15 오차 안에서 성립한다. 시작 상태의 가치는 −7.7255 에서 −0.7255 로 정확히 7 만큼 올라갔는데, Φ(3,0) = −(0 + 7) = −7 이므로 V − Φ = −7.7255 + 7 = −0.7255 다. 값은 크게 달라졌지만 정책은 한 칸도 달라지지 않았다.
이 실험의 함의 — 순방향 RL 에도 쓸모가 있다
V′(start) = −0.7255 는 V(start) = −7.7255 보다 0 에 훨씬 가깝다. 정형화된 보상 아래에서는 목표에 다가가는 매 걸음이 즉시 γΦ(s′) − Φ(s) ≈ +1 의 보너스를 받기 때문이다. 원래 보상에서는 목표에 도달할 때까지 −1 만 계속 받았다. 즉 정형화는 보상을 조밀하게(dense) 만들어 학습을 쉽게 하면서도 최적해는 건드리지 않는다.
이것이 스텝 02 의 정리를 실무에서 쓰는 방식이다. "가까워지면 보너스"는 아무렇게나 주면 위험하다 — 목표 주위를 빙빙 도는 정책이 최적이 되어 버릴 수 있다. γΦ(s′) − Φ(s) 꼴로만 주면 그런 일이 원리적으로 일어나지 않는다.
시각화: 이동하는 가치, 줄다리기하는 두 신경망
도해 1 이 이 장의 문제를, 도해 2 가 답의 지도를 그렸다. 남은 세 그림은 앞의 두 단계에서 계산한 것을 눈으로 확인하는 것이다.

도해 3 을 IRL 의 관점에서 다시 읽자. 우리에게 주어진 것은 정책, 즉 "각 상태에서 어느 막대가 더 높은가"뿐이다. 그 정보로는 막대의 절대 높이를 알 수 없다. Φ 를 바꿔 가며 세 쌍을 위아래로 마음대로 밀어도 시연은 똑같이 설명된다. 비유일성은 IRL 알고리즘의 결함이 아니라 문제 자체의 성질이다.

도해 4 에서 위험 요소도 읽어야 한다. 보상이 학습 중에 계속 바뀐다. 지금까지 22장 동안 보상은 환경의 고정된 부품이었는데, 여기서는 상대 선수가 매 라운드 판을 다시 짠다. 정책이 개선되면 판별기가 더 예민해지고, 판별기가 너무 세지면 보상이 거의 전부 0 이 되어 경사가 사라진다. GAN 이 겪는 불안정이 그대로 온다. 그래서 실무에서는 판별기의 갱신을 일부러 약하게(작은 학습률, 적은 스텝) 가져가고 정책 쪽에는 신뢰영역(17장)을 씌운다.

5부로 가는 다리
이 장은 5부의 문지방이다. 지금까지 보상은 환경이 주는 것이었고, 여기서 처음으로 보상을 우리가 마련해야 하는 문제를 만났다. 세 가지 답 모두 한 가지를 전제한다 — 전문가가 시연을 줄 수 있다. 그런데 대형 언어모형에서는 그것조차 어렵다. "가장 좋은 답변"을 사람이 써 줄 수는 있지만(그것이 지도 미세조정, SFT 다), 그것은 BC 이고 따라서 이 장의 모든 한계를 물려받는다. 사람은 자기가 쓸 수 있는 것보다 알아볼 수 있는 것이 훨씬 많다. 그러면 물음을 바꾸면 된다 — "무엇을 하겠는가" 대신 "이 둘 중 어느 쪽이 더 낫습니까".
비교 판단에서 보상함수를 세우는 것 — 그것이 28장 RLHF 의 첫 단계다. 그리고 그때 이 장의 두 결과가 곧바로 되살아난다. 첫째, 선호에서 얻은 보상도 상수 덧셈과 양수배가 결정되지 않는다(브래들리-테리 모형은 차이만 정한다). 둘째, 그 보상으로 정책을 최적화할 때 정책이 학습 분포 밖으로 나가면 보상모형이 헛소리를 하기 시작한다 — 26장의 외삽 오차와 이 장의 공변량 이동이 같은 자리에서 만난다. 29장의 KL 벌점이 그 처방이다.
이것만 기억하자
- BC 의 손실은 지평의 제곱으로 자란다. 스텝당 오류율 ε 가 누적 후회 O(εT2) 가 된다. ε=0.01 복도에서 T=200 이면 정확값 113.4 로, DAgger 급 εT = 2 의 56.7배다. 원인은 하나 — 학습 분포와 시험 분포가 다르고, 시험 분포를 내가 만든다.
- 시연은 보상함수를 결정하지 못한다. R + c, kR (k>0), 그리고 임의의 Φ 에 대한 γΦ(s′) − Φ(s) 가 모두 같은 최적정책을 준다. Q 는 Φ(s) 만큼 행 단위로 평행이동할 뿐이라 행 안의 순서가 보존되기 때문이다. R ≡ 0 도 항상 답이다.
- 점유분포를 맞추면 보상을 몰라도 된다. J(π) 가 ρπ 의 선형함수이므로 ρπ = ρE 이면 어떤 보상에서도 성능이 같다. GAIL 은 이것을 판별기로 푼다 — 최적 판별기는 ρE/(ρE+ρπ) 이고 목적식은 2·JS − log4 다.
흔한 오해
- "BC 는 데이터를 더 모으면 해결된다" — 부분적으로만 맞다. 실험에서 시연을 40배로 늘려도 성공률은 0.117 에서 0.735 로만 올랐고 전문가 천장 0.823 에 못 미쳤다. 더 근본적인 문제는 어느 데이터를 모으는가다. DAgger 는 상태 20 개로 0.828 에 도달했다 — BC 가 19.5 개로 얻은 0.602 와 같은 크기, 다른 분포다.
- "IRL 이 참 보상을 복원한다" — 복원할 수 없다. 자유도가 1 + 1 + |𝒮| 차원 남으며 이는 알고리즘의 한계가 아니라 정보의 한계다. IRL 이 실제로 하는 일은 "시연과 양립하는 보상들 중 어떤 기준(최대 여유, 최대 엔트로피)으로 하나를 고르는 것"이다.
- "보상 정형화는 편법이다" — γΦ(s′) − Φ(s) 꼴이라면 편법이 아니라 정리로 보장된 변환이다. 격자 실험에서 25/25 상태의 정책이 그대로였고 V(start) 만 −7.7255 → −0.7255 로 올라갔다. 위험한 것은 이 꼴을 벗어난 정형화다 — 그때는 목표 주위를 도는 정책이 최적이 될 수 있다.
- "GAIL 이 배운 판별기가 보상함수다" — 아니다. 판별기는 현재 정책과 전문가의 차이에 대한 함수라 정책이 바뀌면 의미가 바뀌고, 학습이 끝나면 D ≈ 0.5 로 평평해져 정보가 남지 않는다. 보상을 남기고 싶다면 AIRL 처럼 판별기를 f(s,a) = g(s) + γh(s′) − h(s) 로 퍼텐셜 형태를 명시적으로 분리해 설계해야 한다 — (27.6) 이 여기서 설계 원리로 다시 쓰인다.
'강화학습' 카테고리의 다른 글
| [강화학습 29] RLHF ② DPO·GRPO, 그리고 보상 해킹 (0) | 2026.09.15 |
|---|---|
| [강화학습 28] RLHF ① 선호에서 보상모델로 (1) | 2026.09.15 |
| [강화학습 26] 오프라인 RL — 환경 없이 로그만 있을 때 (0) | 2026.09.15 |
| [강화학습 25] MCTS와 AlphaZero — 탐색이 정책을 가르친다 (0) | 2026.09.15 |
| [강화학습 24] 세계모델 — 잠재공간에서 꿈꾸기 (0) | 2026.09.15 |
댓글