점수 R은 미분할 수 없고 응답을 뽑는 순간 연속성도 끊기지만, 우리에게는 SFT에서 매일 미분하던 양인 확률의 로그가 있다. 점수는 그대로 두고 로그확률만 미분해서 평균 점수를 올릴 수 있을까?
역사: 그래디언트를 계산하지 않고 그래디언트를 따라가기
1980년대 신경망 연구에서 역전파는 그래디언트가 단순하면서도 놀랄 만큼 잘 듣는 학습 규칙의 바탕이 된다는 것을 보여 주고 있었다. 그런데 보상만 주어지는 학습에는 역전파할 정답이 없다. 노스이스턴 대학의 로널드 윌리엄스(Ronald J. Williams)는 출력을 무작위로 내는 신경망 단위를 두고 보상만으로 학습하는 문제를 붙들었다. 1986년부터 기술 보고서와 학회 발표로 조금씩 내놓은 결과를 1992년 학술지 Machine Learning의 논문 「Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning」으로 묶었다. 그가 보인 것은, 받은 보상을 행동 확률의 로그 미분에 곱해 파라미터를 고치면 평균적으로 기대 보상이 오르는 방향으로 간다는 것이다. 그래디언트를 따로 계산하지도, 계산할 정보를 모아 두지도 않는다. 제목의 「간단한(simple)」이 그 뜻이라고 그는 적고, 더 정확한 말은 「모델을 쓰지 않는(non-model-based)」일 것이라고 덧붙였다. 조건은 출력을 내는 확률분포가 파라미터로 미분 가능하다는 것 하나였고, 이 규칙들에 그가 붙인 이름이 REINFORCE다.
1999년 학회 NIPS에서 발표된 리처드 서튼(Richard S. Sutton)과 동료들의 논문은 다른 쪽의 막힘에서 출발했다. 그때까지 주류는 행동마다 가치(앞으로 받을 점수의 추정값)를 매기고 가치가 가장 높은 행동을 고르는 방식이었다. 이 방식에서는 추정값이 아주 조금만 바뀌어도 고르는 행동이 다른 행동으로 갑자기 바뀐다. 그 불연속 때문에 간단한 문제와 간단한 함수 근사에서도 어떤 정책으로도 수렴하지 못하는 예가 여럿 알려져 있었다. 서튼과 동료들은 정책을 따로 파라미터로 두고 기대 보상의 그래디언트를 따라 고치면 파라미터를 조금 바꿀 때 정책도 조금만 바뀐다고 짚고, 그 그래디언트를 경험에서 추정할 수 있는 꼴로 적는 정책 그래디언트 정리(policy gradient theorem)를 보였다. 같은 논문은 윌리엄스의 REINFORCE가 평균으로는 정확한 그래디언트를 주지만 학습이 훨씬 느려 그동안 별로 주목받지 못했다고도 적었다.
김민준
지금은 loss = -R * logprob(y) 한 줄 쓰고 backward() 부르면 끝이잖아요. 그게 논문 한 편이 될 일이었어요?
선생님
그 한 줄에 backward를 부를 수 있는 건 거꾸로 보낼 손실이 있어서예요. 윌리엄스는 1986년 역전파 논문을 쓴 세 사람 가운데 하나였어요. 역전파가 거꾸로 보내는 게 뭐였죠?
이서연
출력과 정답의 차이요. 음… 보상만 있으면 정답이 없으니까, 거꾸로 보낼 차이부터 없네요.
김민준
그럼 점수가 높게 나온 출력을 정답이라 치고 보내면 되잖아요.
선생님
출력이 늘 똑같은 신경망은 다른 출력을 내 볼 일이 없어서, 어느 출력이 더 좋은지 견줄 수가 없어요. 그래서 윌리엄스는 출력을 일부러 무작위로 내는 단위를 뒀고, 보상을 로그확률의 미분에 곱하면 평균적으로 기대 보상이 오른다는 것을 처음부터 증명해야 했어요.
이서연
그렇게 증명까지 했는데도 1999년 논문에는 학습이 훨씬 느려서 별로 주목받지 못했다고 적혀 있었죠. 평균으로만 맞는 방향이라서요?
선생님
그래요. 한 번 뽑은 결과로 고치면 한 번 한 번은 크게 엇나가서, 평균이 제 방향을 잡으려면 샘플을 아주 많이 돌려야 했어요.
김민준
그런데 점수는 미분이 안 되잖아요. 확률만 조금 옮겨서 미분 안 되는 점수를 어떻게 올린다는 거예요?
답이 둘일 때: 확률을 옮기면 평균 점수가 움직인다
식을 세우기 전에 숫자로 보자. 답이 「맞음」과 「틀림」 둘뿐이고, 채점기는 맞음에 1점, 틀림에 0점을 준다. 가장 작은 경우를 고른 것은, 답이 둘이면 맞음의 확률 p 하나만 정하면 틀림의 확률 1−p 도 정해져서 손으로 끝까지 셀 수 있기 때문이다. 지금 모델은 맞음을 p=0.3 으로 고르므로, 평균 점수는 0.3×1+0.7×0=0.3 이다.
맞음의 확률을 0.31로 조금 올리면 평균 점수는 0.31이 된다. 점수는 하나도 바뀌지 않았는데 평균 점수가 움직였으니, 움직인 것은 확률뿐이다. p 를 0.01 올렸더니 평균 점수가 0.01 올랐으니, 평균 점수를 p 로 미분한 값은 1이다.
실제 언어 모델에서는 답의 가짓수가 너무 많아 확률표 전체를 훑으며 채점할 수 없다. 그래서 확률표를 들여다볼 수 없고 답을 뽑아 채점만 할 수 있다고 하자. 그래도 이 1을 얻을 수 있을까? 뽑힌 답의 점수에, 그 답의 로그확률을 p 로 미분한 값을 곱해 보자. 맞음이 뽑히면 1×dpdlogp=1/0.3≈3.33, 틀림이 뽑히면 점수가 0이라 0이다. 맞음은 열 번에 세 번꼴로 뽑히므로 평균은 0.3×3.33+0.7×0=1 로 정확한 그래디언트 1과 같다. 한 번 한 번의 값(3.33이나 0)은 1과 거리가 멀지만, 평균은 정확하다.
로그 미분 트릭: 확률만 미분한다
이 계산을 일반 식으로 적자. J를 합의 형태로 쓰고 미분하면, 응답 하나하나의 점수 R은 θ와 무관한 숫자이므로(θ가 바꾸는 것은 그 응답이 뽑힐 확률뿐이다) 그냥 곱해진 채로 남는다.
∇θJ=y∑R(y)∇θπθ(y)
(∇θ 의 ∇(나블라)는 파라미터 θ 의 성분마다 미분한 값을 모은 그래디언트다.) 여기에 미분 공식 하나를 쓴다. ∇logπ=π∇π 이므로 ∇π=π⋅∇logπ. 이 바꿔 쓰기가 로그 미분 트릭(log-derivative trick)이다. 답이 둘일 때 맞음이 뽑히면 곱한 1/0.3 이 바로 이 ∇logπ 였다. 대입하면:
위의 유도에서는 Φt=R, 즉 응답 전체의 점수가 모든 토큰에 똑같이 곱해지는데도 보상 자리를 가중치 Φt 라는 일반 기호로 일부러 적었다. Φt 자리에 다른 것을 넣어도 기댓값이 여전히 올바른 그래디언트가 되는 경우들이 있기 때문이다(2016년 슐먼(John Schulman)과 동료들의 논문이 이런 경우 여섯 가지를 한 식에 모아 정리했다).
SFT는 특수한 정책 그래디언트다
정책 그래디언트 식에서 두 가지를 바꾸면 SFT가 된다: 응답을 모델이 뽑는 대신 데이터셋의 정답을 쓰고, 점수를 항상 1로 둔다.
거꾸로 말하면 정책 그래디언트는 **“내가 만든 답으로, 점수에 비례해 하는 SFT”**다. 점수가 음수면? 로그확률을 내린다. 흔히 "나쁜 예제를 추가하면 SFT가 RL이 된다"고 하는데, 그 말의 알맹이가 바로 이 부호다. 그리고 "남이 만든 답"과 "내가 만든 답"의 차이는 KL 발산의 두 방향, 순방향 KL(forward)과 역방향 KL(reverse)의 차이이기도 하다. 기댓값을 데이터 위에서 취하면 모델이 스스로 만드는 실수는 손실에 나타나지 않고, 내 샘플 위에서 취하면 바로 그 실수가 가중치를 받는다.
ML에서: 로그확률에 곱하는 가중치를 정하는 알고리즘들
언어 모델을 점수로 학습시키는 실제 알고리즘에서 움직이는 것은 언제나 언어 모델의 파라미터 θ 그 자체다. 알고리즘마다 달라지는 것은 로그확률 앞에 곱하는 가중치 Φt 뿐이다. 정책 그래디언트 계열 알고리즘의 발전은 사실상 가중치 Φt 를 정하는 방법의 역사다.
알고리즘
가중치 Φt
무엇을 개선했나
VPG
R
출발점. 정확하지만 기댓값을 계산할 수 없음
REINFORCE
R−b (샘플로 추정)
기댓값을 샘플 평균으로 대체, 베이스라인(점수에서 빼 주는 기준값)으로 분산 감소
Actor-Critic
A^t (어드밴티지: 그 토큰이 평소보다 얼마나 나았나. 비평가(앞으로 받을 점수를 예측하는 보조 모델)가 추정)
토큰마다 다른 가중치, 분산 더 감소
PPO
클리핑된 (확률 비율 × A^t). 확률 비율 = 지금 정책의 확률 ÷ 샘플을 뽑은 옛 정책의 확률, 클리핑 = 정해진 폭을 넘지 않게 자르기
같은 샘플을 여러 번 재사용하되 멀리 가지 않게
GRPO
(Ri−μG)/σG
비평가 대신 그룹(같은 프롬프트에 뽑은 응답 여러 개)의 점수 평균 μG(μ는 뮤) 와 표준편차 σG
변종들
표준편차로 나누기를 뺌, 비대칭 클리핑(위아래로 자르는 폭을 다르게), 시퀀스 단위 비율(토큰마다가 아니라 응답 전체로 잰 확률 비율)…
GRPO의 길이 편향과 불안정 수정
문제 3: 틀린 답에 −1점을 주면
「답이 둘일 때」의 예에서 채점 규칙만 바꾸어, 맞음에는 그대로 1점을 주고 틀림에는 이제 −1점을 준다. 모델은 여전히 맞음을 확률 p=0.3, 틀림을 1−p=0.7 로 고른다. (가) 틀림이 뽑혔을 때, 점수 × (틀림의 로그확률을 p 로 미분한 값)은 얼마인가? 이 샘플은 p 를 올리는가, 내리는가? (나) 맞음이 뽑힐 때와 틀림이 뽑힐 때의 값을 뽑힐 확률로 평균 내면 얼마인가? 평균 점수 J 를 p 로 직접 미분한 값과 비교하라.
선생님
민준 학생, 틀림이 뽑혔어요. 이 샘플은 p를 어느 쪽으로 밀까요?
김민준
점수가 −1이니까 뽑힌 답을 벌주는 거죠. 음수를 곱하니까 p가 내려가요.
이서연
잠깐, 여기서 미분하는 건 틀림의 로그확률이야. 틀림의 확률은 1 − p 라서 log(1 − p)를 p로 미분하면 −1/(1 − p), 즉 −1/0.7이야.
답이 둘뿐이라 같은 일이에요. 틀림이 준 만큼 맞음이 늘어요. 틀림이 0점이던 때는 틀림이 뽑히면 아무 일도 없었는데, −1점이 되니까 틀림이 뽑혀도 신호가 생기네요.
선생님
그럼 (나). 두 경우를 평균 내 볼까요?
김민준
맞음은 그대로 1/0.3 ≈ 3.33이니까 0.3 × 3.33 + 0.7 × 1.43 = 1 + 1 = 2. 어, 틀림이 0점일 때는 1이었는데 두 배가 됐어요. 제가 뭘 잘못 셌나요?
이서연
직접 미분해 보자. 평균 점수가 p × 1 + (1 − p) × (−1) = 2p − 1 이니까 미분하면 2야. 맞게 센 거야.
김민준
p를 올리면 맞음에서 1점을 얻고, 틀림에서 1점을 덜 잃으니까 두 배구나. 조교님이 오답에 감점까지 하면 대충 찍기보다 제대로 푸는 게 곱절로 남는 거랑 같네요.
정리 (가) (−1)×dpdlog(1−p)=0.71≈1.43. 틀림이 뽑힌 샘플도 p 를 올리는데, 답이 둘뿐이라 틀림의 확률을 내리는 것이 곧 맞음의 확률을 올리는 것이기 때문이다. (나) 0.3×3.33+0.7×1.43=2 이고, J=2p−1 을 직접 미분한 값과 같다.