본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Decoding strategy for language models; 언어 모델 디코딩
언어 모델이 낸 다음 토큰 확률 분포에서 실제로 어떤 토큰을 골라 출력할지 정하는 방법

언어 모델 디코딩(decoding)은 언어 모델이 계산한 다음 토큰 확률 분포에서 실제 출력 토큰을 고르는 규칙이다. 생성(sampling) 전략이라고도 한다. 자기회귀 언어 모델은 매 단계마다 어휘 전체(수만~수십만 개)에 대한 확률을 내놓을 뿐 "답"을 내지 않는다. 그 분포에서 토큰을 하나 고르고, 그 토큰을 입력 끝에 붙여 다시 다음 분포를 계산하는 일을 끝 토큰이 나올 때까지 반복해야 문장이 된다. 같은 모델이라도 디코딩 방법에 따라 출력이 지루하게 반복되기도 하고, 엉뚱하게 흩어지기도 하고, 정해진 형식을 지키기도 한다.

상용 LLM API에서 사용자가 조정하는 온도(temperature), top-p, top-k, 최대 출력 길이, 정지 문자열, 반복 패널티 같은 값이 모두 디코딩 설정이다. 이 문서의 "디코딩"은 모델 출력에서 토큰을 고르는 과정을 말하며, 암호의 복호화나 인코더-디코더 구조의 디코더와는 다른 개념이다.

모델은 각 토큰 i에 대한 점수(로짓) zi를 내고, 소프트맥스로 확률을 만든다.

P(xi)=exp⁡(zi/T)∑jexp⁡(zj/T)

여기서 T가 온도다. 디코딩 방법은 크게 두 갈래다.

  • 결정적 방법: 매번 같은 입력에 같은 출력을 낸다. 그리디 디코딩, 빔 서치.
  • 확률적 방법(샘플링): 분포에서 무작위로 뽑는다. 온도, top-k, top-p, min-p는 뽑기 전에 분포를 변형하거나 후보를 잘라 내는 방법이다.

라이브러리는 보통 다음 순서로 처리한다: 로짓에 반복 패널티 등 조정 → 온도로 나눔 → top-k·top-p·min-p로 후보 자르기 → 남은 후보의 확률을 다시 정규화 → 샘플링. 구현마다 순서가 조금씩 다르다.

그리디 디코딩

편집 원본 편집

매 단계에서 확률이 가장 높은 토큰 하나를 고른다(argmax). 온도 0으로 설정하는 것과 같다. 빠르고 재현 가능하지만, 지금 당장 확률이 높은 토큰이 문장 전체로 보면 최선이 아닐 수 있고, 긴 생성에서 같은 구절을 되풀이하는 루프에 빠지기 쉽다. 알고리즘 일반의 탐욕 기법은 그리디 알고리즘 문서 참고.

빔 서치(beam search)는 매 단계 확률 상위 k개(빔 폭)의 부분 문장을 유지하며 확장하고, 끝에서 전체 확률(로그 확률 합)이 가장 높은 문장을 고른다. 정답이 비교적 하나로 정해지는 기계 번역, 음성 인식, 요약에서 오래 표준으로 쓰였다. 긴 문장일수록 확률 곱이 작아지므로 길이로 나누는 길이 정규화를 함께 쓴다.

그러나 열린 생성(이야기, 대화)에서는 빔 서치가 오히려 품질을 떨어뜨린다. 2019년 홀츠먼(Ari Holtzman) 등은 확률을 최대화하는 디코딩이 밋밋하고 이상하게 반복되는 텍스트를 만들며, 사람이 쓴 글은 매 단계 가장 확률 높은 단어로 이루어지지 않는다는 점을 보였다. 이 현상을 신경망 텍스트 퇴화(neural text degeneration)라 불렀다.[1]

온도 T는 소프트맥스 전에 로짓을 나누는 값이다. 이름은 통계역학의 볼츠만 분포에서 왔다.

  • T<1: 분포가 뾰족해져 상위 토큰에 확률이 몰린다. T→0이면 그리디 디코딩과 같다.
  • T=1: 모델이 학습한 분포 그대로.
  • T>1: 분포가 평평해져 낮은 확률 토큰도 자주 뽑힌다. 다양해지지만 엉뚱한 토큰이 섞여 문장이 무너지기 쉽다.

예를 들어 세 후보의 로짓이 2, 1, 0이면 확률은 T=1에서 약 0.67, 0.24, 0.09이고, T=0.5에서 약 0.87, 0.12, 0.02, T=2에서 약 0.51, 0.31, 0.19가 된다.

