베이지안 사고방식

먼저 읽을 장 11.3 결합·주변·조건부분포와 독립성12.2 우도와 최대우도

12장의 빈도주의 추론은 파라미터 θ\theta를 고정된 미지량으로 두고, 절차가 반복 실험에서 얼마나 잘 동작하는지를 물었다. 추정량의 bias와 분산, 신뢰구간의 포함률, 검정의 오류율이 모두 "같은 실험을 다시 한다면"이라는 가정 위의 성질이다. 그런데 연구자가 실제로 묻는 질문은 흔히 다르다. "지금 가진 데이터 20개를 보고 나서, 이 센서의 bias가 0.3 °C보다 클 확률은 얼마인가?" 이 질문에 답하려면 θ\theta 자체에 확률분포를 두어야 한다.

이 장은 그렇게 하는 방법, 즉 베이지안 추론(Bayesian inference)의 뼈대를 세운다. 사전분포·우도·사후분포·사후예측분포라는 네 구성 요소를 정의하고, 관측이 쌓일 때 믿음이 갱신되는 방식을 보고, 12.2장의 MLE·MAP와 무엇이 같고 무엇이 다른지 정리한다. 마지막으로 신뢰구간과 신용구간이 서로 다른 질문에 답한다는 것을 시뮬레이션으로 확인한다.

학습 목표

  • 사전·우도·사후·사후예측분포를 정의한다
  • 빈도주의와 베이지안 해석을 구분한다
  • MLE·MAP·사후평균을 같은 문제에서 계산하고 차이를 설명한다

구성 요소

왜 필요한가. 12.2장에서 우도 L(θ)=p(D∣θ)L(\theta) = p(\mathcal{D} \mid \theta)는 θ\theta의 확률분포가 아니라고 강조했다. 우도는 "어떤 θ\theta가 데이터를 더 잘 설명하는가"를 상대적으로 비교할 뿐, "θ\theta가 0.3과 0.4 사이일 확률"을 말하지 못한다. 그런 확률을 말하려면 데이터를 보기 전의 믿음을 분포로 적고, 데이터로 그 분포를 고치는 규칙이 필요하다. 그 규칙이 Bayes 정리(11.3장)다.

정의. 파라미터 θ\theta와 데이터 D\mathcal{D}에 대해

p(θ∣D)⏟사후=p(D∣θ)⏞우도 p(θ)⏞사전p(D)⏟evidence,p(D)=∫p(D∣θ) p(θ) dθ.\underbrace{p(\theta \mid \mathcal{D})}_{\text{사후}} = \frac{\overbrace{p(\mathcal{D} \mid \theta)}^{\text{우도}}\ \overbrace{p(\theta)}^{\text{사전}}}{\underbrace{p(\mathcal{D})}_{\text{evidence}}}, \qquad p(\mathcal{D}) = \int p(\mathcal{D} \mid \theta)\, p(\theta)\, d\theta.
  • 사전분포(prior) p(θ)p(\theta): 데이터를 보기 전 θ\theta에 대한 믿음. 물리적 제약(양수, 특정 자릿수), 이전 실험, 장비 사양서가 원천이다.
  • 우도(likelihood) p(D∣θ)p(\mathcal{D} \mid \theta): 12.2장과 같은 것이다. 데이터 생성 과정에 대한 모델이다.
  • 사후분포(posterior) p(θ∣D)p(\theta \mid \mathcal{D}): 데이터를 본 뒤의 믿음. 베이지안 추론의 결과물은 숫자 하나가 아니라 이 분포 전체다.
  • evidence(marginal likelihood, 주변우도) p(D)p(\mathcal{D}): 우도를 사전분포로 평균한 값. θ\theta에 의존하지 않으므로 사후분포의 모양에는 영향이 없고 정규화 상수 역할을 한다. 하지만 모델 전체가 데이터를 얼마나 잘 예측했는지를 재는 양이라, 모델 비교에서는 핵심이 된다(13.2장).

