Ch.5 확률과 AI의 판단
Cross-Entropy — AI의 성적표
AI의 예측이 얼마나 '틀렸는지' 어떻게 측정할까?
모델이 '좋다'를 정답으로 예측해야 하는데, 20% 확률만 줬다면 많이 틀린 겁니다. 85% 확률을 줬다면 거의 맞춘 거죠. 이 '틀린 정도'를 숫자로 표현할 수 있을까요?
예측 확률과 정답 사이의 '거리'를 어떻게 측정하는가?
Cross-Entropy — 모델의 예측이 정답과 얼마나 다른지 측정하는 LLM의 성적표입니다.
핵심 개념
크로스 엔트로피
예측 확률과 정답 사이의 차이를 측정하는 손실 함수
손실 함수
모델의 예측이 정답과 얼마나 다른지 요약하는 함수
핵심 내용
정답 확률이 높을수록 손실이 작아집니다
p는 정답 분포(예: '좋다'=1, 나머지=0), q는 모델의 예측 분포(예: '좋다'=0.49, '나쁘다'=0.12, ...). 정답에 해당하는 위치의 확률이 높을수록 손실이 작습니다.
정답 확률 0.01: 손실 4.60 — 매우 틀림
정답 확률 0.20: 손실 1.61 — 많이 틀림
정답 확률 0.85: 손실 0.16 — 거의 맞음
정답 확률 1.00: 손실 0.00 — 완벽!
학습이 진행되면서 손실이 어떻게 줄어드는지 봅시다
import numpy as np
def cross_entropy(true_label_idx, predicted_probs):
"""모델의 예측이 정답과 얼마나 다른지 측정"""
return -np.log(predicted_probs[true_label_idx] + 1e-10)
words = ["좋다", "나쁘다", "덥다", "춥다", "흐리다"]
true_answer = 0 # 정답: "좋다"
# 학습 단계별 모델의 예측
early_probs = np.array([0.20, 0.20, 0.20, 0.20, 0.20])
mid_probs = np.array([0.45, 0.20, 0.15, 0.12, 0.08])
late_probs = np.array([0.85, 0.06, 0.04, 0.03, 0.02])
print("=== 학습 단계별 Cross-Entropy 손실 ===\n")
for name, probs in [("학습 초기", early_probs),
("학습 중기", mid_probs),
("학습 후기", late_probs)]:
loss = cross_entropy(true_answer, probs)
bar = "█" * int(loss * 10)
print(f"{name}: 손실 = {loss:.4f} {bar}")
print(f" '좋다' 예측 확률: {probs[0]:.2f}")
print()LLM의 사전훈련 목표는 Cross-Entropy 손실을 최소화하는 것
입력: '오늘 날씨가'
정답: '좋다'
모델 예측: {'좋다': 0.2, '나쁘다': 0.3, ...}
손실 계산: -log(0.2) = 1.61 (많이 틀림!)
역전파: 파라미터 업데이트
반복 학습: 수조 번 반복 → 언어의 구조와 지식을 학습
모델의 예측이 정답과 얼마나 다른지를 Cross-Entropy로 직접 측정합니다
# Cross-Entropy 손실 직접 계산
import math
def cross_entropy(true_idx, probs):
# -log(정답 확률)
p = max(probs[true_idx], 1e-10) # 0 방지
return -math.log(p)
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 = ["사과", "바나나", "포도", "딸기"]
true_answer = 0 # 정답: "사과"
# 학습 단계별 logits 시뮬레이션
stages = {
"초기 (랜덤)": [0.2, 0.3, 0.1, 0.4],
"학습 10회": [1.5, 0.8, 0.3, 0.2],
"학습 100회": [3.0, 0.5, 0.2, 0.1],
"학습 1000회": [6.0, 0.3, 0.1, 0.05],
}
for stage, logits in stages.items():
probs = softmax(logits)
loss = cross_entropy(true_answer, probs)
print(f"\n[{stage}]")
for w, p in zip(words, probs):
marker = " <-- 정답" if w == words[true_answer] else ""
print(f" {w}: {p:.4f}{marker}")
print(f" 손실(loss): {loss:.4f}")모델이 정답에 99% 확률을 부여했다면 Cross-Entropy 손실은 어떨까요?
Cross-Entropy 손실이 0이 되면 모델이 정답을 100% 확률로 예측한 것이다.
모델이 정답에 0.5(50%) 확률을 부여했을 때 -log(0.5)의 값은 대략 얼마인가요?
Cross-Entropy는 분류(classification) 문제에서만 사용할 수 있다.
다음 빈칸을 채우세요. loss = -np.___(predicted_prob) # 정답 토큰의 확률에 대한 Cross-Entropy
-np.___(prob)
확률과 AI의 판단
핵심 용어
크로스 엔트로피
예측 확률과 정답 사이의 차이를 측정하는 손실 함수
손실 함수
모델의 예측이 정답과 얼마나 다른지 요약하는 함수
정리 노트
Cross-Entropy 손실 함수 핵심 정리
수학적 정의
- 공식
- H(p,q) = −Σ p(x)·log(q(x)) — 정답 분포와 예측 분포의 차이
- 정답 확률 높으면
- −log(0.99) ≈ 0.01 → 손실이 매우 작음 (거의 맞음)
- 정답 확률 낮으면
- −log(0.01) ≈ 4.60 → 손실이 매우 큼 (크게 틀림)
LLM 학습에서의 역할
- 학습 목표
- Cross-Entropy 손실을 최소화하는 것이 사전훈련의 본질
- 역전파
- 손실 → 기울기 계산 → 파라미터 업데이트 → 반복
- 수렴
- 수조 번 반복하여 손실이 충분히 작아지면 학습 종료
Cross-Entropy는 AI의 '성적표'입니다. 정답 확률이 높을수록 손실이 0에 가까워집니다!
시각 자료
핵심 정리
- 1Softmax = logits → 확률 분포 변환 (합=1)
- 2Temperature = 확률 분포의 날카로움 조절 (T↓확정, T↑창의)
- 3Cross-Entropy = 예측과 정답의 차이 측정 (LLM의 성적표)
- 4LLM 학습 = Cross-Entropy 최소화 게임
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작