1958프롤로그
19863막 손실
19981막 모델
20122막 활성화
20144막 학습
20155막 RL
2017+에필로그
Activation Function (활성화 함수)
2막 · 활성화와 출력
1막에서 Conv·Pool·Dense라는 블록을 봤어요. 그런데 사실 이걸 그냥 쌓기만 하면 수십 층을 쌓아도 한 층짜리 선형 변환과 똑같아요. 1969년 Minsky가 이걸로 신경망을 한 차례 묻을 뻔했죠. 부활의 열쇠가 바로 비선형 활성화 함수였어요.
왜 등장했나
각 뉴런이 가중합을 계산한 뒤, 그 값을 살짝 비튼다 — 이게 활성화 함수예요. 1980~90년대엔 Sigmoid·tanh가 표준이었는데, 깊어질수록 기울기가 사라지는 문제가 있었어요. 2012년 AlexNet이 단순하지만 강력한 ReLU를 쓰면서 깊은 학습의 문이 열렸어요.
신경망의 각 뉴런은 가중합(weighted sum)을 계산합니다. 활성화 함수는 이 값에 비선형성을 추가해서, 레이어를 아무리 쌓아도 단순 선형 변환이 되는 것을 막아줍니다. 복잡한 패턴 학습이 가능해지는 이유입니다.
함수를 클릭해보세요
Sigmoid
1/(1+e⁻ˣ)
Tanh
(eˣ-e⁻ˣ)/(eˣ+e⁻ˣ)
ReLU
max(0, x)
Leaky ReLU
max(αx, x)
ELU
x≥0:x else α(eˣ-1)
뉴런의 계산 흐름
1
입력값(inputs) 수신
2
가중합 계산
z = w₁x₁ + w₂x₂ + ... + b (weights × inputs + bias)
3
활성화 함수 적용
output = activation(z)
4
다음 레이어로 전달
MNIST 모델: 은닉층 → ReLU, 출력층(10개 클래스) → Softmax
Softmax Function
왜 등장했나
활성화 중에서도 분류 모델의 마지막 층에만 특별히 쓰이는 게 Softmax예요. 신경망이 뱉어낸 raw 점수(logit)들을 모두 더하면 1이 되는 확률 벡터로 바꿔주죠. 덕분에 "이건 7일 확률 83%"처럼 사람이 해석할 수 있는 출력이 돼요.
다중 분류의 출력층에서 사용합니다. 신경망이 출력한 raw 점수(logit)들을 모두 더하면 1이 되는 확률 벡터로 변환합니다.
수식
K개 클래스가 있을 때 i번째 클래스의 확률:
결과: 모든 출력값이 (0,1) 사이 & 합계 = 정확히 1.0
σ(z)ᵢ = eᶻⁱ / Σⱼ eᶻʲ
지수함수 e^z를 사용해 모든 값을 양수로 만든 뒤, 전체 합으로 나눠 정규화합니다.결과: 모든 출력값이 (0,1) 사이 & 합계 = 정확히 1.0
인터랙티브 — 슬라이더로 logit을 바꿔보세요
Softmax 출력 (확률)
Keras 코드
model.add(Dense(10, activation='softmax')) # 출력층
# → 10개 숫자(0~9)에 대한 확률 벡터 출력
# → 가장 확률 높은 숫자가 예측값
다음 막으로
이제 모델은 입력을 받아 확률 벡터를 뱉어낼 수 있어요. 그런데 그게 맞는 답인지 틀린 답인지 누가 정해줄까요? 학습을 시키려면 "잘 맞춘다"를 숫자로 정의해야 해요.
Loss Functions (손실 함수)
3막 · 학습의 목표
2막에서 모델은 어떻게 답을 만들지를 배웠어요. 이제 그 답을 평가할 차례예요. 학습이란 결국 "예측이 정답과 얼마나 다른가"를 한 숫자로 정의한 뒤, 그 숫자를 줄여나가는 일이에요. 그 숫자를 손실(loss)이라고 부릅니다.
왜 등장했나
손실 함수는 예측과 정답의 차이를 하나의 숫자로 요약해요. 회귀(숫자 예측)엔 보통 MSE, 분류엔 Cross-entropy를 써요. 어떤 손실을 고르느냐가 모델이 무엇을 잘하도록 길러질지를 결정합니다.
모델의 예측값(ŷ)과 실제값(y)이 얼마나 다른지를 수치로 나타냅니다. 학습 = 이 값을 최소화하도록 파라미터를 조정하는 과정입니다.
함수 선택
MSE
mean_squared_error
MAE
mean_absolute_error
MAPE
mean_abs_pct_error
MSLE
mean_sq_log_error
Binary CE
binary_crossentropy
Categorical CE
categorical_crossentropy
Sparse CCE
sparse_categorical_crossentropy
언제 어떤 함수를?
회귀 (연속값 예측)
MSE · MAE · MAPE예: 주가 수치 예측
이진 분류 (0 or 1)
Binary Crossentropy예: 주가 상승/하락
다중 분류 (K 클래스)
Categorical CE예: MNIST 숫자 0~9
Keras 팁
sparse_categorical_crossentropy(one-hot 변환 없이 정수 레이블 사용)
Crossentropy 수식 이해
왜 등장했나
분류 문제에선 거리보다 확률의 차이를 보는 게 자연스러워요. Cross-entropy는 −log를 써서 예측이 틀릴수록 손실이 급격히 커지게 합니다. "확신을 갖고 틀리는 건 죄가 크다"는 직관을 수식으로 표현한 거예요.
분류 문제에서 가장 많이 쓰이는 손실 함수입니다. -log를 사용해서 예측이 틀릴수록 손실이 급격히 커집니다.
Binary Crossentropy
y = 실제값(0 또는 1), ŷ = 예측 확률 (0~1 사이)
L = y·(-log ŷ) + (1-y)·(-log(1-ŷ))
y=1 일 때: L = -log(ŷ) → ŷ→1 이면 L→0, ŷ→0 이면 L→∞
y=0 일 때: L = -log(1-ŷ) → ŷ→0 이면 L→0, ŷ→1 이면 L→∞
L(y,ŷ) = -y·log(ŷ) - (1-y)·log(1-ŷ)
ŷ = 모델이 출력한 확률 (예: 양성 클래스일 확률)
ŷ = 모델이 출력한 확률 (예: 양성 클래스일 확률)
Categorical Crossentropy
다중 클래스(K개) 분류, one-hot 인코딩된 y와 함께 사용
yₖ=1인 정답 클래스만 loss = -log(ŷₖ) 계산됨
→ 결국 정답 클래스의 예측 확률 하나만 보고 손실을 계산
L = Σₖ yₖ · (-log ŷₖ)
yₖ=0인 클래스는 손실에 기여 없음 (×0=0)yₖ=1인 정답 클래스만 loss = -log(ŷₖ) 계산됨
→ 결국 정답 클래스의 예측 확률 하나만 보고 손실을 계산
인터랙티브 체험
실제 정답 y
One-hot Encoding
왜 등장했나
Softmax 출력은 확률 벡터인데, 정답은 보통 "이건 7"이라는 숫자 하나예요. 형태가 달라서 비교가 안 되니, 정답을 7번 자리만 1, 나머지는 0인 벡터로 바꿔주는 게 One-hot이에요. 이제 둘 다 같은 형태의 벡터니까 Cross-entropy로 비교할 수 있어요.
숫자 레이블(0~9)을 K차원 벡터로 변환합니다. 정답 위치만 1, 나머지는 0으로 표현해서 모든 클래스를 동등하게 취급합니다.
왜 필요한가?
정수 레이블의 문제
y=3 으로 표현하면 모델이"3 > 1 이니까 더 중요하다"처럼
숫자 크기에 잘못된 의미 부여
One-hot의 해결
[0,0,0,1,0,0,0,0,0,0]모든 클래스를 동등하게 취급
Categorical CE와 함께 사용
숫자를 눌러보세요
선택: 5 →
Keras에서의 사용
# 방법 1: one-hot 변환 후 categorical_crossentropy
y_onehot = keras.utils.to_categorical(y, num_classes=10)
model.compile(loss='categorical_crossentropy', ...)
# 방법 2: 변환 없이 sparse 사용
model.compile(loss='sparse_categorical_crossentropy', ...)
# → 내부에서 자동으로 동일한 계산 수행
다음 막으로
손실 함수로 "얼마나 틀렸나"는 정의했어요. 그런데 모델의 파라미터는 수십만 개인데, 어디로 어떻게 옮겨야 그 숫자가 줄어들까요? 다음 막에선 움직이는 방법을 봅니다.
Gradient & Gradient Descent
4막 · 학습의 방법
3막에서 우리는 "얼마나 틀렸나"를 숫자로 정의했어요. 이제 그 숫자를 줄여야 하는데, 파라미터가 수십만 개인 공간에서 어디로 한 발씩 옮겨야 할까요? 그 답이 1847년 Cauchy까지 거슬러 올라가는 아이디어 — 기울기(gradient)예요.
왜 등장했나
기울기는 "지금 위치에서 함수가 가장 가파르게 증가하는 방향"을 알려주는 벡터예요. 우리는 손실을 줄이고 싶으니까 그 반대 방향으로 한 발씩 가면 돼요. 이게 Gradient Descent의 전부예요 — 미끄럼틀 타고 가장 낮은 곳을 찾는 셈이죠.
gradient(기울기)는 함수가 가장 가파르게 증가하는 방향의 벡터입니다. 그 반대 방향으로 이동하면 손실 함수의 최솟값을 찾을 수 있습니다.
Gradient 정의
n차원 함수 f의 gradient:
이 벡터의 반대 방향(-∇f)으로 이동 = 손실이 가장 빠르게 줄어드는 방향
∇f(p) = [∂f/∂x₁(p), ∂f/∂x₂(p), ..., ∂f/∂xₙ(p)]ᵀ
각 변수에 대한 편미분값을 모은 벡터입니다.이 벡터의 반대 방향(-∇f)으로 이동 = 손실이 가장 빠르게 줄어드는 방향
경사하강법 시뮬레이션
알고리즘 흐름
0
시작점 x⁰ 설정
1
기울기 방향 계산
Δx = -∇f(x)
2
학습률(step size) t 결정
3
파라미터 업데이트
x⁽ᵏ⁺¹⁾ = x⁽ᵏ⁾ - t × ∇f(x⁽ᵏ⁾)
✓
수렴 조건 확인 (|x⁽ᵏ⁺¹⁾-x⁽ᵏ⁾| < 0.0001)
학습률이 너무 크면 발산, 너무 작으면 느리게 수렴합니다. 슬라이더로 직접 확인해보세요!
SGD → Momentum → Adam
왜 등장했나
단순 Gradient Descent엔 약점이 많아요 — 전체 데이터로 매번 계산하면 너무 느리고, 좁은 골짜기에선 지그재그, 안장점에선 멈춥니다. 그래서 어떻게 한 발을 옮길지가 발전해왔어요: SGD(1951) → Momentum → RMSprop → Adam(2014). 오늘날 대부분의 모델은 Adam을 기본으로 써요.
단순 경사하강법에서 현재 딥러닝의 표준 최적화 알고리즘인 Adam까지의 발전 과정입니다.
SGD — Stochastic Gradient Descent (확률적 경사하강법)
전체 데이터(n개)로 gradient를 계산하면 너무 느립니다.
SGD는 작은 미니배치(m개, m≪n)로 gradient를 근사합니다.
Local minimum에 빠질 수 있음
SGD는 작은 미니배치(m개, m≪n)로 gradient를 근사합니다.
∇f(x) ≈ (1/m) Σᵢ₌₁ᵐ ∇fᵢ(x) (m ≪ n)
장점
매 스텝 계산이 빠름, 메모리 효율적단점
노이즈가 많아 수렴 불안정Local minimum에 빠질 수 있음
예시 설정: SGD (lr=0.01, batch=32) — 가장 기본적인 시작값
Momentum — 관성 추가
이전 이동 방향을 기억해서 관성(ρ)을 추가합니다.
Local minimum을 빠져나오는 데 효과적입니다.
v: 속도 벡터 — 이전 기울기들의 가중합
수렴 속도 향상
최적의 ρ 값 선택이 어려움
Local minimum을 빠져나오는 데 효과적입니다.
v⁽ᵏ⁺¹⁾ = ρ·v⁽ᵏ⁾ + ∇f(x)
x⁽ᵏ⁺¹⁾ = x⁽ᵏ⁾ - t·v⁽ᵏ⁺¹⁾
ρ = 0.9 또는 0.99 (일반적 권장값)v: 속도 벡터 — 이전 기울기들의 가중합
장점
Local minimum 탈출수렴 속도 향상
단점
모든 파라미터에 동일한 학습률 적용최적의 ρ 값 선택이 어려움
Adam — Adaptive Moment Estimation
Kingma & Ba (2014) 제안. 파라미터마다 학습률을 자동 조정합니다.
1차 모멘트(기울기 평균)와 2차 모멘트(기울기 분산)를 동시에 추적합니다.
빠른 수렴, 하이퍼파라미터 튜닝 쉬움
1차 모멘트(기울기 평균)와 2차 모멘트(기울기 분산)를 동시에 추적합니다.
gₜ = ∇f(θₜ₋₁) ← gradient 계산
mₜ = β₁·mₜ₋₁ + (1-β₁)·gₜ ← 1차 모멘트 (평균)
vₜ = β₂·vₜ₋₁ + (1-β₂)·gₜ² ← 2차 모멘트 (분산)
m̂ₜ = mₜ/(1-β₁ᵗ) ← bias 보정
v̂ₜ = vₜ/(1-β₂ᵗ) ← bias 보정
θₜ = θₜ₋₁ - α·m̂ₜ/(√v̂ₜ + ε) ← 파라미터 업데이트
기본값: α=0.001, β₁=0.9, β₂=0.999, ε=10⁻⁸
장점
파라미터별 적응형 학습률빠른 수렴, 하이퍼파라미터 튜닝 쉬움
단점
일부 경우 SGD+Momentum보다 일반화 성능 낮을 수 있음model.compile(..., optimizer='adam') — MNIST 예시 코드
알고리즘 전체 비교
| 알고리즘 | 핵심 아이디어 | 학습률 | 사용처 |
|---|---|---|---|
| GD | 전체 데이터로 gradient 계산 | 고정 | 소규모 문제 |
| SGD | 미니배치로 gradient 근사 | 고정 | 일반 딥러닝 |
| Momentum | SGD + 관성(이전 방향 기억) | 고정 | Local min 탈출 |
| AdaGrad | 파라미터별 학습률 감소 | 감소 | NLP, sparse data |
| RMSProp | 2차 모멘트로 학습률 조정 | 적응형 | RNN |
| Adam | 1차+2차 모멘트 동시 추적 | 적응형 | 현재 표준 |
전체 학습 파이프라인 요약
1
순전파: 입력 → 활성화함수(ReLU) → Softmax → 예측 확률
2
손실 계산: Crossentropy(y, ŷ)
3
역전파: 손실에 대한 gradient 계산 (∇Loss)
4
파라미터 업데이트: Adam으로 weights, bias 조정
↺
1~4 반복 (epoch) → 손실이 수렴할 때까지
4막 다음 페이지로
비선형(2막) + 손실(3막) + Gradient · 역전파 · Optimizer(4막). 신경망 학습의 3대 기둥이 모였어요. 그런데 loss가 줄어든다고 모델이 진짜로 잘 배운 걸까요? 4막의 마지막 페이지에서 그 질문을 다룹니다.
Conv2D — 합성곱 레이어
1막 · 모델 구조
큰그림에서 우리는 신경망이라는 가지를 골랐어요. 그럼 신경망은 어떻게 생겼을까요? 이미지를 다루는 가장 유명한 형태인 CNN(Convolutional Neural Network)부터 만나봅시다. 처음 CNN을 제안한 건 1998년 LeCun의 LeNet-5 — 손글씨 숫자를 인식하기 위해 만들어졌어요.
왜 등장했나
28×28 손글씨 이미지를 일반 신경망(Dense)으로만 풀면 어떻게 될까요? 입력 784개 × 다음 층 100개 = 7만 8천 파라미터에, '7'이 한 칸만 옆으로 가도 완전히 다른 입력으로 봐요. LeCun은 작은 창문이 이미지 위를 돌며 같은 가중치로 패턴을 찾는 Conv2D로 이 두 문제를 한 번에 해결했어요.
작은 커널(필터)이 입력 이미지 위를 이동하며 국소 영역의 가중합을 계산해 특징맵(feature map)을 만듭니다. 같은 커널을 모든 위치에 재사용하므로 파라미터가 적고, 이미지의 패턴(엣지·질감 등)을 효율적으로 잡아냅니다.
핵심 아이디어 & 파라미터
입력 (H, W, inCh)에서 k×k 커널이 이동하며 inCh 채널을 모두 합산 → 필터(출력 채널) 수만큼 특징맵을 생성합니다.
파라미터 수 = (k × k × inCh + 1) × filters
( +1 = 필터당 bias )
완전연결(Dense)과 달리 커널을 모든 위치에서 공유하므로, 큰 이미지에도 파라미터가 폭증하지 않습니다.
커널이 이동하며 특징맵을 만드는 과정
Pooling — 풀링 (Average / Max)
왜 등장했나
Conv가 만든 특징맵은 여전히 크고, '7'이 위쪽에 있든 가운데 있든 대충 7이라는 것만 알면 충분해요. 그래서 작은 창에서 대표값 하나만 남겨 크기를 절반으로 줄이는 게 Pooling이에요. 학습할 파라미터도 없죠.
2×2 같은 작은 창으로 영역을 묶어 대표값 하나로 줄입니다. 공간 크기를 ½로 축소해 연산량을 줄이고, 작은 위치 변화에 강해집니다. 학습 파라미터가 없습니다.
Max vs Average
Max Pooling
창 안의 최댓값 선택 — 가장 강한 특징을 보존Average Pooling
창 안의 평균값 — 전체 분포를 부드럽게 요약 (LeNet에서 사용)출력 크기 = (H / pool, W / pool, 채널수) · 파라미터 = 0
2×2 풀링 — 모드를 바꿔보세요
Flatten — 펼치기
왜 등장했나
Conv·Pool로 좋은 특징은 얻었어요. 그런데 마지막엔 "이건 7"이라는 답이 필요한데, 분류기는 1차원 벡터만 받아요. 그래서 3차원 특징맵을 주욱 펼치는 단순 작업이 필요한데, 그게 Flatten이에요. 값은 그대로, 모양만 바뀝니다.
3차원 특징맵 (H, W, 채널)을 1차원 벡터로 쭉 펼칩니다. Conv/Pooling의 3D 출력을 Dense(완전연결)에 넣기 전에 반드시 필요합니다. 값은 그대로, 모양만 바꿉니다 — 파라미터 없음.
왜 필요한가
Conv2D·Pooling의 출력은
(None, H, W, ch) 형태의 3D입니다. Dense는 1D 벡터를 입력으로 받으므로, 그 사이에 Flatten으로 (None, H×W×ch) 로 펼쳐줍니다.
출력 길이 = H × W × 채널수 · 파라미터 = 0
3D → 1D 펼치기
Dense — 완전연결 레이어
왜 등장했나
펼친 벡터를 받아 "0~9 중 어느 숫자?" 같은 최종 판단을 내리는 게 Dense예요. 사실 Dense는 Conv 이전(1980년대)부터 있던 가장 전통적인 신경망 형태인데, 지금도 거의 모든 모델의 마지막 분류기로 쓰여요.
입력의 모든 뉴런이 출력의 모든 뉴런과 연결됩니다. 분류·회귀의 출력층과 은닉층에 쓰이며, 연결이 많은 만큼 파라미터도 많습니다.
파라미터 계산
입력 뉴런 inN개, 출력 뉴런 units개일 때, 각 출력 뉴런은 모든 입력에 대한 가중치 + bias 1개를 가집니다.
파라미터 수 = (inN + 1) × units
큰 입력(예: Flatten 후 3136)을 Dense에 바로 연결하면 파라미터가 급증합니다. 그래서 CNN은 Conv/Pooling으로 먼저 크기를 줄입니다.
완전연결 — 슬라이더로 크기를 바꿔보세요
다음 막으로
여기까지가 신경망의 외형이에요. Conv·Pool·Flatten·Dense를 쌓으면 일단 "모양"은 신경망이 됩니다. 그런데 왜 이렇게 쌓는 게 효과가 있을까요? 사실 이 블록들 사이에 비밀 장치가 하나 더 숨어 있어요 — 다음 막에서 만나봅시다.
머신러닝 지형도 — 신경망은 어디에?
프롤로그 · 큰 그림
AI라는 말 뒤엔 사실 세 갈래 흐름이 있어요 — 정답을 보며 배우는 지도학습, 데이터의 패턴을 스스로 찾는 비지도학습, 시행착오로 배우는 강화학습. 이 가이드의 주인공은 그중 가장 폭발적으로 자란 가지, 신경망입니다. 1958년 Perceptron에서 시작해 한 번 묻혔다가, 1986년 역전파로 부활하고, 2012년 AlexNet으로 세상을 뒤집은 그 가지요.
AI 모델링을 시작하기 전, 큰 그림을 먼저 봅니다. 머신러닝은 크게 세 갈래로 나뉘고, 이 가이드의 주인공인 신경망이 어디에 속하는지 짚고 갑니다.
머신러닝의 3가지 학습 방식
지도학습 Supervised
정답(label)을 보고 학습.분류 / 회귀.
Neural Network, Decision Tree
👉 이 가이드의 신경망(레이어·활성화·손실·최적화)이 여기에 속합니다.
비지도학습 Unsupervised
정답 없이 데이터 구조를 발견.군집화 / 차원축소.
K-means, PCA
강화학습 Reinforcement
환경과 상호작용하며 보상을 최대화.행동 학습.
Q-learning, Deep Q-Learning
👉 마지막 "5 · 강화학습" 섹션에서 다룹니다.
이 가이드의 범위 — 신경망 중심 + 전통 ML 한눈에
이 가이드는 그중 가장 폭발적으로 자란 가지, 신경망에 본격적으로 들어갑니다. 다만 신경망이 나오기 전 수십 년 동안 ML을 떠받쳐온 전통 모델들(Linear/Logistic Regression, Decision Tree, k-NN, K-means, PCA)도 0막에서 빠르게 짚고 갑니다 — 이름은 들어봤는데 정작 뭔지 모르는 일이 없도록.
신경망의 마지막 Dense 층 하나는 사실 Logistic Regression과 똑같은 수식이에요. 전통 ML은 신경망의 뿌리이고, 신경망은 전통 ML의 일반화라고 생각해도 좋아요.
이 가이드를 따라가는 순서
0
0막 · 전통 ML 한눈에 — Linear/Logistic Regression · Decision Tree · k-NN · K-means · PCA
1
1막 · 모델 구조 — 레이어(Conv2D·Pooling·Flatten·Dense)로 신경망을 어떻게 쌓는지
2
2막 · 활성화 & 출력 — 각 층이 값을 어떻게 변형하고(활성화), 확률로 만드는지(Softmax)
3
3막 · 손실 — 예측이 정답과 얼마나 다른지 측정
4
4막 · 학습의 방법 — 기울기 → 역전파 → Adam → 과적합 방지
5
5막 · 강화학습 — 정답 대신 보상으로 배우는 다른 패러다임
✓
복습 · 체험 — 8문항 퀴즈 + 브라우저에서 실제 학습 (TF.js)
강화학습 기초 — 보상으로 배우기
5막 · 정답이 없을 때
지금까지의 학습은 모두 "정답 레이블"이 필요했어요. 그런데 바둑 한 수가 좋은 수인지를 누가 정답으로 알려줄까요? 게임·로봇처럼 정답 자체가 없는 문제에선 다른 접근이 필요한데, 그게 강화학습(Reinforcement Learning)이에요 — 정답 대신 보상으로 배우는 학습이죠.
왜 등장했나
에이전트가 환경에서 행동을 하면 보상이 돌아와요. "어떤 상황에서 어떤 행동이 좋았나"를 표(Q-table)에 적어두며 학습합니다. 1989년 Watkins가 제안한 Q-learning이 가장 기본적인 형태예요 — 표 한 장으로 모든 걸 기억하는 단순한 방식이죠.
정답(label)이 주어지는 지도학습과 달리, 에이전트가 환경과 상호작용하며 받는 보상(reward)을 단서로 "어떤 상황에서 어떤 행동이 좋은지"를 스스로 학습합니다.
핵심 개념
누적 보상 G = R₁ + γR₂ + γ²R₃ + … + γ^(T-1)R_T (γ = 할인율)
정책 π
상태 → 행동. a = π(s) — 어떤 상황에서 무엇을 할지Q 함수
Q(s,a) = 그 상태에서 그 행동을 했을 때 기대되는 누적 보상Q(s,a) ← Q(s,a) + α [ r + γ·maxₐ′ Q(s′,a′) − Q(s,a) ]
ε-greedy: 대부분은 가장 좋아 보이는 행동(활용, exploitation)을 하되, 확률 ε로 무작위 행동(탐험, exploration)을 섞어 더 나은 길을 찾습니다.
NChain 시뮬레이션 — Q-learning이 정책을 학습하는 과정
규칙: 앞으로(→) 가면 보상 0, 단 마지막 상태 s4에서 앞으로 가면 +10. 처음으로(↺) 돌아가면 즉시 +2.
눈앞의 +2에 안주할지, 멀리 있는 +10을 노릴지 — 에이전트가 학습합니다.
Deep Q-Learning — Q를 신경망으로
왜 등장했나
Q-table은 상태가 조금만 많아져도 폭발해요 — 픽셀 화면처럼 상태가 수십만 가지인 환경에선 표로 못 다뤄요. 그래서 2013년 DeepMind는 표 대신 신경망이 Q를 근사하도록 했어요. 1~4막에서 배운 그 신경망이 강화학습에 다시 등장하는 순간이에요 — Atari 게임을 사람보다 잘하게 된 시작이죠.
상태가 조금만 많아져도 Q-table은 폭발합니다(예: 픽셀 화면). 그래서 표 대신 신경망이 Q(s,a)를 근사하도록 합니다 — 여기서 앞서 배운 신경망이 다시 등장합니다.
Q-table → Q-network
문제
상태 수가 많으면 5×2 같은 표로 감당 불가 (이미지 상태 등)해결
상태 s를 입력하면 각 행동의 Q값을 출력하는 신경망으로 대체Loss = ( r + γ·maxₐ′ Q(s′,a′) − Q(s,a) )²
└─ 목표(target) ─┘ └ 예측 ┘
지도학습의 손실 함수(MSE)와 똑같은 꼴입니다. "목표값과 예측값의 제곱오차"를 줄이도록 신경망을 학습 — 즉 Deep Q-Learning = 강화학습 + 신경망.
빌더와 연결
Q-network는 보통 Dense 층 몇 개로 된 간단한 신경망입니다 (입력=상태, 출력=행동 수만큼의 Q값).
빌더에서 Dense 층을 쌓아 그 구조를 직접 만들어볼 수 있습니다.
복습
1958년 Perceptron부터 2015년 DQN까지, 이 가이드는 신경망 진화의 본편을 다뤘어요. 본문이 끝났으니 머리에 얼마나 남았는지 8문항 퀴즈로 가볍게 확인해봐요.
다음 여정 — 2015 이후의 신경망
에필로그
이 가이드는 1998 LeNet ~ 2015 DQN, 신경망 진화의 본편을 다뤘어요. 그 이후 10년의 세계는 훨씬 더 넓고 빠르게 자랐어요. 핵심 흐름만 짚어보면 — 더 깊은 CNN, 시퀀스를 다루는 Transformer, 데이터를 만들어내는 생성 모델, 그리고 거대 언어 모델(LLM)의 시대로 이어집니다.
2015 → 지금: 4가지 큰 흐름
더 깊은 CNN (2015 ResNet)
깊이를 늘리면 더 잘 학습할 것 같지만, 너무 깊으면 학습이 안 됐어요. Skip connection이라는 단순한 트릭으로 152층 같은 초심층 네트워크가 가능해졌고, ImageNet 정확도가 사람을 넘어섰어요.
시퀀스를 다루는 모델 (2017 Transformer)
이미지가 아닌 문장 · 음성 · 시계열은 순서가 중요해요. RNN을 거쳐 2017년 Transformer가 등장하며 NLP가 폭발했고, 이게 GPT · LLM의 기반이 됐어요.
데이터를 만들어내는 모델 (2014 GAN → 2020 Diffusion)
학습은 보통 "데이터 → 답"인데, "답 → 데이터" 방향도 가능해요. GAN, VAE를 거쳐 지금 Stable Diffusion · Midjourney 같은 이미지 생성이 일상이 됐어요.
거대 언어 모델 (2018+ BERT, GPT)
Transformer를 거대하게 키우자, 별도 학습 없이도 다양한 작업을 할 수 있는 범용 모델이 등장했어요. 이게 ChatGPT · Claude 같은 오늘날 AI의 본체예요.
더 공부할 자료
- Distill.pub — 시각적 머신러닝 논문 모음 (그림으로 보는 NN)
- 3Blue1Brown — Neural Networks — 가장 직관적인 영상 시리즈
- Karpathy — Zero to Hero — Transformer를 처음부터 코드로 구현하기
이 가이드를 끝까지 따라왔다면, 위 자료들도 무리 없이 이해할 수 있을 거예요. 신경망 본편은 끝났지만, 진짜 여정은 이제 시작이에요.
역전파 — 손실을 거꾸로 흘려보내기
왜 등장했나
바로 앞 페이지에서 우리는 "한 변수"에 대한 기울기는 봤어요. 그런데 신경망엔 가중치가 수백 ~ 수백만 개예요. 이 모든 가중치 각각에 대한 기울기를 어떻게 효율적으로 다 구할까요? 그 답이 1986년 Rumelhart · Hinton · Williams가 신경망을 부활시킨 결정적 아이디어 — 역전파(backpropagation)입니다.
손실에서 시작해 출력층 → 은닉층 → 입력층 방향으로 거꾸로 gradient를 흘려보내며, 체인룰(chain rule)을 이용해 모든 가중치에 대한 편미분을 한 번에 효율적으로 계산하는 알고리즘입니다.
두 단계의 반복
신경망 학습 한 스텝은 두 단계로 이루어집니다:
1
순전파 (Forward Pass) — 입력 → 각 층의 활성화 → 예측 ŷ → 손실 L 계산
2
역전파 (Backward Pass) — 손실 L에서 시작해 마지막 층부터 역순으로 ∂L/∂W를 계산
3
업데이트 — Optimizer가 위에서 구한 gradient로 모든 가중치를 한 발씩 옮김
핵심 도구: 체인룰 ∂L/∂w = ∂L/∂y · ∂y/∂h · ∂h/∂w — 한 층의 gradient를 알면 그 앞 층의 gradient를 곱셈만으로 얻을 수 있어요. 그래서 마지막 층부터 거꾸로 흘려보냅니다.
순전파 ↔ 역전파 흐름
위 흐름이 매 학습 스텝마다 반복돼요. 파란 화살표가 한 번, 빨간 화살표가 한 번 — 합쳐서 단 한 사이클로 모든 층의 모든 가중치에 대한 gradient를 얻습니다.
왜 효율적인가
가중치가 N개일 때, 각 가중치를 살짝 바꿔보며 손실 변화를 측정하는 수치 미분으로 계산하면 가중치 한 개당 순전파 한 번 → 총 O(N²)의 비용이 들어요. 역전파는 한 번의 순전파 + 한 번의 역전파만으로 N개 가중치의 gradient를 모두 얻습니다 → O(N).
이 효율성 덕분에 가중치가 수억 ~ 수천억 개인 거대 신경망(GPT 같은 LLM)도 학습이 가능해진 거예요. 역전파가 없었다면 오늘날의 딥러닝은 존재하지 못했죠.
Keras에서는 — 자동 미분
직접 구현할 필요가 없어요. model.fit() 한 줄이 매 스텝마다 "순전파 → 손실 계산 → 역전파 → Optimizer로 파라미터 업데이트"의 사이클을 자동으로 돌립니다. TensorFlow · PyTorch의 autograd(자동 미분)가 모든 연산의 미분 경로를 추적해 역전파 수식을 사람이 적을 필요 없이 계산해 줘요.
model.compile(loss='categorical_crossentropy', optimizer='adam')
model.fit(X_train, y_train, epochs=10)
# ↑ 한 줄 안에서 매 스텝마다:
# forward → loss → backward(역전파) → Adam이 weights 업데이트
과적합과 데이터 분할 — 진짜로 잘 배웠나?
왜 등장했나
Loss가 줄어든다고 모델이 진짜 잘 배운 걸까요? 시험 문제만 통째로 외운 학생이 시험은 만점이지만 새 문제는 못 푸는 것처럼 — 모델도 똑같은 일이 일어나요. 이걸 과적합(overfitting)이라 해요. 진짜로 배웠는지 확인하려면 학습에 안 쓴 데이터로 시험을 봐야 하죠.
모델이 학습 데이터는 잘 맞추지만 새 데이터에 일반화되지 않는 현상이 과적합입니다. 이를 감지·방지하기 위해 데이터를 Train / Validation / Test 세 덩어리로 나눠 학습 · 검증 · 최종평가를 분리합니다.
데이터 분할 — Train / Validation / Test
Train (≈70%)
모델이 실제로 학습하는 데이터. Gradient descent의 대상.
Validation (≈15%)
학습 도중에 평가용. 하이퍼파라미터 튜닝과 학습 종료 시점 결정에 사용.
Test (≈15%)
학습이 모두 끝난 뒤 단 한 번만 평가. 진짜 성능 측정.
철칙
Test 데이터는 모델 선택에 절대 보면 안 됩니다. 보는 순간부터 그것은 Test가 아니라 Validation이 돼요.
비율은 데이터 크기에 따라 달라요. 데이터가 수십만 개 이상이면 80/10/10 이나 98/1/1처럼 train을 더 늘리기도 해요. 작은 데이터셋(수백 개)이라면 K-fold 교차검증이라는 방법도 자주 씁니다.
학습 곡선 — train vs validation loss
파란 train loss는 학습이 진행될수록 계속 줄지만, 빨간 val loss는 어느 시점부터 다시 올라가요. 그 변곡점이 바로 과적합이 시작되는 지점이고, 이 지점에서 학습을 멈추는 것이 Early Stopping입니다.
과적합 vs 과소적합
| 상태 | train loss | val loss | 해석 · 처방 |
|---|---|---|---|
| 과소적합 (Underfitting) | 높음 | 높음 | 모델이 너무 단순함 → 더 큰 모델, 더 긴 학습, 더 좋은 특징 |
| 잘 학습됨 | 낮음 | 낮음 | train · val 둘 다 낮음 ✓ |
| 과적합 (Overfitting) | 낮음 | 높음 | 모델이 train을 외워버림 → 더 많은 데이터 · Dropout · Early Stopping · 정규화 |
과적합 해결법
1
더 많은 데이터 — 가장 효과적이지만 가장 비싸요. 데이터 증강(augmentation)으로 우회하기도 합니다.
2
Early Stopping — val loss가 다시 오르기 시작하면 학습 중단. 가장 쉽고 효과 큰 트릭.
3
Dropout (Srivastava 2014) — 학습 중 일부 뉴런을 무작위로 꺼서 특정 경로 과의존을 막아요. → 빌더에서 Dropout 추가해보기
4
L1 · L2 정규화 — 가중치 크기 자체에 패널티를 줘서 모델 복잡도 억제.
5
모델 크기 줄이기 — 파라미터가 너무 많으면 train을 외울 여지가 커집니다. "필요한 만큼만" 키우세요.
Keras 코드 — 한눈에
from tensorflow.keras.callbacks import EarlyStopping
model.fit(
X_train, y_train,
validation_split=0.2, # train의 20%를 자동으로 val로
epochs=50,
callbacks=[EarlyStopping(patience=5, # val loss가 5번 안 좋아지면 중단
restore_best_weights=True)]
)
# 학습이 끝난 뒤 단 한 번만 — 진짜 성능:
test_loss, test_acc = model.evaluate(X_test, y_test)
다음 막으로
비선형(2막) + 손실(3막) + Optimizer · 역전파 · 과적합 방지(4막). 이제 지도학습 본편이 끝났어요. 그런데 지금까지는 모두 "정답 레이블"이 있는 학습이었죠. 정답을 줄 수 없는 세계는 어떻게 학습할까요?
복습 퀴즈 — 머리에 얼마나 남았나?
왜
지금까지 6막을 따라왔어요. 머리에 얼마나 남았는지 8문항으로 확인해봐요. 틀려도 괜찮아요 — 답을 선택하면 바로 풀이가 나옵니다.
퀴즈 로딩 중…
직접 학습해보기 — 브라우저에서 실제 학습
왜
지금까지 가르친 순전파 → 손실 → 역전파 → 업데이트 사이클을 머리로만 이해했죠? 이제 실제로 동작하는 걸 봐요. 작은 2D 분류 문제를 브라우저에서 직접 학습시켜볼 거예요 — TensorFlow.js가 진짜 신경망을 학습합니다.
간단한 신경망(
Dense(8, ReLU) → Dense(1, Sigmoid))을 2D 점들에 학습시킵니다. 학습이 진행될수록 결정 경계가 데이터를 따라 변형되는 모습을 실시간으로 볼 수 있어요.데이터셋 — 클릭해서 바꿔보세요
선형: 직선 하나로 분리 가능 — 가장 쉬움 · 원형/나선형: 곡선이 필요해 비선형 활성화(ReLU)가 결정적
실시간 학습
데이터 + 결정 경계
학습 곡선 (loss)
TensorFlow.js를 로드하려면 ▶ 버튼을 누르세요. (처음 한 번만 ~400KB 다운로드)
관찰 포인트 (직접 시도)
- 선형 데이터는 10~20 epoch이면 거의 완벽 — 단순 분류 문제.
- 원형 · 나선형은 직선으로 분리 불가능 → 비선형 활성화(ReLU) 덕분에 곡선 경계를 만듭니다. 더 많은 epoch 필요.
- 학습률이 너무 크면 loss가 튀고 결정 경계가 발산, 너무 작으면 학습이 더딥니다 — 슬라이더로 직접 확인.
- loss 곡선이 평평해지면 → 모델이 *학습할 수 있는 만큼은 다 학습한* 상태.
선형 회귀 · 로지스틱 회귀 — 학습의 시작
0막 · 전통 ML 한눈에
신경망이 등장하기 전, ML을 떠받쳐온 고전 모델들을 빠르게 짚어요. 사실 신경망의 마지막 Dense 층 하나는 *선형/로지스틱 회귀와 수식이 똑같아요* — 가장 단순한 형태의 신경망이라고 할 수 있죠. 0막은 그 뿌리를 보는 시간이에요.
왜 등장했나
데이터에서 가장 잘 맞는 직선 하나를 찾는 가장 단순한 학습. 1805년 Legendre의 최소제곱법까지 거슬러 올라가는 ML의 출발점이에요. 회귀(연속값 예측)와 분류(예/아니오)의 토대.
Linear Regression은 연속값(가격·온도 등)을 예측하고, Logistic Regression은 이진 분류(스팸·정상)에 씁니다. 둘 다 가중합 + (선형 또는 sigmoid)이라는 똑같은 골격을 공유해요.
Linear Regression — y = wx + b
입력 x로 연속값 y를 예측. 손실은 MSE(3막에서 본 그것).
ŷ = w · x + b L = Σ(y − ŷ)²
미분 한 번으로 닫힌 해(closed-form)가 바로 나와요 — gradient descent 없이도 풀 수 있는 거의 유일한 ML 모델. 그래서 가장 빠르고 단순해요.
Logistic Regression — sigmoid(wx + b)
선형 결과에 sigmoid를 씌우면 이진 분류가 됩니다. 출력은 0~1 확률.
ŷ = σ(w · x + b) = 1 / (1 + e^−(w·x+b))
이게 사실 Dense(units=1, activation='sigmoid')와 똑같아요. 2막에서 본 Sigmoid 활성화가 여기서 등장. 빌더로도 만들 수 있죠.
왜 하필 sigmoid일까 — 로그오즈(logit)
방금 "선형식에 sigmoid를 씌운다"고 했지만, 사실 순서는 반대예요. 확률 p는 0과 1 사이에 갇혀 있는데 선형식 β₀ + β₁x는 −∞부터 +∞까지 자유롭게 움직여요. 사는 동네가 다르니 그냥 등호로 이을 수가 없죠. 그래서 p를 −∞ ~ +∞로 펴주는 변환을 먼저 찾은 거예요.
확률을 오즈(일어날 확률 ÷ 안 일어날 확률)로 바꾸면 위쪽 한계가 풀려 0~∞가 되고, 거기에 로그를 씌우면 아래쪽 한계까지 풀려 −∞~+∞가 돼요. 이 로그오즈를 선형식과 이어주는 게 로지스틱 회귀의 진짜 모형식이에요.
logit(p) = log( p / (1 − p) ) = β₀ + β₁x₁ + … + βₖxₖ
이제 이 식을 p에 대해 거꾸로 풀면 — 양변에 exp를 씌우고 정리하면 — sigmoid가 저절로 튀어나와요.
p = exp(β₀ + β₁x) / ( 1 + exp(β₀ + β₁x) ) = σ(β₀ + β₁x)
sigmoid는 아무렇게나 고른 함수가 아니에요. "확률을 선형식으로 설명하고 싶다"는 요구에서 로그오즈를 거쳐 유도된 결과죠. 앞으로 2막에서 만날 그 S자 곡선의 출생신고서인 셈이에요.
오즈비(odds ratio) — 계수 β를 읽는 법
신경망은 가중치 하나만 떼어내 읽기가 어렵지만, 로지스틱 회귀는 계수 β 자체가 해석이에요. 다른 변수를 모두 고정한 채 x₁만 1 늘리면 오즈가 정확히 e^β₁ 배가 됩니다. 지수 부분에서 β₁이 그대로 남기 때문이에요.
odds(x₁ + 1) / odds(x₁) = e^(β₀ + β₁(x₁+1)) / e^(β₀ + β₁x₁) = e^β₁
β₁ > 0
x가 커질수록 관심 범주(Y=1)에 속할 확률이 올라가요 — 양의 관계.β₁ < 0
x가 커질수록 확률이 내려가요 — 음의 관계.
금융 사례 — 카드 사용액으로 연체 예측하기
어느 카드사가 고객의 사용액(balance)만으로 연체(default) 가능성을 예측했더니 절편 −10.6513, balance 계수 0.0055가 나왔어요.
어느 카드사가 고객의 사용액(balance)만으로 연체(default) 가능성을 예측했더니 절편 −10.6513, balance 계수 0.0055가 나왔어요.
p̂ = exp(−10.6513 + 0.0055 · balance) / ( 1 + exp(−10.6513 + 0.0055 · balance) )
- 사용액이 $1 늘면 연체 오즈는 e^0.0055 = 1.0055배. 한 걸음은 거의 티가 안 나요.
- 그런데 사용액이 $2,000이면 p̂ = 0.586 — 연체 확률이 이미 절반을 넘어요. 작은 계수도 x가 커지면 크게 쌓입니다.
"이 고객을 왜 거절했나"를 숫자로 설명해야 하는 금융·의료에서 로지스틱 회귀가 아직 현역인 이유예요. 신경망이 더 잘 맞혀도, 설명할 수 없으면 못 쓰는 자리가 있거든요.
신경망과의 관계 — 한 줄 요약
- Linear Regression = Dense(1, 활성화 없음)
- Logistic Regression = Dense(1, sigmoid)
- 여러 층을 쌓으면 → 다층 신경망(MLP). 비선형 활성화가 그 차이를 만들어요.
Decision Tree · k-NN — 직관적 분류기
왜 등장했나
수학식 대신 규칙과 근접성으로 학습. 사람이 분류하는 방식과 가장 가까운 ML 모델들이에요 — 그래서 결과를 "해석 가능"하다는 강점이 있어요.
신경망이 수식과 미분으로 풀어낸다면, 이 두 모델은 "비슷한 이웃의 다수결"(k-NN)이나 "if-then 질문 트리"(Decision Tree)로 학습합니다. 표 형태 데이터에서 자주 쓰여요.
k-NN (k-Nearest Neighbors) — 가까운 이웃의 다수결
새 데이터 → 학습 데이터 중 가장 가까운 k개 이웃을 찾고 → 그들의 다수 클래스가 답.
예측 = mode(k개 최근접 이웃의 라벨) 거리 = Euclidean 등
학습 단계가 없어요 — 데이터 자체가 모델이에요. 예측할 때 모든 데이터와 거리를 계산하므로 예측이 느림. "Lazy learning"이라고 불러요.
Decision Tree — 질문 트리
예/아니오 질문을 트리 형태로 쌓아 분류. 각 노드에서 데이터를 가장 잘 가르는 질문을 자동으로 선택 (정보 이득 / 지니 불순도 기준).
해석 가능: 모델이 어떻게 결정했는지 사람이 단계별로 따라갈 수 있음. 의료·금융처럼 "왜?"를 설명해야 하는 분야에서 자주 선호. 신경망과 정반대 특성.
불순도 — 트리는 질문을 어떻게 고를까
위 그림에서 "키 > 170cm?"라는 첫 질문은 누가 정해줬을까요? 아무도요. 트리는 가능한 질문을 전부 시험해보고 가장 좋은 하나를 직접 고릅니다. 그 채점 기준이 불순도(impurity) — 한 마디 안에 여러 클래스가 얼마나 섞여 있나를 재는 값이에요. 한 클래스만 있으면 0, 반반씩 섞이면 최대가 됩니다.
지니 불순도 imp(t) = 1 − Σ p(j|t)²
엔트로피 불순도 imp(t) = − Σ p(j|t) · log p(j|t)
좋은 질문이란 나눈 뒤 불순도가 많이 떨어지는 질문이에요. 부모 마디의 불순도에서, 두 자식 마디의 불순도를 자료 수 비율로 가중평균해 빼면 그 질문이 벌어준 이득 G(s, t)가 나와요.
G(s, t) = imp(t) − N(t_L)/N(t) · imp(t_L) − N(t_R)/N(t) · imp(t_R)
모든 특성 × 모든 분리점에 대해 G를 계산하고 가장 큰 것을 그 마디의 질문으로 채택 — 잎에 닿을 때까지 이걸 반복해요. 신경망이 gradient를 따라 조금씩 미끄러져 내려간다면, 트리는 매 단계 그 자리에서 가장 좋은 질문을 하나씩 집어드는 탐욕적(greedy) 방식이에요.
직접 계산해보기 — 성별과 학력, 어느 질문이 좋을까
고객 5명의 상품 가입 여부예요. 첫 질문으로 성별과 학력 중 무엇을 써야 할까요? 눈으로는 잘 모르겠으니 G를 계산해봐요.
F {1, 0, 1} → imp = 1 − (1/3)² − (2/3)² = 0.4444 G = 0.48 − ⅖·0.5 − ⅗·0.4444 = 0.01336
대졸 {1, 0, 0} → imp = 1 − (2/3)² − (1/3)² = 0.4444 G = 0.48 − ⅖·0 − ⅗·0.4444 = 0.21336
| X₁ (성별) | X₂ (학력) | Y (가입여부) |
|---|---|---|
| M | 대졸 | 1 |
| M | 대졸 | 0 |
| F | 고졸 | 1 |
| F | 대졸 | 0 |
| F | 고졸 | 1 |
① 아직 안 나눈 부모 마디 — 5명 중 가입 3명 · 미가입 2명
imp(t) = 1 − (2/5)² − (3/5)² = 0.48
imp(t) = 1 − (2/5)² − (3/5)² = 0.48
② 성별로 나누면 (s₁)
M {1, 0} → imp = 1 − (1/2)² − (1/2)² = 0.5F {1, 0, 1} → imp = 1 − (1/3)² − (2/3)² = 0.4444 G = 0.48 − ⅖·0.5 − ⅗·0.4444 = 0.01336
③ 학력으로 나누면 (s₂)
고졸 {1, 1} → imp = 1 − 0² − 1² = 0 (완전히 순수!)대졸 {1, 0, 0} → imp = 1 − (2/3)² − (1/3)² = 0.4444 G = 0.48 − ⅖·0 − ⅗·0.4444 = 0.21336
학력 쪽 이득이 약 16배 큽니다 → 첫 질문은 "학력?"으로 결정. 고졸로 갈린 두 명은 불순도가 0이라 더 물어볼 게 없으니 그대로 잎이 되고, 대졸 세 명만 다음 질문으로 넘어가요. 트리가 자라는 과정은 이 계산의 반복일 뿐이에요.
언제 멈출까 — 정지규칙과 가지치기(pruning)
트리를 끝까지 자라게 두면 잎마다 데이터가 한 개씩 남을 때까지 쪼개져요. 학습 데이터는 100% 맞히지만 새 데이터에는 엉망이 되죠 — 앞으로 4막에서 자세히 볼 과적합이 트리에서 나타나는 모습이에요. 트리에는 신경망과는 다른 두 가지 처방이 있어요.
정지규칙 — 자라기 전에 막기
자라는 도중에 조건을 걸어 멈춰 세워요.
- 마디 안의 Y가 모두 같을 때
- 마디의 자료 수가 기준보다 적을 때
- 뿌리로부터의 깊이가 기준을 넘을 때
- 불순도 감소량 G가 너무 작을 때
가지치기 — 키운 뒤 잘라내기
일단 크게 키운 다음, 검증 데이터의 예측오차가 가장 작아지는 크기를 찾아 거기까지 가지를 쳐냅니다. 보통 알고리즘 안에 자동화돼 있어요.
"웃자란 나무를 나중에 다듬는다"는 정원사의 감각 그대로예요.
신경망이 Dropout · Early Stopping으로 과적합을 막는다면, 트리는 깊이와 마디 크기로 막아요. 목적은 똑같고 손잡이만 다른 셈이죠. → 4막 과적합 편 미리 보기
비교 — 세 가지 분류기
| 모델 | 학습 방식 | 예측 속도 | 해석성 | 강점 |
|---|---|---|---|---|
| k-NN | 없음 (lazy) | 느림 | 중 | 단순함, 작은 데이터 |
| Decision Tree | 분할 규칙 찾기 | 빠름 | ★★★ | 해석 가능, 비수치 데이터 친화 |
| 신경망 | gradient descent | 빠름 | 낮음 | 거대 데이터, 복잡 패턴 |
Random Forest는 Decision Tree 여러 그루를 모아 다수결한 모델 — *표 형태 데이터*(엑셀 같은 정형 데이터)에선 신경망보다 종종 더 강력해요.
K-means · PCA — 정답 없이 데이터를 이해하기
왜 등장했나
지금까지는 모두 정답(label)이 필요한 지도학습이었어요. 비지도학습은 정답 없이 데이터의 *구조*를 찾아요 — 클러스터링(K-means)은 "비슷한 것끼리 모으기", PCA는 "중요한 축 찾기"예요.
"이 고객들은 몇 그룹으로 나뉘나?"(K-means) "이 1000차원 데이터를 2D로 요약하면?"(PCA) 같은 질문에 답하는 모델들. 정답이 없으니 정답률 대신 구조의 유의미함으로 평가해요.
K-means — k개 군집 찾기
데이터를 k개 그룹으로 자동 분할. 알고리즘은 단순한 반복:
1
k개 중심점(centroid)을 무작위로 배치
2
각 데이터를 가장 가까운 중심점에 할당
3
각 그룹의 평균 위치로 중심점을 이동
↺
2~3 반복 → 수렴(중심점이 더 안 움직일 때까지)
사용 예: 고객 세분화, 이미지 색상 압축, 문서 토픽 분류. 단점: k 값을 사람이 미리 정해야 함 ("k=3일까 k=5일까?" — 아래 Elbow method로 가늠).
직접 해보기 — 점 4개를 2개 군집으로
말로만 보면 헷갈리니 아주 작은 예로 직접 돌려봐요. 2차원 점 4개를 k=2로 나눕니다. 처음엔 임의로 (A,B) · (C,D)로 묶고 시작해요.
| 관찰치 | x₁ | x₂ |
|---|---|---|
| A | 5 | 3 |
| B | −1 | 1 |
| C | 1 | −2 |
| D | −3 | −2 |
① 두 군집의 중심(평균)을 계산
(AB) 중심 = (2, 2) · (CD) 중심 = (−1, −2)
(AB) 중심 = (2, 2) · (CD) 중심 = (−1, −2)
② 각 점에서 두 중심까지의 거리를 재고, 더 가까운 쪽으로 재배치
A → AB √10 < CD √61 AB
B → AB √10 > CD √9 CD ⟵ 이동!
C → AB √17 > CD √4 CD
D → AB √41 > CD √4 CD
B → AB √10 > CD √9 CD ⟵ 이동!
C → AB √17 > CD √4 CD
D → AB √41 > CD √4 CD
결과
B가 (AB)에서 (CD)로 넘어갔어요. 군집이 (A) 와 (BCD) 로 바뀝니다.
③ 중심을 다시 계산하고 재확인
(A) 중심 = (5, 3) · (BCD) 중심 = (−1, −1)
이제 어떤 점도 더 가까운 다른 중심이 없어요 → 수렴.
(A) 중심 = (5, 3) · (BCD) 중심 = (−1, −1)
이제 어떤 점도 더 가까운 다른 중심이 없어요 → 수렴.
최종 군집은 (A) 와 (BCD). "중심 계산 → 재배치"를 재배치가 멈출 때까지 반복하는 게 K-means의 전부예요. 시작 묶음이 달랐다면 결과도 달라질 수 있고 — 그래서 초기 중심 선택에 민감하다고 해요.
적절한 k — Elbow method (팔꿈치 법)
K-means는 k를 사람이 미리 정해야 하는데, 몇 개가 좋을까요? 군집이 얼마나 촘촘한지는 SSE(오차제곱합) — 각 점에서 자기 군집 중심까지 거리의 제곱을 모두 더한 값 — 로 잽니다. k를 늘리면 SSE는 무조건 줄어들지만(극단적으로 점마다 군집이면 0), 어느 지점부터는 줄어드는 속도가 확 꺾여요.
SSE가 급격히 줄다가 완만해지기 시작하는 '팔꿈치' 지점의 k를 적정 군집 수로 봐요. 실습에서도 k=2~5의 오차를 계산해 이 곡선을 그려 k를 골랐어요.
무엇이 '가까운' 걸까 — 거리와 스케일링
군집화는 계속 "가깝다"는 말에 기대요. 그럼 두 점 a=(a₁,…,aₙ), b=(b₁,…,bₙ) 사이의 거리는 어떻게 잴까요? 대표적인 세 가지가 있어요.
유클리디안 거리 (L2) d(a,b) = √( (a₁−b₁)² + ⋯ + (aₙ−bₙ)² )
맨해튼 거리 (L1) d(a,b) = |a₁−b₁| + ⋯ + |aₙ−bₙ|
민코우스키 거리 (Lp) d(a,b) = ( Σ |aᵢ−bᵢ|ᵖ )^(1/p) → p=1이면 L1, p=2이면 L2
⭐ 주의 — 스케일이 다르면 거리가 왜곡돼요. 예를 들어 '연봉(원)'과 '나이(세)'를 함께 쓰면 숫자가 큰 연봉이 거리를 독차지해 나이는 있으나 마나가 됩니다. 그래서 거리를 재기 전에 각 변수를 표준화·정규화해 스케일을 맞춰줘요. (실습에서도 수익률을
Normalizer로 정규화한 뒤 거리를 쟀어요.)계층적 군집화 (Hierarchical Clustering) — 나무처럼 묶어가기
K-means가 k를 미리 정해야 하는 것과 달리, 계층적 군집화는 가장 가까운 둘부터 차례로 병합하며 나무(덴드로그램)를 쌓아요. 나중에 원하는 높이에서 자르면 그 수만큼 군집이 나옵니다.
1
각 데이터를 하나의 군집으로 시작 (n개)
2
가장 가까운 두 군집을 병합
↺
하나가 될 때까지 반복 → 덴드로그램 완성
그런데 "군집 사이의 거리"는 뭘로 잴까? — 개체 하나끼리는 위의 거리로 재지만, 여러 점이 든 군집끼리의 거리는 정의하기 나름이에요. 이 선택(연결법, linkage)에 따라 덴드로그램 모양이 달라져요.
| 연결법 | 두 군집의 거리 정의 |
|---|---|
| 단일 연결 (single) | 두 군집에서 가장 가까운 개체 한 쌍의 거리 (min) |
| 완전 연결 (complete) | 가장 먼 개체 한 쌍의 거리 (max) |
| 평균 연결 (average) | 두 군집 모든 개체쌍 거리의 평균 |
| 중심 연결 (centroid) | 두 군집 중심(평균점) 사이의 거리 |
| 와드 연결 (ward) | 두 군집을 합쳤을 때 SSE가 늘어나는 양 — 덜 흩어지게 묶는 방향 |
장점: k를 미리 안 정해도 되고 병합 과정을 덴드로그램으로 해석 가능. 단점: 데이터가 많으면 느림(O(n²)↑). 자르는 높이(군집 수)는 여전히 사람이 선택. 실습에서는 와드(ward) + 유클리드 조합을 썼어요 — 가장 흔한 기본값이에요.
직접 해보기 — 개체 5개를 덴드로그램으로
개체 5개(①~⑤)의 거리를 미리 다 재둔 거리 행렬에서 출발해요. 숫자가 작을수록 가깝습니다. 규칙은 딱 하나 — 단일 연결법(min): 두 군집의 거리는 가장 가까운 한 쌍의 거리로 봐요. "표에서 최솟값을 찾아 그 둘을 묶고, 표를 다시 만든다"를 반복하면 끝이에요.
| ① | ② | ③ | ④ | ⑤ | |
|---|---|---|---|---|---|
| ① | 0 | ||||
| ② | 9 | 0 | |||
| ③ | 3 | 7 | 0 | ||
| ④ | 6 | 5 | 9 | 0 | |
| ⑤ | 11 | 10 | 2 | 8 | 0 |
1단계 · 최솟값 = 2 → ③,⑤ 병합 → (35) (높이 2)
(35)와 나머지 거리를 min으로 다시 계산: (35)–① = min(3, 11) = 3 · (35)–② = min(7, 10) = 7 · (35)–④ = min(9, 8) = 8
(35)와 나머지 거리를 min으로 다시 계산: (35)–① = min(3, 11) = 3 · (35)–② = min(7, 10) = 7 · (35)–④ = min(9, 8) = 8
| (35) | ① | ② | ④ | |
|---|---|---|---|---|
| (35) | 0 | |||
| ① | 3 | 0 | ||
| ② | 7 | 9 | 0 | |
| ④ | 8 | 6 | 5 | 0 |
2단계 · 최솟값 = 3 → (35),① 병합 → (135) (높이 3)
(135)–② = min(7, 9) = 7 · (135)–④ = min(8, 6) = 6
(135)–② = min(7, 9) = 7 · (135)–④ = min(8, 6) = 6
| (135) | ② | ④ | |
|---|---|---|---|
| (135) | 0 | ||
| ② | 7 | 0 | |
| ④ | 6 | 5 | 0 |
3단계 · 최솟값 = 5 → ②,④ 병합 → (24) (높이 5)
남은 건 두 군집뿐: (135)–(24) = min(7, 6) = 6
4단계 · (135),(24) 병합 (높이 6) — 전체가 하나로 합쳐지며 종료.
남은 건 두 군집뿐: (135)–(24) = min(7, 6) = 6
4단계 · (135),(24) 병합 (높이 6) — 전체가 하나로 합쳐지며 종료.
묶인 순서와 높이(=그때의 거리)를 그대로 그린 게 덴드로그램이에요. ③⑤가 가장 먼저(2), 그다음 ①이 붙어 (1,3,5)가 한 덩어리, ②④는 따로 (2,4). 높이 4쯤에서 가로로 자르면 선을 두 번 지나가니 최종 2개 군집이 됩니다.
PCA (주성분 분석) — 데이터의 '중심 축' 찾기
고차원 데이터(예: 1000차원)를 가장 분산이 큰 방향들(주성분, PC)로 압축. 가장 중요한 정보를 잃지 않고 차원을 줄여요.
데이터 → 공분산 행렬 → 고유벡터(주성분) → 투영
각 주성분은 원래 변수들의 선형결합이에요. z₁ = l₁x₁ + l₂x₂ + ⋯ + lₖxₖ
계수 l — PC loading
어떤 원래 변수가 이 축에 얼마나 기여하는지(방향).값 z — PC score
각 관찰치를 새 축에 투영한 좌표값.- 주성분끼리는 서로 상관이 없어요(uncorrelated) — 정보가 겹치지 않게 재정렬한 셈.
- 분산은 내림차순: Var(z₁) ≥ Var(z₂) ≥ ⋯ — 앞쪽 축일수록 정보를 많이 담아요.
- 전체 분산은 보존돼요 — 축을 회전만 했을 뿐 정보 총량은 그대로.
그럼 몇 개의 축만 남길까? — 앞에서부터 p개를 골랐을 때 담긴 정보의 비율을 설명분산비율(Explained Variance Ratio)로 재요.
EVR = (앞쪽 p개 주성분의 분산 합) / (전체 분산)
보통 누적 EVR이 80~90%가 되는 지점까지만 남기면, 정보 손실은 조금이면서 차원은 확 줄일 수 있어요.
사용 예: 시각화(1000차원 → 2D), 노이즈 제거, 특성 압축. Autoencoder(오토인코더)는 PCA의 신경망 버전이라 볼 수 있어요 — *비선형 PCA*.
실전 — 주가 움직임만으로 주식을 군집화하기
금융 데이터 마이닝 실습에서는 S&P 500 종목 수십 개를 골라, 라벨(섹터)은 알려주지 않고 오직 일별 수익률(등락률) 패턴만으로 군집화해봤어요.
1
종목별 종가 → 일별 수익률로 변환 (가격 절대값이 아니라 '움직임'을 봄)
2
수익률을 정규화(Normalizer)해 스케일을 맞춤
3
와드 계층 군집화(덴드로그램) & K-means로 군집을 나눔
놀라운 건 결과예요 — 섹터를 안 알려줬는데도 같은 산업끼리 저절로 뭉쳤어요. Utilities·Health Care 같은 방어주가 한 군집, IT·Industrials 같은 경기민감주가 다른 군집으로요. 비슷하게 움직이는 주식은 대체로 같은 산업이라는 숨은 구조를, 정답 없이 데이터 스스로 드러낸 거죠. 이게 비지도학습이 하는 일이에요. (출처: 금융 데이터 마이닝 실습 4 — Cluster Analysis)
신경망으로 가는 다리
- K-means → Self-Organizing Map(SOM), Mixture-of-Experts
- PCA → Autoencoder, Variational Autoencoder(VAE), Diffusion 모델의 잠재공간
- 비지도학습은 대량의 라벨 없는 데이터가 흔한 현대에 더 중요해졌어요 — 자기지도학습(self-supervised), 사전학습(pretraining)이 그 후예예요.
다음 막으로
군집화로 "비슷한 것끼리" 묶었다면, 이번엔 "함께 일어나는" 패턴을 찾아볼 차례예요 — 장바구니 속 숨은 규칙, 연관규칙입니다.
앙상블 — 배깅 · 부스팅 · 랜덤포레스트
왜 등장했나
Decision Tree 한 그루는 데이터가 조금만 바뀌어도 결과가 출렁이고 과적합에 약해요. 그런데 여러 모델의 의견을 모으면 개별 오차가 상쇄돼 훨씬 안정적이고 강력해집니다 — 이게 앙상블(ensemble)이에요. 정형(표) 데이터에선 오늘날까지도 신경망을 능가하는 일이 흔해요.
여러 개의 약한 모델(주로 Decision Tree)을 결합해 하나의 강한 모델을 만드는 방법. 결합 방식에 따라 Bagging(병렬 · 분산 감소)과 Boosting(순차 · 편향 감소)으로 나뉩니다.
Bagging — 여러 모델의 다수결 (Bootstrap Aggregating)
원본 데이터에서 복원추출(bootstrap)로 서로 다른 데이터셋을 여러 개 만들고, 각각에 모델을 학습시킨 뒤 평균(회귀) · 다수결(분류)로 합쳐요. 서로 다른 데이터를 본 모델들이라 오차가 상쇄 → 분산(variance) 감소.
각 모델을 독립적 · 병렬로 학습 → 빠르고 과적합에 강함. 대표 사례가 바로 Random Forest.
Random Forest — 트리들의 숲
Bagging에 한 가지를 더해요: 각 노드에서 특성(feature)도 무작위로 일부만 골라 분할. 트리들이 서로 더 달라져 다양성이 커지고 과적합이 더 줄어듭니다.
예측 = 다수결( Tree₁, Tree₂, …, Tree_B )
금융에서 부도 예측 · 신용평가 · 이상거래 탐지에 널리 쓰여요. 표 형태 데이터에선 튜닝 없이도 강력한 기본기 모델. ← Decision Tree 복습
OOB 평가 — 공짜로 딸려오는 시험지
Bootstrap으로 n개를 복원추출하면 같은 샘플이 여러 번 뽑히기도 하고, 어떤 샘플은 한 번도 안 뽑히기도 해요. 안 뽑힐 확률을 계산해보면 재미있게도 늘 비슷한 값에 수렴합니다.
(1 − 1/n)ⁿ → e⁻¹ ≈ 0.368 매번 약 37%가 남아요
이렇게 남겨진 샘플을 OOB(out-of-bag)라고 불러요. 이 트리는 그 샘플을 학습에 쓴 적이 없으니, 그대로 채점용 시험지로 쓸 수 있죠.
덕분에 평가용 데이터를 따로 떼거나 교차검증을 돌리지 않고도 앙상블 성능을 추정할 수 있어요. 추가 계산이 거의 들지 않아 실무에서 즐겨 씁니다 — 복원추출을 하는 배깅 · 랜덤포레스트만 누리는 특권이에요.
변수 중요도 — 잃어버린 해석력 되찾기
Decision Tree 한 그루는 결정 과정을 사람이 따라 읽을 수 있었어요. 그런데 100그루를 다수결하는 순간 그 해석력이 날아갑니다 — 정확도와 맞바꾼 셈이죠. 이 손해를 조금이나마 메우려고 함께 보는 게 변수 중요도예요.
계산은 단순해요. 각 트리에서 특성 Xᵢ로 마디가 갈릴 때 줄어든 불순도(앞 페이지에서 계산해본 그 G)를 모두 더하고, 그 값을 트리 M개에 대해 평균냅니다. 자주, 그리고 크게 기여한 변수일수록 값이 커져요.
포르투갈 은행의 마케팅 데이터로 "이 고객이 정기예금에 가입할까?"를 예측한 결과예요. 잔고(balance)와 나이(age)가 압도적이고, 직업·학력·결혼상태는 거의 힘을 못 씁니다. 모델을 열어보기 전엔 몰랐을 사실이죠.
"모델이 무엇을 보고 판단했나"까지는 알 수 있어요. 다만 "이 고객은 왜 거절됐나"처럼 개별 예측의 이유는 여전히 알기 어려워요 — 그 자리는 로지스틱 회귀나 별도의 설명 기법(SHAP 등)이 맡습니다. ← 로지스틱 회귀의 계수 해석
Boosting — 틀린 것에 집중해 이어붙이기
Bagging이 병렬이라면 Boosting은 순차적이에요. 앞 모델이 틀린 샘플에 가중치를 더 줘서 다음 모델이 그걸 집중 보정 → 조금씩 오차를 깎아나가요. 편향(bias) 감소가 핵심.
발전 흐름: AdaBoost(1997) → Gradient Boosting → XGBoost · LightGBM. 캐글(Kaggle) 정형 데이터 대회 우승 단골. 단, 순차 학습이라 과적합 · 튜닝에 더 민감해요.
Bagging vs Boosting — 한눈 비교
| 구분 | Bagging (Random Forest) | Boosting (XGBoost) |
|---|---|---|
| 학습 방식 | 병렬 (독립) | 순차 (이전 오차 보정) |
| 주 목적 | 분산(variance) ↓ | 편향(bias) ↓ |
| 과적합 | 강함 (안전) | 민감 (튜닝 필요) |
| 속도 | 빠름 (병렬화) | 상대적으로 느림 |
신경망 관점: 앙상블이 여러 모델로 강해진다면, 신경망은 한 모델 안에서 층을 깊게 쌓아 강해져요. 실제로 딥러닝에서도 여러 모델의 예측을 평균내는 앙상블은 성능을 끌어올리는 단골 기법이에요.
0막 계속
여기까지가 정답이 있는(지도학습) 전통 모델들이에요. 이제 정답 없이 데이터의 구조를 찾는 비지도학습으로 넘어가요.
연관규칙 — 장바구니 속 숨은 패턴 (Apriori)
왜 등장했나
"맥주를 산 사람은 기저귀도 함께 산다" — 영수증 수백만 장에서 이런 함께 일어나는 규칙을 캐내는 게 연관규칙이에요. 정답 라벨이 없는 비지도 방식이고, 금융에선 상품 교차판매 · 이상거래 패턴 발견에 쓰여요.
거래(transaction) 데이터에서 {A} → {B} 형태의 규칙을 찾아요. 규칙이 얼마나 의미 있는지는 지지도 · 신뢰도 · 향상도 세 지표로 판단합니다.
세 가지 핵심 지표
지지도 Support
전체 거래 중 A와 B가 함께 나타난 비율. 규칙이 얼마나 흔한가.신뢰도 Confidence
A를 산 거래 중 B도 산 비율. 규칙의 정확도.향상도 Lift
A · B가 독립일 때 대비 얼마나 더 함께 나오나. Lift > 1 이면 양의 상관.Support(A→B) = P(A∩B) Confidence(A→B) = P(B|A) = P(A∩B) / P(A) Lift(A→B) = Confidence / P(B)
Apriori 알고리즘 — 빈발 항목집합 찾기
가능한 상품 조합은 폭발적으로 많아요(항목 n개 → 2ⁿ 조합). Apriori는 "자주 안 나오는 조합의 상위집합도 자주 안 나온다"(anti-monotone)는 성질로 가지치기해서 탐색을 확 줄입니다.
1
지지도 최소 기준(min-support)을 정한다
2
1개짜리 빈발 항목 → 2개짜리 → 3개짜리로 크기를 키우며 빈발 집합만 남긴다
3
기준 미달 조합이 나오면 그 상위 조합은 아예 건너뜀 (가지치기)
4
빈발 집합에서 신뢰도 높은 규칙 {A} → {B} 를 추출
예시 — 거래 5건으로 계산해보기
| 거래 | 구매 상품 |
|---|---|
| T1 | 🍞 빵, 🥛 우유 |
| T2 | 🍞 빵, 🧈 버터, 🥛 우유 |
| T3 | 🥛 우유, 🧈 버터 |
| T4 | 🍞 빵, 🧈 버터 |
| T5 | 🍞 빵, 🥛 우유, 🧈 버터 |
규칙 {빵} → {버터} 계산: 빵은 4건(T1·T2·T4·T5), 그중 버터도 산 건 3건(T2·T4·T5). 버터 자체는 4건(지지도 0.8).
→ Support = 3/5 = 0.60 · Confidence = 3/4 = 0.75 · Lift = 0.75 / 0.8 = 0.94. Lift < 1 이라 이 조합은 우연 수준이에요.
→ Support = 3/5 = 0.60 · Confidence = 3/4 = 0.75 · Lift = 0.75 / 0.8 = 0.94. Lift < 1 이라 이 조합은 우연 수준이에요.
어디에 쓰나 · 신경망으로 가는 다리
- 교차판매(cross-selling): "이 카드 쓰는 고객은 이 보험도 든다" → 추천 · 번들 상품
- 이상거래 탐지: 평소 함께 안 나오던 조합이 갑자기 나타나면 이상 신호
- 장바구니 분석: 매대 배치 · 프로모션 설계
연관규칙은 추천시스템의 뿌리예요. 협업 필터링을 거쳐 오늘날엔 임베딩 · 신경망 기반 추천(사용자 · 상품을 벡터로)으로 발전했어요 — 비지도 패턴 발견이라는 문제의식은 그대로예요.
다음 막으로
전통 ML의 큰 그림(회귀 · 분류 · 앙상블 · 군집 · 연관규칙)을 다 봤어요. 이제 본격적으로 신경망의 세계로 들어갑니다 — 이미지 인식의 출발점 CNN부터.
모델 평가지표 — 얼마나 잘 맞췄나?
왜 등장했나
과적합을 피해 모델을 만들었다면, 이제 "얼마나 잘 맞추나"를 숫자 하나로 말할 수 있어야 해요. 그런데 연속값을 맞히는 회귀와 범주를 맞히는 분류는 잣대가 완전히 달라요. 상황에 맞는 지표를 고르는 게 평가의 핵심입니다.
회귀는 오차의 크기(RMSE · R²)로, 분류는 혼동행렬에서 나오는 정확도 · 정밀도 · 재현율 · F1 · ROC로 평가해요. 데이터가 적을 땐 교차검증으로 신뢰도를 높입니다.
회귀 지표 — RMSE · R²
RMSE
예측과 실제의 차이를 제곱 · 평균 · 제곱근. 작을수록 좋고, 단위가 원래 y와 같아 해석이 쉬움.R² (결정계수)
모델이 분산을 얼마나 설명하나. 1에 가까울수록 좋음(0이면 평균 예측 수준).RMSE = √( (1/n) Σ(yᵢ − ŷᵢ)² ) R² = 1 − Σ(yᵢ − ŷᵢ)² / Σ(yᵢ − ȳ)²
RMSE는 큰 오차에 민감(제곱 때문)해요 — 이상치가 많은 금융 데이터에선 MAE(절댓값 평균)와 함께 보기도 합니다.
혼동행렬 (Confusion Matrix)
분류 결과를 실제 × 예측 2×2 표로 정리한 게 모든 분류 지표의 출발점이에요.
금융 예시: 부도(Positive) 예측에서 FN(부도인데 정상이라 판단)은 손실이 크고, FP(정상인데 부도라 거절)는 기회 손실 — 무엇을 더 줄일지에 따라 지표 선택이 달라져요.
분류 지표 — 정확도 · 정밀도 · 재현율 · F1
정확도 Accuracy
전체 중 맞힌 비율 = (TP+TN)/전체. 클래스 불균형엔 취약.정밀도 Precision
Positive라 예측한 것 중 진짜 = TP/(TP+FP).재현율 Recall
실제 Positive 중 잡아낸 것 = TP/(TP+FN).F1 Score
정밀도 · 재현율의 조화평균. 둘의 균형.F1 = 2 · (Precision · Recall) / (Precision + Recall)
정밀도 ↔ 재현율은 트레이드오프. 사기탐지처럼 놓치면 안 되는 문제는 재현율을, 스팸처럼 오탐이 성가신 문제는 정밀도를 중시해요.
ROC 곡선 & AUC
분류 임계값(threshold)을 0→1로 바꿔가며 TPR(재현율) vs FPR(1−특이도)를 그린 곡선. 곡선 아래 넓이가 AUC예요.
AUC = 1 완벽 · 0.5 무작위(대각선). 임계값을 안 정하고도 모델의 전반적 분별력을 한 숫자로 비교할 수 있어 널리 쓰여요.
K-fold 교차검증 (Cross-Validation)
데이터가 적으면 train/test 한 번 나누는 것만으론 운(運)에 좌우돼요. 데이터를 k등분해 번갈아 한 조각을 검증에 쓰고 나머지로 학습 → k번의 평균으로 안정적 평가.
검증(validation) · 학습(train)
보통 k=5 또는 10. 모든 데이터가 한 번씩 검증에 쓰여 데이터를 알뜰하게 활용해요. 하이퍼파라미터 튜닝의 표준 절차입니다.
편향-분산 트레이드오프 (Bias–Variance)
모델이 너무 단순하면 편향(bias)이 커 과소적합, 너무 복잡하면 분산(variance)이 커 과적합. 둘의 합이 최소가 되는 적정 복잡도가 최선이에요.
이게 바로 과적합과 데이터 분할 페이지에서 본 train/val 곡선의 이론적 배경이에요. 앙상블(Bagging은 분산↓, Boosting은 편향↓)이 이 트레이드오프를 공략하는 대표 방법이었죠.