분모를 빼고 쓰면 p(θ∣D)∝p(D∣θ) p(θ)p(\theta \mid \mathcal{D}) \propto p(\mathcal{D} \mid \theta)\,p(\theta), 즉 사후 ∝ 우도 × 사전이다. 우도가 같아도 사전분포가 다르면 사후분포가 다르다. 이 점이 장점(지식을 넣을 수 있다)이자 비판의 대상(주관이 들어간다)이다.

사후예측분포. 연구의 최종 질문은 파라미터보다 다음 관측에 대한 것일 때가 많다. 새 관측 y~\tilde{y}의 분포는 θ\theta를 사후분포로 평균해 얻는다.

p(y~∣D)=∫p(y~∣θ) p(θ∣D) dθ.p(\tilde{y} \mid \mathcal{D}) = \int p(\tilde{y} \mid \theta)\, p(\theta \mid \mathcal{D})\, d\theta.

이것이 사후예측분포(posterior predictive distribution)다. 12.3장의 표에서 "조건부 예측분포"와 "파라미터의 사후분포"를 구분했는데, 사후예측분포는 둘을 잇는다. 관측 잡음(aleatoric)과 파라미터 불확실성(epistemic)이 모두 들어 있다.

직관과 계산. 12.2장의 동전 데이터(20번 중 앞면 7번)를 그대로 쓴다. 사전분포로 Beta(2,2)\mathrm{Beta}(2, 2)를 둔다. 이 분포는 0.5 근처를 약간 선호하지만 0과 1 근처도 배제하지 않는다. θ\theta를 촘촘한 격자로 나누면 위 식의 적분을 합으로 바꿔 모든 구성 요소를 직접 계산할 수 있다.

import numpy as np
from scipy import stats

n, k = 20, 7                                     # 20번 던져 앞면 7번 (12.2장과 같은 데이터)
theta = np.linspace(0, 1, 2001)                  # 파라미터 격자, (G,)
dtheta = theta[1] - theta[0]

prior = stats.beta.pdf(theta, 2, 2)              # p(θ) = Beta(2, 2), (G,)
lik = stats.binom.pmf(k, n, theta)               # p(D | θ), (G,)
evidence = np.sum(lik * prior) * dtheta          # p(D) = ∫ p(D | θ) p(θ) dθ
post = lik * prior / evidence                    # p(θ | D), (G,)

print(f"evidence p(D)            = {evidence:.5f}")
print(f"사후분포의 적분           = {np.sum(post) * dtheta:.4f}")
print(f"격자 사후와 Beta(9, 15)의 최대 차이 < 1e-10: {np.max(np.abs(post - stats.beta.pdf(theta, 9, 15))) < 1e-10}")
print(f"P(다음 던지기가 앞면 | D) = {np.sum(theta * post) * dtheta:.4f}   (9/24 = {9 / 24:.4f})")
evidence p(D)            = 0.06324
사후분포의 적분           = 1.0000
격자 사후와 Beta(9, 15)의 최대 차이 < 1e-10: True
P(다음 던지기가 앞면 | D) = 0.3750   (9/24 = 0.3750)

격자로 계산한 사후분포는 Beta(9,15)\mathrm{Beta}(9, 15)와 수치 오차 수준에서 같다. 사전 Beta(2,2)\mathrm{Beta}(2, 2)의 두 파라미터에 앞면 수 7과 뒷면 수 13을 더한 것이다. 왜 이렇게 되는지는 13.2장(켤레 모델)에서 다룬다. 다음 던지기가 앞면일 사후예측확률은 ∫θ p(θ∣D) dθ\int \theta\, p(\theta \mid \mathcal{D})\, d\theta, 즉 사후평균 9/24=0.3759/24 = 0.375다. MLE를 꽂은 0.35와 다르다. 사전분포가 성공·실패를 하나씩 미리 본 것처럼 작용해 0.5 쪽으로 조금 당겼다.

