Python으로 배우는 AI 개념

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를 낮추면 선택이 더 예측 가능해집니다.

예제 코드

코드 실행 →
main.py
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 컴파일러에서 실행하세요.

연습 문제

입력값과 경계 조건을 바꾸고 더 큰 데이터에서도 동작을 확인하세요.

  1. 입력이나 가중치를 바꾸고 실행하기 전에 출력을 예상해 보세요.
  2. 중간 값을 출력해 계산의 각 단계를 따라가 보세요.
  3. 아래에 연결된 챌린지를 풀며 아이디어를 직접 구현해 보세요.
Python IDE에서 실행 →

챌린지로 연습하기

이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.

모든 챌린지