Ch.5 확률과 AI의 판단
Softmax — AI는 어떻게 선택하는가?
AI는 어떻게 다음 단어를 '선택'할까?
'오늘 날씨가' 다음에 올 단어를 AI가 고릅니다. '좋다' 35%, '나쁘다' 15%, '덥다' 12%... 이 확률은 어디서 올까요?
모델이 출력하는 raw 점수(logits)를 어떻게 확률로 바꿀까?
Softmax — 임의의 숫자들을 0~1 사이의 확률 분포로 변환하는 LLM의 핵심 함수입니다.
핵심 개념
소프트맥스
실수 벡터를 확률 분포(합=1)로 변환하는 함수
로짓
소프트맥스 적용 전 모델의 원시 출력값
핵심 내용
LLM의 본질은 '다음 토큰의 확률 분포를 계산하는 것'입니다
'오늘 날씨가' → {'좋다': 35%, '나쁘다': 15%, '덥다': 12%, ...}
확률을 계산하고 샘플링하는 것이 텍스트 생성의 전부
Softmax, Logits, 확률 분포(Probability Distribution)
임의의 숫자를 확률 분포로 바꾸는 마법의 함수
각 값에 자연지수(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 마스터!
핵심 용어
소프트맥스
실수 벡터를 확률 분포(합=1)로 변환하는 함수
로짓
소프트맥스 적용 전 모델의 원시 출력값
학습 시
손실 함수(Cross-Entropy), 드롭아웃
추론 시
Softmax, Temperature, Top-k/Top-p
평가 시
Perplexity, BLEU, ROUGE
정리 노트
Softmax · Logits · 확률 분포 핵심 정리
Softmax 핵심 성질
- 공식
- softmax(xᵢ) = eˣⁱ / Σeˣʲ — 자연지수 후 전체 합으로 나눔
- 출력 범위
- 모든 값이 0~1 사이, 합이 반드시 1 (확률 분포)
- 수치 안정성
- 오버플로 방지를 위해 max(x)를 먼저 빼줌 (결과 동일)
LLM에서의 역할
- 로짓(Logits)
- Softmax 적용 전 모델의 원시 출력값 (임의의 실수)
- 확률 분포
- 로짓 → Softmax → 다음 토큰 확률 (합=1)
- 텍스트 생성
- 확률 분포에서 샘플링하여 다음 토큰을 선택
LLM의 본질은 '다음 토큰의 확률 분포를 계산하는 것' — Softmax가 그 마지막 관문입니다!
시각 자료
핵심 정리
- 1LLM은 다음 토큰의 확률 분포를 계산하는 확률 기계
- 2Softmax = logits를 확률 분포(합=1)로 변환하는 함수
- 3e^x로 부각 → 전체 합으로 나누기 → 확률 완성
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작