사후예측분포가 plug-in 예측과 가장 크게 다른 점은 폭이다. 앞으로 20번을 더 던질 때 앞면 수를 예측해 본다. plug-in 예측은 θ^=0.35\hat\theta = 0.35가 참이라고 믿고 Binomial(20,0.35)\mathrm{Binomial}(20, 0.35)를 쓴다. 사후예측분포는 θ\theta의 불확실성까지 평균한다. 이 분포는 Beta-Binomial이라는 이름이 있고, "θ\theta를 사후분포에서 뽑은 뒤 그 θ\theta로 20번 던지는" 두 단계 샘플링으로도 얻을 수 있다.

m = 20                                           # 앞으로 20번 더 던진다
ks = np.arange(m + 1)                            # 가능한 앞면 수, (m+1,)
plug = stats.binom.pmf(ks, m, k / n)             # MLE θ̂ = 0.35를 꽂은 예측, (m+1,)
pred = stats.betabinom.pmf(ks, m, 9, 15)         # 사후예측 ∫ Binom(m, θ) p(θ | D) dθ, (m+1,)

rng = np.random.default_rng(0)                   # 같은 분포를 두 단계 샘플링으로 확인
sim = rng.binomial(m, rng.beta(9, 15, size=200_000))   # θ ~ 사후, 그 θ로 20번 던지기

for name, p in (("plug-in Binom(20, 0.35)", plug), ("사후예측 Beta-Binomial", pred)):
    mean = np.sum(ks * p)
    sd = np.sqrt(np.sum((ks - mean) ** 2 * p))
    lo, hi = ks[np.searchsorted(np.cumsum(p), [0.05, 0.95])]
    print(f"평균 {mean:.2f}  표준편차 {sd:.2f}  90% 범위 [{lo:2d}, {hi:2d}]   {name}")
print(f"평균 {sim.mean():.2f}  표준편차 {sim.std():.2f}                     두 단계 샘플링")
평균 7.00  표준편차 2.13  90% 범위 [ 4, 11]   plug-in Binom(20, 0.35)
평균 7.50  표준편차 2.87  90% 범위 [ 3, 12]   사후예측 Beta-Binomial
평균 7.50  표준편차 2.87                     두 단계 샘플링

표준편차가 2.13에서 2.87로 약 35% 커졌다. plug-in 예측은 동전 자체의 무작위성만 반영하고, 20번의 관측으로는 θ\theta를 정확히 알 수 없다는 사실을 버린다. 데이터가 적을수록 이 차이가 크고, 데이터가 많아져 사후분포가 좁아지면 두 예측은 같아진다. 12.3장에서 "모델이 보고하는 분포의 폭"이 무엇을 반영하는지 물었던 질문에 대한 베이지안의 답이 이것이다.

순차적 갱신

왜 필요한가. 실험은 한 번에 끝나지 않는다. 오늘 측정하고, 내일 더 측정하고, 다른 실험실의 결과가 나중에 도착한다. 관측이 올 때마다 처음부터 다시 계산해야 한다면 불편하고, 무엇보다 "지식이 쌓인다"는 과정을 표현하지 못한다.

정의. 관측 D1,D2\mathcal{D}_1, \mathcal{D}_2가 θ\theta가 주어졌을 때 조건부 독립이면

p(θ∣D1,D2)∝p(D2∣θ) p(D1∣θ) p(θ)⏟∝ p(θ∣D1)p(\theta \mid \mathcal{D}_1, \mathcal{D}_2) \propto p(\mathcal{D}_2 \mid \theta)\, \underbrace{p(\mathcal{D}_1 \mid \theta)\, p(\theta)}_{\propto\, p(\theta \mid \mathcal{D}_1)}

이다. 첫 데이터로 얻은 사후분포 p(θ∣D1)p(\theta \mid \mathcal{D}_1)가 둘째 데이터의 사전분포 자리에 들어간다. 오늘의 사후가 내일의 사전이다. 결과는 두 데이터를 한꺼번에 넣은 것과 정확히 같고, 관측 순서와도 무관하다.

동전의 Beta\mathrm{Beta} 사전에서는 갱신이 계수 세기로 줄어든다. 앞면이면 첫째 파라미터에, 뒷면이면 둘째 파라미터에 1을 더한다. 참 θ=0.35\theta = 0.35에서 50번을 하나씩 던지며 갱신한다.