확률 상위 k개 토큰만 남기고 나머지를 버린 뒤, 남은 후보의 확률을 다시 합이 1이 되게 맞춰 샘플링한다. 2018년 이야기 생성 연구 등에서 쓰였다.[2] 단점은 k가 고정이라는 것이다. 모델이 확신하는 자리(후보가 사실상 하나)에서는 k개가 너무 많아 엉뚱한 토큰이 끼고, 후보가 고르게 많은 자리에서는 너무 적어 다양성을 잃는다.

top-p(핵) 샘플링

편집 원본 편집

홀츠먼 등이 2019년 제안한 핵 샘플링(nucleus sampling)은 확률이 높은 순서로 토큰을 더해 누적 확률이 p를 넘는 가장 작은 집합(핵)만 남긴다.[1]

∑x∈V(p)P(x∣x<t)≥p

예를 들어 다섯 후보의 확률이 0.5, 0.2, 0.1, 0.1, 0.1이고 p=0.8이면 앞의 세 후보(누적 0.8)가 핵이 되고, 확률은 0.625, 0.25, 0.125로 다시 맞춰진다. 모델이 확신하는 자리에서는 핵이 작고, 불확실한 자리에서는 커져 top-k보다 상황에 잘 맞는다. 2020년대 LLM API의 기본 샘플링 설정 가운데 하나다.

2024년 제안된 min-p 샘플링은 가장 확률 높은 토큰의 확률에 비율 pbase를 곱한 값을 문턱으로 삼아, 그보다 확률이 낮은 토큰을 버린다.[3] 1위 토큰 확률이 0.9이고 pbase=0.1이면 0.09 미만 토큰을 버리고, 1위 확률이 0.2면 0.02 미만만 버린다. 저자들은 특히 온도를 높였을 때 top-p보다 품질과 다양성의 균형이 낫다고 보고했다. 오픈 소스 추론 도구 다수가 이 옵션을 지원한다.

그 밖의 방법

편집 원본 편집
  • 국소 전형 샘플링(locally typical sampling): 정보 이론 관점에서, 조건부 엔트로피에 가까운 정보량을 가진 "전형적인" 토큰들 사이에서 뽑는다.[4]
  • 자기 일관성(self-consistency): 연쇄적 사고로 풀이를 여러 개 샘플링한 뒤 최종 답을 다수결로 정한다. 그리디로 한 번 푸는 것보다 추론 과제 성능이 높다.[5]
  • best-of-N: 여러 답을 생성하고 보상 모델이나 검증기로 가장 좋은 것을 고른다. 추론 모델의 테스트 시간 연산 활용과 이어진다.
방법 후보 결정 결정성 적합한 작업 주의점
그리디 1위 하나 결정적 짧은 정답형, 분류, 코드 일부 반복 루프
빔 서치 상위 k개 경로 결정적 번역, 음성 인식, 요약 열린 생성에서 밋밋함
온도 전체 분포 변형 확률적 다양성 조절 전반 높으면 문장 붕괴
top-k 상위 k개 확률적 일반 생성 k가 상황에 안 맞음
top-p 누적 확률 p까지 확률적 일반 생성, 대화 온도가 높으면 꼬리 토큰 유입
min-p 1위 확률 대비 비율 이상 확률적 창작, 높은 온도 비교적 새 방법
  • 반복 패널티(repetition penalty): 이미 나온 토큰의 로짓을 일정 비율로 깎는다. 2019년 세일즈포스의 CTRL 논문이 제안했다.[6]
  • 빈도·존재 패널티(frequency/presence penalty): OpenAI 등의 API 매개변수로, 토큰이 나온 횟수에 비례해(빈도) 또는 한 번이라도 나왔으면(존재) 로짓에서 빼서 새 주제와 표현을 유도한다.
  • n-gram 반복 금지: 같은 n-gram이 두 번 나오지 않게 막는다. 빔 서치 기반 요약에서 쓰였다.

패널티가 너무 세면 필요한 단어(고유명사, 코드의 변수명)까지 피하게 되므로 작업에 맞게 조절해야 한다.

구조화 출력과 제약 디코딩

편집 원본 편집

