
LLM은 왜 가장 확률 높은 토큰을 고르지 않을까
- 1LLM은 왜 다음 토큰 하나만 예측할까
- 2Transformer는 왜 Q, K, V 셋으로 나눴을까
- 3토큰은 왜 단어가 아닐까
- 4LLM은 왜 가장 확률 높은 토큰을 고르지 않을까읽는 중
- 5Positional Encoding에서 RoPE까지, 어텐션에 순서를 부여하는 법
LLM에 “오늘 날씨가”를 넣으면 모델은 “좋”에 0.12, “맑”에 0.08, “흐”에 0.05처럼 수만 개 토큰 각각에 확률을 매깁니다. 이것이 모델이 하는 일의 전부입니다. 확률 분포를 내놓을 뿐 토큰을 고르지는 않죠. 실제로 토큰 하나를 뽑는 것은 모델 바깥 코드의 몫인데, 여기서 직관이 어긋납니다.
확률이 제일 높은 토큰을 고르면 될 것 같습니다. 모델이 가장 자신 있다고 매긴 답이니까요. 그런데 이렇게 하면 같은 구절이 끝없이 반복되거나, 번역에서는 빈 문장이 나옵니다. 모델 제작자들도 이 문제를 알아서 DeepSeek-R1은 temperature 0.6을 권하고 Qwen3는 거기에 top-p 0.95까지 얹으라고 적어 둡니다. 대부분 그 값을 그대로 복사해 쓰지만, 왜 그 값인지, 왜 확률 1등을 곧장 고르면 안 되는 건지는 의외로 답하기 어렵습니다.
가장 그럴듯한 문장을 찾으려던 시도가 왜 무너졌는지에서 출발해, 분포에서 뽑되 꼬리를 어떻게 자르는지, temperature가 분포의 어디를 손대는지를 짚고, 추론 모델들이 결국 샘플링 쪽으로 기운 이유까지 따라갑니다.
가장 그럴듯한 문장을 찾으면 안 될까
가장 단순한 선택은 매 스텝 확률이 가장 높은 토큰을 고르는 것입니다. greedy decoding이라 부르죠. 그런데 이 방법은 가장 확률 높은 문장, 즉 분포의 최빈값(mode)을 찾아 주지 않습니다. 문장의 확률은 토큰 확률의 곱이라 첫 스텝에서 조금 낮은 토큰을 골랐을 때 뒤가 훨씬 좋은 경우가 얼마든지 있습니다.
위 그림에서 greedy는 첫 스텝에 A(0.5)를 고르고 그 아래 최선인 0.4를 이어 확률 0.20짜리 경로에 도착합니다. B(0.3) 뒤에는 0.9가 기다리고 있어 경로 확률이 0.27로 더 높지만, 첫 스텝에서 B가 A보다 낮으니 greedy는 그 길을 영영 보지 못합니다.
문장 전체의 점수는 보통 확률의 곱 대신 로그 확률의 합으로 씁니다. 확률 수백 개를 곱하면 부동소수점이 0으로 무너지기 때문입니다.
이 점수를 최대로 만드는 문장이 최빈값인데, 후보가 너무 많습니다. 어휘 개를 스텝 이어 붙이면 경우의 수가 이라 전부 셀 수 없습니다. 그래서 오래된 타협안이 beam search였습니다. 매 스텝 점수 상위 개 경로만 남기고 나머지는 버립니다. 남기는 경로 수 를 빔 폭이라 부르고 음성 인식과 기계 번역이 내내 이 방법으로 후보를 골랐고요. 위 그림에서도 면 A와 B를 둘 다 들고 가다가 다음 스텝에 0.27을 발견합니다.
그러니 빔 폭을 키울수록 결과가 좋아져야 하는데, 기계 번역에서는 반대였습니다. 2019년 Stahlberg와 Byrne이 탐색을 끝까지 밀어붙여 진짜 최빈값을 찾아봤더니, 테스트셋 문장 51.8%에서 모델이 가장 높은 점수를 준 번역이 빈 문장이었습니다. 빔 10의 BLEU(번역 품질 점수)는 30.3인데 정확 탐색은 2.1이었고요. 번역이 쓸 만했던 것은 탐색이 불완전한 덕분이었습니다.
답이 열린 생성에서는 반복으로 무너집니다. Holtzman 연구진이 GPT-2로 5,000편을 생성해 봤더니 greedy 출력의 73.66%가 같은 구절을 되풀이하며 끝났고, 빔 16도 28.94%였습니다. 사람이 쓴 글에서는 0.28%죠. 한 번 반복이 시작되면 다음 반복의 확률이 올라가서 루프가 스스로 강해집니다.
beam search 출력은 반복에 들어선 뒤로 토큰 확률이 0.9 위에 붙고, 사람 글은 0.1 아래로 자주 내려갑니다. perplexity(모델이 후보 몇 개 중에서 고르는 셈인지를 나타내는 값)로 재면 빔 16 출력은 1.48, 사람 글은 12.38이었습니다. 모델이 보기에 가장 그럴듯한 글은 사람이 쓴 글과 전혀 닮지 않았습니다. 왜 이렇게 되는지는 아직 합의된 답이 없고, 학습 목적함수가 토큰 단위라서 문장 단위 품질과 어긋난다는 해석이 유력합니다.
greedy가 최빈값을 못 찾는 것은 문제의 절반이고, 나머지 절반은 최빈값 자체가 해롭다는 점입니다. 다만 이 수치는 base 모델 기준이라 챗 모델의 짧은 답에서는 greedy도 멀쩡합니다. 문제가 두드러지는 것은 긴 생성과 추론 모델입니다.
분포에서 뽑되 꼬리는 자른다
최빈값을 찾는 대신 분포에서 뽑으면 어떨까요. 모델이 매긴 확률 그대로 주사위를 굴리는 것, 그러니까 0.5짜리 토큰은 절반의 확률로 고르는 방식입니다. 모델의 분포를 정확히 믿는 선택이죠. Holtzman 연구진의 같은 실험에서 이 순수 샘플링은 반복률이 0.22%로 사람 글보다도 낮았습니다. 대신 perplexity가 22.73으로 사람 글의 두 배 가까이 올랐습니다. 사람보다 훨씬 예측하기 어려운 글, 읽어 보면 앞뒤가 맞지 않는 글이 나온다는 뜻입니다.
원인은 분포의 꼬리에 있습니다. 어휘가 10만 개를 넘으니 상위 백 개 남짓이 확률 대부분을 가져가도 나머지가 십만 개 넘게 남습니다. 그 토큰이 조금씩 나눠 갖는 확률 질량은 무시할 수 없는 크기가 됩니다.
문제는 그 한 번입니다. 뽑힌 토큰은 다음 스텝의 조건이 됩니다. 엉뚱한 토큰이 한 번 들어가면 모델은 그 엉뚱한 문맥에 맞춰 다음을 예측하고 오류는 되돌아오지 않고 쌓입니다. 학습 때는 늘 사람이 쓴 올바른 문맥만 조건으로 받던 모델이 자기가 만든 문맥을 처음 받는 순간이기도 하고요.
꼬리의 확률이 믿을 만하지 않은 데는 구조적인 이유가 있습니다. logit이 만들어지는 과정을 되짚어 봅시다. logit은 모델이 내놓은 벡터 하나에 어휘 행렬 를 곱한 값입니다. 문제는 의 차원이 어휘 크기보다 훨씬 작다는 점인데, Llama 3 8B의 경우 어휘가 12만 8천 개인데 의 차원()은 4,096뿐입니다. 4,096개의 축으로 12만 8천 개의 logit을 독립적으로 조절할 수 없으니, 모델이 특정 토큰에 확률 0을 주고 싶어도 정확히 0을 줄 수가 없습니다. 이 제약을 softmax bottleneck이라 부릅니다.
Finlayson 연구진은 2024년에 이 제약 아래에서 절단이 정당화된다는 것을 증명했습니다. 모델이 0을 주고 싶은 토큰은 logit도 낮으니 임계값으로 잘라내면 걸러진다는 논리입니다. 경험적으로 먹히던 절단에 이론적 근거가 붙은 셈인데, 같은 논문은 임계값이 거친 기준이라 멀쩡한 토큰도 함께 버린다는 한계도 짚었습니다.
절단의 첫 형태는 top-k입니다. 2018년 Fan 연구진이 이야기 생성에 쓴 방법으로, 확률 상위 개(원 논문은 10개)만 남기고 그 안에서 다시 정규화해 뽑습니다. 단순하지만 가 고정이라 분포 모양을 무시합니다. 다음 토큰이 거의 정해진 자리에서는 이 쓸모없는 후보 39개를 살려 두고, 후보가 수백 개인 자리에서는 멀쩡한 후보를 잘라 버리죠.
Holtzman 연구진이 제안한 nucleus sampling, 흔히 top-p라 부르는 방법은 개수 대신 확률 질량으로 자릅니다. 확률 높은 순으로 더해 가다가 누적 확률이 를 처음 넘는 지점까지만 남기는 것입니다. 남는 개수는 스텝마다 달라져 한 개에서 천 개 사이를 오갑니다. min-p는 기준을 다시 바꿔 최대 확률의 일정 비율에 못 미치는 토큰을 자릅니다. llama.cpp 커뮤니티에서 먼저 구현돼 퍼진 뒤 2024년에 논문으로 정리됐습니다.
| 방법 | 기준 |
|---|---|
| top-k | 확률 상위 개만 남김 |
| top-p (nucleus) | 누적 확률이 를 넘는 지점까지 |
| min-p | 확률 ≥ (min-p 값) × 최대 확률 |
뾰족한 분포에서는 세 방법이 3개에서 4개를 남겨 비슷하지만, 평평한 분포에서는 갈립니다. top-k 3은 질량 0.42만 남기고, top-p 0.9는 여덟 개, min-p 0.1은 열 개를 전부 남깁니다. 후보가 고르게 퍼진 자리에서 많이 남기는 쪽이 분포의 뜻에 가깝죠.
Holtzman 실험에서 인 nucleus sampling은 perplexity 13.13, 반복률 0.36%로 사람 글(12.38, 0.28%)에 가장 가까웠습니다. 사람 평가와 모델 확률을 함께 쓰는 종합 점수에서도 가장 높았고요. 절단 샘플링이 이후 몇 년간 기본값이 될 때 가장 자주 인용된 근거가 이 실험입니다.
min-p는 주요 엔진에 전부 구현이 들어갔지만, 2025년 재분석에서 비교 조건을 맞추면 top-p 대비 우위가 사라진다는 결과가 나왔습니다. Qwen3 권장값에서도 min-p는 0이고, 기본값은 여전히 top-p입니다.
절단은 구현 수준에서 보면 남길 토큰 밖의 logit을 로 덮는 마스킹입니다. 마스크를 확률이 아니라 문법이 정하면 JSON 스키마 같은 형식을 강제하는 structured output이 되고요. 같은 자리에 다른 규칙을 꽂은 것입니다.
temperature가 손대는 것
절단이 어느 토큰을 후보에 남길지를 정한다면 temperature는 남은 후보 사이의 격차를 정합니다. softmax에 나눗셈 하나를 넣는 것이 전부입니다.
는 토큰 의 logit, 는 어휘 크기, 가 temperature입니다. 이면 보통의 softmax라 모델이 학습한 분포가 그대로 나옵니다. 를 1보다 작게 두면 logit 사이의 차이가 확대되어 큰 값이 더 커지고, 0에 가까워지면 최대 logit 하나가 확률을 전부 가져가 greedy와 같아집니다(구현은 0을 나눗셈 대신 argmax로 처리합니다). 반대로 키우면 차이가 줄어들고 무한대에서는 균등 분포가 됩니다. 어텐션이 점수를 키 벡터 차원의 제곱근 로 나누는 것과 같은 산수인데, 거기서는 softmax가 한 항목에 확률을 몰아주는 포화를 막으려고 나눴고 여기서는 그 포화의 정도를 고르려고 나눕니다.
같은 logit 열 개를 세 온도로 펼친 결과입니다. 막대의 순서는 셋 다 같습니다. temperature는 순위를 바꾸지 않고 격차만 바꿉니다. 에서는 1위가 0.82를 가져가고 perplexity는 1.9, 에서는 0.51에 4.7, 에서는 0.28에 8.1입니다. temperature를 올리는 것은 모델을 덜 믿고 후보를 더 고르게 보겠다는 결정이고, 내리는 것은 모델이 앞세운 후보를 더 밀어주겠다는 결정입니다.
top-p와 temperature는 그래서 같이 쓰입니다. top-p는 어느 토큰을 후보로 남길지를, temperature는 남은 후보 사이의 격차를 정합니다. 서로 다른 손잡이입니다. 다만 독립은 아니어서 temperature를 먼저 낮추면 top-p가 남기는 후보 수도 줄어듭니다. 그래서 적용 순서가 결과를 바꾸는데 엔진마다 순서가 다릅니다. vLLM은 temperature, min-p, top-k와 top-p 순입니다. 같은 값을 넣어도 엔진이 다르면 분포가 다를 수 있다는 뜻인데, 이 순서는 서빙 설정의 영역이니 여기서는 존재만 적어 둡니다.
temperature를 낮추면 반복이 돌아옵니다. Holtzman 실험에서 top-k 40에 이던 설정의 반복률은 0.78%였습니다. 같은 top-k 40에서 만 0.7로 내리자 8.86%로 뛰었고 perplexity는 6.88에서 3.48로 내려가 greedy 쪽으로 되돌아갔습니다. 낮은 temperature는 절단은 아니지만 절단과 같은 방향으로 작용합니다. 꼬리를 잘라내는 대신 눌러서 사실상 0에 붙이는 셈이라 너무 누르면 최빈값의 문제를 그대로 물려받습니다.
temperature는 speculative decoding의 속도에도 걸립니다. 두 모델의 분포가 겹치는 정도가 수락률이 되는데, temperature를 올리면 분포가 평평해져 겹침이 줄고 속도 이득도 줄어듭니다. 벤치마크의 속도 향상이 대개 temperature 0 조건인 것도 그 때문입니다.
무작위를 들인 대가
샘플링을 들이면 같은 프롬프트에서 매번 다른 문장이 나옵니다. speculative decoding이 무손실이라고 할 때 보장하는 것도 문장이 같다는 게 아니라 문장이 나올 확률 분포가 같다는 것입니다. 출력이 분포가 되면 평가도 분포 측정이어야 합니다. DeepSeek-R1의 모델 카드가 벤치마크를 여러 번 돌려 평균 내라고 적어 둔 이유죠. 한 번 돌린 점수는 표본 하나입니다.
그렇다면 temperature를 0으로 두면 재현이 될까요. 되지 않습니다. 2025년 9월 Thinking Machines가 Qwen3-235B에 같은 프롬프트를 temperature 0으로 1,000번 넣었더니 서로 다른 완성이 80가지 나왔습니다. 102번째 토큰까지는 전부 같다가 103번째에서 992개는 “Queens, New York”으로, 8개는 “New York City”로 갈라졌습니다.
원인은 배치에 있습니다. 서빙 엔진은 여러 요청을 한 배치로 묶어 GPU에 올리는데, 배치 크기가 달라지면 행렬곱과 정규화, 어텐션 커널이 덧셈을 묶는 순서가 달라지고 부동소수점 덧셈은 순서에 따라 마지막 자리가 흔들리게 됩니다. 흔들리는 것은 argmax의 입력인 logit이라 두 logit이 근소하게 갈리는 자리에서는 그 흔들림이 argmax를 뒤집습니다. 같은 팀이 덧셈 순서를 배치 크기와 무관하게 고정한 커널로 Qwen3-8B를 1,000번 돌리자 전부 같은 답이 나왔고, 대신 같은 작업이 26초에서 55초로, 어텐션 커널을 손본 뒤에도 42초로 느려졌습니다. 결정성은 커널 수준에서 값을 치러야 얻어집니다.
더 근본적인 대가는 이 결정이 모델 밖에 있다는 점입니다. 학습 목적함수는 분포를 만드는 법까지만 정하고 거기서 어떻게 뽑을지는 정하지 않습니다. temperature와 top-p는 사람이 고르는 값이고 최적값은 모델마다, 작업마다 다릅니다. 코드 생성과 소설 쓰기에 같은 값이 맞을 리 없는데 대부분의 호출은 기본값을 그대로 씁니다.
반복도 완화됐을 뿐 사라지지 않았습니다. API마다 repetition penalty나 presence penalty가 여전히 남아 있는 것도 그 방증입니다. 추론 모델이 긴 사고 과정 중에 같은 구절을 되풀이하는 루프도 temperature를 올리면 줄어들지만, 2025년에 이 현상을 분석한 연구는 원인으로 지목한 학습 쪽 결함까지 고쳐지는 것은 아니라고 정리했습니다. 샘플링은 우회로이지 치료가 아닙니다.
샘플링은 왜 기본값이 됐나
그럼에도 2025년 이후 나온 주요 추론 모델들은 샘플링을 권장 수준을 넘어 금지나 강제 쪽으로 옮겨 놓았습니다.
| 모델 | 권장 설정 | 비고 |
|---|---|---|
| DeepSeek-R1 | temperature 0.6 (0.5부터 0.7) | 범위 밖 비권장 |
| Qwen3 사고 모드 | temperature 0.6 · top-p 0.95 · top-k 20 · min-p 0 | greedy 금지 |
| OpenAI 추론 모델 | temperature · top_p 파라미터 없음 (추론이 켜진 요청) | 1로 고정 |
DeepSeek-R1은 끝없는 반복과 비일관 출력을 이유로 들었고, Qwen3는 greedy를 아예 쓰지 말라고 못 박았습니다. 수만 토큰을 이어 쓰는 사고 과정에서는 한 번 들어선 루프가 끝까지 가니까요. OpenAI는 손잡이 자체를 없앴습니다. 추론이 켜진 요청에서 temperature를 받지 않고 1로 고정합니다.
샘플링이 빠질 수 없게 된 더 깊은 이유는 학습과 추론 양쪽에서 파이프라인의 재료가 됐기 때문입니다.
self-consistency는 답을 여러 개 뽑아 다수결로, Best-of-N은 검증자 점수가 가장 높은 것을 택합니다. 학습 쪽에서는 GRPO가 프롬프트 하나에 답을 여러 개 뽑아 보상을 비교하고요. 셋 다 샘플이 서로 달라야 성립하고, greedy면 N개가 사실상 같은 답이라 비교할 것이 없습니다.
beam search가 남은 자리는 답이 거의 하나인 작업입니다. Whisper는 빔 5로 음성을 받아쓰고, 반복이 의심되면 temperature를 올려 다시 뽑죠. 반면 LLM 서빙 엔진에서는 밖으로 밀려나는 중인데, vLLM은 v0.6.3에서 use_beam_search를 코어 밖으로 분리했습니다.
마치며
모델이 내놓는 것은 분포까지입니다. 그 분포의 최빈값 쪽 끝은 반복과 빈 문장으로 흐르고 꼬리 쪽 끝은 한 번 뽑히면 뒤를 오염시키니, 어느 토큰을 뽑을지 정하는 전략은 모두 그 둘 사이 어디에 설지를 고르는 일이었습니다. 어디에 설지는 최대우도 목적함수가 정해 주지 않고 모델 밖에서 사람이 고르는 값이라, 2026년의 추론 모델들은 그 선택지를 아예 닫거나 샘플링 쪽으로 못 박았습니다.
이 글은 분포에서 토큰이 뽑히는 마지막 한 줄만 봤습니다. Transformer 블록이 토큰의 순서를 어떻게 아는지, 위치 인코딩은 다음 글에서 다룹니다.
함께 보면 좋은 글
- LLM은 왜 다음 토큰 하나만 예측할까
- 토큰은 왜 단어가 아닐까
- Prefill과 Decode로 이해하는 LLM 추론 과정
- Speculative Decoding으로 LLM 추론 속도 높이기
- Test Time Scaling
- GPT-5.1 API 변경사항, 모델 ID만 바꾸면 추론이 꺼집니다
참고자료
- The Curious Case of Neural Text Degeneration (Holtzman et al., ICLR 2020)
- Hierarchical Neural Story Generation (Fan et al., ACL 2018)
- On NMT Search Errors and Model Errors: Cat Got Your Tongue? (Stahlberg & Byrne, EMNLP 2019)
- If beam search is the answer, what was the question? (Meister et al., EMNLP 2020)
- Closing the Curious Case of Neural Text Degeneration (Finlayson et al., ICLR 2024)
- Turning Up the Heat: Min-p Sampling for Creative and Coherent LLM Outputs (Nguyen et al., ICLR 2025)
- Min-p, Max Exaggeration: A Critical Analysis of Min-p Sampling in Language Models (2025)
- Defeating Nondeterminism in LLM Inference (Thinking Machines Lab, 2025)
- Wait, Wait, Wait… Why Do Reasoning Models Loop? (2025)
- DeepSeek-R1 모델 카드, Usage Recommendations
- Qwen3-8B 모델 카드, Best Practices