샘플링 전략 비교: temperature, top-p, top-k, min-p, 그리고 실제 프로덕션에서 작동하는 방식
요약
LLM의 텍스트 생성 품질을 결정하는 네 가지 핵심 샘플링 파라미터(temperature, top-p, top-k, min-p)의 작동 원리와 차이점을 설명합니다. 각 파라미터가 확률 분포를 어떻게 변형하여 출력의 창의성과 일관성을 조절하는지 상세히 다룹니다.
핵심 포인트
- Temperature는 로짓 단계에서 분포의 날카로움을 조절함
- Top-p는 누적 확률 기반으로 토큰 집합을 절단함
- Top-k는 상위 k개의 토큰만 남기고 정규화함
- Min-p는 최상위 토큰 확률에 비례한 하한선을 설정함
- 파라미터 적용 순서가 결과에 결정적인 영향을 미침
샘플링 전략 비교: temperature, top-p, top-k, min-p, 그리고 실제 프로덕션에서 작동하는 방식
당신은 챗봇을 배포했습니다. 모든 블로그 포스트가 그렇듯 temperature 0.7을 선택했습니다. 그런데 첫 번째 실제 사용자가 문장 중간에 횡설수설하는 응답의 스크린샷을 보내옵니다. 동료는 top-p 0.9를 제안합니다. 다른 이는 top-k 50을 말합니다. 팀에 새로 합류한 누군가는 min-p를 언급하며 이것이 모든 문제를 해결할 것이라고 주장합니다. 당신에게는 벤치마크도, 테스트 세트도 없으며, 이 조절 장치(knobs) 중 그 어떤 것이 단순히 출력을 짧게 만드는 대신 당신의 구체적인 문제를 실제로 해결하는지 알 방법이 없습니다.
이것이 LLM 제품을 출시하는 대부분의 팀이 처한 샘플링 파라미터(sampling parameter) 선택의 현주소입니다. 파라미터들은 문서화가 제대로 되어 있지 않고, 비직관적인 방식으로 상호작용하며, 모든 추론 엔진(inference engine)의 기본값은 당신의 사용 사례가 아닌 범용 채팅 벤치마크에 맞춰 조정되어 있습니다. 이 포스트는 가장 흔한 네 가지 샘플링 조절 장치인 temperature, top-p, top-k, min-p가 출력 분포(output distribution)에 미치는 구체적인 효과를 매핑하여, 당신이 추측 없이 올바른 설정(또는 조합)을 선택할 수 있도록 돕습니다.
샘플링 파라미터가 중요한 이유
모든 LLM은 어휘 사전(vocabulary)에 대한 확률 분포(probability distribution)에서 선택함으로써 한 번에 하나의 토큰(token)씩 텍스트를 생성합니다. 가공되지 않은 분포(최종 트랜스포머 레이어의 로짓(logits)을 소프트맥스(softmax)를 통해 통과시킨 값)는 거의 직접적으로 사용되지 않습니다. 가공되지 않은 분포는 5만 개의 토큰에 0.0001의 확률을 할당하고 최상위 토큰에 0.3을 할당할 수도 있습니다. 만약 거기서 직접 샘플링을 한다면, 반복적이고 로봇처럼 들리는 좁은 범위의 고확률 연속 문구만을 얻게 됩니다.
샘플링 파라미터는 이 분포를 재형성합니다. 목표는 창의적이거나 유용한 변동성을 가질 수 있을 만큼 분포를 충분히 넓히되, 모델이 의미 없는 토큰에 유의미한 확률을 할당할 정도로 너무 넓히지는 않는 것입니다. 각 파라미터는 서로 다른 실패 모드(failure mode)를 해결합니다:
- Temperature는 분포의 전반적인 날카로움 (sharpness)을 조절합니다.
- **Top-p (nucleus sampling)**는 누적 확률이 임계값에 도달하는 가장 작은 토큰 집합으로 분포를 절단 (truncate) 합니다.
- Top-k는 확률이 가장 높은 상위 k개의 토큰만 유지하고 정규화 (renormalize) 합니다.
- Min-p는 최상위 토큰의 확률에 비례하여 확률 하한선 (probability floor)을 설정하며, 최상위 토큰 확률의 일정 비율 이상을 가진 토큰들만 유지합니다.
다음 다이어그램은 각 전략이 동일한 로짓 (logit) 분포를 어떻게 변형하는지 보여줍니다:
flowchart LR
A[모델로부터의<br/>Raw logits] --> B[Softmax]
B --> C[전체 확률<br/>분포]
...
위의 각 상자는 조정 가능한 단계입니다. 순서가 중요합니다: temperature는 softmax 적용 _전_에 로짓에 적용되는 반면, top-p, top-k, min-p는 softmax 적용 _후_에 생성된 확률 분포에 적용됩니다. 만약 temperature를 0으로 먼저 설정한다면, 분포가 이미 argmax 토큰에 대한 델타 함수 (delta function)가 되어 버리기 때문에 이후의 절단 파라미터들은 아무런 효과가 없습니다.
네 가지 노브(knobs), 내부에서부터의 설명
Temperature
Temperature는 가장 오래되었고 가장 널리 이해되고 있는 파라미터입니다. 이는 softmax 이전에 로짓을 tau로 나눕니다:
P(token_i) = exp(logit_i / tau) / sum_j exp(logit_j / tau)
tau = 1일 때, 이는 표준 softmax입니다. tau가 0에 가까워지면, 분포는 가장 높은 확률을 가진 토큰에 대한 원-핫 벡터 (one-hot vector)로 수렴합니다 (탐욕적 디코딩 (greedy decoding)). tau가 1보다 크면 분포가 평탄해져서, 모델이 원래 의도했던 것보다 낮은 확률의 토큰들이 더 나타날 가능성이 높아집니다.
실제 사용 범위: tau = 0 (결정론적 (deterministic), 코드 생성이나 사실 기반 QA에 적합), tau = 0.1-0.3 (결정론에 가까움, 분류 작업에 유용), tau = 0.6-0.9 (창의적 글쓰기, 대화형), tau = 1.0-1.5 (브레인스토밍, 다양한 생성). 1.5를 초과하면 모델이 불확실하다고 판단하는 토큰에 유의미한 확률을 할당하게 되므로, 모델이 점점 더 일관성 없는 텍스트를 생성하게 됩니다.
temperature의 핵심적인 특성은 이것이 분포 전체에 걸친 (distribution-wide) 변환이라는 점입니다. 이는 어떤 토큰을 제거(prune)하는 것이 아니라, 단지 확률을 더 균등하게 만들거나 (tau > 1) 더 불균등하게 만들 뿐입니다 (tau < 1). 이는 tau > 1일 때, 오타, 잘못된 언어, 또는 환각 (hallucination)된 토큰을 포함하여 원본 분포에서 본질적으로 확률이 0에 가까웠던 토큰들을 활성화할 수 있음을 의미합니다. 모델이 이유가 있어서 해당 토큰들에 낮은 확률을 부여했음에도 불구하고, temperature가 그 신호를 무시(overriding)하기 때문입니다.
Top-p (nucleus sampling)
2019년 Holtzman 등이 도입한 Top-p는 temperature의 특정 문제를 해결합니다. temperature만으로는 어휘 집합(vocabulary)을 잘라낼(truncate) 수 없습니다. tau = 0.8일 때도 모델은 여전히 수천 개의 토큰에 아주 작은 0이 아닌 확률을 할당하며, 이 긴 꼬리 (long tail) 부분에서 샘플링을 하면 예상치 못한 토큰이 생성됩니다.
Top-p는 토큰들을 확률이 높은 순서대로 내림차순 정렬한 다음, 누적 확률이 p를 초과할 때까지 상위 토큰들을 유지하는 방식으로 작동합니다. 만약 p = 0.9라면, 확률 질량 (probability mass)의 90%를 합계로 차지하는 상위 토큰들을 유지합니다. 이는 적응형 (adaptive) 방식입니다. 모델이 확신이 있을 때는 Top-p가 소수의 토큰만 유지하고, 불확실할 때는 더 많은 토큰을 유지합니다.
실제 권장 범위: 대부분의 생성 작업에서 p = 0.8-0.95를 사용합니다. 더 낮은 값 (0.5-0.7)은 사실 기반의 질의응답 (QA)에 유용한, 더 집중된 출력을 생성합니다. 0.95를 초과하는 값은 잘라내기가 거의 없는 것과 비슷합니다. Top-p의 놀라운 특성은 엔트로피가 높은 분포에서 Top-k보다 덜 제한적일 수 있다는 점인데, 이는 분포의 형태에 맞춰 적응하기 때문입니다.
Top-k
Top-k는 가장 단순한 절단 (truncation) 방식입니다. 확률이 가장 높은 k개의 토큰만 유지하고 다시 정규화 (renormalize)합니다. 초기 GPT-2 시절부터 이어져 온 일반적인 기본값은 k = 40 또는 k = 50입니다.
top-k의 문제는 그것이 정적(static)이라는 점입니다. 분포가 뾰족할 때(모델이 확신할 때), k = 50은 잘려 나갔어야 할 낮은 확률의 토큰들을 많이 유지하게 됩니다. 반대로 분포가 평탄할 때(모델이 불확실할 때), k = 50은 의미 있는 확률을 가진 토큰들을 잘라버립니다. top-k는 특정 도메인과 모델에 맞춰 k를 튜닝했을 때는 수용 가능한 수준으로 작동하지만, 모델과 작업(task)이 바뀌면 취약해집니다.
실제 권장 범위: 일반적인 생성에는 k = 10-50을 사용합니다. k = 1은 탐욕적(greedy) 방식입니다 (사실상 tau = 0). 대부분의 모델에서 k가 100을 넘어가면 절단(truncation)이 거의 일어나지 않는 것과 같습니다.
Min-p
2024년 Nguyen 등이 제안한 Min-p (arXiv 2407.01082)는 적응형 임계값(adaptive threshold)을 사용하여 top-k의 정적인 특성을 해결합니다. 이는 (min_p * P_max)를 하한선(floor)으로 설정하여 작동하며, 여기서 P_max는 가장 확률이 높은 토큰의 확률입니다. 이 하한선보다 낮은 확률을 가진 토큰들은 버려지며, 남은 분포는 다시 정규화 (renormalize)됩니다.
만약 min_p = 0.1이고 최상위 토큰의 확률이 0.6이라면, 하한선은 0.06이 됩니다. 확률이 0.06 미만인 모든 토큰은 제거됩니다. 모델이 확신할 때(최상위 토큰이 1에 가까울 때)는 하한선이 높아져 살아남는 토큰이 적습니다. 모델이 불확실할 때(최상위 토큰이 0.3일 때)는 하한선이 낮아져 더 많은 토큰이 통과합니다.
실제 권장 범위: min_p = 0.01-0.2. 논문에서 권장하는 기본값은 창의성과 일관성의 좋은 균형을 위해 약 0.05-0.1 정도입니다. 0.01 미만의 값은 절단이 거의 없는 것과 비슷합니다. 0.2를 초과하는 값은 매우 제한적이게 됩니다.
비교 표
| 파라미터 | 역할 | 적응형 여부 | 일반적인 범위 | 최적 용도 | 주요 실패 모드 |
|---|---|---|---|---|---|
| Temperature | softmax 전 로짓(logits) 스케일링 | 아니오 | 0 - 1.5 | 무작위성/창의성 조절 | 차별 없이 낮은 확률의 토큰을 허용함 |
| ... |
실제 샘플링: 어떤 조합이 효과적인가
프로덕션 시스템에서 샘플링 파라미터는 거의 단독으로 사용되지 않습니다. 가장 일반적인 프로덕션 레시피는 다음과 같습니다:
대화형 에이전트 (Conversational agents)의 기본 설정: temperature = 0.7, top-p = 0.9, min-p = 0.05. 이는 자연스러운 변동성을 위한 충분한 무작위성 (randomness)을 제공하는 동시에, min-p 하한선이 모델이 매우 낮은 확률 영역으로 방황하는 것을 방지합니다. top-k는 보통 비활성화합니다 (0 또는 200과 같은 높은 값으로 설정). min-p와 top-p가 이미 더 적응적으로 절단 (truncation)을 처리하기 때문입니다.
코드 생성 (Code generation) 또는 구조화된 출력 (Structured output)용: temperature = 0.1-0.2, top-p = 0.95, min-p = 0.01. 0에 가까운 temperature는 대부분의 확률을 상위 몇 개의 토큰에 집중시킵니다. top-p를 0.95로 설정하면 모델이 진정으로 불확실할 때 (예: 변수 이름을 선택할 때), argmax를 넘어선 선택지를 여전히 가질 수 있도록 보장합니다.
창의적 글쓰기 (Creative writing) 또는 브레인스토밍 (Brainstorming)용: temperature = 0.9-1.1, top-p = 0.95, min-p = 0.02. 약간 높아진 temperature는 다양성을 장려합니다. 관대한 top-p는 분포를 넓게 유지합니다. 낮은 min-p는 주로 최악의 롱테일 (long-tail) 토큰들에 대한 안전망 역할을 합니다.
분류 (Classification) 또는 추출 (Extraction)용: temperature = 0 (greedy), 절단 파라미터 불필요. 출력 공간이 고정된 레이블 세트인 경우, 어떠한 샘플링이라도 정확도를 떨어뜨립니다. 이는 기본 파라미터가 실제로 최적인 드문 사례입니다.
다음은 vLLM이 실제 환경에서 이러한 파라미터들을 어떻게 결합하는지 보여주는 Python 코드 스니펫입니다:
from vllm import SamplingParams
# Conversational agent
...
흔한 실수 (Common pitfalls)
상호작용을 이해하지 못한 채 절단 파라미터를 중첩하여 사용하는 것. top-p를 0.9로, top-k를 50으로 동시에 설정하는 것은 두 번의 절단이 순차적으로 실행됨을 의미합니다. top-p가 30개의 토큰을 남기면, top-k가 이를 50개로 자르는 것은 아무런 효과가 없습니다. 반대로 top-k가 50개를 남기면, top-p가 이를 더 줄일 수도 있습니다. 실제 동작은 어떤 절단이 먼저 적용되느냐에 따라 달라집니다. 대부분의 엔진은 top-k를 먼저 적용하고, 그다음 top-p, 마지막으로 min-p를 적용합니다. 세 가지를 모두 설정한다면, 당신은 다음 달에 기억조차 나지 않을 수도 있는 실행 순서에 의존하게 되는 것입니다. 절단 방식은 최대 두 가지만 선택하세요.
Temperature를 1.5 이상으로 설정하고 일관성 (coherence)을 기대하는 경우. Temperature는 창의성 조절 다이얼이 아닙니다. 1.5를 초과하면 모델은 극도로 낮을 확률을 가진 토큰에 상당한 확률을 할당합니다. 출력물이 창의적으로 보일 수 있지만 실제로는 무작위적입니다. 다양한 출력이 필요하다면 Temperature를 1.2 이상으로 높이는 대신 top-p를 높이거나 min-p를 낮추는 방법을 시도하세요.
top-k를 유일한 샘플러로 사용하는 경우. 이는 제가 배포된 서비스에서 가장 흔히 보는 실수입니다. 정적인 k 값은 분포 (distribution)에 적응할 수 없습니다. k=50일 때, 어떤 때는 쓰레기 토큰을 유지하고 어떤 때는 유효한 꼬리 (tail) 부분을 잘라버리게 됩니다. 반드시 top-k만 사용해야 한다면, k를 보수적으로(10-20) 설정하고 성능의 일부를 포기한다는 점을 받아들여야 합니다.
Temperature 0이 모든 샘플링을 비활성화한다는 사실을 잊는 경우. Temperature가 0이면 모델은 항상 argmax 토큰을 선택합니다. 절단할 분포 자체가 존재하지 않기 때문에 top-p, top-k, min-p는 아무런 효과가 없습니다. 설정 파일에서 "temperature=0, top_p=0.95"를 본다면, top_p는 죽은 코드 (dead code)입니다.
배치 추론 (batched inference)에서 샘플링 파라미터를 잘못 적용하는 경우. 일부 추론 엔진 (inference engines)은 배치 내의 모든 시퀀스에 대해 샘플링 파라미터를 공유합니다. 배치의 기본값과 충돌하는 요청별 Temperature 재정의 (override)를 전달하면, 기본값으로 조용히 폴백 (fallback)되는 현상이 발생합니다. 요청별 샘플링 재정의가 실제로 배치 레이어 (batching layer)를 통해 제대로 전달되는지 항상 확인하십시오.
사용하지 말아야 할 때
다음과 같은 경우 샘플링 파라미터는 출력 품질을 개선하기 위한 주요 도구가 되어서는 안 됩니다:
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기