보상을 어느 토큰에 줄 것인가: 끝의 1비트를 나누는 네 길
성공 궤적 하나를 통째로 칭찬하면 삽질한 스텝까지 함께 칭찬받는다. 비평가를 다시 들이는 것이 한 가지 답이지만, 가치 함수를 학습하는 일 자체가 어렵다. 비평가 없이, 끝에 온 점수를 꼭 필요한 토큰에만 골라 줄 수는 없을까?
역사: 명령 하나하나를 똑같이 칭찬한 기계
1958년 IBM의 연구 저널에 리처드 프리드버그(R. M. Friedberg)가 프로그램을 스스로 짓는 기계를 실었다. 아주 단순한 가상 컴퓨터에 「저장된 두 비트의 AND를 계산해 정해진 자리에 넣어라」 같은 과제를 주고, 64개 명령으로 된 프로그램을 무작위로 지어 돌려 본다. 성공하면 그 프로그램에 들어 있던 명령 하나하나를 자리마다 강화해, 다음번에 그 명령이 그 자리에 나올 확률을 높인다. 성공 한 번을 명령 64개에 똑같이 나눠 준 것이다. 기계는 아주 쉬운 과제 몇 개를 배웠지만, 민스키의 정리에 따르면 순전히 운에 맡겼을 때보다 1000배쯤 오래 걸렸고, 뒤이은 논문에서 여러 손질을 더한 판도 운보다 조금 못한 수준이었다. 민스키의 진단은 이랬다. 작동하는 프로그램의 공은 서브루틴처럼 함께 일하는 명령 묶음에만 줄 수 있고, 명령 하나하나를 따로 강화해서는 잘될 리가 없다.
1비트를 4,000토큰에
검증기가 궤적 끝에 주는 것은 맞음 아니면 틀림, 곧 1비트다. 4,000토큰짜리 궤적이라면 토큰 하나에 돌아가는 정보는 4,000분의 1비트다. GRPO는 이 1비트를 모든 토큰에 똑같이 나눠 준다. 이 균일 배분이 틀린 것은 아니다. 궤적 하나의 어드밴티지를 그 궤적의 모든 토큰에 곱하는 것은 베이스라인을 뺀 REINFORCE 추정이라 기대값은 치우치지 않는다. 문제는 흔들림(분산)이다. 결과와 무관한 스텝도 성공 궤적에서는 칭찬받고 실패 궤적에서는 벌을 받다가 기대값에서야 상쇄되므로, 궤적 몇 개로 하는 한 번의 업데이트에서는 그 몫이 흔들림으로 남는다. 궤적이 길수록 그렇다. 토큰마다 다른 몫을 주려는 방법들은 네 갈래로 나뉜다. 앞의 갈래가 모자란 곳에서 다음 갈래가 나온다.
② 정책 자신의 통계로 다시 나눈다. 가장 값싼 길은 새로 굴리지 않는 것이다. 엔트로피처럼 정책이 이미 내놓은 숫자로 어드밴티지를 토큰마다 다르게 싣는다. 대표적인 것이 엔트로피가 높은 소수의 분기 토큰(forking token — 결말을 가르는 토큰)에만 그래디언트를 주는 방법이다. 왕(Shenzhi Wang)과 동료들은 2025년 6월, 엔트로피가 가장 높은 20%의 토큰에만 그래디언트를 주고도 Qwen3-32B에서 모든 토큰에 줄 때보다 AIME’25 점수가 11.04점 높았다고 보고했다. 추가 비용이 없다. 대신 새 정보를 만들지는 못한다. 같은 1비트를 어디에 실을지 고쳐 정할 뿐이라, 정책이 망설이지 않고 틀린 토큰은 짚어 내지 못한다.
① 더 굴려서 정보를 산다. 새 정보가 필요하면 사야 한다. 궤적 중간의 한 지점에서 여러 번 이어 써 보고 검증기로 채점하면, 그 평균이 그 지점의 가치(여기서 이어 쓰면 결국 맞힐 확률)의 추정이 된다. 두 지점의 가치 차이가 그 사이 토큰들의 몫이다. VinePPO(Kazemnejad et al., arXiv:2410.01679, 2024년 10월)는 학습한 비평가 대신 이 몬테카를로 추정을 썼다. 추론 과제에서 가치망이 대안 스텝을 비교할 때 무작위 기준을 겨우 넘는다는 관찰이 출발점이었고, MATH와 GSM8K에서 PPO보다 짧은 벽시계 시간(최대 3배 빠르게)으로 앞섰다. 대가는 궤적 길이에 따라 늘어나는 추가 생성이다.
같은 앞부분에서 지점
(지금까지의 토큰으로 정해지는 상태)까지 온 뒤 네 번 이어 써 검증기로 채점했다(통과 1, 실패 0). 점선 상자 안의 평균이 그 지점의 가치의 추정이고, 두 지점에서 잰 평균의 차이가 그 사이 토큰들의 몫이다. 갈래 수와 채점 결과는 그림을 위한 예다.
③ 정답을 본 자기 자신에게 묻는다. 지점마다 여러 번 굴리는 값이 부담스러우면, 한 번의 계산으로 토큰마다 의견을 들을 수 있는 교사를 쓴다. 같은 모델에 정답이나 풀이를 보여 준 뒤, 그 모델이 학생 궤적의 토큰마다 매기는 분포를 교사로 쓴다. 신호가 궤적당 1비트에서 토큰마다 어휘 전체의 분포 차이로 바뀐다. 교사가 실제 생성 때는 없는 정보를 보고 있으므로, 그 정보에 기대는 버릇이 학생에게 새어 들어가지 않게 막는 것이 이 갈래의 과제다.
④ 실행해서 처음 어긋난 곳을 찾는다. 추정도 교사도 결국 짐작이다. 코드처럼 실행할 수 있으면 추정하지 않고 관찰할 수 있다. EGCA(Execution-Grounded Credit Assignment, arXiv:2603.16158, 2026년 3월)는 테스트에 실패한 프로그램과 미리 마련해 둔 참조 해답을 같은 계측으로 실행해, 중간 상태가 처음 달라지는 구간에만 어드밴티지를 주고 그 뒤 토큰은 가린다. 가장 긴 증가 부분수열 문제에서 > 를 >= 로 쓴 버그는 입력 [1, 3, 3, 5]에서 같은 값 3 두 개를 비교하는 순간 처음 갈라진다. 균일 배분이라면 이 비교 연산자는 상관없는 토큰 수백 개와 똑같은 크기의 벌을 받는다. DeepSeek-Coder-Instruct 6.7B를 APPS+로 학습해 HumanEval pass@1 82.1%를 얻었다(같은 조건의 GRPO 79.0%). 대신 실행할 수 있는 검사와 참조 해답이 있어야 한다.
| 갈래 | 무엇을 묻는가 | 새 정보를 들여오나 | 필요한 것 |
|---|---|---|---|
| ① 더 굴리기 | 이 지점에서 이어 쓰면 맞힐 확률은? | 예 — 추가 롤아웃의 채점 | 롤아웃 예산 |
| ② 다시 나누기 | 어느 토큰이 바뀔 여지가 있었나? | 아니오 — 몫만 옮긴다 | 없음 |
| ③ 정답을 본 자기 | 정답을 알았다면 뭐라고 썼을까? | 예 — 토큰마다 분포 | 정답이나 참조 풀이 |
| ④ 첫 어긋남 | 어디서 처음 어긋났나? | 예 — 실행 결과 | 실행 가능한 검사 + 참조 해답 |
②는 같은 1비트를 다르게 나누어 분산을 줄이려는 거래이고, 나머지는 비용(①)이나 치우침(③)이나 준비물(④)을 치르고 정보를 더 들여오는 거래다.
문제 6 — 표 3의 숫자를 잘못 옮긴 보고서
학생이 실험에서 잰 세 값 3.1, 4.2, 5.0을 보고서의 표 3에 옮기다가 4.2를 2.4로 잘못 적었다. 그 뒤의 평균 계산, 그래프, 결론 문단은 모두 표 3의 숫자를 그대로 가져다 썼다. 조교는 결론 문단을 읽다가 결론이 이상하다는 것을 알아챘다. (가) 표 3대로 계산한 평균과 바른 평균을 구하시오. (나) 감점 10점을 어디에 주어야 하는가? 평균을 계산한 줄은 잘못이 있는가?







