같은 모델에 같은 질문을 해도, 설정을 바꾸면 매번 비슷한 답을 하기도 하고 엉뚱한 답을 섞기도 한다. 이 차이는 확률표에서 토큰을 뽑는 단계에서 생긴다. 그러면 이 설정은 학습 때 계산하는 로그확률에도 끼어들까?
생성의 2단계: 뽑기
[2단계: 샘플링] 생성할 때는 1단계로 얻은 확률표에서 토큰 하나를 고른다. 가장 많이 쓰는 손잡이가 샘플링 온도(temperature)다. 모델이 표를 만들기 직전의 점수인 로짓(모든 토큰에 매긴, 아직 확률로 바꾸지 않은 점수)을 샘플링 온도 T 로 나눈 뒤 확률로 바꾼다(이 절의 T 는 응답 길이가 아니라 샘플링 온도).
숫자로 보자. 세 토큰에 모델이 준 확률이 [0.5, 0.3, 0.2]라고 하자. T=0.5 로 로짓을 나누는 것은 확률을 제곱해 합이 1이 되게 다시 나누는 것과 같아서 [0.658, 0.237, 0.105]가 된다. 높은 확률이 더 높아져 보수적으로 뽑는다. T=2 이면 확률의 제곱근을 다시 나눈 꼴이라 [0.415, 0.322, 0.263]으로 평탄해져 다양하게 뽑는다. 샘플링 온도 말고도 확률이 작은 토큰을 잘라 내는 설정(상위 몇 개만 남기는 top-k, 확률이 큰 순서로 더해 0.9가 될 때까지만 남기는 top-p 같은 것)이 이 단계에서 작동한다.
학습할 때는 2단계가 없다
DPO 학습은 이미 있는 응답의 확률을 조회할 뿐이라 뽑는 단계가 없다. 그래서 샘플링 설정은 DPO 학습 루프에 영향을 주지 않는다. 확률은 언제나 모델의 원래 분포(T=1)에서 조회한다. (데이터셋을 만들 때는 영향을 준다 — 다양한 응답을 얻으려 높은 T를 쓸 수 있다.)
ML에서: 온라인 RL에서는 샘플링이 돌아온다
PPO와 GRPO(비평가 대신 같은 프롬프트에 뽑은 응답 여러 개의 평균 점수를 기준으로 삼는 온라인 방법)는 학습 중에 직접 샘플링한다. 응답을 뽑는 쪽(생성 엔진)과 로그확률을 계산하는 쪽(학습기)은 서로 다른 프로그램으로 돌아가는 경우가 많다. 이때도 샘플링 설정은 끼어들지 않을까? 아래 문제 7에서 따져 본다.
문제 6 — 급식 설문
학교가 새 급식 메뉴에 찬성하는 학생의 비율을 알고 싶다. 전교생은 1학년 50%, 2학년 30%, 3학년 20%다. 설문지는 1학년 교실에서 많이 걷혀서, 응답자는 1학년 70%, 2학년 20%, 3학년 10%였다. 학년마다의 찬성률은 1학년 80%, 2학년 50%, 3학년 20%로 나왔다. (가) 응답자 전체의 찬성률은? (나) 전교생의 찬성률은? (다) 응답자 한 사람의 표에 학년마다 얼마를 곱해서 세면 (나)의 값을 되찾는가?
김민준
(가)는 0.7×0.8+0.2×0.5+0.1×0.2=0.68. 이게 발표할 숫자죠.
이서연
응답자에서도 전교생에서도 1학년이 제일 많고 3학년이 제일 적잖아. 순서가 같으니까 크게 다르지 않을 거야.
선생님
서연 학생, (나)를 전교생 비율로 직접 계산해 볼까요?
이서연
0.5×0.8+0.3×0.5+0.2×0.2=0.59. 0.68이랑 0.09나 차이 나네요. 순서가 같아도 비율 값이 다르면 결과가 달라져요.
김민준
(다)는 전교생 비율 ÷ 응답자 비율이니까 1학년 0.5/0.7≈0.71, 2학년 0.3/0.2=1.5, 3학년 0.2/0.1=2. 이걸 곱해서 세면 0.7×0.71×0.8+0.2×1.5×0.5+0.1×2×0.2=0.59 로 돌아와요.
선생님
그래요. 너무 많이 걷힌 학년은 덜 세고, 덜 걷힌 학년은 더 세는 거예요.
정리 (가) 0.68. (나) 0.59. (다) 1학년 0.71, 2학년 1.5, 3학년 2 (전교생 비율 ÷ 응답자 비율). 순서가 같다는 것만으로는 부족하다. 평균에는 비율의 값이 들어간다.
문제 7 — (킬러) 샘플러의 샘플링 온도
GRPO 학습 코드에서 응답은 생성 엔진이 샘플링 온도 0.7로 샘플링하고, 학습기는 로그확률을 원래 로짓(T=1)으로 계산한다. 어떤 위치에서 모델의 분포가 [0.6, 0.3, 0.1]이라 하자. (가) 생성 엔진은 세 토큰을 각각 어떤 확률로 뽑는가? (나) 이 샘플로 정책 그래디언트를 계산하면 무엇이 어긋나는가? (다) 고치는 방법 두 가지를 제시하시오.
김민준
이건 본문에 나왔어요. 샘플링 온도는 생성할 때만 쓰니까 학습에는 영향이 없어요.
선생님
본문이 그렇게 말한 건 어떤 학습이었죠?
김민준
DPO요… 데이터셋이 고정돼 있는. 근데 GRPO는 학습 중에 직접 뽑잖아요. 뽑는 데는 샘플링 온도가 쓰이고…
선생님
그럼 (가)부터 계산해 보죠.
김민준
로짓을 0.7로 나누는 건 확률을 1/0.7 제곱하고 다시 정규화하는 거니까… 돌려보면 [0.690, 0.256, 0.053]이에요.
이서연
근데 그래도 같은 정책 아니에요? 샘플링 온도는 단조 변환이라 순서가 안 바뀌잖아요. 가장 확률 높은 토큰은 여전히 첫 번째고.
선생님
서연 학생, 정책 그래디언트의 기대값은 무엇의 순서를 필요로 했나요, 아니면 값을 필요로 했나요?
이서연
∑yπθ(y)R(y)∇logπθ(y) 니까… 값 자체요. 순서만 같아서는 안 되고, 뽑히는 빈도가 정확히 πθ 여야 해요.
이서연
첫 토큰은 0.6이어야 하는데 0.69로 뽑히고, 셋째는 0.1이어야 하는데 0.053으로 뽑히네요. 이미 확률 높은 토큰이 실제보다 자주 뽑혀요. 순서를 보존한다고 분포가 같은 건 아니었어요. 급식 설문에서 학년 순서가 같다고 넘어갔던 것과 같은 실수예요.
선생님
그래요. 그러면 (나)는요?
김민준
샘플이 πθ 가 아니라 다른 분포에서 나왔으니까, 남이 만든 응답으로 정책 그래디언트를 계산한 거랑 같은 상황이에요. 그래디언트가 한쪽으로 치우쳐요. 흔한 답은 더 강화되고 드문 답은 덜 탐색되고.
선생님
(다)는요?
이서연
하나는 학습기도 로짓을 0.7로 나눠서 로그확률을 계산하는 거요. 그러면 우리가 최적화하는 정책이 "샘플링 온도 0.7을 씌운 정책"이 되고, 샘플이랑 일치해요.
김민준
다른 하나는 임포턴스 가중치(원하는 확률 ÷ 뽑힌 확률로 곱하는 수 — 신경망 파라미터가 아니다)요. 첫 토큰은 0.6/0.69≈0.87, 셋째는 0.1/0.053≈1.87 을 곱해서 보정하는. 급식 설문에서 학년마다 곱했던 수랑 같은 거네요.
선생님
둘 다 실제로 쓰는 방법이에요. 예컨대 바이트댄스가 공개한 RL 학습 도구 verl 은 학습기에서도 로짓을 샘플링 온도로 나눠요. 그리고 샘플링 온도를 맞춰도 생성 엔진과 학습기의 수치 차이만으로 비슷한 어긋남이 생겨서, 임포턴스 가중치로 따로 보정하기도 해요.
이서연
확률론 시간에 "단조 변환은 중앙값은 보존하지만 평균은 보존하지 않는다"를 배웠는데, 그거네요. 순서에 관한 성질만 보존되는 거예요.
김민준
실험 보고서 쓸 때 조교님이 "측정한 조건이랑 분석한 조건이 다르면 그건 다른 실험"이라고 했던 게 이거였구나.
정리 (가) [0.690,0.256,0.053]. (나) 샘플이 πθ 가 아닌 분포에서 나오므로 정책 그래디언트가 치우친다. "순서가 같다"는 충분하지 않다 — 기대값에는 확률 값이 들어간다. (다) ① 학습기에서도 로짓을 T로 나눠 샘플러와 같은 정책의 로그확률을 쓴다, ② 임포턴스 가중치 πθ/πsampler로 보정한다.