AEGLOSLAB ChatGPT 같은 AI를 만들고 서비스하기

제3부 사후학습·정렬(Post-training/Alignment)

3.4 PPO — 강화학습으로 정렬

앞 장에서 만든 보상 모델 $r_\phi(x,y)$ 는 채점기다. 응답을 넣으면 사람이 얼마나 좋아할지를 스칼라 하나로 출력한다. 그런데 채점기는 더 나은 답을 생성하지 못한다. 시험지에 점수를 적어 줄 뿐, 학생을 대신해 답을 쓰지는 않는다. 남은 질문은 그래서 하나로 좁혀진다 — 채점기가 손에 있을 때, 언어모델을 "그 채점기가 높게 주는 응답을 더 자주 내도록" 어떻게 몰아가는가. 이것이 RLHF(Reinforcement Learning from Human Feedback)에서 강화학습(Reinforcement Learning, RL)이 맡는 절반이고, 그 표준 도구가 PPO(Proximal Policy Optimization, 근접 정책 최적화)다.

PPO는 검증된 공학이다 — InstructGPT를 비롯한 초기 정렬 모델이 이 방식으로 대규모에서 실제로 작동했다. 동시에 정렬 기법 중 손꼽히게 불안정하고 튜닝이 까다로운 축이라는 평판도 정확하다. 이 두 사실이 이 장의 긴장이다. PPO를 왜 이렇게 복잡하게 지었는지 부품 하나하나까지 따라가되, 그 복잡성이 어떤 대가를 치르는지, 그래서 왜 다음 세대 기법(3.5의 DPO, 3.7의 GRPO)이 이 무게를 덜어내는 방향으로 갈라져 나왔는지를 같이 본다. 이 장은 3.3(보상 모델·페어와이즈)을 전제하며, 여기서 "참조 정책"이라 부르는 것은 3.2에서 만든 SFT 모델이다. 나오는 하이퍼파라미터 값($\epsilon$, $\beta$, GAE의 $\lambda$)은 자주 인용되는 대표값일 뿐 구현·시점마다 다르니, 무게는 특정 숫자가 아니라 각 부품이 왜 거기 있는가에 둔다.

3.4.1 지도학습으로는 닿지 않는 곳

강화학습을 꺼내기 전에 왜 SFT(3.2)만으로는 부족한지부터 못박아야 한다. 이 "왜"를 건너뛰면 PPO의 복잡성이 순전한 사치로 보인다.

SFT는 정답 시연(demonstration)을 흉내 낸다 — "이 프롬프트에는 이 응답을 내라"를 토큰 단위 교차엔트로피로 배운다. 여기엔 지도학습이라는 형식에서 오는 세 가지 구조적 한계가 겹쳐 있다.

첫째, 좋은 답은 유일하지 않다. 한 질문에 훌륭한 응답은 수없이 많고 나쁜 응답도 수없이 많은데, SFT는 레이블러가 써 준 단 하나의 시연만 정답으로 높인다. "이것도 좋지만 저것이 더 낫다"는 상대적 선호를 표현할 언어가 SFT 손실에는 없다. 반면 사람은 두 응답 중 나은 쪽을 고르는 일을 처음부터 새 응답을 쓰는 일보다 훨씬 쉽고 일관되게 해낸다 — 그 비교 신호를 스칼라로 압축한 것이 바로 보상 모델이었다(3.3). RL은 이 비교 신호를 직접 학습에 쓴다.

둘째, SFT는 모델 자신의 출력을 보지 않는다. 고정된 데이터셋을 흉내 낼 뿐, 지금 이 모델이 실제로 무엇을 생성하는지에 대해서는 아무 피드백도 받지 못한다. 그런데 우리가 정말 개선하려는 것은 데이터셋이 아니라 "이 모델이 지금 뽑아내는 응답"의 품질이다. RL은 모델이 스스로 생성한 응답(롤아웃)을 채점해 그 신호로 갱신한다 — 온-폴리시(on-policy) 학습이다. 이 차이는 미묘해 보이지만 결정적이다. SFT는 모델이 만드는 실수의 분포를 모르는 채로 이상적 데이터만 보여 주는 반면, RL은 모델이 실제로 빠지는 함정 위에서 직접 교정한다.

셋째, 시퀀스 전체의 품질은 미분 불가능하다. "이 응답이 도움이 되는가, 안전한가, 사실인가"는 완성된 응답 전체에 대한 판단이지 토큰 하나하나에 정답이 부여되는 것이 아니다. 이런 시퀀스 수준의, 미분 불가능한 스칼라 품질 신호를 어떻게 그래디언트로 바꾸나? 바로 이 지점이 강화학습의 고향이다. RL은 환경이 주는 스칼라 보상을 정책 파라미터의 그래디언트로 바꾸는 기계이고, 그 기계의 입력 단자에 보상 모델을 연결하는 것이 RLHF다.

사람이 비교로 선호 라벨링 (쉽고 일관됨) 보상 모델 r_φ 선호를 스칼라로 (3.3) RL로 정책 최적화 r_φ를 높이는 응답을 더 자주 생성 (이 장) 모델이 스스로 낸 응답을 채점→갱신 (온-폴리시)

한 가지는 분명히 해 두자. RL은 SFT를 대체하지 않는다. 실무의 정렬 파이프라인은 거의 항상 SFT 다음에 RLHF다(3.1). SFT가 모델을 "지시를 따르는, 대략 맞는" 지점까지 데려다 놓으면 RLHF가 그 위에서 선호에 맞게 미세하게 높인다. RL을 SFT 없이 처음부터 실행하는 것은 사실상 작동하지 않는다 — 뒤에서 보겠지만 언어 생성의 행동 공간이 너무 커서, 무작위에 가까운 정책으로 시작하면 의미 있는 보상을 받는 응답을 우연히 만날 확률이 0에 수렴하기 때문이다. 좋은 시작점(참조 정책)이 반드시 필요하다.

3.4.2 언어 생성을 마르코프 결정 과정으로 쓰기

강화학습의 언어로 문제를 다시 쓰자. 표준 RL은 에이전트가 환경과 상호작용하며 보상을 최대화하는 문제이고, 그 골격이 마르코프 결정 과정(Markov Decision Process, MDP)이다. 프롬프트 $x$ 가 주어지고 모델이 응답 $y=(a_1,a_2,\dots,a_T)$ 를 한 토큰씩 생성하는 상황을 MDP의 다섯 부품에 대응시키면 이렇게 된다.

RL 부품언어 생성에서의 대응설명
정책 $\pi_\theta$언어모델 자체상태를 받아 다음 행동의 확률분포를 낸다. 파라미터 $\theta$ 가 학습 대상.
상태 $s_t$프롬프트 + 지금까지 생성한 토큰 $(x, a_1,\dots,a_{t-1})$다음 토큰을 정하는 데 필요한 모든 문맥.
행동 $a_t$다음 토큰어휘 $\mathcal{V}$ 전체(수만 개)에서 하나를 고른다.
전이 $s_{t+1}$토큰을 이어 붙이기 $s_{t+1} = s_t \oplus a_t$결정적(deterministic)이고 자명하다 — 고른 토큰을 뒤에 붙일 뿐.
보상 $R$완성 응답의 RM 점수 $r_\phi(x,y)$ + 토큰별 KL 페널티RM 점수는 마지막 토큰에서만(희소), KL은 매 토큰.

