1. 지도학습에서 우리가 진짜 하고 싶은 일
지도학습의 데이터는 이렇게 생겼습니다.
$$S = \{(x_1, y_1), (x_2, y_2), \dots, (x_n, y_n)\}$$
$x$는 입력, $y$는 정답입니다.
타이타닉 데이터로 예를 들어볼까요. $x_1$은 첫 번째 승객의 정보, 즉 (남성, 3등석, 22세, 형제 1명, 요금 7.25달러) 같은 벡터이고, $y_1$은 그 승객이 살아남았는지 여부(0 또는 1)입니다. 이런 쌍이 891개 있는 것이 타이타닉 훈련 데이터입니다.
우리가 하고 싶은 건 단순합니다. 새로운 $x$가 들어왔을 때, 예를 들어 test.csv에 있는 어떤 승객의 정보 (여성, 1등석, 35세, 혼자)가 들어왔을 때 이 사람이 생존했을지 안 했을지($y$)를 잘 맞추는 함수 $h$를 찾는 것입니다. 여기서 $h$는 hypothesis(가설)의 줄임말이고, 우리가 학습시키려는 "예측 함수"라고 생각하시면 됩니다.
이건 시험 공부와 정확히 똑같은 구조입니다. 문제집(훈련 데이터 891명)으로 열심히 공부해서, 한 번도 본 적 없는 실전 시험 문제(test.csv의 418명)를 잘 푸는 것이 목표입니다. 문제집을 그냥 통째로 외우는 학생과, 문제집을 통해 "이런 유형은 이렇게 푸는구나"라는 패턴을 배운 학생 중 누가 실전에서 잘 볼지는 뻔하겠죠. 지도학습도 마찬가지입니다.
2. 파라미터(가중치)는 어떻게 정하는가?
$h(x)$ 안에는 가중치 $w$가 들어 있고, 이 $w$를 어떻게 정하느냐가 머신러닝의 핵심입니다. 타이타닉 예시로 말하면, "성별이 생존에 얼마나 영향을 주는가"를 나타내는 숫자 $w_1$, "객실 등급이 얼마나 영향을 주는가"를 나타내는 $w_2$ 같은 것들입니다. 이 값들을 데이터로부터 찾아내는 과정이 학습입니다.
좋은 $w$란 예측값이 정답에 가까운 $w$입니다. "얼마나 가까운지"를 측정하는 도구가 바로 손실함수(Loss Function) 입니다.
$$J(\theta) = \frac{1}{2} \sum_{i=1}^{n} \left( h_\theta(x^{(i)}) - y^{(i)} \right)^2$$
직관적으로 읽으면 이렇습니다. "(예측값 - 정답)²을 모든 데이터에 대해 다 더한다." 891명 전원에 대해 "내가 예측한 생존확률"과 "실제 생존 여부"의 차이를 제곱해서 싹 더하는 겁니다.
제곱을 취하는 이유는 두 가지입니다. 첫째, 오차가 음수일 때도 양수로 만들어서 합산해야 하기 때문입니다. 예측이 +3 틀렸든 -3 틀렸든 둘 다 똑같이 나쁜 예측인데, 그냥 더해버리면 서로 상쇄돼서 "오차가 없다"고 착각하게 됩니다. 둘째, 크게 틀릴수록 더 큰 벌점을 주기 위함입니다.
1만큼 틀리면 벌점 1이지만 10만큼 틀리면 벌점 100입니다. "조금 틀린 건 봐줘도, 크게 틀린 건 절대 용납 못 한다"는 메시지를 모델에게 전달하는 것입니다.
앞의 $\frac{1}{2}$는 나중에 미분할 때 내려오는 2와 상쇄돼서 식이 깔끔해지도록 붙여놓은 것이고, 수학적으로 큰 의미는 없습니다.
3. 데이터는 어디서 오는가? — 문제 정식화
$$(x, y) \sim D$$
입력-정답 쌍 $(x, y)$는 실제 세계의 분포 $D$에서 나온 샘플입니다. 이게 무슨 말이냐면, 타이타닉호에 탔을 법한 사람들의 특성과 생존 여부에 대한 어떤 거대한 "진짜 분포"가 세상에 있다고 상상하는 겁니다.
1912년에 그 배에 탈 수 있었던 모든 가능한 승객들의 특성 분포 말이죠. 실제로는 2,224명이 탑승했고 그 중 891명의 기록을 우리가 가지고 있는데, 이 891명은 그 거대한 분포에서 뽑아낸 아주 작은 조각에 불과합니다.
더 일반적인 예로, "한국 20대의 키와 몸무게 분포"를 생각해봅시다. 한국 20대는 약 600만 명인데, 우리가 설문조사로 1,000명의 데이터를 모았다면 이 1,000명은 600만 명이라는 진짜 분포 $D$에서 뽑은 샘플입니다. 이 샘플로 만든 모델이 나머지 599만 명에게도 잘 작동해야 의미가 있는 것이죠.
이 "샘플은 전체가 아니다"라는 사실이 나중에 과적합을 이해할 때 결정적으로 중요해집니다.
4. 기대 손실(Expected Loss): 진짜 목표는 세상 전체
이상적인 목표는 실제 세계 전체에서 평균적으로 잘 작동하는 $h$를 찾는 것입니다.
$$L_D(h) = \mathbb{E}_{(x,y) \sim D} \left[ \ell(h(x), y) \right]$$
여기서 $\mathbb{E}$는 기댓값(expectation), 쉽게 말해 평균입니다. "분포 $D$ 전체에서 데이터를 무한히 뽑는다면 평균적으로 얼마나 틀리는가?"를 측정하는 것입니다. 당연히 이걸 최소화하고 싶습니다.
$$\min_h L_D(h)$$
그런데 여기서 근본적인 문제가 생깁니다. 실제 분포 $D$는 알 수 없습니다. 타이타닉에 탔을 법한 모든 가능한 사람의 데이터를 다 가질 수 없고, 한국 20대 600만 명 전원의 키·몸무게를 다 측정할 수도 없습니다. 그래서 우리가 가진 샘플 $S$(891명, 또는 1,000명)로 대신 최소화합니다.
$$L_S(h) = \frac{1}{n} \sum_{i=1}^{n} \ell(h(x_i), y_i)$$
이걸 경험적 손실(Empirical Loss) 이라고 부릅니다. "경험한 데이터(샘플)에서 측정한 손실"이라는 뜻입니다.
수능을 예로 들면, 수능 출제 가능한 모든 문제의 집합이 $D$이고, 우리가 풀 수 있는 모의고사·기출문제집은 그 중 일부 샘플 $S$입니다. 진짜 목표는 "수능(=$D$) 잘 보기"인데, 우리는 수능 문제를 미리 볼 수 없으니 기출문제집($S$)으로 공부해서 수능 실력을 키우는 것입니다. 문제집에서 잘 푼다고 해서 수능에서도 반드시 잘 푼다는 보장은 없다는 것, 느낌이 오시나요?
5. 일반화와 과적합: 왜 모의고사만 잘 보면 안 되는가?
훈련 데이터에서 손실을 0에 가깝게 줄이는 건 사실 어렵지 않습니다. 극단적으로 말하면 문제집 답을 통째로 외우면 됩니다. 타이타닉 승객 891명의 데이터를 모두 외워서 "PassengerId가 1번이면 사망, 2번이면 생존, ..." 이런 식의 거대한 룩업 테이블을 만들면 훈련 정확도는 100%입니다.
하지만 이 모델로 test.csv의 418명을 예측하면 어떨까요? 당연히 엉망입니다. test.csv의 PassengerId는 892번부터 시작해서 훈련 데이터에 존재하지 않으니, 모델은 완전히 속수무책이 됩니다.
$$L_S(h) \approx 0 \quad \text{이지만} \quad L_D(h) \gg L_S(h)$$
이것이 과적합(Overfitting) 입니다. 모델이 데이터의 본질적인 패턴(여성이 남성보다 더 많이 살아남았다, 1등석이 3등석보다 더 많이 살아남았다)이 아니라, 우연히 생긴 노이즈까지 암기한 상태입니다.
복잡한 모델일수록 이런 경향이 강합니다. 데이터 5개를 놓고 5차 다항식을 맞추면 모든 점을 정확히 통과할 수 있지만, 그 사이의 값을 예측하면 엉망이 됩니다. 점 사이에서 함수가 위아래로 미친 듯이 출렁이기 때문이죠.
$$y = a_0 + a_1 x + a_2 x^2 + \cdots + a_5 x^5$$
반대로 과소적합(Underfitting) 은 모델이 너무 단순해서 훈련 데이터조차 제대로 못 맞추는 경우입니다. 예를 들어 타이타닉에서 "모든 승객은 사망"이라고만 예측하는 모델은 너무 단순해서 여성·1등석 같은 중요한 패턴을 전혀 활용하지 못합니다. 문제집 기본 개념도 이해 못 한 학생이 수능에서 잘 볼 리가 없는 것과 같습니다.
둘 다 나쁘고, 적절한 복잡도를 찾는 것이 머신러닝의 핵심입니다. 새로운 데이터에서도 잘 작동하는 능력을 일반화(Generalization) 라고 하고, 좋은 모델의 기준은 훈련 성능이 아니라 일반화 성능입니다.
$$L_S(h) \approx L_D(h)$$
"문제집 점수 ≈ 수능 점수"인 학생이 진짜 실력자라는 뜻입니다.
6. 데이터를 어떻게 나눠야 하는가
$$S_\text{train} \cap S_\text{test} = \emptyset$$
이 식은 "훈련 집합과 테스트 집합의 교집합은 공집합이다", 즉 겹치는 데이터가 하나도 없어야 한다는 뜻입니다. Test set은 절대로 훈련에 사용하면 안 됩니다. 수능 실제 문제를 미리 보고 공부하면 만점을 받더라도 그 점수가 실력을 반영하지 않게 되는 것과 같습니다.
Validation set은 좀 더 미묘합니다. 훈련용도 아니고 최종 평가용도 아닌 "중간 점검용"입니다. 예를 들어 다항회귀에서 차수를 1차로 할지, 3차로 할지, 9차로 할지 결정해야 한다고 해봅시다. Training set으로 각각 학습시킨 후, Validation set에서 성능을 비교해서 가장 좋은 차수를 선택합니다. 그리고 마지막에 딱 한 번, Test set으로 최종 성능을 평가합니다.
모델 복잡도 $M$이 커질수록 훈련 오차는 계속 감소하지만, 테스트 오차는 어느 순간부터 다시 올라가는 U자 형태 를 그립니다. 왼쪽 끝은 과소적합(너무 단순), 오른쪽 끝은 과적합(너무 복잡), 중간 어딘가에 가장 좋은 지점이 있습니다. 이 변곡점을 Validation set이나 Cross-Validation으로 찾는 것입니다.
7. 선형회귀: 가중치, w에 대해 선형이라는 것
$$f_w(x) = w^T x$$
여기서 $w^T x$는 두 벡터의 내적, 즉 $w_1 x_1 + w_2 x_2 + \cdots + w_d x_d$입니다. 타이타닉 예로는 "성별 가중치 × 성별 + 객실등급 가중치 × 객실등급 + 나이 가중치 × 나이 + ..." 이런 식으로 피처별 가중치와 피처값을 곱해서 다 더한 것입니다.
여기서 중요한 포인트가 하나 있습니다. 선형회귀에서 "선형"은 입력 $x$에 대한 선형이 아닙니다. 파라미터 $w$에 대한 선형 입니다.
$$f_w(x) = w_0 + w_1 x + w_2 x^2$$
이 식은 $x$에 대해서는 2차 곡선(포물선)이지만, $w_0, w_1, w_2$에 대해서는 선형입니다. 즉 $w$들이 모두 1제곱으로만 등장하고 $w^2$이나 $w_1 w_2$ 같은 항이 없다는 뜻입니다. $w$만 1차로 들어가면 선형회귀입니다. 덕분에 $x$를 어떻게 변형해서 집어넣든 선형회귀의 틀 안에서 다룰 수 있습니다.
이렇게 입력을 목적에 맞게 변형하는 과정이 피처 엔지니어링(Feature Engineering) 입니다. HW1에서 IsChild, IsAlone, HasCabin을 만드신 것이 바로 이 과정이죠. 원래 데이터에는 Age, SibSp, Parch, Cabin이 있었지만, "18세 미만인가?"라는 새로운 피처(IsChild)로 변환하는 것입니다.
$$\phi(x) = (1, x, x^2, \dots, x^d), \quad f_w(x) = w^T \phi(x)$$
$\phi$(파이)는 피처 변환 함수입니다. 예를 들어 $y = x^2$ 관계의 데이터(포물선)에 $f_w(x) = w_0 + w_1 x$ 같은 직선 모델을 쓰면 절대 맞출 수 없습니다. 직선으로는 포물선을 표현할 수 없으니까요. 이때 $\phi(x) = (x, x^2)$으로 변환해서, 즉 원래 $x$뿐 아니라 $x^2$도 피처로 추가해서 넣으면 선형회귀로도 이 곡선 관계를 포착할 수 있게 됩니다.
8. L2 손실: 결국 평균을 예측하는 모델
$$L_2(y, \hat{y}) = (y - \hat{y})^2$$
여기서 $y$는 실제값(정답), $\hat{y}$(y-hat)은 모델이 출력한 예측값입니다. 모자(hat)가 씌워진 기호는 관례적으로 "추정값"을 의미합니다.
L2 손실을 최소화하는 최적 예측값이 무엇인지 생각해봅시다. 한 가지 중요한 사실이 있습니다. 같은 입력에 대해서도 정답이 여러 개일 수 있다 는 것입니다. 예를 들어 "공부시간 5시간"이라는 같은 입력에 대해서 시험 점수는 70, 80, 65로 사람마다 다를 수 있습니다. 철수가 5시간 공부한 것과 영희가 5시간 공부한다고 해서 같은 점수가 나올 리 없죠. 사람마다 기초 실력, 집중도, 컨디션이 다르기 때문입니다. 현실은 결정론적이지 않습니다.
타이타닉으로 보면 "여성, 3등석, 22세"라는 동일한 조건의 승객 여러 명이 있을 때, 어떤 사람은 살아남고 어떤 사람은 못 살아남았을 수 있습니다. 그 차이는 데이터에 기록되지 않은 수많은 변수들(그 순간 갑판의 어디에 있었는지, 구명조끼를 빨리 찾았는지 등) 때문이겠죠.
그렇다면 $x = 5$(공부시간 5시간)가 들어왔을 때 모델은 뭘 뱉어야 할까요? 70? 80? 65?
결론부터 말하면, L2 손실을 최소화하면 나오는 예측값은 조건부 평균 입니다.
$$\hat{y}^*(x) = \mathbb{E}[y \mid x]$$
$\mathbb{E}[y \mid x]$는 "$x$가 주어졌을 때 $y$의 평균"입니다. 세로줄 $\mid$은 "~라는 조건 하에서"라는 뜻이에요. 공부시간이 5시간이라는 조건 하에서 점수의 평균을 구하면 $(70 + 80 + 65) / 3 = 71.67$이 되고, 이것이 L2 손실을 최소화하는 최적 예측이 됩니다.
왜 평균일까요? 직관적으로 설명하면 이렇습니다. 70, 80, 65 세 값에서 "한 숫자를 골라 대표값으로 삼아라. 단, 각 값과의 차이 제곱의 합이 최소가 되도록." 이 문제의 답이 바로 평균입니다. 수학적으로 증명되는 사실이에요. 즉 선형회귀는 "각 $x$에서 가능한 $y$들의 평균을 추정하는 모델"로 해석할 수 있습니다.
L2 손실의 장점은 미분 가능하고 최적화가 쉽다는 것이지만, 이상치(outlier)에 매우 민감하다는 단점이 있습니다. 반 학생 점수가 대부분 70~80점대인데 한 명이 0점이면 평균이 확 끌려내려가서 실제 반 분위기를 제대로 반영하지 못하는 것과 같습니다.
오차를 제곱하기 때문에 아주 크게 틀린 데이터 한 개의 영향력이 엄청나게 커지거든요.
9. 정규방정식: 최적 w를 한 번에 구하는 공식
"L2 손실을 최소화하면 조건부 평균이 최적 예측값이다"라고 했습니다. 그렇다면 그 최적값을 실제로 어떻게 구할까요?
$$w^* = \arg\min_w \|y - Xw\|^2$$
$\arg\min$은 "최솟값을 만드는 $w$가 무엇인가"라는 뜻입니다.
단순히 최솟값이 얼마인지가 아니라, 그 최솟값을 달성하는 $w$ 자체를 찾는 것이죠. 별표 $w^*$는 "최적 $w$"를 의미합니다.
고등학교 때 2차 함수의 최솟값을 찾을 때 미분해서 0이 되는 지점을 찾으셨을 겁니다. $f(x) = x^2 - 4x + 3$의 최솟값은 $f'(x) = 2x - 4 = 0$, 즉 $x = 2$에서 나오는 것처럼요. 여기서도 똑같이 합니다.
손실함수를 $w$로 미분하고 0으로 놓으면 다음을 얻습니다.
$$\frac{\partial}{\partial w} \|y - Xw\|^2 = -2X^T(y - Xw) = 0$$
정리하면:
$$w^* = (X^T X)^{-1} X^T y$$
이것이 정규방정식(Normal Equation) 입니다. 외우기보다 의미로 이해하는 게 중요합니다. $X^T X$는 피처들이 서로 어떤 관계인지(공분산 구조)
예를 들어 "요금이 높은 사람은 1등석인 경향이 있다" 같은 피처 간 상관을 담고 있습니다. $X^T y$는 피처와 정답이 어떤 관계인지, 예를 들어 "여성일수록 생존 확률이 높다"를 담고 있습니다. 이 두 관계를 결합해서 "가장 잘 설명하는 가중치"를 한 번에 계산하는 공식입니다.
단, $X^T X$가 역행렬이 존재해야 (가역행렬이어야) 계산이 가능합니다. 역행렬이 없는 경우는 피처끼리 완벽하게 겹치는 경우(다중공선성)인데, HW1에서 Fare를 제외하신 이유가 바로 이거죠. Pclass와 Fare가 너무 밀접한 정보라서 둘 다 넣으면 $X^T X$가 거의 특이행렬(singular matrix)에 가까워져서 수치적으로 불안정해집니다.
10. 정규화: 복잡도에 벌점을 주자
과적합 모델은 가중치의 크기가 과도하게 커지는 경향이 있습니다.
$$\|w\|2 = \sqrt{\sum{j=1}^d w_j^2}$$
이 기호 $\|w\|_2$는 $w$라는 벡터의 L2 norm, 즉 "크기"입니다. 2차원 벡터 $(3, 4)$의 크기가 $\sqrt{9+16} = 5$인 것과 같은 원리를 고차원으로 확장한 것입니다.
왜 과적합 모델은 가중치가 커질까요? 고차 다항식($x^5, x^8, x^9$)은 $x$ 값이 조금만 바뀌어도 출력이 폭발적으로 변합니다. $x = 2$와 $x = 2.1$일 때 $x^9$은 512와 708.2로 거의 200 차이가 나죠. 훈련 데이터의 모든 점을 억지로 통과시키려면 함수가 그 사이에서 위아래로 확확 흔들려야 하고, 이 흔들림을 만들기 위해 가중치가 아주 커져야 합니다. "이 점에서는 위로 +500, 저 점에서는 아래로 -480..." 하는 식으로요. 결국 "가중치가 크다 = 모델이 불안정하게 복잡하다" 는 신호입니다.
원래는 경험적 손실만 최소화했는데, 이제 가중치가 너무 커지는 것에도 벌점을 부과합니다.
$$w^* = \arg\min_w \left( L_S(w) + R(w) \right)$$
$L_S(w)$는 예측이 얼마나 틀렸는지(기존 손실), $R(w)$는 가중치가 얼마나 커졌는지(추가 벌점)를 측정합니다. 두 가지를 동시에 줄이는 $w$를 찾는 것입니다. "시험 점수도 잘 받고(손실 낮고), 컨닝도 하지 말고(가중치 작게)" 같은 두 가지 목표를 동시에 요구하는 것이죠.
가장 흔한 정규화인 L2 정규화(Ridge) 는 다음과 같습니다.
$$R(w) = \frac{\lambda}{2} \sum_{j=1}^d w_j^2 = \frac{\lambda}{2} w^T w$$
$\lambda$(람다)는 정규화의 세기를 조절하는 균형추입니다.
$\lambda$가 크면 → 가중치를 세게 억제 → 모델이 단순해짐 → 과적합 위험 감소 (대신 너무 크면 과소적합) $\lambda$가 작으면 → 억제가 약함 → 손실 최소화에 더 집중 (대신 과적합 위험 증가) $\lambda = 0$이면 → 정규화 없음 → 원래 선형회귀와 동일
참고로 bias 항 $w_0$는 보통 정규화에서 제외합니다. $w_0$는 모델의 방향이나 복잡도와 무관하게 예측값 전체를 위아래로 평행이동시키는 역할만 하기 때문입니다.
예를 들어 타이타닉 생존율이 전체적으로 38%라면 $w_0$는 이 기저 확률을 반영하는 역할을 하는데, 이걸 억제할 이유가 없죠.
정규화가 들어간 최종 목적함수는 다음과 같습니다.
$$\sum_{i=1}^{N}(y_i - w^T x_i)^2 + \frac{\lambda}{2} w^T w$$
경험 손실 + 복잡도 제어항. 이 둘의 합을 최소화하는 $w$를 찾는 것이 정규화가 적용된 선형회귀의 목표입니다.
m, w, λ 세 가지를 헷갈리지 말자
이 세 가지는 이름이 다 알파벳 한 글자라 헷갈리기 쉬운데, 역할이 완전히 다릅니다.
$m$ 은 모델이 애초에 어디까지 표현할 수 있게 설계되었는지를 나타내는 값입니다. 다항회귀에서의 최고차수가 대표적인 예입니다. 사람이 직접 정하는 규칙입니다.
$$f_w(x) = w_0 + w_1 x + w_2 x^2 + \cdots + w_m x^m$$
$m=1$이면 직선, $m=2$면 포물선, $m=9$면 꾸불꾸불한 9차 곡선까지 표현 가능한 모델이 됩니다. 도화지의 크기를 정하는 것과 비슷해요.
$w$ 는 그 설계된 모델 안에서 실제로 각 항을 얼마나 세게 쓸지를 정하는 가중치입니다. 학습을 통해 데이터로부터 결정됩니다. $m=2$로 포물선 모델을 정했어도, 데이터를 보고 $w_2$를 0에 가깝게 학습하면 실제로는 거의 직선처럼 나올 수도 있죠.
$\lambda$ 는 학습할 때 $w$가 너무 커지지 못하게 벌점을 주는 정규화 세기입니다. $m$과는 직접적인 관계가 없습니다. $m$이 크더라도(도화지가 크더라도) $\lambda$를 크게 설정하면 가중치가 커지는 것을 억제할 수 있습니다. 즉 $m=9$로 화려한 도화지를 주고도 $\lambda$로 "하지만 너무 요란하게 그리지는 마"라고 제약하는 것입니다.
'Machine Learning' 카테고리의 다른 글
| 도대체 머신러닝이 도대체 무엇인가? (0) | 2026.04.16 |
|---|