Ch.5 확률과 AI의 판단

Cross-Entropy — AI의 성적표

Cross-Entropy 손실 함수의 의미를 이해한다학습 단계에 따른 손실 감소를 시각적으로 파악한다NumPy로 Cross-Entropy를 계산할 수 있다

AI의 예측이 얼마나 '틀렸는지' 어떻게 측정할까?

모델이 '좋다'를 정답으로 예측해야 하는데, 20% 확률만 줬다면 많이 틀린 겁니다. 85% 확률을 줬다면 거의 맞춘 거죠. 이 '틀린 정도'를 숫자로 표현할 수 있을까요?

예측 확률과 정답 사이의 '거리'를 어떻게 측정하는가?

Cross-Entropy — 모델의 예측이 정답과 얼마나 다른지 측정하는 LLM의 성적표입니다.

lightbulb

핵심 개념

크로스 엔트로피

예측 확률과 정답 사이의 차이를 측정하는 손실 함수

손실 함수

모델의 예측이 정답과 얼마나 다른지 요약하는 함수


article

핵심 내용

정답 확률이 높을수록 손실이 작아집니다

H(p, q) = -Σ_i=1^N p(x_i) × \log(q(x_i))

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의 판단

key

핵심 용어

📉

크로스 엔트로피

예측 확률과 정답 사이의 차이를 측정하는 손실 함수

📉

손실 함수

모델의 예측이 정답과 얼마나 다른지 요약하는 함수

edit_note

정리 노트

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에 가까워집니다!

image

시각 자료

다이어그램: py-scene-loss-curve
check_circle

핵심 정리

  • 1Softmax = logits → 확률 분포 변환 (합=1)
  • 2Temperature = 확률 분포의 날카로움 조절 (T↓확정, T↑창의)
  • 3Cross-Entropy = 예측과 정답의 차이 측정 (LLM의 성적표)
  • 4LLM 학습 = Cross-Entropy 최소화 게임

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

play_circle인터랙티브 레슨 시작