티스토리 뷰

반응형

https://huggingface.co/docs/transformers/generation_strategies#decoding-strategies

https://huggingface.co/blog/how-to-generate

https://dytis.tistory.com/53

 

 


1. 이야기 주제

이번에는 LLM에서 Greedy Decoding 외에 어떤 디코딩 전략들이 있는지를 설명합니다.


2. 이야기할 전략은 총 네 가지입니다

  1. Greedy Decoding (기본)
  2. Sampling (Top-k, Top-p)
  3. Beam Search
  4. Contrastive Search (최신 기법)

3. 결론부터 말하면

디코딩은 LLM이 다음 토큰을 선택하는 방식이며,
각 전략은 속도, 다양성, 정확성 간의 trade-off를 조절합니다.
→ 상황에 따라 적절한 디코딩 전략을 선택하는 것이 중요합니다.


4. 디코딩 방식별 특징 설명

🟩 1. Greedy Decoding

  • 항상 가장 높은 확률의 토큰 1개 선택
  • 결정론적, 빠름
  • 하지만 다양성 없음
  • 예: "The capital of France is" → "Paris"

🟨 2. Top-k Sampling

  • 확률이 상위 k개인 토큰들 중 랜덤으로 선택
  • 다양성 확보
  • k가 클수록 더 창의적, 작을수록 더 보수적
  • 예: k=5 → ["Paris", "Lyon", "Marseille", "Nice", "Toulouse"] 중 하나 랜덤

🟧 3. Top-p Sampling (nucleus sampling)

  • 누적 확률이 p 이상이 되는 최소 집합에서 선택 (예: p=0.9)
  • 상황에 따라 k가 유동적으로 바뀜 → 더 유연함
  • p=0.9면 상위 토큰 중 누적합이 90% 넘는 그룹에서 랜덤 샘플링

🟦 4. Beam Search

  • 각 단계에서 확률 높은 k개의 문장 후보를 추적
  • 마지막에 가장 높은 전체 확률을 가진 시퀀스를 출력
  • 결정론적이고 신중한 탐색
  • 예: "The capital of France is" → beam1: Paris is beautiful, beam2: Paris is large...

🟥 5. Contrastive Search (고급)

  • 확률뿐만 아니라 문장의 정보 다양성 (diversity)도 고려
  • 적당한 확률 + 새로운 정보가 있는 토큰 선택
  • 더 자연스럽고 풍부한 문장 생성 가능
  • 최근 ChatGLM, TigerBot 등에서 사용됨

5. 비교 표

전략 결정론성 다양성 속도 활용 예시

Greedy ✅ 높음 ❌ 없음 ✅ 빠름 요약, QA
Top-k ❌ 낮음 ✅ 있음 ✅ 빠름 창작, 대화
Top-p ❌ 낮음 ✅ 유연함 ✅ 빠름 코딩, 스토리
Beam Search ✅ 높음 ❌ 제한적 ❌ 느림 번역, 논리형 답변
Contrastive ⚖️ 중간 ✅ 있음 ⚖️ 중간 정보질문, 대화

6. 결론 반복

LLM 디코딩 전략은 다양성과 정확성 사이의 균형을 맞추는 방식이며,
Greedy 외에도 Top-k, Top-p, Beam, Contrastive 같은 전략들이 존재합니다.
→ 목적에 따라 전략을 다르게 선택해야 합니다.


Top-k Sampling 랑 빔서치랑 늘 구분이 안돼

 

정말 좋은 질문이에요.
많은 분들이 Top-k SamplingBeam Search를 헷갈려합니다.
겉으로 보기엔 “여러 개를 선택한다”는 점이 비슷해 보이거든요.
하지만 본질, 목적, 내부 작동 방식은 완전히 다릅니다.
지금부터 텐프랩 법칙으로 깔끔하게 구분해드릴게요.


1. 이야기 주제

Top-k Sampling과 Beam Search의 차이점을 명확히 설명하고,
왜 둘이 혼동되기 쉬운지를 정리합니다.


2. 이야기할 핵심은 세 가지입니다

  1. 작동 방식의 구조 차이
  2. 목적과 사용 시나리오 차이
  3. 결과의 성격 차이

3. 결론부터 말하면

