← 학습 경로

RL · 2026-09-28

LLM RL 총정리: 토큰의 선택에서 시스템의 순환까지

13편의 핵심 그림을 따라, 토큰 확률을 바꾸는 학습부터 경험과 가중치가 오가는 시스템까지 30분 흐름으로 연결합니다.

LLM RL은 모델이 만든 응답을 평가하고, 그 경험을 바탕으로 다음 선택을 바꾸는 과정입니다. 앞부분에서는 토큰 확률이 어떻게 바뀌는지, 뒷부분에서는 그 계산을 두 엔진이 어떻게 나누어 실행하는지 살펴봅니다.

이 글은 1~13편의 그림을 모아 약 30분 동안 아래로 내려가며 설명할 수 있게 구성했습니다. 앞의 학습 원리에 약 16분, 시스템에 약 12분을 쓰고 마무리에 2분을 남깁니다. 그림 번호는 원문 번호를 유지하며, 각 절의 링크에서 자세한 설명을 이어 읽을 수 있습니다.

LLM의 행동은 다음 토큰을 고르는 것이다

일반적인 RL에서 정책은 현재 상황을 보고 행동을 고릅니다. LLM에서는 프롬프트와 앞선 토큰이 상황이고, 다음 토큰의 선택이 행동입니다. 선택한 토큰은 다음 선택의 문맥에 들어갑니다.

미로에서는 현재 위치와 지도를 보고 이동을 선택해 위치가 바뀐다. LLM에서는 질문과 생성한 토큰을 보고 다음 토큰을 선택해 문맥이 늘어난다. 두 예시 모두 완료한 결과를 평가하고 경험과 보상으로 이후 정책을 학습한다.

미로에서는 이동한 위치가, LLM에서는 늘어난 토큰 문맥이 다음 선택의 입력이 됩니다. 이제 토큰 선택이 응답과 보상으로 이어지는 과정을 펼쳐 보겠습니다.

같은 LLM이 질문에서 x1을 선택하고, 질문에 x1을 붙인 문맥에서 x2를 선택한다. 선택이 반복되어 응답 2+3=5를 완성한다. 정답 검증을 거친 응답에 보상 +1을 한 번 부여한다.

여러 선택이 모여 응답이 됩니다. 정답 검사나 코드 실행처럼 결과를 검증할 수도 있고, 보상 모델이나 LLM 평가기로 점수를 매길 수도 있습니다. 이 예에서는 완성된 응답에 보상을 한 번 주지만, 학습할 때는 그 응답을 만든 토큰 선택들로 돌아갑니다.

1편: 토큰 생성과 보상

학습은 선택했던 토큰의 확률을 바꾼다

기록된 응답을 현재 모델로 다시 읽는다

생성한 응답이 u → b → d라면, 학습할 때는 이 기록을 고정해 둡니다. 새로운 답을 뽑는 대신 각 문맥에서 실제 선택했던 토큰에 현재 모델이 주는 확률을 계산합니다.

같은 Transformer가 세 예측 위치에서 P, P와 u, P와 u와 b를 문맥으로 받는다. 문맥 표현이 LM head와 softmax를 통과한 뒤 기록된 선택 u, b, d의 확률 0.5, 0.2, 0.4를 각각 꺼낸다.

u의 확률은 프롬프트 P에서, b의 확률은 P와 u에서 나옵니다. 그림의 세 위치는 같은 모델의 서로 다른 예측 위치입니다. 학습에서는 인과 마스크를 이용해 여러 위치의 확률을 한 순전파에서 계산할 수 있습니다.

어드밴티지가 방향을 주고, 역전파가 가중치를 바꾼다

어드밴티지 A는 결과가 비교 기준보다 얼마나 좋았는지를 나타내는 신호입니다. 가장 단순한 정책 그레디언트 예에서 손실은 −A × log p(선택 토큰 | 문맥)입니다. A가 양수면 그 선택을 더 자주 하도록, 음수면 덜 하도록 밀어주는 방향의 신호가 됩니다.

보상에서 구한 return 1에서 기준값 0.4를 빼 어드밴티지 +0.6을 얻는다. 기록된 문맥과 선택 토큰을 현재 모델에 넣어 로그확률을 계산한다. 고정한 어드밴티지와 로그확률로 손실을 계산하고 모델 파라미터에 역전파한다.

그림의 A는 +0.6이므로, 로그확률 z에 대한 손실은 −0.6z이고 그 미분은 −0.6입니다. 이 기울기가 LM head와 Transformer를 거쳐 가중치로 돌아갑니다. 확률표를 직접 고치는 것이 아니라 가중치를 바꾸고, 다음 계산에서 확률이 달라지는 것입니다. 여러 토큰이 같은 가중치를 공유하므로 각 토큰 확률이 신호대로 반드시 움직인다는 보장은 없습니다.