rng = np.random.default_rng(1)
tosses = (rng.random(50) < 0.35).astype(int)     # 참 θ = 0.35에서 50번, (50,)

a, b = 2, 2                                      # 사전 Beta(2, 2)
for i, t in enumerate(tosses, 1):
    a, b = a + t, b + (1 - t)                    # 오늘의 사후가 내일의 사전
    if i in (1, 5, 20, 50):
        lo, hi = stats.beta.ppf([0.025, 0.975], a, b)
        print(f"n = {i:2d}  사후 Beta({a:2d}, {b:2d})  평균 {a / (a + b):.3f}  95% 구간 [{lo:.3f}, {hi:.3f}]")

h = tosses.sum()
print(f"한 번에 갱신                 사후 Beta({2 + h:2d}, {2 + 50 - h:2d})")
n =  1  사후 Beta( 2,  3)  평균 0.400  95% 구간 [0.068, 0.806]
n =  5  사후 Beta( 4,  5)  평균 0.444  95% 구간 [0.157, 0.755]
n = 20  사후 Beta(10, 14)  평균 0.417  95% 구간 [0.232, 0.615]
n = 50  사후 Beta(18, 36)  평균 0.333  95% 구간 [0.215, 0.463]
한 번에 갱신                 사후 Beta(18, 36)

관측이 쌓이면서 구간의 폭이 0.74에서 0.25로 줄고, 하나씩 갱신한 결과와 한 번에 갱신한 결과가 같다. 아래 위젯에서 사전분포의 평균 mm과 강도 κ=α0+β0\kappa = \alpha_0 + \beta_0를 바꾸며 같은 과정을 본다. "강한 편향" 사전(m=0.25m = 0.25)으로 시작하면 참값 θ∗=0.7\theta^* = 0.7에 다가가는 데 훨씬 많은 관측이 필요하다는 것을 확인한다.

연구에서의 의미. 순차적 갱신은 그대로 알고리즘이 된다. 위치·속도 같은 시간에 따라 변하는 상태를 측정이 올 때마다 갱신하는 Kalman filter(24.6장), 다음 실험 조건을 지금까지의 사후분포로 고르는 베이지안 실험 설계(25.3장)가 모두 이 구조다. 단 조건이 있다. 두 데이터가 θ\theta를 공유하고 서로 조건부 독립이어야 한다. 같은 데이터를 두 번 넣거나, 사전분포를 두 번 곱하면 실제보다 확신하는 사후분포가 나온다.

점추정과의 관계

왜 필요한가. 사후분포는 분포이지만, 보고서에는 결국 숫자를 써야 할 때가 있다. 그 숫자를 무엇으로 고를지, 그리고 12.2장의 MLE·MAP와는 어떤 관계인지 정리해 둔다.

세 가지 점추정.

θ^MLE=arg⁡max⁡θp(D∣θ),θ^MAP=arg⁡max⁡θp(θ∣D),θ^PM=E[θ∣D]=∫θ p(θ∣D) dθ.\hat\theta_{\text{MLE}} = \arg\max_\theta p(\mathcal{D} \mid \theta), \qquad \hat\theta_{\text{MAP}} = \arg\max_\theta p(\theta \mid \mathcal{D}), \qquad \hat\theta_{\text{PM}} = \mathbb{E}[\theta \mid \mathcal{D}] = \int \theta\, p(\theta \mid \mathcal{D})\, d\theta.

MLE는 사전분포를 쓰지 않는다. MAP는 사후분포의 최빈값이고, 사후평균(posterior mean)은 사후분포의 무게중심이다. 12.3장의 결정 이론을 사후분포에 적용하면, 사후평균은 제곱손실 E[(θ−θ^)2∣D]\mathbb{E}[(\theta - \hat\theta)^2 \mid \mathcal{D}]을, 사후중앙값은 절댓값손실을 최소화하는 결정이다. 즉 점추정을 고르는 일은 사후분포 위에서 손실을 정하는 일이다.