정책은 상태에서 다음 토큰의 분포 $\pi_\theta(a_t \mid s_t)$ 를 내는데, 이것은 1.1에서 본 다음 토큰 확률 바로 그것이고 소프트맥스 헤드가 낸다. 토큰을 하나 골라(1.7의 샘플링) 상태를 갱신하고, 종료 토큰(EOS)에 닿으면 에피소드가 끝난다. 즉 정책 = 언어모델, 상태 = 현재까지의 토큰열, 행동 = 다음 토큰, 보상 = 완성 응답의 보상모델 점수다.

π_θ로 토큰 a₁ 생성 a₂ 생성 ⋯ a_T = EOS 보상 모델 채점 s₁ = 프롬프트 x s₂ = x, a₁ s₃ = x, a₁, a₂ s_T = x, a₁…a_{T-1} 완성 응답 y r_φ(x, y) : 스칼라

여기서 개념적 갈림길을 하나 살펴봐야 한다. 위 대응은 응답을 토큰 단위 MDP로 본다 — 매 토큰이 하나의 행동이고, 상태가 토큰마다 바뀐다. 그런데 보상이 끝에서 정확히 한 번만 나오므로, "응답 전체가 곧 하나의 행동이고 보상은 그 행동에 대한 즉각적 대가"라고 보는 문맥적 밴딧(contextual bandit) 관점도 가능하다. 두 관점은 수학적으로 이어져 있지만 강조점이 다르다. 토큰 MDP 관점은 "중간 토큰들에 어떻게 신용을 나눠 줄 것인가"라는 신용 할당(credit assignment) 문제를 전면에 세우고, 그래서 가치 함수·어드밴티지가 등장한다(3.4.5·3.4.6). 밴딧 관점은 그 문제를 아예 우회한다 — 뒤에서 볼 GRPO(3.7)가 정확히 이 밴딧적 시각에서 가치 함수를 걷어낸다. PPO는 토큰 MDP 관점 위에 서 있다.

3.4.3 왜 이것이 특이한 강화학습 문제인가

언어 생성을 MDP로 쓸 수는 있지만, 그것은 교과서 RL과 여러 면에서 다른 특이한 문제다. 이 차이를 이해해야 PPO가 왜 이렇게 설계됐는지가 보인다.

행동 공간이 이산적이면서 거대하다. 매 스텝의 행동은 어휘 전체에서 토큰 하나 — 후보가 수만 개다. 로봇 제어(연속 행동 몇 개)나 아타리 게임(행동 수십 개)과는 규모가 다르다. 그래서 정책은 값 기반(value-based, 예: Q-러닝)으로 각 행동의 값을 매기는 대신, 소프트맥스 분포로 직접 표현되고(1.1) 정책 경사 계열이 자연스럽다. 어휘 5만 개 규모의 Q-함수를 매 스텝 argmax 하는 것은 상상하기 어렵지만, 소프트맥스 분포에서 샘플링하는 것은 언어모델이 원래 하던 일이다.

보상이 희소하고 지연된다. 보상은 주로 응답이 끝난 뒤 정확히 한 번 나온다. "이 응답 전체가 얼마나 좋은가"는 알아도 "3번째 토큰이 좋았는지 나빴는지"는 직접 알 수 없다. 이것이 신용 할당 문제다 — 시퀀스 끝의 스칼라 하나를, 그 결과를 만든 수백 개 토큰에 어떻게 배분하나. 이 희소성을 다루려고 가치 함수와 어드밴티지(3.4.5)가 들어온다.

전이가 결정적이고 자명하다. 환경 동역학이 "토큰 이어 붙이기"라 완전히 알고 있고 불확실성이 없다. 불확실한 것은 오직 정책 자신의 확률적 선택뿐이다. 그래서 이 문제는 "환경을 어떻게 모델링하나"가 아니라 "정책 자체를 어떻게 안정적으로 갱신하나"에 초점이 쏠린다 — 바로 PPO의 관심사와 정확히 겹친다. 보통의 RL이 씨름하는 환경 확률성·부분 관측성 같은 골칫거리가 여기엔 아예 없는 대신, 정책이 자기 출력 분포를 스스로 망가뜨리는 위험이 전면에 온다.

출발점이 주어져 있다. 보통의 RL은 무에서 정책을 배운다. RLHF는 이미 쓸 만한 SFT 정책에서 출발하며, 거기서 너무 멀어지면 안 된다는 제약이 따른다(3.4.9). "출발점 근처에 머물러라"는 이 조건이 이 문제만의 독특한 색이고, PPO의 클리핑과 KL 페널티가 둘 다 이 색을 칠하는 장치다.

"언어 생성은 RL이다"라는 정식화는 강력하지만 유일한 관점은 아니다. 뒤에서 볼 DPO(3.5)는 같은 목표 — 선호 최적화 — 를 RL 없이 지도학습 손실 하나로 푼다. RL 정식화가 필수가 아니라 하나의 접근임을 보여 주는 반례다. 이 장은 RL로 푸는 길을 근본까지 분석하되, 그것이 유일한 길은 아니라는 것을 처음부터 열어 둔다.

3.4.4 정책 경사와 REINFORCE — 로그 미분 트릭

PPO에 닿으려면 그 조상인 정책 경사(policy gradient)를 먼저 살펴봐야 한다. 우리가 최대화하려는 것은 정책이 만드는 응답의 기대 보상이다.

$$J(\theta) = \mathbb{E}_{y \sim \pi_\theta(\cdot \mid x)}\big[\, R(x, y) \,\big]$$

문제는 기댓값이 $\theta$ 에 의존하는 분포 $\pi_\theta$ 에 대한 것이라는 데 있다. 보상 $R$ 자체는 $\theta$ 로 미분할 수 없다 — 보상 모델은 블랙박스 채점기이고, 애초에 "어떤 응답이 나왔는가"는 이산적 샘플링의 결과라 그래디언트가 흐르지 않는다. 그런데도 $J(\theta)$ 를 $\theta$ 로 미분해야 한다. 미분이 흘러야 할 통로는 보상이 아니라 분포다. 이것을 가능하게 하는 것이 로그 미분 트릭(log-derivative trick)이다. 임의의 확률분포에 대해 $\nabla_\theta \pi_\theta = \pi_\theta \nabla_\theta \log \pi_\theta$ 라는 항등식이 성립한다(단순히 $\nabla \log f = \nabla f / f$ 를 뒤집은 것이다). 이것을 기댓값의 정의에 넣고 전개하면:

$$\nabla_\theta J(\theta) = \nabla_\theta \sum_y \pi_\theta(y\mid x)\, R(x,y) = \sum_y \big(\nabla_\theta \pi_\theta(y\mid x)\big) R(x,y) = \sum_y \pi_\theta(y\mid x)\, \big(\nabla_\theta \log \pi_\theta(y\mid x)\big) R(x,y)$$

마지막 형태는 다시 기댓값이므로:

$$\nabla_\theta J(\theta) = \mathbb{E}_{y \sim \pi_\theta}\Big[\, R(x,y)\, \nabla_\theta \log \pi_\theta(y \mid x) \,\Big]$$

