베이즈 정리: AI 학습과 추론의 철학적 기반

베이즈 정리의 핵심을 이해하고, 나이브 베이즈 분류기, 베이즈 최적화, LLM과의 연관성까지 직접 코드로 확인한다.

· 9 min read · PALDYN Team

지난 글에서 조건부 확률, 엔트로피, 교차 엔트로피 손실의 관계를 살펴봤다. 이번에는 AI의 핵심 수학 기초 시리즈의 마지막 주제인 **베이즈 정리(Bayes’ Theorem)**를 다룬다. 베이즈 정리는 18세기 영국 목사 토머스 베이즈(Thomas Bayes)가 고안한 공식이지만, 현대 AI·머신러닝의 철학적 기반이 된다. “새로운 증거를 보고 기존 믿음을 얼마나 바꿔야 하는가?”라는 질문에 수학적으로 답한다.

베이즈 정리: 믿음의 업데이트 공식

베이즈 정리는 한 줄로 표현된다.

P(H|E) = P(E|H) · P(H) / P(E)

각 항의 의미를 스팸 필터 예시로 이해해보자.

  • P(H) (사전 확률, Prior): 증거를 보기 전, 이메일이 스팸일 확률. 전체 이메일 중 30%가 스팸이라면 P(스팸) = 0.30
  • P(E|H) (우도, Likelihood): 스팸이라고 가정했을 때 “무료”라는 단어가 포함될 확률. P(“무료”|스팸) = 0.80
  • P(E) (증거, Evidence): 전체 이메일에서 “무료” 단어가 나올 확률 (정규화 상수)
  • P(H|E) (사후 확률, Posterior): “무료”를 봤을 때 스팸일 확률 → 우리가 알고 싶은 값
# 베이즈 정리 계산 예시
# 스팸 필터: "무료" 단어가 있을 때 스팸일 확률

p_spam = 0.30             # 사전 확률: 30% 이메일이 스팸
p_free_given_spam = 0.80  # 우도: 스팸에서 "무료" 포함 확률
p_free_given_ham = 0.10   # 우도: 정상에서 "무료" 포함 확률

# P("무료") = P("무료"|스팸)·P(스팸) + P("무료"|정상)·P(정상)
p_free = (p_free_given_spam * p_spam +
          p_free_given_ham * (1 - p_spam))
print(f"P('무료') = {p_free:.3f}")  # 0.310

# 베이즈 정리 적용
p_spam_given_free = (p_free_given_spam * p_spam) / p_free
print(f"P(스팸|'무료') = {p_spam_given_free:.3f}")  # ≈ 0.774
# "무료" 단어 하나로 스팸 확률이 30% → 77.4%로 업데이트!

베이즈 정리 완전 해부

의료 진단에서의 기저율 오류

베이즈 정리의 가장 유명한 응용이자 가장 많은 사람이 직관적으로 틀리는 문제가 **기저율 무시(Base Rate Neglect)**다.

# 99% 정확도 검사인데, 양성이면 정말 병에 걸렸을까?
p_disease = 0.001       # 유병률 0.1%
p_pos_given_disease = 0.99  # 민감도: 환자의 99%가 양성
p_pos_given_healthy = 0.05  # 위양성률: 건강인의 5%가 양성

# 전체 양성 확률
p_positive = (p_pos_given_disease * p_disease +
              p_pos_given_healthy * (1 - p_disease))

# 양성일 때 실제 병에 걸렸을 확률
p_disease_given_pos = (p_pos_given_disease * p_disease) / p_positive
print(f"양성 → 실제 병: {p_disease_given_pos:.3f}")  # ≈ 0.019 (1.9%!)

99%의 민감도에도 불구하고 양성 결과의 실제 의미는 불과 1.9%의 확률로 병에 걸렸다는 것이다. 왜? 유병률(0.1%)이 너무 낮기 때문이다. 대부분의 양성 판정은 건강한 사람에서 나온 위양성이다. 이것이 바로 베이즈 정리의 실용적 힘이다.

나이브 베이즈: 베이즈 정리를 ML로

**나이브 베이즈(Naive Bayes)**는 베이즈 정리를 직접 분류기로 구현한 알고리즘이다. “나이브(Naive, 단순한)“라는 이름은 특징들이 서로 조건부 독립이라는 강한 가정에서 온다.

from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.pipeline import Pipeline