Top-k Sampling은 다양성을 위한 무작위 선택 전략이고,
Beam Search는 정답성을 위한 탐색 알고리즘입니다.

  • Top-k Sampling: 확률 상위 k개 중 랜덤으로 1개 선택
  • Beam Search: 확률 상위 k개의 경로를 끝까지 추적해서 가장 좋은 전체 문장 선택

4. 이유 설명

✅ 구조적 차이

항목 Top-k Sampling Beam Search

선택 방식 확률 상위 k개 중 랜덤 1개 선택 확률 상위 k개 문장 후보 모두 유지
탐색 깊이 매 step마다 한 개 선택 각 step마다 k개씩 경로 확장
결과 개수 보통 1개 생성 (원하면 여러 번 반복) 보통 k개 생성 (beam width = k)
예측 방식 확률 기반 샘플링 (탐색 아님) 탐색 기반 최적화
다양성 높음 낮음 (확률이 높은 경로만)
속도 빠름 느림

5. 예시로 설명

Prompt: "The capital of France is"

🌱 Top-k Sampling (k=3)

  • 모델이 다음 토큰 확률을 다음처럼 줬다고 가정:
"Paris" (0.7), "Lyon" (0.2), "Marseille" (0.1)

→ 여기서 랜덤하게 하나 뽑음
→ 한 번 실행: “Paris”
→ 또 실행: “Lyon”
→ 또 실행: “Paris”

→ 실행할 때마다 다른 결과 → 다양성 확보

🌳 Beam Search (beam width = 2)

  • 1단계: top-2 토큰: “Paris”, “Lyon”
  • 2단계:
    • “Paris is” → 다음 후보들 추적
    • “Lyon is” → 다음 후보들 추적
  • 계속 확장 → 끝까지 생성
    전체 시퀀스 확률이 가장 높은 문장 선택

→ 탐색 결과는 항상 같은 것 (deterministic)
→ diversity 없음


6. 결론 반복

Top-k Sampling은 확률 기반으로 다양성을 만드는 무작위 전략이고,
Beam Search는 전체 시퀀스 확률이 높은 경로를 찾는 탐색 알고리즘입니다.

  • 둘 다 “k”라는 숫자가 들어가지만,
    • Top-k는 선택지 필터링
    • Beam은 경로 추적

→ 이게 가장 중요한 구분 포인트입니다.


시각적으로 도식화해드릴까요?
“Top-k는 한 줄, Beam은 나뭇가지”처럼 보여드릴 수 있어요! 원하세요?

 

 

모르는 단어

  1. 디코딩 전략
    1. 이야기할 전략은 총 네 가지입니다
      1. Greedy Decoding (기본)
      2. Sampling (Top-k, Top-p)
      3. Beam Search
      4. Contrastive Search (최신 기법)
    2. beam search
      1. 빔 서치는 확률이 높은 경로만 추적해 최적의 답을 찾는 전략이며, 병렬 샘플링은 다양한 답을 한 번에 생성하기 위한 방식입니다.
      2. Beam width = 3 (3개의 후보를 동시에 추적)
      3. 첫 번째 토큰 예측 결과 (확률 순):
        • "Paris" (0.7), "Lyon" (0.2), "Marseille" (0.1) → top 3 선택 → 3개의 beam 생성
      4. 다음 토큰 예측 (각 beam마다):
        • "Paris is" → 다음 후보: "beautiful", "in", "a"
        • "Lyon is" → 다음 후보: "a", "known", "in"
        • "Marseille is" → 다음 후보: "located", "in", "famous"
      5. 총 3 × 3 = 9개의 후보 문장 생성 → 그중 확률이 높은 상위 3개를 선택하여 다음 step으로 beam 유지 → 이 과정을 반복하면서 가장 확률 높은 문장으로 좁혀감
    3. 병렬 샘플링
      1. 병렬 샘플링에서는 하나의 질문에 대해 여러 답을 동시에 생성하는데, vLLM은 prompt에 해당하는 KV 캐시는 모든 샘플이 공유하고, 답이 갈라지는 시점부터만 복사하여 사용합니다.
      1. greedy decoding
  2. copy on write
    1. 수정이 필요한 시점에만 복사하는 copy-on-write 방식
  3. 프리엠션
  4. 프롬프트
  5. shared prefix = prefix caching
반응형
댓글