이 변형이 핵심이다. 미분 불가능한 $R$ 은 이제 단순히 곱해지는 스칼라 가중치로 남고, 미분은 전부 $\log \pi_\theta$ 가 담당한다 — 그리고 $\log \pi_\theta$ 는 우리가 얼마든지 역전파할 수 있는 신경망 출력이다. 자기회귀 모델에서 $\log \pi_\theta(y\mid x) = \sum_{t=1}^{T} \log \pi_\theta(a_t \mid s_t)$ 이므로 토큰 단위로 풀면:

$$\nabla_\theta J(\theta) = \mathbb{E}\!\left[\, \Big(\sum_{t=1}^{T} \nabla_\theta \log \pi_\theta(a_t \mid s_t)\Big)\, R(x,y) \,\right]$$

이것이 REINFORCE 추정량이다. 직관은 단순하고 아름답다. 보상이 높았던 응답의 토큰들은 확률을 높이고(양의 $R$ 이 $\nabla\log\pi$ 를 그 방향으로 밀고), 보상이 낮았던 응답의 토큰들은 확률을 내린다. 잘한 행동은 더 자주, 못한 행동은 덜 자주 — 그것이 전부다. 기댓값은 롤아웃한 응답들의 표본 평균으로 근사한다(몬테카를로). 즉 여러 응답을 뽑아 채점하고, 각 응답의 로그확률 그래디언트에 그 응답의 보상을 곱해 평균 내면 정책 경사의 추정치가 나온다.

3.4.5 baseline — 분산은 왜 줄고 편향은 왜 안 생기나

REINFORCE는 옳지만 실전에서 그대로 쓰면 분산이 너무 커서 학습이 크게 변동한다. 문제의 근원은 위 식이 보상의 절대값에 비례해 갱신한다는 데 있다. 모든 응답의 보상이 예컨대 $+10 \sim +12$ 사이라면, 상대적으로 나쁜 $+10$ 짜리 응답조차 큰 양수로 확률이 올라간다 — 방향은 미묘하게만 다른데 크기는 다 커서 표본마다 추정량이 크게 변동한다.

해결은 상태에만 의존하고 행동에는 의존하지 않는 아무 함수 baseline $b(s_t)$ 를 빼는 것이다.

$$\nabla_\theta J(\theta) = \mathbb{E}\!\left[\, \sum_{t} \nabla_\theta \log \pi_\theta(a_t \mid s_t)\, \big(R - b(s_t)\big) \,\right]$$

이렇게 빼도 그래디언트의 기댓값은 조금도 변하지 않는다. baseline이 곱해진 항의 기댓값이 정확히 0이기 때문이다. $b(s_t)$ 는 행동 $a_t$ 와 무관하므로 기댓값 밖으로 빠지고:

$$\mathbb{E}_{a_t \sim \pi_\theta}\big[\, \nabla_\theta \log \pi_\theta(a_t \mid s_t)\, b(s_t)\,\big] = b(s_t) \sum_{a_t} \pi_\theta(a_t\mid s_t)\, \nabla_\theta \log \pi_\theta(a_t\mid s_t) = b(s_t)\, \nabla_\theta \underbrace{\sum_{a_t}\pi_\theta(a_t\mid s_t)}_{=\,1} = 0$$

가운데 등식에서 다시 $\pi\nabla\log\pi = \nabla\pi$ 를 거꾸로 쓴 뒤, 확률의 합이 항상 1이라 그 그래디언트가 0임을 썼다. 편향은 0인데 분산은 줄어든다 — 이것이 baseline이 주는 무비용 이득이다. 좋은 baseline은 "그 상태에서 기대되는 보상"이다. 실제 보상이 기대보다 높았으면 높이고 낮았으면 내리니, 절대값이 아니라 기대 대비 초과분으로 갱신하게 되어 위의 "$+10\sim+12$" 문제가 사라진다($+11$ 근처를 빼면 $-1\sim+1$ 로 중심화된다).

숫자로 보면 이 효과가 얼마나 극적인지 드러난다. 한 상태에서 두 행동 $a,b$ 만 있고 현재 정책이 $\pi(a)=\pi(b)=0.5$ 라 하자. 스칼라 파라미터 $\theta$ 에 대한 점수함수(score) $u=\nabla_\theta\log\pi$ 는 두 행동에서 $\pi(a)u_a+\pi(b)u_b=0$ 을 만족해야 하므로(방금 증명한 그 항등식), $u_b=-u_a$ 다. $u_a=+1$, $u_b=-1$ 이라 두자. $a$ 가 더 나은 행동이어서 보상이 $R(a)=10.5$, $R(b)=9.5$ 다.

baseline 없이 REINFORCE 한 표본이 주는 그래디언트 추정치 $g=R\cdot u$ 는 확률 $0.5$ 로 $10.5\times(+1)=+10.5$, 확률 $0.5$ 로 $9.5\times(-1)=-9.5$ 다. 그 기댓값(참 그래디언트)은 $0.5(+10.5)+0.5(-9.5)=+0.5$ — $a$ 의 확률을 높이는 옳은 방향이다. 그런데 분산은

$$\mathrm{Var}(g) = \mathbb{E}[g^2]-(\mathbb{E}[g])^2 = 0.5\times 10.5^2 + 0.5\times 9.5^2 - 0.5^2 = 55.125+45.125-0.25 = 100.0$$

표준편차가 $10$ 이다. 참값 $+0.5$ 를 표준편차 $10$ 의 잡음이 완전히 덮어 버린다 — 한 표본만 보면 방향조차 알 수 없다.

이제 baseline $b=\mathbb{E}[R]=10$ 을 빼자. 어드밴티지는 $A(a)=+0.5$, $A(b)=-0.5$ 다. 추정치 $g'=A\cdot u$ 는 확률 $0.5$ 로 $0.5\times(+1)=+0.5$, 확률 $0.5$ 로 $-0.5\times(-1)=+0.5$ — 어느 쪽이 뽑히든 정확히 $+0.5$ 다. 기댓값은 여전히 $+0.5$(불편)인데 분산은 $100$ 에서 0으로 떨어졌다. 잡음이 사라지고 참 그래디언트만 남았다. 실제 문제에서 분산이 정확히 0까지 가지는 않지만, "기대 대비로 중심화하면 갱신 신호가 극적으로 깨끗해진다"는 이 메커니즘이 baseline의 전부다.

이 "기대되는 보상"이 다음 절의 가치 함수이고, "실제 $-$ 기대"가 어드밴티지다. baseline은 임의 함수여도 불편이지만, 분산을 가장 잘 줄이는 baseline이 가치 함수라서 그것을 따로 학습해 쓴다.

3.4.6 가치 함수와 어드밴티지

상태 가치 함수(state-value function)는 "상태 $s_t$ 에서 현재 정책으로 끝까지 갔을 때 기대되는 남은 보상"이다.

$$V^\pi(s_t) = \mathbb{E}_{\pi}\!\left[\, \sum_{k\ge 0} \gamma^k\, r_{t+k} \;\middle|\; s_t \,\right]$$