# 한국어 스팸 필터
emails = [
    "무료 쿠폰 지금 클릭하세요",
    "내일 회의 시간을 알려주세요",
    "당신이 선택되었습니다 혜택 받기",
    "프로젝트 검토 부탁드립니다",
    "무료 이벤트 참여하고 혜택을",
    "오늘 보고서 제출 기한입니다",
]
labels = [1, 0, 1, 0, 1, 0]  # 1=스팸, 0=정상

# 파이프라인: 벡터화 + 나이브 베이즈
pipeline = Pipeline([
    ('vectorizer', CountVectorizer()),
    ('classifier', MultinomialNB())
])

pipeline.fit(emails, labels)

# 새 이메일 분류
new_emails = ["무료 혜택을 받아가세요", "팀 미팅 일정 조율"]
predictions = pipeline.predict(new_emails)
probabilities = pipeline.predict_proba(new_emails)

for email, pred, prob in zip(new_emails, predictions, probabilities):
    label = "스팸" if pred == 1 else "정상"
    print(f"'{email}' → {label} (확률: {prob[pred]:.2f})")

나이브 베이즈 분류기 구현

나이브 베이즈의 독립성 가정은 현실적이지 않다. “무료”와 “클릭”은 스팸에서 함께 나타나는 경향이 있으므로 독립이 아니다. 그러나 실제로는 놀랍도록 잘 작동한다. 구글의 초기 스팸 필터도 나이브 베이즈를 기반으로 했다.

베이즈 최적화: 하이퍼파라미터 탐색

머신러닝의 실무에서 베이즈 정리가 가장 직접적으로 쓰이는 또 다른 곳은 **베이즈 최적화(Bayesian Optimization)**다. 학습률, 배치 크기, 층 수 같은 하이퍼파라미터를 자동으로 찾을 때 쓰인다.

# Optuna로 구현한 베이즈 최적화 예시
import optuna

def objective(trial):
    # 탐색할 하이퍼파라미터 정의
    lr = trial.suggest_float("lr", 1e-5, 1e-1, log=True)
    dropout = trial.suggest_float("dropout", 0.0, 0.5)
    hidden_dim = trial.suggest_categorical("hidden", [64, 128, 256])

    # 모델 학습 및 검증 손실 반환
    val_loss = train_and_evaluate(lr, dropout, hidden_dim)
    return val_loss

# 베이즈 최적화 실행 (랜덤 탐색보다 훨씬 효율적)
study = optuna.create_study(direction="minimize")
study.optimize(objective, n_trials=50)

print(f"최적 파라미터: {study.best_params}")

그리드 탐색은 모든 조합을 시도하고, 랜덤 탐색은 무작위로 탐색한다. 베이즈 최적화는 이전 평가 결과를 기반으로 다음에 탐색할 지점을 선택한다. “이 방향이 좋을 것 같다”는 믿음을 업데이트하면서 탐색한다. 바로 베이즈 정리의 사전→사후 확률 업데이트 원리다.

LLM과 베이즈적 관점

LLM의 동작을 베이즈 관점에서 해석하면 흥미로운 통찰이 나온다.

사전 학습(Pre-training)은 수조 개의 토큰으로부터 “언어와 세계에 대한 일반 지식”을 학습한다. 이것이 **사전 분포(Prior)**다. 모델이 학습 데이터에서 본 패턴, 사실, 추론 방식의 집약이다.

프롬프트(Prompt)는 **증거(Evidence)**다. “당신은 한국어 교사입니다. 학생에게 설명해주세요”라는 프롬프트는 모델이 어떤 스타일로 응답해야 하는지에 대한 증거다.

모델의 응답은 **사후 분포(Posterior)**다. 사전 학습된 지식과 프롬프트 맥락을 결합해 가장 적절한 응답을 생성한다.

RAG(Retrieval-Augmented Generation)는 이 관점에서 더 풍부한 증거를 제공하는 방법이다. 검색된 문서들이 추가적인 증거가 되어 모델의 사후 분포를 더 정확하게 만든다.

수학 기초의 마무리

이번 편으로 AI의 수학 기초 파트(선형대수, 행렬 연산, 확률론, 베이즈 정리)가 마무리된다. 이 수학들은 AI를 처음 배울 때 어렵게 느껴지지만, 결국 모두 같은 목표를 향한다. “어떻게 데이터에서 의미 있는 패턴을 발견하고, 불확실한 세계에서 최선의 예측을 할 것인가?” 다음 파트에서는 이 수학적 토대 위에 머신러닝 알고리즘이 어떻게 구축되는지 살펴볼 것이다.


지난 글: AI를 위한 확률론 기초: 불확실성을 다루는 언어


읽어주셔서 감사합니다. 😊