본문 바로가기
C.W.K.
Stream
Lesson 05 of 06 · published

Generation 설정: Sampling, Beam, Constraints

~30 min · transformers, generation

Level 0스카우트
0 XP0/50 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

generate()는 토큰마다 상태가 바뀌는 반복문이야

model.generate()GenerationConfig를 읽으며 다음 토큰을 하나씩 고르는 상태 기계야. do_samplenum_beams로 전략을, max_new_tokens로 길이를, temperature·top_p·top_k·repetition_penalty로 분포를, eos_token_idstop_strings로 종료 조건을 정해.

목적에 맞는 전략 하나를 골라

  • Greedy는 매 단계 가장 확률이 높은 토큰을 골라. 결정적이어야 하는 도구 호출, JSON, 코드 완성의 출발점이야.
  • Sampling은 확률 분포에서 토큰을 뽑아 다양성을 만들어. 대화와 창작에서는 temperature=0.7, top_p=0.9 정도에서 시작해 조정해.
  • Beam search는 여러 후보 문장을 함께 탐색해. 번역이나 요약처럼 최선의 한 문장을 찾을 때 유용하지만 beam 수만큼 계산량이 늘어.

끝내는 조건까지 생성 설정이야

eos_token_id가 틀리거나 빠지면 모델이 끝났어야 할 자리에서도 계속 생성할 수 있어. 지시형 모델은 <|eot_id|><|end_of_turn|>처럼 종료 토큰을 여러 개 쓸 수 있으니 목록으로 넘겨. 임의 문자열에서 멈춰야 하면 더 느리지만 유연한 stop_strings를 사용해.

Code

Greedy vs sampling vs beam·python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

repo = "Qwen/Qwen2.5-1.5B-Instruct"
tok = AutoTokenizer.from_pretrained(repo)
model = AutoModelForCausalLM.from_pretrained(repo, torch_dtype=torch.bfloat16, device_map="auto")

prompt = tok.apply_chat_template(
    [{"role": "user", "content": "Translate to Korean: The Hub is the registry."}],
    tokenize=False, add_generation_prompt=True,
)
inputs = tok(prompt, return_tensors="pt").to(model.device)

# Greedy — deterministic
out_g = model.generate(**inputs, max_new_tokens=50, do_sample=False)

# Sampling — varied
out_s = model.generate(**inputs, max_new_tokens=50,
                       do_sample=True, temperature=0.7, top_p=0.9)

# Beam — exhaustive
out_b = model.generate(**inputs, max_new_tokens=50, num_beams=4, early_stopping=True)

for label, out in [("greedy", out_g), ("sample", out_s), ("beam", out_b)]:
    print(label, ":", tok.decode(out[0], skip_special_tokens=True)[-200:])
여러 EOS 토큰에 멈추기 (Llama-3 스타일)·python
from transformers import AutoTokenizer

tok = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")

# Llama-3 는 eos_token + eot (end-of-turn) marker 둘 다 가짐
eos_ids = [tok.eos_token_id, tok.convert_tokens_to_ids("<|eot_id|>")]
print("stop ids:", eos_ids)

# generate() 에 넘기기: eos_token_id=eos_ids

External links

Exercise

1-3B instruct 모델에서 같은 프롬프트를 5번씩 (a) greedy, (b) temp=0.3 sample, (c) temp=0.9 sample, (d) beam=4 로 돌려. 출력 저장. 각 strategy 의 character-level 다양성 (unique 출력 수 / 5) 계산. 어디서 greedy 가 바람직하고 어디서 제한적인지 봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.