$\gamma \in (0,1]$ 는 할인율(discount factor)이다. 언어 RLHF에서는 에피소드가 짧고 유한하며 보상이 끝에 몰려 있어 $\gamma$ 를 1이나 거의 1로 두는 경우가 흔하다(구현마다 다르다). $V^\pi$ 는 알 수 없으니 근사한다. 실무에서는 정책 모델과 거의 같은 트랜스포머 백본에 스칼라를 출력하는 "가치 헤드(value head)"를 추가해 $V_\psi(s_t)$ 로 학습한다(파라미터 $\psi$). 각 위치마다 "여기서부터 기대되는 보상"을 회귀로 예측하는 문제이고, 손실은 예측과 실제 리턴의 제곱오차다.

$$L^{\text{VF}}(\psi) = \mathbb{E}\big[\, (V_\psi(s_t) - \hat{R}_t)^2 \,\big]$$

RL 용어로 정책은 행위자(actor), 가치는 비평가(critic)이고, PPO는 actor-critic 계열이다. 가치 헤드는 정책과 백본을 공유하기도 하고(메모리 절약) 완전히 별도 네트워크로 두기도 한다(안정성). 이 선택이 뒤(3.4.11)에서 "메모리에 뜨는 모델 수"를 좌우한다.

어드밴티지(advantage)는 baseline을 가치 함수로 둔, 행동의 상대적 이득이다.

$$A^\pi(s_t, a_t) = Q^\pi(s_t, a_t) - V^\pi(s_t)$$

$Q^\pi(s_t,a_t)$ 는 "상태 $s_t$ 에서 행동 $a_t$ 를 하고 이후 정책대로 갔을 때의 기대 보상", $V^\pi(s_t)$ 는 "그 상태에서 행동을 정책 분포로 평균했을 때의 기대"다. 차이 $A_t$ 는 "이 특정 토큰을 고른 것이 그 상태의 평균적 선택보다 얼마나 좋았나"를 말한다. $A_t>0$ 이면 그 토큰의 확률을 높이고 $A_t<0$ 이면 내린다. 정책 경사는 이제 이렇게 쓴다.

$$\nabla_\theta J \approx \mathbb{E}\!\left[\, \sum_t \nabla_\theta \log \pi_\theta(a_t\mid s_t)\, \hat{A}_t \,\right]$$

3.4.7 GAE — 편향과 분산 사이를 람다로 조절하기

어드밴티지 $\hat{A}_t$ 를 실제로 어떻게 추정하나. 두 극단이 있다. 하나는 몬테카를로 — 그 시점부터 에피소드가 끝날 때까지의 실제 리턴을 그대로 쓴다. 편향은 없지만 분산이 크다(에피소드 전체의 무작위성을 모두 반영한다). 다른 하나는 1-스텝 TD(temporal difference) — 한 스텝 뒤 가치 추정으로 나머지를 대신한다. 분산은 작지만 가치 함수가 부정확하면 편향된다.

GAE(Generalized Advantage Estimation)는 이 둘 사이를 파라미터 $\lambda\in[0,1]$ 로 매끄럽게 보간한다. 먼저 TD 잔차(residual)를 정의한다.

$$\delta_t = r_t + \gamma\, V_\psi(s_{t+1}) - V_\psi(s_t)$$

이것은 "한 스텝 뒤에 본 가치 추정 $r_t+\gamma V(s_{t+1})$ 이 현재 추정 $V(s_t)$ 보다 얼마나 좋았나"다 — 예상 밖의 좋은 소식이면 양수, 나쁜 소식이면 음수. GAE 어드밴티지는 이 잔차들의 지수가중 합이다.

$$\hat{A}_t^{\text{GAE}(\gamma,\lambda)} = \sum_{l=0}^{\infty} (\gamma\lambda)^l\, \delta_{t+l}$$

이 무한합은 실제로는 재귀식 하나로 뒤에서 앞으로 전파된다.

$$\hat{A}_t = \delta_t + \gamma\lambda\, \hat{A}_{t+1}$$

에피소드 끝에서 $\hat{A}_{T}=\delta_T$ 로 시작해 거꾸로 채워 나가면 한 번의 역방향 스캔으로 모든 어드밴티지가 나온다 — 구현이 값싼 이유다. $\lambda$ 가 하는 일은 이 재귀식에서 곧장 읽힌다. $\lambda=0$ 이면 $\hat{A}_t=\delta_t$ 로 1-스텝 TD가 되어 저분산·고편향이고, $\lambda=1$ 이면 $\hat{A}_t = \sum_{l\ge0}\gamma^l\delta_{t+l}$ 인데 이 합에서 가치항들이 이웃끼리 상쇄(telescoping)되어 몬테카를로 어드밴티지(고분산·무편향)로 수렴한다. 그 사이 값(흔히 $\lambda\approx0.95$ 대의 대표값)이 편향과 분산의 실용적 타협을 준다.

가치 함수는 분산을 줄이는 baseline을 주고, GAE는 그 baseline을 쓰는 어드밴티지 추정의 편향-분산을 $\lambda$ 로 조절한다. 이 모든 장치가 필요했던 이유는 다시 3.4.3의 희소 보상 때문이다 — 보상이 끝에 정확히 한 번 나오므로 중간 토큰들에게 신용을 어떻게 나눠 줄지를 가치 함수와 GAE가 메운다. 다만 이것은 분산을 줄이려는 근사 장치이지 정답이 아니다. 가치 함수가 부정확하면(RLHF 초기엔 흔하다) 어드밴티지 추정이 편향되어 정책이 잘못된 방향으로 간다. "critic이 틀리면 actor도 틀린다"는 이 취약성이 PPO 불안정성의 한 축이고, 뒤에서 GRPO(3.7)가 가치 함수를 아예 없애려는 동기가 여기서 나온다.

3.4.8 PPO — 확률비와 클리핑된 대리목적

이제 핵심이다. 정책 경사의 원식은 한 번 갱신할 때마다 새 데이터를 뽑아야 한다(on-policy). 갱신 한 걸음마다 정책이 바뀌므로, 이전 정책으로 뽑은 데이터는 더 이상 현재 정책을 대표하지 못하기 때문이다. 그런데 언어모델에서 롤아웃(생성)은 계산의 큰 몫을 차지할 만큼 비용이 크다 — 한 번 생성한 데이터로 여러 번 갱신하고 싶다. 그러나 여러 번 갱신하면 정책이 데이터를 뽑을 때의 정책 $\pi_{\theta_{old}}$ 에서 멀어져 그 데이터가 더는 유효하지 않게 된다. 데이터 재사용의 이득과 정책이 너무 빨리·멀리 벗어나는 위험 사이의 긴장, 이것이 PPO가 푸는 문제다.

핵심 도구는 확률비(probability ratio)다.

$$r_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta_{old}}(a_t \mid s_t)}$$

$\pi_{\theta_{old}}$ 는 롤아웃을 뽑을 때 쓴 정책(고정), $\pi_\theta$ 는 지금 갱신 중인 정책이다. $r_t=1$ 이면 두 정책이 이 토큰에서 같고, $r_t>1$ 이면 새 정책이 그 토큰을 더 좋아하게 됐다는 뜻이다. 이 비가 왜 나오는지는 중요도 표본추출(importance sampling)에서 온다. 옛 정책으로 뽑은 표본으로 새 정책의 기대 어드밴티지를 추정하려면 비율로 보정해야 하고, 그 결과가 대리목적(surrogate)이다.

$$L^{\text{CPI}}(\theta) = \mathbb{E}_t\big[\, r_t(\theta)\, \hat{A}_t \,\big]$$

