모델링을 나누는 여러 축
먼저 읽을 장 1.3 문제를 수학적으로 정의하기
논문과 강의는 모델을 여러 이름으로 부른다. 지도학습 모델, 생성 모델, 확률 모델, 베이지안 모델, 사전학습 모델. 이 이름들은 한 줄로 늘어선 범주처럼 들리지만, 실제로는 서로 다른 질문에 대한 답이다. 무엇으로 학습 신호를 얻는가, 어떤 분포를 모델링하는가, 출력이 숫자 하나인가 분포인가, 파라미터를 어떻게 보는가, 학습을 어떻게 구성하는가. 이 질문들을 섞으면 "생성 모델이니까 베이지안이다", "판별 모델이니까 불확실성을 낼 수 없다" 같은 잘못된 결론이 나온다.
이 장은 모델을 나누는 다섯 개의 축을 하나씩 정의하고, 그 축들이 서로 독립이라는 것을 보인다. 1.3장에서 정한 문제(입력·출력·유형)가 주어졌을 때, 이 축들은 그 문제를 어떤 모델로 풀지 결정하는 좌표가 된다.
학습 목표
- 학습 패러다임·판별/생성·점/분포·빈도/베이지안 축을 구분한다
- 이 축들이 서로 독립적임을 설명한다
학습 신호에 따른 구분
왜 필요한가. 과학 데이터에서 가장 비싼 것은 대개 정답 label이다. 측정 하나에 며칠이 걸리기도 하고, 전문가가 판정해야 하기도 한다. 학습 신호를 어디서 얻을지 정하면, label이 적을 때 무엇을 할 수 있는지가 정해진다.
정의. 학습 신호의 출처에 따라 다섯 가지로 나눈다.
| 패러다임 | 학습 데이터 | 학습 신호 | 과학 예 | 다루는 곳 |
|---|---|---|---|---|
| 지도학습(supervised) | 쌍 | 정답 와의 차이 | 조성 → 측정한 물성 | 16–18부 |
| 비지도학습(unsupervised) | 만 | 데이터의 구조(군집, 밀도, 저차원 구조) | 단일세포 발현 데이터의 군집화 | 16.5장 |
| 자기지도학습(self-supervised) | 만 | 데이터에서 스스로 만든 과제(가린 부분 맞히기, 다음 값 예측) | 서열의 일부를 가리고 맞히기 | 19.8장 |
| 준지도학습(semi-supervised) | 적은 + 많은 | 두 가지를 함께 | 소수의 실험 label + 다수의 무label 측정 | — |
| 강화학습(reinforcement) | 환경과의 상호작용 | 행동의 결과로 받는 보상 | 충전 정책, 실험 순서 결정 | 20부 |
자기지도학습과 비지도학습은 둘 다 label이 없다. 차이는 자기지도학습이 데이터에서 "입력 → 정답" 꼴의 과제를 만들어 지도학습처럼 학습한다는 점이다. 이렇게 얻은 표현을 적은 label로 조정하는 것이 뒤에 나올 사전학습 후 미세조정이다.
연구에서의 의미. 패러다임은 문제 유형(1.3장)과 다른 축이다. 시계열 예측은 과거로 미래를 맞히므로 label 없이도 지도학습 형태로 학습할 수 있다. 상태 추정은 숨은 상태의 정답이 없으면 지도학습이 불가능하고, 상태공간 모델과 관측만으로 추정해야 한다.
판별 모델과 생성 모델
왜 필요한가. 같은 분류 문제를 푸는 두 모델이 같은 정확도를 내더라도, 그 모델이 데이터에 대해 아는 것은 다를 수 있다. 어떤 모델은 경계만 알고, 어떤 모델은 데이터가 어떻게 생겼는지까지 안다. 이 차이는 처음 보는 입력이 들어올 때, 그리고 데이터를 새로 만들어야 할 때 드러난다.
정의. 입력 와 출력 에 대해 모델링할 수 있는 분포는 , , 세 가지다. 어느 분포를 학습하는가에 따라 모델을 둘로 나눈다.
- 판별 모델(discriminative model): 조건부분포 만 학습한다. 로지스틱 회귀, 대부분의 회귀 신경망.
- 생성 모델(generative model): 결합분포 , 또는 label이 없으면 데이터 분포 를 학습한다.
생성 모델은 Bayes 정리로 도 계산할 수 있다.
분모가 곧 다. 즉 생성 모델은 분류에 필요한 것보다 더 많은 것을 학습한다. 그 대가로 의 형태(예: 가우시안)를 가정해야 하고, 그 가정이 틀리면 분류도 나빠질 수 있다.
데이터 생성 과정을 가정한다는 것. 생성 모델은 "데이터가 이런 과정으로 만들어졌다"는 이야기를 수식으로 쓴 것이다. 먼저 클래스 가 확률 로 정해지고, 그 클래스에 따라 측정값 가 에서 나온다. 과학자에게는 익숙한 사고방식이다. 시뮬레이터나 물리 모델이 바로 데이터 생성 과정의 가정이고, 잡음 모델까지 붙이면 그 자체로 생성 모델이 된다.
직관과 코드. 정상·불량 시료의 두 측정값으로 만든 같은 데이터에 두 모델을 학습한다. 판별 모델은 로지스틱 회귀, 생성 모델은 클래스마다 가우시안을 두고 공분산을 공유하는 선형판별분석(LDA)이다. 결정 경계 근처의 점과, 학습 데이터에서 아주 먼 점을 넣어 본다.
import numpy as np
from scipy.stats import multivariate_normal
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.linear_model import LogisticRegression
rng = np.random.default_rng(0)
cov = np.array([[1.0, 0.3], [0.3, 1.0]])
X0 = rng.multivariate_normal([0.0, 0.0], cov, size=300) # (300, 2) 정상 시료의 두 측정값
X1 = rng.multivariate_normal([2.0, 1.0], cov, size=300) # (300, 2) 불량 시료
X, y = np.vstack([X0, X1]), np.repeat([0, 1], 300) # (600, 2), (600,)
disc = LogisticRegression().fit(X, y) # p(y|x)를 직접 학습
gen = LinearDiscriminantAnalysis(store_covariance=True).fit(X, y) # p(x|y)p(y)를 학습
x_new = np.array([[1.0, 0.5], [12.0, 6.0]]) # 경계 근처 점, 데이터에서 먼 점
print("판별 p(y=1|x):", disc.predict_proba(x_new)[:, 1].round(2))
print("생성 p(y=1|x):", gen.predict_proba(x_new)[:, 1].round(2))
p_x = sum(gen.priors_[k] * multivariate_normal(gen.means_[k], gen.covariance_).pdf(x_new)
for k in (0, 1)) # p(x) = sum_k p(x|y=k) p(y=k)
print("생성 p(x) :", np.array2string(p_x, precision=2))
print("생성모델이 만든 불량 시료 3개:\n", rng.multivariate_normal(gen.means_[1], gen.covariance_, size=3).round(2))판별 p(y=1|x): [0.46 1. ] 생성 p(y=1|x): [0.47 1. ] 생성 p(x) : [1.02e-01 5.35e-25] 생성모델이 만든 불량 시료 3개: [[ 2.95 2.23] [ 1.18 -0.23] [ 3.95 1.11]]
만 보면 두 모델은 거의 같다. 차이는 그 밖에 있다. 생성 모델은 를 계산해, 두 번째 점이 학습 데이터가 거의 나오지 않는 곳에 있다는 것을 알려 준다. 그리고 학습한 분포에서 새 시료를 만들 수 있다. 판별 모델은 둘 다 할 수 없다.
연구에서의 의미. 과학 문제에서는 학습 범위 밖의 입력이 흔하다(1.2장). 판별 모델의 확률이 1에 가깝다는 것은 "학습한 경계의 한쪽에 있다"는 뜻일 뿐, 그 입력이 학습 범위 안에 있다는 뜻이 아니다. 입력이 분포 밖인지 판단하는 방법은 21.4장에서, 데이터 분포 자체를 학습하는 생성모델은 19부에서 다룬다.
점 예측과 분포 예측
정의. 출력의 형태에 따른 축이다. 점 예측 모델은 입력마다 숫자 하나 를 낸다. 분포 예측 모델은 입력마다 분포 를 낸다. 12.3장에서 자세히 보듯, 점 예측은 분포에서 대표값 하나를 고른 것이고, 어떤 대표값인지(평균, 중앙값, 분위수)는 학습에 쓴 손실이 정한다.
이 축은 판별/생성 축과 다르다. 판별 모델도 분포를 출력할 수 있다. 가장 단순한 예는 선형 회귀에 잡음 분산을 함께 추정하는 것이다. 온도 차로 열전 전압을 예측하는 회귀에서, 잔차의 표준편차 를 추정해 예측분포 를 만들고, 그 90% 구간이 새 데이터의 몇 %를 포함하는지 확인한다.
from sklearn.linear_model import LinearRegression
dtemp_k = rng.uniform(0, 10, size=200) # (200,) 입력: 온도 차
volt_mv = 0.5 * dtemp_k + rng.normal(0, 0.4, size=200) # (200,) 출력: 열전 전압
reg = LinearRegression().fit(dtemp_k[:, None], volt_mv)
sigma_mv = np.std(volt_mv - reg.predict(dtemp_k[:, None]), ddof=2) # 잔차로 추정한 잡음 표준편차
new_k = rng.uniform(0, 10, size=5000) # (5000,) 새 입력
new_mv = 0.5 * new_k + rng.normal(0, 0.4, size=5000) # (5000,)
mu_mv = reg.predict(new_k[:, None]) # (5000,) 점 예측 = 예측분포의 평균
inside = np.abs(new_mv - mu_mv) <= 1.645 * sigma_mv # 90% 예측 구간 mu ± 1.645 sigma
f5 = reg.predict([[5.0]])[0]
print(f"점 예측 f(5 K) = {f5:.3f} mV")
print(f"예측분포 p(y|5 K) = N({f5:.3f}, {sigma_mv:.3f}^2) mV")
print(f"90% 예측 구간의 실제 포함률 {inside.mean():.3f}")점 예측 f(5 K) = 2.518 mV 예측분포 p(y|5 K) = N(2.518, 0.383^2) mV 90% 예측 구간의 실제 포함률 0.886
같은 회귀 모델이 점 예측(2.518 mV)도, 분포 예측도 낸다. 분포 예측이 있으면 "새 측정이 이 범위에 들어갈 확률이 90%"라는 주장을 하고, 그 주장을 데이터로 확인할 수 있다. 실제 포함률 0.886이 0.90보다 조금 낮은 것은, 표본 200개로 추정한 이 참값 0.4보다 작게 나왔기 때문이다. 파라미터 추정의 불확실성을 무시하고 추정값을 참값처럼 쓰면 구간이 조금 좁아지는 경향이 있다. 이 문제를 다루는 방법이 다음 절의 베이지안 관점이고, 구간의 평가는 21.2장에서 다룬다.
결정론적 모델과 확률적 모델, 빈도주의와 베이지안
결정론적 모델과 확률적 모델. 같은 입력에 항상 같은 출력을 내는 모델을 결정론적(deterministic), 출력이 확률분포에서 뽑히는 모델을 확률적(stochastic)이라 한다. 학습이 끝난 회귀 신경망은 결정론적이다. 확산 모델처럼 실행할 때마다 다른 표본을 내는 생성모델, 무작위 힘을 넣은 분자동역학 시뮬레이터는 확률적이다. 앞 절의 분포 예측 모델은 출력이 분포의 파라미터이므로 계산 자체는 결정론적이지만, 그 분포에서 표본을 뽑으면 확률적 모델로 쓸 수 있다.
파라미터를 보는 두 관점. 이 축은 출력이 아니라 파라미터 에 대한 태도다.
- 빈도주의(frequentist): 는 고정된 미지수다. 데이터로 하나의 추정값 (예: 최대우도 추정, 12.2장)를 구하고, 그 추정값이 데이터를 다시 뽑을 때 얼마나 흔들릴지를 신뢰구간으로 표현한다(12.4장).
- 베이지안(Bayesian): 를 확률변수로 보고, 사전분포 를 데이터로 갱신해 사후분포를 얻는다.
여기서 는 우도, 는 데이터를 보기 전의 믿음, 는 데이터를 본 뒤의 믿음이다.
직관과 코드. 새로 합성한 시료가 안정성 시험을 통과할 확률 를 추정한다. 시료 3개가 모두 통과한 경우와, 300개 중 240개가 통과한 경우를 비교한다. 베이지안 쪽은 위의 균등 사전분포 을 쓴다. 성공 번, 실패 번을 관측하면 사후분포는 다(13.2장).
from scipy.stats import beta
for k, n in [(3, 3), (240, 300)]: # 성공 k번 / 시도 n번
mle = k / n # 빈도주의: 고정된 미지수의 점 추정
post = beta(1 + k, 1 + n - k) # 베이지안: 균등 사전분포 Beta(1, 1)의 사후분포
lo, hi = post.ppf([0.025, 0.975])
print(f"{k:3d}/{n:<3d} MLE {mle:.3f} 사후 평균 {post.mean():.3f} 95% 구간 [{lo:.3f}, {hi:.3f}]")3/3 MLE 1.000 사후 평균 0.800 95% 구간 [0.398, 0.994] 240/300 MLE 0.800 사후 평균 0.798 95% 구간 [0.751, 0.841]
데이터가 3개일 때 최대우도 추정은 "통과 확률 100%"라는 극단적인 답을 낸다. 사후분포는 평균 0.8에 0.40부터 0.99까지의 넓은 구간을 준다. 3개로는 거의 아무것도 확신할 수 없다는 정직한 답이다. 데이터가 300개가 되면 두 관점의 답은 거의 같아진다. 사전분포의 영향은 데이터가 적을 때 크고, 많을 때 작다.
연구에서의 의미. 과학 문제는 데이터가 적은 경우가 많아 이 차이가 실제로 중요하다. 동시에 베이지안 추론은 사전분포를 정해야 하고 계산이 비싸다(13부). 어느 쪽을 쓰든 결론에 붙는 불확실성의 뜻(신뢰구간인가 사후 구간인가)을 밝힌다.
학습 구성 방식
마지막 축은 학습을 어떤 순서와 구조로 하는가다.
| 구성 | 뜻 | 장점 | 위험 | 다루는 곳 |
|---|---|---|---|---|
| end-to-end | 입력에서 최종 출력까지 하나의 모델을 한 번에 학습 | 사람이 설계한 중간 단계의 오류가 없다 | 데이터가 많이 필요하고, 중간 과정을 검증할 수 없다 | 17부 |
| 단계별 학습 | 특징 추출 → 모델처럼 단계를 나눠 따로 학습 | 단계마다 검증할 수 있다 | 앞 단계의 오류가 뒤로 전파된다 | 16부 |
| 사전학습 후 미세조정 | 큰 데이터(대개 자기지도)로 학습한 모델을 작은 label 데이터로 조정 | label이 적어도 된다 | 사전학습 데이터와 목표 문제가 다르면 이득이 없거나 해롭다 | 19.9장 |
| 물리-데이터 하이브리드 | 알려진 물리 모델과 학습 모델을 결합(보정 항, 파라미터 학습, 물리 손실) | 데이터 효율, 물리적 일관성, 외삽 안정성 | 물리 모델이 틀린 곳에서 체계적 오차 | 24.5장 |
축들은 독립적이다
다섯 축을 다시 모으면 다음과 같다.
| 축 | 질문 | 값 |
|---|---|---|
| 학습 신호 | 무엇으로 학습하는가? | 지도 · 비지도 · 자기지도 · 준지도 · 강화 |
| 모델링 대상 | 어떤 분포를 모델링하는가? | 판별 · 생성 , |
| 출력 형태 | 숫자 하나인가 분포인가? | 점 예측 · 분포 예측 |
| 파라미터 관점 | 는 무엇인가? | 빈도주의(고정된 미지수) · 베이지안(확률변수) |
| 학습 구성 | 어떤 순서·구조로 학습하는가? | end-to-end · 단계별 · 사전학습-미세조정 · 하이브리드 |
이 축들은 서로 독립이다. 한 축의 값이 다른 축의 값을 정하지 않는다. 이 장에서 이미 그 예를 봤다.
- 판별 모델도 분포를 출력한다. 앞 절의 선형 회귀 + 잡음 분산은 판별·분포 예측·빈도주의 모델이다.
- 생성 모델도 베이지안 추론 없이 학습한다. 앞의 LDA는 평균과 공분산의 점 추정만 쓰는 생성·빈도주의 모델이다.
- 베이지안이라고 생성 모델은 아니다. 로지스틱 회귀의 가중치에 사전분포를 두면 판별·베이지안 모델이 된다.
- 같은 형태의 출력을 다른 축에서 얻을 수 있다. 공분산을 공유하는 가우시안 생성 모델의 는 로지스틱 회귀와 똑같이 "선형 함수에 sigmoid를 씌운 꼴"이다. 차이는 그 파라미터를 를 거쳐 추정하느냐, 를 직접 최대화해 추정하느냐에 있다. 이 장의 연습문제가 이 성질을 확인한다.
대표적인 모델 몇 개를 축 위에 놓아 본다.
| 모델 | 학습 신호 | 모델링 대상 | 출력 | 파라미터 관점 |
|---|---|---|---|---|
| MSE로 학습한 회귀 신경망 | 지도 | 판별 | 점 | 빈도주의(점 추정) |
| 이분산 가우시안 회귀(12.3장) | 지도 | 판별 | 분포 | 빈도주의 |
| Gaussian process 회귀(13.7장) | 지도 | 판별 | 분포 | 베이지안 |
| 가우시안 혼합 모델 군집화 | 비지도 | 생성 | 분포 | 빈도주의(EM, 13.4장) |
| 다음 토큰 예측으로 학습한 자기회귀 서열 모델(19.2장) | 자기지도 | 생성 | 분포 | 빈도주의 |
실습
서로 다른 논문 다섯 편을 이 장의 다섯 축으로 분류한 표를 만든다. 1.2장 실습에서 고른 세 편에 두 편을 더하면 된다. 가능하면 다섯 편이 적어도 두 축에서 서로 다른 값을 갖도록 고른다.
| 논문 | 학습 신호 | 모델링 대상 | 출력 | 파라미터 관점 | 학습 구성 | 근거(논문의 어느 문장·식) |
|---|---|---|---|---|---|---|
- 축마다 근거를 적는다. 논문이 스스로 붙인 이름("probabilistic", "Bayesian", "generative")을 그대로 옮기지 말고, 손실함수와 출력의 정의에서 근거를 찾는다. 예를 들어 손실이 NLL이고 출력이 평균과 분산이면 분포 예측이다.
- 논문의 이름과 표의 분류가 다른 곳을 표시한다. "확률적"이라고 했지만 출력이 점 예측인 경우, "생성"이라고 했지만 만 학습한 경우 등이다.
- 연습문제를 푼다. 생성 모델의 가 판별 모델과 같은 꼴이 되는 것을 직접 확인한다.
실패 사례
- '생성 모델 = 베이지안', '판별 모델 = 점 예측'처럼 축을 섞는 것. 이렇게 섞으면 "불확실성이 필요하니 생성 모델을 써야 한다"처럼 엉뚱한 설계 결정이 나온다. 불확실성이 필요하면 출력 축(분포 예측)이나 파라미터 축(베이지안)을 바꾸면 되고, 판별 모델로도 충분하다.
- 판별 모델의 확률을 학습 범위 안에 있다는 증거로 쓰는 것. 는 경계에서 멀다는 뜻이다. 학습 데이터에서 멀어질수록 확률은 오히려 1에 가까워질 수 있다(본문의 ).
- 사전분포를 숨기는 것. 데이터가 적은 베이지안 결과는 사전분포에 크게 좌우된다. 사전분포를 밝히지 않고 사후 구간만 보고하면, 결론이 데이터에서 왔는지 가정에서 왔는지 독자가 알 수 없다.
- 사전학습 모델이 항상 이득이라고 가정하는 것. 사전학습 데이터(예: 자연 이미지, 일반 텍스트)와 목표 과학 데이터가 다르면 미세조정이 처음부터 학습한 작은 모델보다 나쁠 수 있다. 같은 분할에서 처음부터 학습한 baseline과 비교한다.
통과 기준
- 임의의 모델 하나(논문 또는 자신의 모델)를 다섯 축 위에 위치시키고, 축마다 손실함수·출력 정의·학습 절차에서 근거를 하나씩 든다.
- 실습의 논문 다섯 편 분류표를 완성하고, 논문이 스스로 붙인 이름과 분류가 다른 곳을 하나 이상 찾아 설명한다.
- 연습문제
gaussian-generative-classifier의 테스트를 통과한다.