Ch.5 확률과 AI의 판단

Softmax — AI는 어떻게 선택하는가?

Softmax 함수의 역할과 수학적 정의를 이해한다logits를 확률 분포로 변환하는 과정을 설명한다NumPy로 Softmax를 직접 구현할 수 있다

AI는 어떻게 다음 단어를 '선택'할까?

'오늘 날씨가' 다음에 올 단어를 AI가 고릅니다. '좋다' 35%, '나쁘다' 15%, '덥다' 12%... 이 확률은 어디서 올까요?

모델이 출력하는 raw 점수(logits)를 어떻게 확률로 바꿀까?

Softmax — 임의의 숫자들을 0~1 사이의 확률 분포로 변환하는 LLM의 핵심 함수입니다.

lightbulb

핵심 개념

소프트맥스

실수 벡터를 확률 분포(합=1)로 변환하는 함수

로짓

소프트맥스 적용 전 모델의 원시 출력값


article

핵심 내용

LLM의 본질은 '다음 토큰의 확률 분포를 계산하는 것'입니다

'오늘 날씨가' → {'좋다': 35%, '나쁘다': 15%, '덥다': 12%, ...}

확률을 계산하고 샘플링하는 것이 텍스트 생성의 전부

Softmax, Logits, 확률 분포(Probability Distribution)

임의의 숫자를 확률 분포로 바꾸는 마법의 함수

softmax(x_i) = \frace^{x_i}Σ_{j=1^N e^x_j}

각 값에 자연지수(e)를 씌운 뒤, 전체 합으로 나누어 모든 출력이 0~1 사이가 되고 합이 1이 되도록 합니다.

Softmax의 핵심 성질: 1. 모든 출력값이 0~1 사이 2. 모든 출력값의 합이 1 (확률 분포) 3. 가장 큰 입력값이 가장 높은 확률을 받음 4. 수치 안정성을 위해 max(x)를 빼줌

직접 Softmax를 구현해봅시다

import numpy as np

def softmax(logits):
    """임의의 숫자를 확률 분포로 변환"""
    exp_vals = np.exp(logits - np.max(logits))  # 수치 안정성
    return exp_vals / np.sum(exp_vals)

# 모델이 출력한 raw 점수 (logits)
# "오늘 날씨가" 다음에 올 토큰 후보들
words = ["좋다", "나쁘다", "덥다", "춥다", "흐리다"]
logits = np.array([3.2, 1.8, 1.5, 1.0, 0.5])

probs = softmax(logits)

print("=== Softmax 결과 ===")
for word, prob in zip(words, probs):
    bar = "█" * int(prob * 40)
    print(f"  {word:4s}: {prob:.4f}  {bar}")
print(f"\n합계: {np.sum(probs):.4f}")

logits 값을 바꿔가며 Softmax 출력이 어떻게 변하는지 직접 확인합니다

# Softmax 입력값 변화 실험
import math

def softmax(logits):
    max_val = max(logits)
    exps = [math.exp(x - max_val) for x in logits]
    total = sum(exps)
    return [e / total for e in exps]

words = ["맑다", "흐리다", "춥다", "덥다"]

# 시나리오별 logits 비교
scenarios = {
    "균등": [1.0, 1.0, 1.0, 1.0],
    "맑다 우세": [5.0, 1.0, 1.0, 1.0],
    "맑다 압도적": [10.0, 1.0, 1.0, 1.0],
    "맑다 vs 흐리다": [3.0, 2.8, 0.5, 0.5],
}

for name, logits in scenarios.items():
    probs = softmax(logits)
    print(f"\n[{name}] logits = {logits}")
    for w, p in zip(words, probs):
        bar = "#" * int(p * 30)
        print(f"  {w}: {p:.3f} {bar}")

Softmax 함수의 출력값을 모두 더하면 얼마인가요?

Softmax에서 입력값(logits)이 가장 큰 항목이 항상 가장 높은 확률을 받는다.

Softmax 함수에서 수치 안정성을 위해 입력값에 어떤 처리를 하나요?

다음 코드의 빈칸을 채우세요. import numpy as np def softmax(x): e = np.exp(x - np.max(x)) return e / e.___()

e.___() (모든 원소의 합)

Softmax의 출력값 중 하나가 음수가 될 수 있다.

Softmax 마스터!

key

핵심 용어

📊

소프트맥스

실수 벡터를 확률 분포(합=1)로 변환하는 함수

📈

로짓

소프트맥스 적용 전 모델의 원시 출력값

🎓

학습 시

손실 함수(Cross-Entropy), 드롭아웃

🔮

추론 시

Softmax, Temperature, Top-k/Top-p

📊

평가 시

Perplexity, BLEU, ROUGE

edit_note

정리 노트

Softmax · Logits · 확률 분포 핵심 정리

Softmax 핵심 성질

공식
softmax(xᵢ) = eˣⁱ / Σeˣʲ — 자연지수 후 전체 합으로 나눔
출력 범위
모든 값이 0~1 사이, 합이 반드시 1 (확률 분포)
수치 안정성
오버플로 방지를 위해 max(x)를 먼저 빼줌 (결과 동일)

LLM에서의 역할

로짓(Logits)
Softmax 적용 전 모델의 원시 출력값 (임의의 실수)
확률 분포
로짓 → Softmax → 다음 토큰 확률 (합=1)
텍스트 생성
확률 분포에서 샘플링하여 다음 토큰을 선택

LLM의 본질은 '다음 토큰의 확률 분포를 계산하는 것' — Softmax가 그 마지막 관문입니다!

image

시각 자료

다이어그램: py-scene-softmax
다이어그램: neural-net
check_circle

핵심 정리

  • 1LLM은 다음 토큰의 확률 분포를 계산하는 확률 기계
  • 2Softmax = logits를 확률 분포(합=1)로 변환하는 함수
  • 3e^x로 부각 → 전체 합으로 나누기 → 확률 완성

퀴즈와 인터랙션으로 더 깊이 학습하세요

play_circle인터랙티브 레슨 시작