생성 당시 모델과 기준 모델은 역할이 다르다

같은 입력 P를 각 모델에 넣는다. 왼쪽은 current와 old가 선택 토큰 u에 준 확률 0.6과 0.5를 나누어 r=1.2를 구한다. 오른쪽은 current와 reference의 네 후보 확률분포를 KL로 비교한다. 두 current 상자는 같은 모델이다.

현재 모델은 학습 대상입니다. 생성 당시 모델과는 같은 토큰의 확률비를 구해 데이터 생성 이후의 변화를 반영합니다. PPO식 clipping은 유리한 방향으로 충분히 변한 선택을 같은 데이터로 계속 밀어붙이지 않게 합니다. 별도의 기준 모델과 비교하는 KL 항은 유지하려는 기준 정책에서 얼마나 멀어지는지 관리하며, 선택적으로 사용합니다.

2편: 확률 계산, 손실과 역전파

보상을 비교해야 올릴 확률과 내릴 확률이 정해진다

그룹의 다른 응답과 비교한다

같은 질문의 응답 네 개가 1, 1, 0, 0점을 받았다면, 평균은 0.5입니다. GRPO의 기본 예에서는 이 그룹 안에서 보상을 비교합니다. 아래는 표준편차로도 나누어 성공에 +1, 실패에 −1을 주는 예입니다.

같은 질문에서 생성한 네 응답의 보상은 1, 1, 0, 0이다. 평균 0.5와 모집단 표준편차 0.5로 정규화해 +1, +1, -1, -1을 구한다. 각 응답의 생성 토큰에는 그 응답의 공통 어드밴티지를 사용한다.

응답의 최종 보상만 쓰는 이 구성에서는 같은 응답의 생성 토큰에 같은 A를 전달합니다. 이것은 모든 토큰이 성공에 똑같이 기여했다는 뜻이 아닙니다. 보상이 모두 같다면 그룹 내부의 상대 보상 신호도 사라집니다.

그 문맥에서 예상했던 결과와 비교한다

Critic은 각 토큰을 고르기 전의 문맥에서 앞으로 받을 보상을 예상합니다. 실제 결과가 그 예상보다 좋았는지를 보면, 같은 최종 보상에서도 위치마다 다른 비교 신호를 얻을 수 있습니다.

문맥 P, P+u, P+u+b에서 critic의 예상은 0.2, 0.6, 0.4이다. 실제 return 1에서 각 예상을 빼면 토큰 u, b, d의 어드밴티지 A는 0.8, 0.4, 0.6이다. 각 A는 해당 토큰의 정책 손실에 들어간다.

그림은 끝까지 관측한 return에서 예측값을 빼는 단순한 예입니다. 실제 PPO에서는 TD 오차들을 조합하는 GAE 등을 사용할 수 있습니다. 그룹 비교는 다른 응답을, critic은 학습한 예측값을 비교 기준으로 사용합니다. 어떤 기준을 쓰느냐에 따라 추가 모델의 계산 비용과 기다려야 하는 경험도 달라집니다.

3편: 그룹 비교와 critic

교사는 학생이 만든 문맥에서 학습 신호를 준다

학생이 실제로 가는 경로에서 배운다

SFT는 주어진 답의 앞부분에서 다음 정답 토큰을 배우는 방식입니다. OPD는 학생이 직접 생성한 문맥에서 교사의 신호를 얻습니다. 학생이 정답 경로와 다른 선택을 했더라도, 그 이후의 문맥에서 배울 수 있습니다.

SFT는 주어진 답 u, a, c의 문맥에서 다음 목표 토큰을 학습한다. OPD는 학생이 생성한 u, b, d의 문맥에서 교사의 토큰 확률을 읽는다. 세 번째 평가 문맥도 학생 경로인 P+u+b를 사용한다.

같은 문맥에서 같은 토큰의 확률을 비교한다

문맥 P+u에서 두 모델을 실행해 선택 토큰 b의 학생 확률 0.2와 교사 확률 0.4를 비교하면 +0.693이다. 문맥 P+u+b에서 토큰 d의 학생 확률 0.4와 교사 확률 0.2를 비교하면 -0.693이다. 신호용 확률은 업데이트 중 고정한다.