MAP가 베이지안이 아닌 이유. MAP는 사전분포를 쓰므로 베이지안처럼 보이지만, 두 가지 점에서 베이지안 추론이 아니다.

  1. 분포를 버린다. 사후분포의 꼭대기 한 점만 남기고 폭, 즉 파라미터 불확실성을 버린다. 앞 절의 사후예측분포를 만들 수 없다.
  2. 매개변수화에 의존한다. 확률밀도는 변수를 바꾸면 Jacobian이 곱해진다. θ\theta 대신 log-odds ϕ=log⁡θ1−θ\phi = \log\frac{\theta}{1-\theta}로 같은 사후분포를 나타내면 밀도는 p(ϕ∣D)=p(θ∣D) θ(1−θ)p(\phi \mid \mathcal{D}) = p(\theta \mid \mathcal{D})\,\theta(1-\theta)가 되고, 꼭대기의 위치가 움직인다. 같은 믿음을 다르게 적었을 뿐인데 MAP가 달라진다. 반면 분위수(중앙값, 구간의 끝점)는 단조 변환을 그대로 따라간다.

12.2장의 예(사전 Beta(2,2)\mathrm{Beta}(2, 2), 3번 중 3번 앞면)로 확인한다. 사후분포는 Beta(5,2)\mathrm{Beta}(5, 2)다.

a, b = 2 + 3, 2 + 0                              # 사전 Beta(2, 2), 3번 중 3번 앞면 → Beta(5, 2)
print(f"MLE       k/n           = {3 / 3:.3f}")
print(f"MAP       (a-1)/(a+b-2) = {(a - 1) / (a + b - 2):.3f}")
print(f"사후평균  a/(a+b)       = {a / (a + b):.3f}")
print(f"사후중앙값              = {stats.beta.median(a, b):.3f}")

# 같은 사후분포를 log-odds φ = log(θ/(1-θ))로 나타내면 밀도에 Jacobian dθ/dφ = θ(1-θ)가 곱해진다
phi = np.linspace(-6, 8, 140001)                 # (G,)
th = 1 / (1 + np.exp(-phi))                      # φ에 대응하는 θ, (G,)
dens_phi = stats.beta.pdf(th, a, b) * th * (1 - th)    # p(φ | D), (G,)
cdf_phi = np.cumsum(dens_phi) / dens_phi.sum()
print(f"φ 공간의 MAP를 θ로 되돌린 값      = {th[np.argmax(dens_phi)]:.3f}")
print(f"φ 공간의 중앙값을 θ로 되돌린 값   = {th[np.searchsorted(cdf_phi, 0.5)]:.3f}")
MLE       k/n           = 1.000
MAP       (a-1)/(a+b-2) = 0.800
사후평균  a/(a+b)       = 0.714
사후중앙값              = 0.736
φ 공간의 MAP를 θ로 되돌린 값      = 0.714
φ 공간의 중앙값을 θ로 되돌린 값   = 0.736

θ\theta 공간의 MAP는 0.8인데, 같은 사후분포를 ϕ\phi 공간에서 최대화하면 θ=5/7≈0.714\theta = 5/7 \approx 0.714에 해당하는 점이 나온다. 중앙값은 두 공간에서 0.736으로 같다. 신경망의 weight decay를 MAP로 해석할 수 있다는 12.2장의 결론은 그대로 유효하지만, 그것으로 "모델이 베이지안이다"라고 말할 수는 없다.

데이터가 많아지면. 관측 수 nn이 커지면 우도가 사전분포를 압도해 사후분포는 MLE 근처에 몰리고, 폭은 1/n1/\sqrt{n} 속도로 준다. 사전분포가 참값 근처에 0이 아닌 밀도를 주는 한, 세 점추정과 베이지안 구간·빈도주의 구간이 모두 비슷해진다. 베이지안과 빈도주의의 차이가 실제 숫자로 드러나는 곳은 데이터가 적은 곳, 즉 과학 연구에서 흔한 곳이다.

