Python으로 배우는 언어 모델의 텍스트 생성: Temperature와 Top-k
언어 모델은 다음에 올 수 있는 모든 토큰에 점수(로짓)를 냅니다. 샘플링 설정은 그 점수를 어떻게 선택으로 바꿀지 정하며, temperature는 무작위성을 조절하고 top-k는 가장 좋은 후보만 남깁니다.
쉬운 말로 이해하는 개념
언어 모델은 다음에 올 수 있는 모든 토큰에 점수(로짓)를 냅니다. 샘플링 설정은 그 점수를 어떻게 선택으로 바꿀지 정하며, temperature는 무작위성을 조절하고 top-k는 가장 좋은 후보만 남깁니다.
언어 모델이 다음 토큰을 고르는 방법을 순수 Python으로 확인합니다: layer normalization, temperature, top-k 샘플링.
핵심 아이디어
- temperature가 1보다 낮으면 출력이 더 예측 가능해지고, 1보다 높으면 더 창의적이 됩니다.
- top-k 샘플링은 가능성이 낮은 토큰을 제거해 글이 주제에서 벗어나지 않게 합니다.
- 텍스트는 한 번에 한 토큰씩 생성되며, 새 토큰은 다시 입력으로 들어갑니다.
- Layer normalization은 값이 여러 층을 지나는 동안 안정적인 범위를 유지하게 합니다.
언제 사용하나요?
- 신경망과 AI 라이브러리 내부에서 무슨 일이 일어나는지 이해합니다.
- 해당 챌린지에서 직접 구현하기 전에 아이디어를 익힙니다.
- 머신러닝 강의, 면접, 프로젝트를 준비합니다.
직접 움직여 보기
주사위 버튼을 눌러 다음 단어를 샘플링하세요. temperature나 top-k를 낮추면 선택이 더 예측 가능해집니다.
예제 코드
import math
import random
# Layer normalization rescales a vector to mean 0 and variance 1.
def layer_norm(x, eps=1e-5):
mean = sum(x) / len(x)
var = sum((v - mean) ** 2 for v in x) / len(x)
return [(v - mean) / math.sqrt(var + eps) for v in x]
print("layer norm:", [round(v, 3) for v in layer_norm([2.0, 4.0, 6.0, 8.0])])
# Next-token scores from a model; temperature and top-k shape the choice.
words = ["cat", "dog", "car", "sky"]
logits = [2.0, 1.5, 0.3, -1.0]
def probabilities(temperature=1.0, top_k=None):
scores = [l / temperature for l in logits]
if top_k: # keep only the k best scores
cutoff = sorted(scores, reverse=True)[top_k - 1]
scores = [s if s >= cutoff else -1e9 for s in scores]
exps = [math.exp(s - max(scores)) for s in scores]
return [e / sum(exps) for e in exps]
for t, k in [(1.0, None), (0.5, None), (1.0, 2)]:
print(f"temperature={t} top_k={k}:", [round(p, 2) for p in probabilities(t, k)])
random.seed(7)
print("sampled:", random.choices(words, weights=probabilities(0.8, 3), k=5))
예상 출력
layer norm: [-1.342, -0.447, 0.447, 1.342]
temperature=1.0 top_k=None: [0.54, 0.33, 0.1, 0.03]
temperature=0.5 top_k=None: [0.71, 0.26, 0.02, 0.0]
temperature=1.0 top_k=2: [0.62, 0.38, 0.0, 0.0]
sampled: ['cat', 'cat', 'dog', 'cat', 'cat']
작동 원리
layer_norm()은 벡터를 평균 0, 분산 1로 맞추며, Transformer는 모든 블록 안에서 이를 수행합니다. probabilities()는 로짓을 temperature로 나눈 뒤 Softmax를 적용하므로, temperature가 낮을수록 1위 단어가 뽑힐 가능성이 커집니다. top-k는 Softmax 전에 상위 k개 밖의 점수를 거의 −∞로 만듭니다.
값을 변경하고 Python 설치 없이 CodeUtility 온라인 Python 컴파일러에서 실행하세요.
연습 문제
입력값과 경계 조건을 바꾸고 더 큰 데이터에서도 동작을 확인하세요.
- 입력이나 가중치를 바꾸고 실행하기 전에 출력을 예상해 보세요.
- 중간 값을 출력해 계산의 각 단계를 따라가 보세요.
- 아래에 연결된 챌린지를 풀며 아이디어를 직접 구현해 보세요.
챌린지로 연습하기
이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.
- 레이어 정규화 각 행을 평균 0, 분산 1로 정규화한 뒤 스케일과 이동을 적용합니다. 모든 트랜스포머 블록에서 쓰입니다. 보통
- 온도와 Top-K 샘플링 언어 모델처럼 다음 토큰을 고릅니다: 상위 k개 로짓을 남기고 온도를 적용한 뒤 샘플링합니다. 보통