앞 절의 표에서 정답이 이긴 잣대는 하나뿐이었다. 토큰당 평균이다. 그렇다면 합을 아예 평균으로 바꾸면 길이 편향은 사라질까? 이 물음은 선호 학습보다 먼저, 여러 후보 문장 가운데 하나를 골라 내놓아야 하는 기계번역에서 나왔다.
역사: 빈 번역이 가장 그럴듯한 번역이었다
신경망 번역기는 문장을 옮길 때 빔 서치(beam search — 후보 번역 몇 개만 남겨 가며 한 토큰씩 늘려 가는 탐색. 남기는 후보 수가 빔 크기)로 답을 고른다. 후보의 점수는 토큰 로그확률의 합이었다. 2016년 구글 번역 팀은 새 신경망 번역기를 내놓으며, 이 점수로는 한 단계마다 음수 로그확률이 더해져 긴 문장일수록 점수가 낮아지므로 평균적으로 짧은 번역을 편애하게 된다고 적었다. 그들은 처음에 점수를 길이로 그냥 나눴다가, 길이의 α 제곱(0<α<1)으로 나누는 편이 낫다는 것을 찾았다. 평가용 데이터에서 맞춘 α 는 대개 0.6~0.7이었다.
2017년 존스 홉킨스 대학의 코엔(Philipp Koehn)과 놀스(Rebecca Knowles)는 이상한 일을 보고했다. 빔을 넓혀 후보를 더 많이 살펴보면 번역이 좋아져야 할 텐데, 여덟 언어 쌍 거의 모두에서 알맞은 빔 크기를 넘기면 오히려 번역이 나빠졌다. 주된 원인은 넓은 빔이 더 짧은 번역을 찾아낸다는 것이었다. 점수를 길이로 나누면 증상이 조금 덜했다.
2019년 케임브리지 대학의 슈탈베르크(Felix Stahlberg)와 번(Bill Byrne)은 끝까지 가 보았다. 후보를 추리지 않고 모델이 매기는 점수가 가장 높은 번역을 빠짐없이 찾아내는 탐색을 만들어, 영어→독일어 트랜스포머(요즘 언어모델의 뼈대가 된 신경망 구조) 번역기의 시험 문장 2,169개에 돌렸다. 문장의 51.8%에서 점수가 가장 높은 번역은 빈 문장, 곧 끝을 알리는 토큰 하나였다. 빔 서치가 그럭저럭 쓸 만한 번역을 내놓은 것은 최고점을 찾는 데 실패한 덕분이었다. 원문이 40토큰보다 길면 거의 모든 문장에서 빈 번역이 최고점이었다.
슈탈베르크와 번의 영어→독일어 트랜스포머 번역기 결과를 다시 그렸다. 위는 내놓은 번역의 길이를 정답 번역 길이로 나눈 값, 아래는 빈 번역을 내놓은 문장의 비율이다. 그리디 디코딩은 한 단계마다 확률이 가장 높은 토큰 하나만 골라 이어 가는 방법, 빔 10개는 후보를 열 개씩 남기는 빔 서치다. 점수를 가장 잘 찾아낸 탐색이 가장 나쁜 번역을 냈다.
평균으로 나누기 — SimPO
선호 학습에서도 같은 선택이 나왔다. 2024년 멍(Yu Meng)과 동료들의 SimPO(Simple Preference Optimization, 단순한 선호 최적화)는 보상을 토큰당 평균 로그확률로 바꾼다. 번역기처럼 길이의 몇 제곱이 아니라 길이 그대로 나눈다.
논문이 한 설정에서 쓴 값은 β=10, γ=3 이다. 앞 절의 두 응답(12토큰 × 0.8, 4토큰 × 0.6)에 넣으면 보상은 10log0.8=−2.23 과 10log0.6=−5.11 이다. 정답이 이미 2.88 앞서 있다. γ 가 없으면 손실은 −logσ(2.88)=0.055 로 거의 할 일이 없지만, γ=3 이면 −logσ(−0.12)=0.76 이다. 이기고 있어도 3만큼 앞서기 전에는 더 벌리라고 민다.
아래 위젯에서는 선호 응답 끝에 토큰을 덧붙일 수 있다. 덧붙인 토큰이 합과 평균을 각각 어느 쪽으로 움직이는지 보라. 단추는 아래 문제 5의 값을 불러온다.
ML에서: 생성할 때 쓰는 잣대와 맞춘다
SimPO 논문이 평균을 고른 까닭은 둘이다. 하나는 생성과 맞추기다. 번역기의 빔 서치처럼 여러 후보 가운데 하나를 고를 때는 흔히 길이로 나눈 평균 로그확률, 곧 토큰당 우도(likelihood — 모델이 그 토큰들에 준 확률)로 순위를 매긴다. 보상이 바로 그 양이면 학습이 벌려 놓은 차이가 생성할 때의 순위에 그대로 나타난다. DPO의 보상(레퍼런스 대비 비율의 합)은 그렇지 않다. 저자들이 DPO로 학습한 모델을 재 보니, 학습 데이터의 선호 쌍 가운데 선호 응답의 평균 로그확률이 더 높은 쌍은 절반쯤뿐이었다. 다른 하나는 나누기를 뺐을 때 생긴 탈이다. 길이로 나누지 않은 SimPO는 길고 같은 말을 되풀이하는 답을 냈다.
나누지 않고 벌점으로 막는 길도 있다. 2024년 스탠퍼드의 라이언 박(Ryan Park)과 동료들이 낸 R-DPO(Regularized DPO — 논문은 「길이 규제를 더한 DPO(length-regularized DPO)」라 부르고 손실에 R-DPO 라는 이름을 붙였다)는 레퍼런스와 합을 그대로 두고, 선호 응답이 비선호 응답보다 긴 만큼 마진을 이미 벌린 것으로 쳐 준다. 그러면 선호 응답이 긴 쌍은 덜 밀리고, 선호 응답이 짧은 쌍은 더 밀린다.
문제 4 — 쉬운 과목으로 평점 올리기
전공 과목 12학점의 평점 평균이 3.0인 학생이 있다. 거의 틀림없이 A+(4.5)가 나오는 1학점짜리 교양 과목을 더 들어 평균을 올리려 한다. (가) 교양 과목을 몇 개 더 들어야 평균이 3.5가 되는가? (나) 그동안 이 학생의 전공 실력은 달라졌는가?
김민준
평점 평균은 학점으로 나누니까 과목을 더 들어도 공정하죠. 평균을 올리려면 결국 전공을 잘 봐야 해요.
선생님
민준 학생, 교양을 한 과목만 더 들으면 평균이 얼마가 되죠?
김민준
(12×3.0+4.5)/13=3.12 요.
김민준
전공은 그대로인데 올랐네요. 3.5가 되려면 (36+4.5k)/(12+k)=3.5 에서 k=6, 여섯 과목이에요.
이서연
분모를 늘리면서 쉬운 점수를 섞었을 뿐이야. (나)는 "그대로"지.
정리 (가) (36+4.5k)/(12+k)=3.5 에서 k=6. (나) 전공 실력은 그대로다. 평균은 거의 확실한 항목을 더해 분모를 늘리면 오른다.
문제 5 — 평균을 속이는 법
평균 로그확률로 응답의 순위를 매긴다고 하자(빔 서치가 후보를 고를 때, 그리고 SimPO가 보상을 매길 때 쓰는 양이다). 12토큰 × 0.8 응답 끝에 “네, 알겠습니다. 감사합니다.” 같은 인사말을 붙여, 모델이 거의 확신하는(토큰당 확률 0.99) 토큰 20개가 더해졌다. 평균 로그확률은 어떻게 변하는가? 평균이 길이 문제를 완전히 해결했다고 할 수 있는가? 위젯의 「문제 5」 단추로 불러와 풀이와 견주어 보라.
이서연
평균이면 길이가 상관없으니까, 인사말을 붙여도 점수는 그대로겠지. 내용이 안 바뀌었잖아.
김민준
잠깐, 아까 교양 과목이랑 같은 수법 아니야? 돌려봤어. (12log0.8+20log0.99)/32=−0.090. 원래 log0.8=−0.223 이었으니 확 좋아졌어.
이서연
내용은 하나도 안 바뀌었는데 점수가 두 배 넘게 좋아졌네. 쉬운 토큰으로 분모를 늘린 거구나.
선생님
합의 잣대였다면 인사말을 붙인 응답은 어떻게 됐을까요?
이서연
합은 20log0.99=−0.20 만큼 더 나빠져요. 합에서는 붙이면 손해고 평균에서는 붙이면 이득이에요. 방향이 거꾸로네요.
선생님
그래요. 평균은 “길면 불리한” 문제를 없앤 대신 “뻔한 토큰으로 희석하면 유리한” 문제를 새로 열어요. 잣대를 바꾸면 빈틈의 모양도 바뀌어요.
이서연
해석학에서 배운 체자로 평균이 생각나요. 진동하는 수열도 평균을 내면 수렴하는 것처럼 보이지만, 원래 수열이 수렴한다는 뜻은 아니잖아요. 평균이라는 잣대가 무엇을 가리는지를 봐야 하네요.
정리 평균이 −0.223→−0.090 으로 좋아진다(합으로는 −0.20 만큼 나빠진다). 평균은 길이 불이익을 없애지만, 확신이 높은 뻔한 토큰으로 희석하는 새로운 빈틈을 연다. 잣대를 바꾸면 점수만 올리는 꼼수(리워드 해킹)의 모양도 바뀐다.