해석의 차이

두 가지 확률. 빈도주의에서 확률은 반복 실험에서의 장기 빈도다. 그래서 고정된 미지량 θ\theta에는 확률을 붙이지 않고, 데이터에서 계산한 구간처럼 무작위인 것에만 붙인다. 베이지안에서 확률은 불확실성의 정도를 나타내는 수다. 그래서 반복할 수 없는 단 하나의 미지량(이 센서의 bias, 이 행성의 질량)에도 분포를 둘 수 있다. 두 관점 모두 같은 우도를 쓴다. 다른 것은 무엇이 무작위인가와 확률 문장의 주어다.

신용구간. 사후분포에서 확률 1−α1-\alpha를 담는 구간 [l,u][l, u], 즉

Pr⁡[l≤θ≤u∣D]=1−α\Pr[l \le \theta \le u \mid \mathcal{D}] = 1 - \alpha

인 구간을 신용구간(credible interval)이라 한다. 양쪽 꼬리에 α/2\alpha/2씩 남기는 등꼬리 구간이 가장 흔하다. 12.4장의 신뢰구간(confidence interval)과 비교하면 다음과 같다.

신뢰구간 신용구간
무작위인 것 구간 [L(X),U(X)][L(X), U(X)] θ\theta (사후분포로 표현한 불확실성)
약속 모든 고정된 θ\theta에서, 반복 실험의 95%가 θ\theta를 덮는다 이 데이터와 사전분포 아래에서 θ\theta가 구간 안에 있을 확률이 95%다
필요한 것 표본분포 사전분포
"참값이 이 구간에 있을 확률 95%" 틀린 해석 맞는 해석 (사전분포가 맞다면)

두 약속이 정말 다른지 시뮬레이션으로 확인한다. 20번 던지는 실험을 2만 번 반복한다. 빈도주의 쪽은 이항분포의 Clopper–Pearson 정확 신뢰구간(Clopper & Pearson, 1934)을, 베이지안 쪽은 균등 사전 Beta(1,1)\mathrm{Beta}(1, 1)의 95% 신용구간을 쓴다. 질문 두 가지를 던진다. (1) θ=0.05\theta = 0.05로 고정하고 반복하면 각 구간이 θ\theta를 덮는 비율은? (2) 실험마다 θ\theta를 사전분포에서 새로 뽑으면?

rng = np.random.default_rng(2)
n, R = 20, 20000                                 # 20번 던지는 실험을 R번 반복

ks = np.arange(n + 1)                            # 가능한 앞면 수마다 구간을 한 번씩 계산, (n+1,)
cp = (np.nan_to_num(stats.beta.ppf(0.025, ks, n - ks + 1), nan=0.0),    # Clopper-Pearson
      np.nan_to_num(stats.beta.ppf(0.975, ks + 1, n - ks), nan=1.0))    # 빈도주의 정확 신뢰구간
cr = stats.beta.ppf([[0.025], [0.975]], 1 + ks, 1 + n - ks)  # 균등 사전 Beta(1, 1)의 신용구간

def report(label, th, k):
    for name, (lo, hi) in (("Clopper-Pearson 신뢰구간", cp), ("신용구간", cr)):
        print(f"{label}  포함률 {np.mean((lo[k] <= th) & (th <= hi[k])):.3f}   {name}")

report("θ = 0.05 고정  ", 0.05, rng.binomial(n, 0.05, size=R))
th = rng.beta(1, 1, size=R)                      # θ를 실험마다 사전분포에서 새로 뽑는다, (R,)
report("θ ~ Beta(1, 1)", th, rng.binomial(n, th))
θ = 0.05 고정    포함률 0.985   Clopper-Pearson 신뢰구간
θ = 0.05 고정    포함률 0.921   신용구간
θ ~ Beta(1, 1)  포함률 0.979   Clopper-Pearson 신뢰구간
θ ~ Beta(1, 1)  포함률 0.951   신용구간