학생이 선택한 b에 학생은 0.2, 교사는 0.4를 줬다면, 로그확률 차이는 ln(0.4/0.2)로 양수입니다. 반대라면 음수가 됩니다. 여기서 소개한 OPD 구성은 이 교사 신호를 토큰별 학습 신호로 사용합니다.

과제 보상에서 만든 어드밴티지에 교사 신호를 더할 수도 있고, 과제 보상 없이 교사 신호만 사용할 수도 있습니다. Critic은 미래의 보상을 예상하고, 교사는 다음 토큰 분포를 제공합니다. 신호의 출처는 달라도 학생 가중치를 바꾸는 정책 업데이트로 연결됩니다.

4편: 학생 문맥과 교사 신호

RL과 OPD의 순서는 학습 목적에 따라 달라진다

배울 만한 경험을 만들 수 있는 출발점이 필요하다

보상으로 좋은 선택을 강화하려면, 제한된 생성 예산 안에서 유용한 차이를 관측할 기회가 있어야 합니다. 아래의 그룹 비교 예에서는 모두 실패한 그룹보다 성공과 실패가 섞인 그룹에서 과제 보상 신호를 얻을 수 있습니다.

같은 질문에 여덟 응답을 생성한다. 모두 보상 0이면 기본 GRPO의 그룹 상대 신호가 0이다. 보상 0과 1이 섞이면 평균을 기준으로 성공과 실패의 생성 확률을 다르게 조절할 신호가 생긴다. 가상 표본이며 측정 결과가 아니다.

PT는 언어와 지식의 기반을, SFT는 시범을 통한 출발점을 만들 수 있습니다. OPD도 후속 RL에 앞서 학생의 행동 분포를 개선하는 데 사용할 수 있습니다. 그림은 그룹 보상이 모두 같은 한 번의 사례이며, 모든 RL이 성공 응답 없이는 학습할 수 없다는 뜻은 아닙니다.

전문 능력을 키우고 하나의 학생으로 모은다

DeepSeek V4의 흐름은 분야별 SFT·RL로 전문 교사를 준비하고, 여러 교사의 신호로 하나의 학생을 학습하는 사례입니다. 보상으로 능력을 발전시키는 과정과, 그 능력을 학생에게 전달하는 과정을 연결합니다.

사전학습 모델에서 분야별 SFT와 RL로 전문 교사를 준비한다. 전문 교사들은 학생 문맥의 확률 정보를 제공하고 OPD가 하나의 학생을 학습한다. 실선은 모델 학습 진행이고 점선은 교사 정보 전달이다.

능력 통합과 다음 학습의 준비는 다른 목적이다

한 경로는 교사의 RL 이후 학생 OPD로 능력을 전달하고 학생을 평가한다. 다른 경로는 학생이 먼저 OPD를 수행한 뒤 같은 학생을 과제 보상으로 RL 학습한다. 두 경로에서 RL을 받는 모델이 다르다.

RL 뒤에 OPD를 두면 교사의 능력을 통합할 수 있고, 학생의 RL 앞에 OPD를 두면 학습 출발점을 준비할 수 있습니다.

교사와 학생이 시작할 문맥을 함께 고른다

MiMo V2.6의 MOPD²(Multi-Prefix Multi-Teacher On-Policy Distillation)는 여러 교사를 활용하면서, 학생이 생성을 시작할 대화 문맥도 고릅니다. 질문부터 전체 rollout을 만드는 경로와, 교사 rollout이나 SFT 데이터의 중간 이력에서 새 한 턴을 만드는 경로를 함께 사용합니다.

MiMo MOPD²는 질문부터 학생이 전체 rollout을 생성하는 경로와 P와 원본 2턴인 h1에서 새 3턴 y1을, P와 원본 3턴인 h2에서 새 4턴 y2를 독립적으로 생성하는 경로를 사용한다. 각 경로의 지정 교사는 학생과 같은 문맥을 조건으로 확률 정보를 주고 학생이 업데이트된다.

예를 들어 P + 원본 2턴에서 학생이 새 3턴을, P + 원본 3턴에서 새 4턴을 생성합니다. 두 시작점은 독립적이며, 앞에서 학생이 만든 새 3턴을 다음 시작점에 붙이는 것이 아닙니다. 지정된 교사는 학생과 같은 문맥을 보고 확률 정보를 제공합니다. 학생은 원본 답을 그대로 따라 쓰는 대신, 준비된 여러 문맥에서 직접 생성하며 배웁니다.

학습 순서뿐 아니라 누구에게, 어떤 문맥에서 배우게 할 것인가도 설계할 수 있다는 사례입니다. MiMo V2.6 §5.6

5편: RL과 OPD를 조합하는 학습 전략과 출처