문제는 이 대리목적을 제약 없이 최대화하면 정책이 폭주한다는 것이다. 어드밴티지가 양수인 토큰의 $r_t$ 를 무한정 키우는 방향으로 급등하는데, 대리목적상으로는 계속 좋아 보여도 그 지점은 이미 $\pi_{\theta_{old}}$ 에서 너무 멀어 중요도 보정이 신뢰할 수 없고, 실제 성능은 붕괴한다. 신뢰영역(trust region)을 벗어난 갱신인 것이다.

전신인 TRPO(Trust Region Policy Optimization)는 이 문제를 "$\pi_\theta$ 와 $\pi_{\theta_{old}}$ 사이 KL이 일정 이하"라는 명시적 제약으로 풀었지만, 2차 최적화가 필요해 부하가 크고 언어모델 규모에서 다루기 어렵다. PPO의 통찰은 이 제약을 별도 조건으로 걸지 않고 목적함수 자체에 클리핑으로 심어 버리는 것이다.

$$L^{\text{CLIP}}(\theta) = \mathbb{E}_t\Big[\, \min\big(\, r_t(\theta)\,\hat{A}_t,\ \ \text{clip}(r_t(\theta),\, 1-\epsilon,\, 1+\epsilon)\,\hat{A}_t \,\big) \Big]$$

$\text{clip}(\cdot,1-\epsilon,1+\epsilon)$ 는 확률비를 $[1-\epsilon,1+\epsilon]$ 구간에 가두고($\epsilon$ 은 흔히 0.1~0.2), 그렇게 클리핑된 항과 클리핑 안 된 원래 항 중 작은 쪽을 취한다. 이 $\min$ 이 핵심 기법이다. 어드밴티지 부호에 따라 두 경우로 나눠 읽어야 그 작동이 보인다.

어드밴티지가 양수일 때(좋은 토큰, 확률을 높이고 싶다), $r_t$ 를 키우면 목적이 커진다. 그러나 $r_t$ 가 $1+\epsilon$ 을 넘으면 클리핑되어 목적이 평평해진다 — 더 최적화해 봐야 이득이 없다. "좋은 토큰이라도 한 번에 $1+\epsilon$ 배 이상은 확률을 올리지 마라"는 제동 장치다. 어드밴티지가 음수일 때(나쁜 토큰, 확률을 내리고 싶다), $r_t$ 를 줄이면 목적이 커진다($\hat{A}<0$ 이므로). 그러나 $r_t$ 가 $1-\epsilon$ 밑으로 내려가면 클리핑되어 목적이 평평해진다 — "나쁜 토큰이라도 한 번에 $1-\epsilon$ 배 밑으로는 내리지 마라"는 제동 장치다.

$\min$ 을 취하기 때문에 클리핑은 목적을 개선하는 방향으로 신뢰영역을 벗어나는 것만 막고, 반대 방향은 그대로 벌점을 준다. 예를 들어 좋은 토큰($\hat{A}>0$)인데 갱신 중 실수로 확률이 크게 떨어져 $r_t$ 가 $1-\epsilon$ 밑으로 갔다면, 클리핑되지 않은 항 $r_t\hat A$ 이 더 작아 $\min$ 이 그쪽을 골라 온전한 벌점이 흐른다 — 잘못 내려간 좋은 토큰은 도로 높이는 강한 신호가 살아 있다. 보수적이지만 겁쟁이는 아닌 설계다.

어드밴티지 Â > 0 (좋은 토큰) 1 1+ε rt L 증가 클리핑(평평) 어드밴티지 Â < 0 (나쁜 토큰) 1−ε 1 rt L 감소 클리핑(평평) 신뢰영역 [1−ε, 1+ε]을 "목적이 좋아지는 방향"으로 벗어나면 목적이 평평해져 갱신을 멈춘다
PPO 클리핑된 목적 L^CLIP — 확률비 r_t에 대한 모양(ε = 0.2).

숫자를 넣으면 이 모양이 명확해진다. $\epsilon=0.2$, 좋은 토큰 $\hat A=+2$ 를 두자. $r_t=1.0$ 이면 목적 기여는 $\min(1.0\times2,\ 1.0\times2)=2.0$. $r_t=1.1$ 이면 $\min(2.2,\ 2.2)=2.2$ — 아직 클립 구간 안이라 원래 항 그대로 늘어난다. $r_t=1.5$ 면 클리핑이 $r_t$ 를 $1.2$ 로 자르므로 $\min(1.5\times2,\ 1.2\times2)=\min(3.0,\ 2.4)=2.4$ — 목적이 $2.4$ 에서 멈추고, 여기서 $r_t$ 를 더 키워도 목적은 $2.4$ 로 평평해 그래디언트가 0이다. 반대로 나쁜 토큰 $\hat A=-2$ 를 $r_t=0.5$ 까지 내렸다면(과하게 내림), 클리핑이 $r_t$ 를 $0.8$ 로 높여 $\min(0.5\times(-2),\ 0.8\times(-2))=\min(-1.0,\ -1.6)=-1.6$ — 여기서도 $r_t$ 를 더 내려도 목적은 $-1.6$ 에 갇혀 확률을 더 낮추려는 그래디언트가 소실된다. 두 경우 모두 "너무 멀리 간 갱신"의 이득을 잘라 낸다.

실제 PPO 손실은 세 항을 합친다.

$$L^{\text{PPO}}(\theta,\psi) = \underbrace{L^{\text{CLIP}}(\theta)}_{\text{정책(클립)}} \;-\; c_1\, \underbrace{L^{\text{VF}}(\psi)}_{\text{가치 회귀}} \;+\; c_2\, \underbrace{S[\pi_\theta]}_{\text{엔트로피 보너스}}$$

$L^{\text{VF}}$ 는 가치 헤드의 제곱오차(3.4.6)이고, 일부 구현은 여기에도 가치 클리핑을 적용해 급변을 막는다. $S[\pi_\theta]$ 는 정책 엔트로피 보너스로, 정책이 너무 빨리 결정적으로 굳어 탐색을 멈추는 것을 막는다(계수 $c_2$ 는 작게). 부호에 주의하면, 정책과 엔트로피는 최대화, 가치 오차는 최소화라 가운데 항만 부호가 반대다. 이 전체를 최대화하려고 한 번 뽑은 롤아웃 배치로 여러 에폭·미니배치 경사 상승을 수행하는데 — 바로 클리핑이 그 재사용을 안전하게 만들어 준다. 클리핑이 없다면 같은 데이터로 두세 번만 갱신해도 정책이 신뢰영역을 벗어나 붕괴한다.

3.4.9 KL 페널티 — 참조 정책에서 멀어지지 않게

PPO의 클리핑은 한 번의 갱신이 크지 않게 막는다. 하지만 작은 걸음도 수천 번 누적하면 정책은 출발점(SFT)에서 아주 멀리 표류할 수 있다. 클리핑은 스텝 크기를 제어하지 총 이동 거리를 제어하지 않기 때문이다. 그 표류를 막는 별개의 장치가 KL 페널티다. 이 둘은 서로 다른 문제를 푼다 — 클리핑은 한 걸음의 크기, KL 페널티는 출발점으로부터의 총 거리.