각 구간은 자기 약속은 지킨다. Clopper–Pearson 구간은 어떤 고정된 θ\theta에서도 95% 이상을 덮도록 만든 구간이라 θ=0.05\theta = 0.05에서도 0.985를 덮는다(이산 데이터라 보수적이다). 신용구간은 특정한 θ=0.05\theta = 0.05에서는 0.921로 95%에 못 미치지만, θ\theta가 사전분포를 따라 바뀌는 상황을 평균하면 정확히 0.951이다. 신용구간의 95%는 "사전분포가 참값들의 분포를 잘 나타낸다면"이라는 조건이 붙은 약속이다.

연구에서의 의미. 어느 구간을 보고할지는 질문에 달려 있다. 규제·품질 관리처럼 "어떤 상황에서도 오류율이 5%를 넘지 않는 절차"가 필요하면 신뢰구간이 맞다. 실험 하나의 결과를 바탕으로 "이 값이 기준을 넘을 확률"을 계산해 의사결정에 쓰려면 사후분포가 필요하다. 어느 쪽이든 보고서에는 무엇을 계산했는지와, 베이지안이라면 사전분포를 함께 적는다.

실습

동전 던지기와 센서 보정 두 예제에서 사전분포를 바꾸며 사후분포가 어떻게 달라지는지 본다. 코드는 labs/bayesian-inference/bayesian-thinking/prior_sensitivity.py이고, 그림을 outputs/prior_sensitivity.png에 저장한다.

  • 동전: 참 θ∗=0.7\theta^* = 0.7. 위젯과 같은 세 사전분포(균등 Beta(1,1)\mathrm{Beta}(1, 1), 약한 믿음 Beta(4,4)\mathrm{Beta}(4, 4), 강한 편향 Beta(16,48)\mathrm{Beta}(16, 48))로 관측 수에 따른 사후평균과 95% 신용구간을 비교한다.
  • 센서 보정: 온도 센서의 bias bb를 기준 항온조에서 반복 측정한다. yi=b+εiy_i = b + \varepsilon_i, εi∼N(0,0.32)\varepsilon_i \sim \mathcal{N}(0, 0.3^2) °C, 참 bias 0.4 °C. 사전분포는 균등, 사양서 N(0,0.252)\mathcal{N}(0, 0.25^2), 과신한 사양서 N(0,0.052)\mathcal{N}(0, 0.05^2) 세 가지이고 사후분포는 격자에서 계산한다.

집필 시점의 실행 결과는 다음과 같다(시드 0). 각 칸은 사후평균 [95% 신용구간]이다.

[동전] 참 θ* = 0.7, 관측 수 n별 사후 평균과 95% 신용구간
   n   앞면             균등 Beta(1,1)          약한 믿음 Beta(4,4)        강한 편향 Beta(16,48)
   0    0     0.500 [0.025, 0.975]     0.500 [0.184, 0.816]     0.250 [0.153, 0.362]
   5    4     0.714 [0.359, 0.957]     0.615 [0.349, 0.848]     0.290 [0.190, 0.401]
  20   12     0.591 [0.384, 0.782]     0.571 [0.388, 0.745]     0.333 [0.237, 0.437]
 100   63     0.627 [0.532, 0.718]     0.620 [0.527, 0.709]     0.482 [0.406, 0.558]

[센서 보정] 참 bias 0.4 °C, 잡음 σ = 0.3 °C
  n      MLE(표본평균)                         균등             사양서 N(0,0.25²)              과신 N(0,0.05²)
  1         -0.002    -0.002 [-0.590, +0.586]    -0.001 [-0.377, +0.376]    -0.000 [-0.097, +0.097]
  3         +0.176    +0.176 [-0.163, +0.516]    +0.119 [-0.160, +0.398]    +0.014 [-0.081, +0.108]
 10         +0.310    +0.310 [+0.124, +0.496]    +0.271 [+0.097, +0.445]    +0.067 [-0.019, +0.154]
 30         +0.371    +0.371 [+0.264, +0.478]    +0.354 [+0.249, +0.459]    +0.169 [+0.096, +0.241]