경험은 학습기로, 새 가중치는 추론기로 이동한다

지금까지 본 계산을 실행 시스템에 놓아보겠습니다. 추론 엔진은 응답과 도구 실행 경험을 만들고, 학습 엔진은 그 기록으로 확률과 손실을 계산해 가중치를 갱신합니다.

Miles 논문의 RL 루프. 왼쪽 SGLang 추론 엔진과 오른쪽 학습 엔진 사이로 trajectory가 data buffer를 거쳐 전달되고, 아래 weight update 경로로 새 가중치가 추론 쪽으로 돌아간다.

경험에는 응답 문자열뿐 아니라 토큰 ID, 생성 당시 로그확률, 보상, 학습할 위치를 나타내는 mask, 정책 버전 등이 필요합니다. 학습한 가중치는 반대 방향으로 전달됩니다. Miles·Slime·NeMo-RL 같은 프레임워크를 볼 때도 경험 전달과 weight sync라는 두 화살표를 기준으로 구조를 읽을 수 있습니다.

6편: 두 엔진의 시스템 지도 · 그림 출처: Miles v0.1, Figure 1

생성했던 계산을 학습에서도 최대한 맞춘다

토큰과 전문가 선택을 이어받는다

문자열로 바꾼 응답을 다시 토큰화하면 원래와 다른 토큰 ID가 나올 수 있습니다. TITO는 생성한 토큰 ID를 그대로 전달해 이 차이를 피합니다.

문자열 왕복 경로에서는 생성 토큰 101,202가 문자열 AB를 거쳐 토큰 303으로 바뀐다. TITO 경로에서는 101,202를 그대로 학습에 전달한다. 토큰 번호는 교육용 예다.

MoE에서는 같은 토큰이라도 다른 전문가를 고르면 계산 경로가 바뀝니다. R3는 생성 때 선택한 전문가 ID를 기록해 학습에서 재사용합니다. 전문가의 가중치는 현재 학습 가중치를 사용합니다.

추론 엔진의 router가 E1과 E2를 선택한다. 전문가 ID 1,2를 경험과 함께 학습 엔진에 전달하고, 학습에서도 E1과 E2를 실행한다. E3는 선택되지 않는다.

양자화는 비용과 계산의 일치를 함께 바꾼다

왼쪽 구성은 공통 양자화 규약을 적용해 학습 순전파와 추론이 같은 양자화 값을 사용한다. 오른쪽 구성은 학습 순전파는 BF16 값을 사용하고 추론만 FP8로 양자화한다.

양쪽 순전파에 같은 양자화 규약을 적용하거나, 학습은 BF16으로 유지하고 추론은 FP8로 실행할 수 있습니다. 후자는 추론 비용을 줄이지만 계산 차이를 남깁니다. Miles v0.1의 NVFP4 경로는 학습 순전파까지 같은 양자화에 맞추는 구성이며, BF16 학습과의 조합으로 설명하면 안 됩니다.

7편: TITO와 R3 · 8편: 양자화 구성

맞춰도 남는 차이는 확률비로 보정한다

같은 가중치라도 연산 순서와 커널, 정밀도 등의 차이로 계산 결과가 달라질 수 있습니다. 여기에 학습으로 가중치가 바뀌는 차이도 더해집니다.

같은 토큰의 확률이 생성 엔진 v1에서는 0.50, 학습 엔진 v1에서는 0.52, 학습 엔진 v2에서는 0.60이다. 앞의 차이는 엔진 차이, 뒤의 차이는 가중치 업데이트이며 현재 학습 확률을 생성 확률로 나누면 1.2이다.

그림의 0.50 → 0.52는 엔진 차이, 0.52 → 0.60은 모델 업데이트 차이입니다. 현재 확률과 실제 생성 확률의 비는 0.60/0.50 = 1.2입니다. 이 비를 통해 관측한 선택을 학습에 반영할 비중을 조절합니다. 보정이 두 엔진의 계산을 같게 만드는 것은 아니며, clipping이나 비중 제한은 불안정한 갱신을 관리하는 별도 선택입니다.

9편: 엔진 차이와 확률 보정

생성과 학습을 겹치면 경험이 오래될 수 있다

생성이 모두 끝날 때까지 기다린 뒤 학습하면 한쪽 자원이 쉬는 구간이 생깁니다. 비동기 실행은 준비된 경험을 학습하는 동안 다음 경험을 생성합니다.

동기 실행은 G1 생성, G1 학습과 sync를 마친 뒤 G2를 생성한다. 비동기 실행은 G1 학습 중 G2를 생성하고 sync 동안만 생성을 잠시 멈춘다. 데이터가 부족하면 학습 대기는 여전히 남는다.