RLHF는 SFT 모델을 참조 정책(reference policy) $\pi_{\text{ref}}$ 로 얼려 두고, 학습되는 정책이 거기서 멀어질수록 벌점을 준다. 실제 최적화하는 보상은 RM 점수에서 KL을 뺀 것이다.

$$R(x,y) = r_\phi(x,y) \;-\; \beta\, \mathrm{KL}\!\big[\pi_\theta(\cdot\mid x)\,\|\,\pi_{\text{ref}}(\cdot\mid x)\big]$$

$\beta$ 는 KL 계수(강도)다. 구현에서는 이 KL을 토큰별 페널티로 분해해 각 스텝의 보상에 넣는다. 시퀀스 KL의 로그비가 토큰 로그비의 합이라는 사실 — $\log\frac{\pi_\theta(y\mid x)}{\pi_{\text{ref}}(y\mid x)} = \sum_t \log\frac{\pi_\theta(a_t\mid s_t)}{\pi_{\text{ref}}(a_t\mid s_t)}$ — 을 쓰면 토큰별 보상은 이렇게 된다.

$$r_t = \underbrace{-\,\beta \log \frac{\pi_\theta(a_t\mid s_t)}{\pi_{\text{ref}}(a_t\mid s_t)}}_{\text{매 토큰: KL 페널티}} \;+\; \underbrace{r_\phi(x,y)\cdot \mathbb{1}[t = T]}_{\text{마지막 토큰에만: RM 점수}}$$

RM 점수는 완성된 응답에 대해 마지막 토큰에서 한 번, KL 페널티는 매 토큰마다 추가된다. 이 토큰별 보상 $r_t$ 가 앞서 GAE(3.4.7)의 TD 잔차 $\delta_t=r_t+\gamma V(s_{t+1})-V(s_t)$ 에 들어가는 그 $r_t$ 다 — 이제 모든 부품이 하나로 이어진다.

KL 페널티가 없으면 무슨 일이 벌어지나. 보상 모델은 완벽하지 않다 — 실제 인간 선호의 불완전한 근사일 뿐이고, 학습 분포 밖(out-of-distribution)에서는 특히 엉터리 점수를 준다(3.3). 정책이 RM 점수만 무제한 좇으면 두 방향으로 붕괴한다. 하나는 보상 해킹 — 정책이 RM의 허점을 찾아내, 사람은 안 좋아하지만 RM만 높게 주는 이상한 출력으로 몰려간다(3.4.12). RM 점수는 치솟는데 실제 품질은 곤두박질친다. 다른 하나는 모드 붕괴(mode collapse) — 특정 고득점 패턴으로 다양성을 잃거나, 문장이 깨지고 반복되는 비언어적 출력으로 도망친다. SFT가 애써 만든 언어 능력이 붕괴한다. KL 페널티는 이 붕괴에 닻을 내린다. "RM 점수를 높이되, 말이 되는 언어(참조 정책 근처)를 벗어나지 마라." $\beta$ 를 조절하면 이 팽팽함이 바뀐다.

$\beta$ (KL 계수)결과위험
너무 작음정책이 자유롭게 RM 점수 추구보상 해킹·붕괴 — RM 점수만 오르고 품질 하락
적절함참조 근처에서 선호에 맞게 개선(원하는 지점)
너무 큼참조에 고정되어 거의 안 움직임정렬이 거의 안 됨 — RLHF의 효과 소실

한 가지 미묘한 점을 살펴봐야 정직하다. 위 토큰별 항 $-\beta\log\frac{\pi_\theta}{\pi_{\text{ref}}}$ 는 KL의 단일 샘플 추정치이지 KL 자체가 아니다. KL은 이 항의 기댓값이라 항상 $\ge0$ 이지만, 개별 토큰에서는 음수(즉 보너스)일 수도 있다 — 정책이 그 토큰에서 참조보다 확률을 낮게 줬을 때다. 이 추정치를 흔히 $k_1$ 이라 부르는데, 불편이지만 분산이 크고 부호가 오락가락한다. 그래서 어떤 구현은 항상 음이 아닌 다른 추정량을 쓴다 — 예컨대 $k_3 = (\rho-1)-\log\rho$ 형태(여기서 $\rho=\pi_{\text{ref}}/\pi_\theta$)는 항상 $\ge0$ 이면서 여전히 불편이라 분산을 줄인다. 어느 추정량을 쓰는지는 구현마다 다르니 코드를 직접 확인해야 하지만, 요지는 변하지 않는다 — 평균적으로 참조에서 멀어질수록 벌점.

3.4.10 수계산 — KL 페널티 토큰 보상과 어드밴티지

식은 예제로 굳는다. 아주 작은 응답 하나의 토큰별 보상을 직접 끝까지 계산하자(모든 수치는 설명용 개략값이다). 프롬프트에 대해 정책이 토큰 3개 $y=(a_1,a_2,a_3)$ 를 생성했고(마지막이 EOS), KL 계수 $\beta=0.2$, 보상 모델 점수 $r_\phi(x,y)=0.80$ 이다. 각 토큰에서 정책과 참조의 로그확률을 롤아웃 때 저장해 두었다.

토큰$\log\pi_\theta$$\log\pi_{\text{ref}}$로그비 $\log\frac{\pi_\theta}{\pi_{\text{ref}}}$해석
$a_1$$-0.50$$-0.60$$+0.10$정책이 참조보다 더 확신
$a_2$$-1.00$$-0.70$$-0.30$정책이 참조보다 덜 확신
$a_3$ (EOS)$-0.20$$-0.90$$+0.70$정책이 참조보다 훨씬 더 확신

토큰별 KL 페널티는 $-\beta\cdot(\text{로그비})$ 다.

$$\text{KL}_1 = -0.2\times(+0.10) = -0.02,\qquad \text{KL}_2 = -0.2\times(-0.30) = +0.06,\qquad \text{KL}_3 = -0.2\times(+0.70) = -0.14$$

$a_2$ 는 정책이 참조보다 덜 확신했으므로 로그비가 음수이고, 그 결과 페널티가 양수($+0.06$)다 — 앞 절에서 말한 "개별 토큰은 음수 KL(=보너스)일 수 있다"의 실제 모습이다. 반면 $a_3$ 은 참조에서 크게 벗어나(로그비 $+0.70$) 가장 큰 벌점($-0.14$)을 받는다. RM 점수 $0.80$ 은 EOS인 $a_3$ 에서만 더해지므로 토큰별 보상은:

$$r_1 = -0.02,\qquad r_2 = +0.06,\qquad r_3 = \underbrace{0.80}_{\text{RM}} + \underbrace{(-0.14)}_{\text{KL}} = +0.66$$

토큰별 분해가 시퀀스 보상과 맞아떨어지는지 확인하면, 총합은 $-0.02+0.06+0.66=0.70$. 다른 길로도 같은 값이 나와야 한다 — 로그비 합이 $0.10-0.30+0.70=0.50$ 이니 $r_\phi-\beta\cdot(\text{로그비 합})=0.80-0.2\times0.50=0.70$. 두 계산이 일치한다.

이제 이 $r_t$ 들이 어드밴티지로 흘러가는 것을 마저 밟자. 가치 헤드가 $V(s_1)=0.55$, $V(s_2)=0.60$, $V(s_3)=0.65$ 를 예측했고 $\gamma=1$, 마지막 상태 이후 가치는 0(에피소드 종료)이라 하자. TD 잔차 $\delta_t=r_t+\gamma V(s_{t+1})-V(s_t)$ 를 뒤에서부터:

$$\delta_3 = 0.66 + 0 - 0.65 = +0.01,\qquad \delta_2 = 0.06 + 0.65 - 0.60 = +0.11,\qquad \delta_1 = -0.02 + 0.60 - 0.55 = +0.03$$

$\lambda=1$ 로 GAE 재귀식 $\hat A_t=\delta_t+\gamma\lambda\hat A_{t+1}$ 을 반복 적용하면 $\hat A_3=\delta_3=0.01$, $\hat A_2=\delta_2+\hat A_3=0.12$, $\hat A_1=\delta_1+\hat A_2=0.15$. 세 어드밴티지가 모두 양수라 세 토큰의 확률을 (클리핑 범위 안에서) 조금씩 높이는 방향으로 정책이 갱신된다. 여기서 배울 것은 신호가 세 겹으로 쌓였다는 점이다 — RM이 준 총점(0.70)을 KL 페널티가 토큰마다 분할해 참조에서 벗어난 토큰($a_3$)에 벌을 주고, 가치 함수가 baseline을 빼 "평균 대비 얼마나 나았나"로 중심화한다. 이 RM·KL·baseline 세 층이 겹쳐야 비로소 안정적인 갱신 신호가 나온다.

3.4.11 RLHF-PPO 루프와 메모리에 상주하는 네 모델

부품을 다 모았으니 한 번의 반복(iteration)이 어떻게 실행되는지 조립하자.

θ_old ← θ 갱신 후 다음 반복 프롬프트 배치 x ① 롤아웃(생성) 정책 π_θ가 응답 y 생성(샘플링, 1.7) ② 채점·신호 계산 보상 모델 r_φ(x,y) 채점(마지막 토큰) 참조 π_ref와 비교 토큰별 KL 페널티 토큰별 보상 r_t 조립 = RM(끝) − β·KL(매 토큰) 가치 V_ψ(s_t) 예측 ③ 어드밴티지 Â_t (GAE) ④ 업데이트(여러 에폭) L^CLIP로 정책 π_θ 갱신 + L^VF로 가치 V_ψ 갱신
RLHF-PPO 한 반복의 루프

한 반복은 네 단계로 진행된다. 롤아웃에서 현재 정책 $\pi_{\theta_{old}}$ 로 프롬프트 배치에 대한 응답을 샘플링하고(이 생성이 계산의 큰 몫), 각 토큰의 로그확률도 함께 저장한다(나중에 $r_t$ 분자에 필요하다). 채점·신호 단계에서 보상 모델이 완성 응답에 점수를 매기고(마지막 토큰), 참조 정책과 비교해 토큰별 KL 페널티를 계산하며, 가치 헤드가 각 위치의 $V$ 를 예측한다. 어드밴티지 단계에서 $r_t$ 와 $V$ 로 GAE 어드밴티지 $\hat A_t$ 와 가치 타깃 $\hat R_t$ 를 계산한다. 업데이트 단계에서 저장된 롤아웃으로 $L^{\text{PPO}}$ 를 여러 에폭·미니배치에 걸쳐 최대화해 정책과 가치를 함께 갱신하고, 끝나면 $\theta_{old}\leftarrow\theta$ 하고 다음 반복으로 넘어간다.

RLHF-PPO가 악명 높게 부하가 큰 근본 이유가 여기서 드러난다. 한 번의 갱신에 최대 네 개의 대형 모델이 동시에 필요하다.

모델역할학습?메모리 부담
정책 π_θ (actor)응답 생성 + 갱신 대상예가장 부하가 크다 — 가중치 + 그래디언트 + 옵티마이저 상태
가치 V_ψ (critic)어드밴티지용 baseline 예측예부하가 크다 — 별도 네트워크면 정책과 비슷, 백본 공유면 절감
참조 π_ref (frozen SFT)KL 페널티 기준아니오순전파만(가중치만), 그래도 한 벌 상주
보상 r_φ (frozen RM)응답 채점아니오순전파만, 한 벌 상주

이 무게를 바이트로 못박아 보면 왜 이것이 엔지니어링 문제인지가 명확해진다. 7B 파라미터 모델을 혼합정밀도 Adam으로 학습한다고 하자(2.4·2.6). 학습되는 모델 하나는 파라미터당 대략 16바이트를 차지한다 — bf16 가중치 2바이트 + bf16 그래디언트 2바이트 + fp32 마스터 가중치 4바이트 + Adam의 1차 모멘트 4바이트 + 2차 모멘트 4바이트. 따라서 정책(actor)은 $7\times10^9\times16 \approx 112$ GB다. 가치(critic)를 정책과 같은 크기의 별도 네트워크로 두면 또 $112$ GB. 참조와 보상 모델은 동결이라 bf16 가중치만 상주해 각각 $7\times10^9\times2\approx14$ GB. 넷을 합치면 $112+112+14+14 = 252$ GB — 활성값이나 롤아웃 생성용 KV 캐시(5.1)를 아직 세지도 않았는데 벌써 80 GB GPU 하나의 세 배를 넘긴다. 여기에 매 반복 생성(느림)·채점·다중 순전파와 역전파가 겹치니, 단순 추론과는 비교가 안 되는 컴퓨트·메모리·엔지니어링 비용이 든다(5.5의 GPU 운영, 7.5의 비용과 직결된다).

실무의 절감책은 대개 이 표의 어느 칸을 지우는 일이다. 정책과 가치가 백본을 공유하고 헤드만 분리하면 critic의 $112$ GB가 헤드 하나 값으로 줄고, 참조·보상을 같은 베이스에 서로 다른 어댑터·헤드로 추가하면 동결 모델의 상주 비용을 아낀다. 정책을 LoRA로 학습하면(3.8) 그래디언트·옵티마이저 상태가 전체 파라미터가 아니라 저랭크 어댑터에만 적용되어 $112$ GB의 대부분이 사라진다. 그럼에도 "여러 대형 모델이 함께 떠 있다"는 본질은 남고, 바로 이 무게가 다음 세대 기법들의 출발 동기다.

3.4.12 보상 해킹과 과최적화