정리 (가) 표 3대로 3.50, 바른 값 4.10. (나) 감점은 표 3에 몰아 준다. 평균 계산·그래프·결론은 받은 숫자로 바르게 계산했고, 표 3이 맞았다면 모두 맞았다. 결론은 잘못이 드러난 곳이지 생긴 곳이 아니다.
cd /tmp/claude-1000/-home-hakkyu-lameproof/1a964a37-7f78-4d59-8aaf-1efffbb1b316/scratchpad/s3_genrl_23 && echo ok noop
문제 7 — 처음 어긋난 곳, 가장 크게 떨어진 곳
테스트에 실패한 프로그램을 다섯 블록으로 나누고, 블록마다 그 지점에서 여러 번 이어 써서 「결국 통과할 확률」을 재었다. 시작 0.60 → 블록 1 뒤 0.62 → 블록 2 뒤 0.45 → 블록 3 뒤 0.43 → 블록 4 뒤 0.08 → 블록 5 뒤 0(실패). 참조 해답과 나란히 실행해 보니 중간 상태는 블록 2에서 처음 달라졌다(비교 연산자 >=). 블록 4는 코드 자체는 참조와 같지만, 블록 2가 만든 틀린 값을 받아 틀린 답을 돌려준다. (가) 블록마다 확률의 변화를 구하고, 가장 크게 떨어진 블록을 찾으시오. (나) 벌을 몰아 줄 블록은 어디인가? (다) 「처음 어긋난 곳」이 원인이 아닐 수 있는 경우를 하나 드시오.



>= 를 > 로 고친다고 해 봐요. 블록 4의 결과는 여전히 틀릴까요?








정리 (가) +0.02, −0.17, −0.02, −0.35, −0.08 (합 −0.60). 가장 크게 떨어진 곳은 블록 4다. (나) 벌은 처음 어긋난 블록 2에 몰아 준다. 결말 확률이 떨어진 자리는 결과가 드러난 자리일 뿐이고, 하류의 하락은 상류 실수에 딸려 온 것이다. EGCA의 비교에서 처음 어긋난 곳(82.1)이 마지막 어긋난 곳(80.2)·무작위(79.6)·균일(79.0)보다 나았다. (다) 빠뜨림 버그(어긋남이 빠뜨린 자리보다 뒤에 나타남), 스스로 고치는 자연어 풀이. 「처음 어긋난 곳 = 원인」은 한번 어긋나면 되돌아오지 않는 실행 상태에서 가장 잘 맞는다.