학습 가중치는 optimizer update마다 바뀌지만, 추론 엔진의 배포 버전은 weight sync가 적용될 때 바뀝니다. Miles에서 다룬 staleness는 배포 버전과 경험의 생성 버전을 비교하는 규약입니다. 학습 스텝 수와 자동으로 같지 않습니다.

한 경험은 v3으로 시작해 sync 후 v4로 이어 생성한다. 완료 시 가장 오래된 생성 버전 v3과 현재 v4의 간격은 1이다. 버퍼에서 기다리는 동안 v5가 배포되면 꺼낼 때 간격은 2가 된다.

경험은 생성이 오래 걸리는 동안에도, 완성된 뒤 버퍼에서 기다리는 동안에도 오래될 수 있습니다. 그림은 중간 sync 뒤 생성을 이어갈 수 있는 구성의 예입니다. 기다림을 줄이는 이득과, 오래된 경험을 보정하거나 제외하는 비용을 함께 봐야 합니다.

10편: 비동기 실행과 staleness

추론 최적화는 에이전트 실행 전체로 넓어진다

계산을 재사용하되 대기 시간도 본다

같은 prefix의 KV 캐시를 재사용하면 입력 계산을 줄일 수 있습니다. 하지만 캐시가 있는 엔진에 대기열이 길다면 다른 엔진이 먼저 끝낼 수도 있습니다.

공통 입력 P에서 응답 a와 b가 갈라지며 공유 가능한 것은 일치하는 prefix P의 KV이다. 엔진 A에는 P의 캐시가 있지만 대기열이 길고, 엔진 B에는 캐시가 없지만 대기열이 짧다. 라우터는 재계산 비용과 대기를 함께 고려한다.

추론 최적화에는 배치의 빈자리를 채우는 방법, 후보 토큰을 한꺼번에 검증하는 speculative decoding, MTP로 후보를 만드는 방법도 있습니다. 각각 반복 계산, 자원 공백, 순차 생성 비용을 줄이려는 접근입니다.

모델 호출이 끝나도 작업은 계속된다

프로그램 P의 코드 작성과 수정은 Reasoning, 테스트와 재시험은 Acting으로 이어진다. GPU 계산과 도구 실행은 다른 구간에서 발생하며, 이 예의 KV, 파일, 실행 환경은 호출 사이에도 유지된다. 작업 종료 때 자원을 회수한다.

에이전트가 도구 결과를 기다리면 GPU 연산은 멈춰도 KV와 도구 환경은 남아 있을 수 있습니다. ThunderAgent는 프로그램 상태를 보고 실행·일시중지·복원을 결정합니다. 별도의 CPU 도구 서버에서도 환경 준비, 실행 대기와 자원 회수가 완료 시간을 좌우합니다. 최적화의 범위가 토큰 생성에서 작업 전체의 수명으로 넓어집니다.

11편: 추론 최적화 · 12편: 에이전트 전체의 스케줄링

새 가중치로 생성을 재개하면 순환이 이어진다

마지막은 weight sync입니다. 가중치를 추론 측 분할과 형식에 맞춰 준비하고, 통신 환경에 맞는 경로로 전송하고, 새 정책을 사용할 준비가 끝나면 재개합니다.

Broadcast는 공통 GPU 통신망의 기본 경로, P2P는 여러 노드의 병렬 전송을 활용하는 경로, disk-delta는 공유 저장소를 이용하는 경로입니다. 어느 방식이 유리한지는 변환·전송·적용 비용을 함께 비교해야 합니다.

Trainer가 v21을 준비하고 A와 B에 전송한다. 복사가 끝나도 GPU별 재양자화가 남으며 A가 먼저 준비되고 B가 나중에 준비된다. 갱신에 참여한 둘의 준비를 확인한 뒤 v21 새 요청을 허용한다. 기존 요청과 이전 KV의 처리 규칙을 전환 전에 정한다.

그림처럼 재양자화가 필요한 모델은 복사가 끝나도 변환을 기다려야 합니다. 같은 추론 실행에 참여하는 GPU의 준비와 기존 요청·KV 처리가 끝나야 일관된 새 정책으로 생성할 수 있습니다.

토큰 선택 → 평가와 학습 신호 → 손실과 가중치 갱신 → 새 가중치 전달 → 다음 토큰 선택. 앞부분에서 본 학습 원리와 뒷부분에서 본 시스템은 이 하나의 순환을 함께 완성합니다.

13편: 가중치 준비, 전송과 재개

목차로 돌아가기 ↑