프로그램이 모델 출력을 바로 읽어 쓰려면 JSON처럼 정해진 형식을 지켜야 한다. 프롬프트로 부탁하는 것만으로는 괄호 누락, 필드 이름 오류가 생길 수 있다. 제약 디코딩(constrained decoding)은 매 단계 형식상 허용되지 않는 토큰의 확률을 0으로 만들어(마스킹) 문법에 맞는 출력만 나오게 한다.

  • 정규 표현식과 문법: 2023년 Outlines 연구는 정규 표현식이나 문맥 자유 문법을 유한 상태 기계로 바꾸고, 각 상태에서 허용되는 어휘 토큰의 색인을 미리 만들어 오버헤드를 줄였다.[7]
  • JSON 모드와 스키마: OpenAI는 2023년 11월 개발자 행사에서 유효한 JSON만 출력하는 JSON 모드를 발표했고,[8] 이후 주요 API와 오픈 소스 서빙 도구(vLLM, llama.cpp 등)가 JSON 스키마나 문법을 지정하는 구조화 출력 기능을 제공한다.
  • 도구 호출: 함수 이름과 인자를 정해진 형식으로 내는 도구 호출도 같은 기술 위에 있다.

토큰 경계와 문법 기호가 어긋나면 마스킹이 모델이 원래 내려던 분포를 왜곡해 품질이 떨어질 수 있다. 형식은 보장하지만 내용의 사실성까지 보장하지는 않는다.

속도를 위한 디코딩

편집 원본 편집

자기회귀 생성은 토큰마다 모델 전체를 한 번씩 실행해야 해서 느리다. 추측 디코딩(speculative decoding)은 작은 초안 모델이 여러 토큰을 미리 생성하고, 큰 모델이 이를 한 번에 병렬로 검증해 받아들이거나 고친다. 수정된 거부 샘플링을 쓰면 출력 분포가 큰 모델 단독과 똑같이 유지된다.[9] 딥마인드는 매개변수 700억 개인 친칠라에서 2~2.5배 속도 향상을 보고했다.[10] 초안 모델 대신 추가 예측 헤드를 쓰는 Medusa 같은 변형도 있다. 이미 계산한 키·값을 재사용하는 KV 캐시도 디코딩 속도의 핵심이다.

  • 정답이 하나인 작업(추출, 분류, 수학, 코드 수정): 온도를 낮게(0~0.3) 두거나 그리디.
  • 대화와 일반 글쓰기: 온도 0.7~1 안팎과 top-p 0.9~0.95 정도가 흔한 출발점이다. 최적값은 모델과 작업마다 다르다.
  • 창작, 아이디어 발산: 온도를 높이고 min-p 등으로 꼬리를 자른다.
  • 추론 모델: 일부 API는 온도 같은 샘플링 매개변수를 고정하거나 무시하고, 대신 사고 노력 수준(reasoning effort)이나 사고 토큰 예산을 조절하게 한다.
  • 재현성: 온도 0이라도 GPU 병렬 연산의 부동소수점 순서 차이나 배치 구성 때문에 출력이 완전히 같지 않을 수 있다.
  1. ↑ 1.0 1.1 A. Holtzman, J. Buys, L. Du, M. Forbes, Y. Choi, 〈The Curious Case of Neural Text Degeneration〉, ICLR, 2020. arXiv:1904.09751
  2. ↑ A. Fan, M. Lewis, Y. Dauphin, 〈Hierarchical Neural Story Generation〉, ACL, 2018. arXiv:1805.04833
  3. ↑ M. N. Nguyen 외, 〈Turning Up the Heat: Min-p Sampling for Creative and Coherent LLM Outputs〉, 2024. arXiv:2407.01082
  4. ↑ C. Meister, T. Pimentel, G. Wiher, R. Cotterell, 〈Locally Typical Sampling〉, TACL, 2023. arXiv:2202.00666
  5. ↑ X. Wang 외, 〈Self-Consistency Improves Chain of Thought Reasoning in Language Models〉, ICLR, 2023. arXiv:2203.11171
  6. ↑ N. S. Keskar 외, 〈CTRL: A Conditional Transformer Language Model for Controllable Generation〉, 2019. arXiv:1909.05858
  7. ↑ B. T. Willard, R. Louf, 〈Efficient Guided Generation for Large Language Models〉, 2023. arXiv:2307.09702
  8. ↑ OpenAI, New models and developer products announced at DevDay, 2023-11-06.
  9. ↑ Y. Leviathan, M. Kalman, Y. Matias, 〈Fast Inference from Transformers via Speculative Decoding〉, ICML, 2023. arXiv:2211.17192
  10. ↑ C. Chen 외, 〈Accelerating Large Language Model Decoding with Speculative Sampling〉, 2023. arXiv:2302.01318