2. VPG — 미분할 수 없는 점수를 올리는 법

자주 하는 실수와 요약

자주 하는 실수
실수 나온 문제 바로잡는 법
총점이 높으니 문항 하나하나도 맞았겠다고 봄, 응답의 첫 토큰이 응답의 점수를 그대로 받았다고 봄 1, 2 끝에 한 번 받는 점수로는 문항·토큰 하나의 몫을 떼어 낼 수 없다. 같은 토큰으로 시작한 응답도 점수가 다를 수 있다
보상이 토큰(행동)마다 하나씩 붙는다고 봄 2 언어모델은 보통 응답이 끝난 뒤 한 번 점수를 받는다. 중간 토큰의 보상은 0이다
음수 점수를 받은 답이 뽑히면 맞는 답의 확률까지 내려간다고 봄 3 뽑힌 답의 로그확률을 내리면, 확률 합이 1이라 다른 답의 확률은 오른다
합을 맞추려고 나머지를 똑같이 깎음 4 비율을 지키려면 나머지는 원래 몫에 비례해 준다. 소프트맥스도 그렇게 움직인다
한 번도 안 뽑힌 답이 벌을 받는다고 봄 5 소프트맥스 그래디언트의 성분 합은 0이다. 뽑힌 답이 오른 만큼 나머지 몫이 줄 뿐이다
보상이 모두 양수면 모든 답의 확률이 오른다고 봄 6 확률 합은 1이다. 모든 보상이 같으면 정확한 그래디언트는 0이고, 샘플 하나의 추정치만 크게 흔들린다
loss = -R * logprob(y) 값의 감소를 성능 향상으로 봄 7 이 loss는 한 점에서 기울기만 맞춘 대리 손실이다. 성능은 평균 보상을 따로 기록해 본다
남이 만든 응답으로도 같은 식을 쓸 수 있다고 봄 7 로그 미분 트릭은 y∼πθ\textcolor{#1c9c60}{y} \sim \textcolor{#1565c0}{\pi_\theta} 일 때만 성립한다. 다른 분포의 샘플은 확률 비율로 보정해야 한다
요약

정답 대신 점수만 있을 때의 목표는 내가 뽑는 응답의 평균 점수 J(θ)\textcolor{#d62728}{J}(\theta) 를 올리는 것이다. 언어모델은 보통 응답이 끝난 뒤에야 점수를 한 번 받으므로, 그 점수로는 토큰 하나의 몫을 떼어 낼 수 없다. 점수도 샘플링도 미분할 수 없지만, 로그 미분 트릭으로 ∇J=Ey∼πθ[R ∇log⁡πθ(y)]\nabla \textcolor{#d62728}{J} = \mathbb{E}_{\textcolor{#1c9c60}{y} \sim \textcolor{#1565c0}{\pi_\theta}}[\textcolor{#d9670b}{R}\,\nabla \log \textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y})] 를 얻는다. 점수는 미분되지 않는 가중치이고, 미분하는 것은 SFT와 같은 로그확률뿐이며, 응답은 지금의 모델이 뽑아야 한다. 응답을 토큰으로 쪼개면 가중치는 토큰마다의 빈칸 Φt\textcolor{#8e44ad}{\Phi_t} 가 되고, VPG는 그 빈칸을 응답 전체의 점수 R\textcolor{#d9670b}{R} 로 채운다. 소프트맥스 정책에서는 현재 평균 J\textcolor{#d62728}{J} 보다 나은 답이 오르고, 모든 보상에 같은 상수를 더해도 정확한 그래디언트는 그대로다. 다만 응답 공간이 너무 커서 기대값은 샘플로 추정해야 하고, 그 추정치는 흔들린다.