Logits, Odds 그리고 Log-Odds
요약
언어 모델의 출력값인 Logit이 왜 Log-odds를 의미하는지 수학적으로 설명합니다. Logit의 절대값은 의미가 없으며, 두 Logit의 차이가 토큰 간의 상대적 발생 확률(Odds Ratio)을 결정한다는 핵심 원리를 다룹니다.
핵심 포인트
- Logit은 Softmax 적용 전의 가공되지 않은 점수이며 경계가 없음
- Logit은 Log-odds를 의미하며 확률 공간을 산술 연산에 적합하게 확장함
- Logit의 절대값은 임의적이며, 두 Logit의 차이가 상대적 확률 차이를 나타냄
- Logit bias를 더하는 것은 해당 토큰의 Odds에 exp(B)를 곱하는 것과 같음
Logit(로짓)은 모델이 어떤 정규화 과정을 거치기 전에 토큰에 대해 생성하는 가공되지 않은 점수(raw score)입니다. 이 이름은 단순히 장식적인 것이 아닙니다. Logit은 Log-odds(로그 오즈)이며, 이를 문자 그대로 받아들이면 왜 개별 Logit 값은 아무런 정보도 주지 못하는 반면, 두 Logit의 차이는 한 토큰이 다른 토큰보다 얼마나 더 발생할 가능성이 높은지를 정확하게 알려주는지 설명됩니다.
Logit이란 무엇이며, 무엇이 아닌가
언어 모델의 마지막 레이어는 어휘 사전(vocabulary)의 각 항목당 하나의 실수(real number)를 생성합니다. 128,000개의 토큰으로 구성된 어휘 사전의 경우, 각 위치마다 128,000개의 숫자가 생성되며, 일반적으로 대략 -20에서 +20 사이의 범위를 가집니다. 이 값들은 경계가 없으며(unbounded), 음수가 될 수 있고, 합계가 특정 값을 이루지도 않습니다. Softmax가 이 값들을 확률(probabilities)로 변환하기 전까지, 이들은 그저 점수일 뿐입니다.
| 항목 | 설명 |
|---|---|
| logit | Softmax 적용 전의 가공되지 않은 점수. 경계가 없으며 부호에 제한이 없음. 동일한 위치에 있는 다른 Logit들과의 상대적 관계에서만 의미를 가짐. |
| ... |
Logit은 Log-odds를 의미하며, 이는 문자 그대로의 의미입니다
두 가지 결과(two-outcome)가 존재하는 경우, 그 관계는 정확하며 역산이 가능합니다:
logit(p) = ln( p / (1 - p) )
sigmoid(z) = 1 / (1 + exp(-z))
...
표가 보여주는 두 가지 사실이 있습니다. 스케일은 대칭적입니다: p = 0.9는 +2.197을 주고, p = 0.1은 -2.197을 줍니다. 그리고 양 끝단 근처에서는 엄청나게 확장됩니다. 즉, 0.99에서 0.999까지의 거리는 Logit 공간에서 2.3이며, 이는 0.5에서 0.9까지의 거리와 같습니다. 이것이 바로 Logit을 산술 연산을 수행하기에 좋은 공간으로 만드는 핵심입니다. 확률은 양 극단에서 밀집되지만, Logit은 그렇지 않기 때문입니다.
차이만이 의미를 갖는다
모든 Logit에 상수를 더해도 Softmax 결과는 변하지 않으며, 이는 Softmax 페이지에서 증명됩니다. 따라서 Logit의 절대값은 임의적입니다. 특정 위치의 모든 Logit을 +1000만큼 이동시켜도 모델의 출력 분포는 동일합니다.
이동 후에도 살아남는 것은 차이(difference)이며, 이는 명확하게 해석됩니다:
p_a / p_b = exp(z_a) / exp(z_b) = exp(z_a - z_b)
따라서 Logit의 차이는 두 토큰 사이의 Log odds ratio(로그 오즈비)입니다.
...
이는 두 개의 후보 연속 문구(candidate continuations)를 비교할 때 찾아야 할 수치입니다. "_yes_의 logit은 12.3이었고 _no_는 9.8이었다"는 두 개의 사실이 아니라 하나의 사실을 나타냅니다. 즉, _yes_가 12.2배 더 발생할 가능성이 높다는 것이며, 12.3이나 9.8 자체는 단독으로는 아무런 의미가 없습니다.
Logit bias +2가 정확히 하는 일
Logit bias (로짓 바이어스)는 softmax (소프트맥스)를 적용하기 전에 특정 토큰의 logit (로짓)에 상수를 더합니다. Logit은 log-odds (로그 오즈)이므로, B를 더하는 것은 해당 토큰의 odds (오즈)에 exp(B)를 곱하는 것과 같으며, 이는 검증 가능합니다.
시작: A, B, C, D에 대한 z = [3.0, 2.0, 1.0, 0.0]
exp = [20.0855, 7.3891, 2.7183, 1.0000] sum 31.1929
...
따라서 logit bias는 odds 승수(multiplier)이며, 유용한 정신적 변환 방식은 다음과 같습니다: +1은 2.7배의 odds 증가, +2는 7.4배, +5는 148배 증가입니다. 큰 음수 값은 토큰을 억제(suppress)하는 데 사용됩니다. -100은 해당 토큰을 사실상 불가능하게 만들며, 특정 토큰을 금지(ban)하는 기능은 보통 사후 필터링(post-filtering)보다는 이 방식으로 구현됩니다.
알아둘 만한 한계점: bias는 단어(word)나 구절(phrase)이 아닌 개별 토큰(single tokens)에 적용됩니다. 세 개의 조각으로 토큰화(tokenise)되는 단어를 억제하려면 그 단어를 시작하는 토큰에 bias를 주어야 하는데, 그 토큰은 다른 단어들의 시작점이기도 합니다. 토큰 수준의 개입을 통해 단어 수준의 의도를 구현하는 것은 처음 생각하는 것보다 더 어려우며, 하나 이상의 토큰을 다루는 모든 작업에는 제약된 디코딩 (constrained decoding)이 도구로 사용됩니다.
Logits, logprobs 그리고 API가 반환하는 것
호스팅되는 API 중 logits를 반환하는 경우는 거의 없습니다. 대신 그들은 logprobs (로그 확률) — 즉 softmax 이후의 log(p) — 를 반환합니다. 이는 서로 다른 양이며, 이미 shift (이동)가 해결된 상태이므로 엄밀히 말해 정보량이 더 적습니다.
logprob -> probability (확률): p = exp(logprob)
-0.0001 -> 0.99990
...
마지막 줄이 바로 시퀀스 점수(sequence scores)를 비교하기 전에 반드시 길이 정규화(length-normalised)를 거쳐야 하는 이유입니다. 토큰당 평균 logprob — 여기서는 길이에 상관없이 -0.1 — 은 길이와 상관없이 비교 가능하지만, 총합(total)은 그렇지 않습니다. 총합을 최대화하는 탐색은 항상 가장 짧은 후보를 선호하게 될 것입니다.
API로부터 logprobs (로그 확률)를 추출하고, 이를 변환하여 신뢰도 신호 (confidence signal)로 사용하는 실무적인 작업에 대해서는 정확히 해당 내용을 다루는 페이지가 있습니다. 여기서 주의해야 할 점은 보정 (calibration)에 관한 것입니다. 토큰 확률이 0.99라는 것은 모델이 자신의 학습 분포 (training distribution) 하에서 해당 연속이 압도적으로 가능하다고 판단한다는 의미이지, 그 문장이 참일 확률이 99%라는 것과는 동일하지 않습니다.
보정 (Calibration) 및 온도 스케일링 (Temperature scaling)
모델이 0.8의 신뢰도로 내놓은 예측들 중 약 80%가 실제로 맞다면, 그 모델은 보정되었다 (calibrated)고 합니다. 대부분의 학습된 분류기 (classifiers)는 그렇지 않습니다. 이들은 체계적으로 과잉 확신 (overconfident)하는 경향이 있으며, 표준적인 해결책은 로짓 (logits)에 직접 작동합니다.
먼저 측정부터 해야 합니다. 예측값들을 신뢰도별로 빈 (bin)을 나누고, 각 빈의 평균 신뢰도를 해당 빈의 실제 정확도 (accuracy)와 비교한 뒤, 빈 크기에 따라 가중치를 두어 그 차이들을 평균냅니다. 이것이 기대 보정 오차 (expected calibration error)입니다.
bin n mean conf accuracy |gap|
-------- ---- ---------- --------- ------
0.5-0.6 100 0.55 0.53 0.02
...
온도 스케일링 (Temperature scaling)은 하나의 학습된 파라미터 (fitted parameter)를 사용하여 이를 해결합니다. 소프트맥스 (softmax) 또는 시그모이드 (sigmoid)를 적용하기 전에 모든 로짓을 T로 나눕니다. 이때 T는 홀드아웃 세트 (held-out set)에서 선택합니다. 모든 로짓을 동일하게 나누기 때문에 순위 (ranking)를 바꿀 수는 없습니다. 즉, 정확도는 변하지 않고 오직 확률값만 이동합니다.
p = 0.90의 예측이 실제로는 75%의 시간 동안만 맞을 때.
logit(0.90) = ln(0.9/0.1) = 2.197225
...
언급할 가치가 있는 세 가지 주의 사항이 있습니다. 첫째, T는 검증 세트(validation set)에서 피팅(fitted)되며 동일한 종류의 데이터에만 전이됩니다. 즉, 한 도메인에서 피팅된 온도(temperature)가 다른 도메인을 교정(calibrate)할 수는 없습니다. 둘째, 온도 스케일링(Temperature scaling)은 전반적인 신뢰 수준(confidence level)을 교정할 뿐, 특정 클래스에 대해서는 과잉 확신(overconfident)하고 다른 클래스에 대해서는 과소 확신(underconfident)하는 모델을 고칠 수는 없습니다. 이를 해결하려면 클래스별(per-class) 교정이나 더 유연한 매핑(mapping)이 필요합니다. 셋째, 상관관계가 있는 방식으로 자신 있게 틀리는 모델에 대해서는 아무런 조치도 취할 수 없습니다. 이는 유창하고 자신감 있는 허구(a fluent, confident fabrication)의 배후에 있는 실패 모드(failure mode)입니다. 이 경우 확률이 잘못 교정된 것이라기보다, 당신이 원하는 질문과는 다른 질문에 답하고 있는 것에 가깝습니다.
또한, 이것은 생성 요청 시의 온도 파라미터(the temperature parameter on a generation request)와 정확히 동일한 산술 연산이라는 점에 유의하세요. 연산은 동일하지만 목적은 다릅니다. 하나는 확률을 정직하게 만들기 위해 피팅되는 것이고, 다른 하나는 샘플링(sampling)이 얼마나 모험적일지를 변경하기 위해 수동으로 설정되는 것입니다.
양방향 변환
import numpy as np
def softmax(z):
...
마지막 두 줄이 이 섹션의 핵심입니다. 확률로부터 로짓(logits)을 복구할 때는 가산 상수(additive constant) 범위 내에서만 가능합니다. 왜냐하면 상수는 애초에 확률에 포함되어 있지 않았기 때문입니다. 만약 최대 로짓이 3.0이라고 가정하여 상수를 고정한다면, 원래의 벡터를 정확하게 되찾을 수 있습니다. 만약 상수를 고정할 수 없더라도, 중요한 정보는 잃지 않은 셈입니다.
관련 항목
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기