결과를 읽는 법은 세 가지다.

  • 약한 사전분포는 데이터가 늘면 잊힌다. 동전의 균등·약한 믿음 사전은 n=100n = 100에서 사후평균이 0.627과 0.620으로 거의 같다. 센서의 균등 사전은 사후평균이 MLE(표본평균)와 같고, 사양서 사전은 n=30n = 30에서 MLE와 0.017 °C 차이다.
  • 강하고 틀린 사전분포는 오래 남는다. 강한 편향 사전(사전 관측 64번에 해당)은 n=100n = 100에서도 사후평균이 0.482이고 95% 신용구간 [0.406, 0.558]이 참값 0.7을 덮지 못한다. 과신한 센서 사양서도 n=30n = 30에서 구간 [0.096, 0.241]이 참 bias 0.4를 놓친다. 사후분포의 폭이 좁다고 정확한 것은 아니다.
  • 데이터가 적을 때 사전분포의 역할이 가장 크다. 센서의 첫 측정은 우연히 −0.002-0.002 °C였다. 측정 1–3번에서는 어느 사전분포를 쓰느냐에 따라 구간의 폭이 6배까지 달라진다. 사전분포를 보고서에 적고, 다른 합리적인 사전분포에서도 결론이 유지되는지(민감도 분석) 확인해야 하는 이유다(13.8장).

이어서 연습문제를 푼다. Beta 사전분포의 갱신과 사후예측분포를 구현한다.

실패 사례

  • MAP 추정을 베이지안 추론이라 부르는 것. MAP는 사후분포의 최빈값 하나이고 불확실성을 버린다. 매개변수화를 바꾸면 값도 바뀐다. weight decay로 학습한 신경망이 "베이지안 신경망"인 것은 아니다. 베이지안이라고 말하려면 사후분포(또는 그 근사, 13.5–13.6장)로 예측을 평균해야 한다.
  • 사후예측 대신 plug-in 예측을 쓰는 것. 추정값 하나를 꽂아 예측하면 파라미터 불확실성이 빠져 예측 구간이 좁아진다. 데이터가 적을수록 과신이 커진다.
  • 사전분포를 숨기거나 데이터를 보고 고르는 것. 결과가 원하는 쪽으로 나올 때까지 사전분포를 바꾸면 12.4장의 선택 편향과 같은 문제가 된다. 사전분포는 데이터를 보기 전에 정하고 근거와 함께 보고한다.
  • 같은 데이터를 두 번 쓰는 것. 데이터로 사전분포를 정한 뒤 같은 데이터로 다시 갱신하거나, 각각 사전분포를 포함한 두 사후분포를 곱하면 사전 정보와 데이터를 이중으로 세어 과신한 사후분포가 나온다.
  • 신용구간을 빈도주의 보장으로 읽는 것. 95% 신용구간은 특정한 θ\theta에서 반복 실험의 95%를 덮는다고 보장하지 않는다. 실험에서 θ=0.05\theta = 0.05일 때 0.921이었다.

통과 기준

  • 동전 예제에서 사전·우도·evidence·사후·사후예측분포를 격자로 계산하고, 닫힌 형태(Beta, Beta-Binomial)와 일치하는지 확인한다.
  • 센서 보정 문제를 MLE·MAP·베이지안 추론으로 각각 정의하고, 세 방법의 출력(숫자 하나, 숫자 하나, 분포)의 차이와 사전분포가 결론을 좌우하는 조건을 실습 결과의 숫자로 설명한다.
  • 연습문제 beta-binomial-update의 테스트를 통과한다.

참고 문헌

  • Clopper, Pearson (1934). The use of confidence or fiducial limits illustrated in the case of the binomial. Biometrika, 26(4), 404–413. — 이항 비율의 정확 신뢰구간
  • Gelman, Carlin, Stern, Dunson, Vehtari, Rubin (2013). Bayesian Data Analysis (3rd ed.). CRC Press. — 사전·우도·사후·사후예측분포를 중심으로 한 베이지안 추론의 표준 교과서