KL 페널티를 다뤘지만 보상 해킹은 RLHF의 중심 난제라 따로 깊이 다룰 값어치가 있다. 그 근원은 오래된 법칙 하나다 — 굿하트의 법칙(Goodhart's Law): 측정값이 목표가 되는 순간 그것은 좋은 측정값이기를 멈춘다. RM 점수는 인간 선호의 대리 지표(proxy)인데, 정책이 그 대리 지표를 직접 최대화하는 순간 대리와 실물이 갈라진다. 이것을 RLHF 맥락에서 보상 과최적화(reward overoptimization)라 부른다. RM 점수를 계속 높여도 어느 지점을 넘으면 실제 인간 평가가 오히려 떨어지기 시작한다 — 정책이 실제 품질이 아니라 RM의 결함을 학습하기 때문이다. 이 현상은 최적화 압력(정책이 RM에서 얼마나 멀리 벗어났나, 대략 KL로 측정)에 대해 실제 품질이 처음엔 오르다 정점을 지나 꺾이는 언덕 모양으로 나타난다.

실제로 나타나는 해킹의 유형들은 몇 가지로 정형화되어 있다. 가장 흔하고 잘 문서화된 것은 장황함(length bias)이다. RM이 "긴 답 = 자세하고 좋은 답"으로 편향되어 있으면 정책은 내용 없이 길기만 한 답을 배운다. 이 편향이 워낙 흔해서 길이를 별도로 보정하는 것이 표준 대응이 되었을 정도다. 다음은 아부(sycophancy) — RM과 그 뒤의 사람이 동의해 주는 답을 선호하면, 정책은 사용자 의견에 무비판적으로 맞장구치도록 배운다. 사실보다 동조를 택하니 정직성(3.1)을 직접 잠식하는 위험한 해킹이다. 형식·표식 악용도 흔하다 — "구조화된 답이 좋다"는 신호를 과학습해 불릿·머리말·굵은 글씨·정중한 상투구를 남발하거나, RM이 좋아하는 특정 문구·이모지·결론 형식을 기계적으로 붙인다. 겉보기 형식만 채우고 알맹이는 빈다. 자신감 과장은 RM이 확신에 찬 어조를 선호할 때 나온다 — 정책이 모르는 것도 단정적으로 말하도록 배워 환각을 부추긴다. 극단에는 비언어적 붕괴가 있다 — KL이 너무 약하면 정책이 아예 말이 안 되지만 RM 점수만 높은 깨진 토큰열로 도망친다.

완화책은 저마다 다른 축을 막고, 저마다 한계가 뚜렷하다.

완화책무엇을 하나한계
KL 페널티 조율참조 정책에서 못 벗어나게(3.4.9). 가장 기본 방어.$\beta$ 너무 크면 정렬 자체가 안 됨. 균형이 어렵다.
조기 중단KL이 임계를 넘거나 검증 선호가 꺾이면 학습 중단."언제가 정점인가"를 알아야 함 — 별도 홀드아웃 평가 필요.
RM 앙상블·불확실성여러 RM의 평균·최소·분산으로 한 RM의 허점 의존을 줄임.비용 증가. 앙상블도 공통 편향은 못 검출함.
길이·형식 정규화길이 편향 등 알려진 축을 명시적으로 보정.아는 해킹만 막음. 새 해킹엔 무력.
RM 재학습(플라이휠)해킹된 출력을 사람이 재라벨링해 RM 갱신(8.1).느리고 비쌈. 사후 대응이라 항상 한 발 늦음.
적대적 평가·레드팀해킹·탈옥을 능동적으로 찾아 측정(4.3).발견은 하되 자동 수정은 아님.

정직하게 말하면 보상 해킹은 완전히 없앨 수 없다. RM이 인간 선호의 근사인 한 격차는 항상 있고, 최적화 압력은 늘 그 격차를 공략한다. 실무의 목표는 제거가 아니라 "과최적화가 실익을 해치기 전에 멈추는 지점을 찾는 것"이다. 이것이 RLHF를 수행해 두고 잊는 자동 절차가 아니라 감시가 필요한 과정으로 만든다 — RM 점수가 오르는 것과 실제 품질이 오르는 것은 다른 일이고, 후자는 반드시 독립적인 홀드아웃 평가(4.1·4.2)로 따로 확인해야 한다.

3.4.13 왜 불안정한가, 그리고 DPO·GRPO로 가는 길

PPO는 작동한다. 그러나 정렬 기법 중 가장 다루기 까다로운 축이라는 평판도 정당하다. 그 까다로움의 정체는 네 갈래다. 첫째는 하이퍼파라미터 민감성이다 — $\beta$(KL)·$\epsilon$(클립)·학습률·GAE의 $\lambda$·에폭 수·배치 구성·엔트로피 계수가 서로 얽혀 있고, 한 축을 잘못 설정하면 학습이 발산하거나 붕괴한다. "좋은 설정"이 데이터·모델·RM마다 달라 재현이 어렵고, 논문의 값을 그대로 이식하면 대개 안 된다. 둘째는 불안정한 동역학이다 — actor와 critic이 서로를 쫓는 움직이는 표적 문제로, critic이 부정확하면 actor가 잘못된 어드밴티지로 학습하고 그 결과 분포가 바뀌어 critic이 또 뒤처진다. 여기에 RM까지 추가되어 삼중 상호작용이 크게 변동한다. 셋째는 비용이 큰 자원이다 — 네 모델 상주(3.4.11)에 매 반복 온-폴리시 생성과 다중 순전파·역전파가 겹친다. 넷째는 디버깅의 어려움이다 — 정렬이 안 되는 실패가 버그인지, RM 문제인지, KL이 잘못됐는지, 단순히 하이퍼파라미터인지 구분하기 어렵다. 신호가 여러 겹으로 섞여 있어 원인을 분리하기가 어렵다.

이 난점들이 후속 기법의 직접적 동기다. 각각이 PPO의 어느 무게를 덜어내려 했는지로 지도를 그리면 계보가 선명해진다.

흐름PPO의 무엇을 덜어내나어디서
DPO 계열 (DPO·IPO·KTO·ORPO)RM·RL 루프 전체를 없애고 선호 데이터로 직접 지도학습. 온-폴리시 생성도, 네 모델도, 클리핑 튜닝도 불필요.3.5
GRPO가치 모델(critic)을 없애고, 같은 프롬프트의 여러 샘플 그룹 평균을 baseline으로 씀 → 메모리·불안정 축소. 추론 모델 RL에 널리 쓰임.3.7
RLAIF·헌법적 AI사람 선호 라벨을 AI 피드백으로 대체(RM 학습 데이터 병목 완화). RL 부분은 유사.3.6

DPO(3.5)는 선호 최적화의 목표는 그대로 두되 RL이라는 형식 자체를 버리는 길이고 — PPO의 KL-정규화 목적을 직접 풀면 명시적 RM 없이 곧장 지도학습 손실로 떨어진다는 수학적 다리가 그 근거다. GRPO(3.7)는 RL은 유지하되 가장 부하가 큰 부품인 가치 모델을 떼는 길이다. 앞서 밴딧 관점(3.4.2)에서 보았듯, 같은 프롬프트에 여러 응답을 뽑아 그 그룹의 평균 보상을 baseline으로 쓰면 학습된 critic 없이도 어드밴티지를 근사할 수 있다. 두 길 모두 PPO의 무게와 불안정에 대한 반작용으로 읽으면 계보가 또렷하다.

"PPO는 낡았고 DPO가 이겼다"는 서사는 그러나 과도한 단순화다. DPO는 파이프라인을 크게 단순화하지만 온-폴리시 신호의 부재, 분포 이동 취약성 같은 자기만의 트레이드오프가 있다(3.5). 대규모의 복잡한 정렬 — 특히 추론 모델의 RL(3.7) — 에서는 여전히 PPO·GRPO 같은 온-폴리시 RL이 핵심 도구다. 어느 하나가 항상 낫다고 단정할 수 없고, 데이터·목표·자원·팀 역량에 따라 답이 달라진다. PPO를 끝까지 이해할 값어치는 유행 때문이 아니다 — 선호를 온-폴리시로 최적화한다는 것의 원형이 여기 다 들어 있고, 뒤따르는 모든 기법은 이 원형의 어느 부품을 덜어냈는가로 스스로를 정의하기 때문이다.