증명 전체보다 수식의 기호가 코드에서 어떤 tensor인가에 초점을 맞춥니다.
shape의 첫 축은 보통 batch B, 두 번째는 time/token T입니다.
이산 행동의 확률은
sample 평균은 기대값의 추정치이며, baseline과 더 많은 rollout은 gradient의
분산을 낮추는 데 쓰입니다. torch.multinomial은 확률에 따른 표본을,
argmax는 가장 큰 값 하나를 선택합니다.
긴 sequence 확률의 곱은 매우 작아지므로 합으로 바꿉니다.
prompt와 padding은 합에서 제외합니다. 구현의 [B,T] log-prob에 bool
action_mask를 곱한 뒤, 문서에 적힌 reduction으로 줄입니다.
entropy가 낮아지면 policy가 한 행동에 몰렸다는 신호일 수 있지만, 무조건 나쁜 것은 아닙니다. task 성능, KL, 길이와 함께 봅니다.
log π_policy - log π_reference를 policy rollout에서 평균한 추정치라 finite
sample에서 음수가 나올 수 있습니다. 진짜 분포 KL이 음수라는 뜻이 아닙니다.
gradient descent는 loss.backward()가 graph를 따라 .grad를 채웁니다.
- current policy: gradient가 흘러야 함
- advantage/return target: 보통
detach - old policy, reference policy, reward model: policy update 동안 frozen
- value model: value loss로만 update
이 소유권을 테스트하지 않으면 loss 값은 맞아도 엉뚱한 model이 학습될 수 있습니다.
TD target은 truncated는 task terminal과 다르므로 bootstrap 규칙을 명시해야 합니다.
최대화식을 최소화 loss로 구현하면 앞에 음수가 붙습니다.
-(log_prob * advantage.detach()).mean()의 부호가 핵심입니다.
GAE는 TD residual
old_log_probs.detach()가 빠지면 old policy까지 움직입니다. 양수·음수 advantage에서
min과 clipping의 동작이 다르므로 hand-calculation test가 필요합니다.
chosen/rejected response의 policy-reference log-ratio 차이를
DPO는 고정 preference data의 offline objective입니다. online rollout RL과 같다고 부르지 않습니다.
GRPO는 한 prompt의 group reward를 평균·표준편차로 정규화해 advantage를 만듭니다.
모든 reward가 같으면 학습 신호가 0입니다. DAPO는 비대칭 Clip-Higher, informative group을 찾는 bounded dynamic sampling, global token reduction, soft overlong shaping을 결합합니다. 각 구성요소는 DAPO 구현 노트에서 독립적으로 끄고 검사합니다.
- loss tensor의 shape를 적었는가?
- prompt, response, EOS, padding, tool output mask를 구분했는가?
- sequence 평균과 global token 평균 중 무엇인지 적었는가?
- gradient가 흐를 model과 끊길 model을 테스트했는가?
- 빈 mask, zero-variance group, NaN/Inf를 거부하는가?
Sources: sutton-barto-rl2, gae-2015, ppo-2017, dpo-2023,
deepseekmath-grpo-2024, dapo-2025. 전체 metadata는
출처 원장에 있습니다.