회귀분석

src/content/documents/deep-learning/linear-regression-as-the-starting-point-of-deep-learning.json

몸무게로 키를 예측하는 가장 단순한 모델

딥러닝이 아무리 복잡해 보여도 그 출발점은 고등학교 때 배운 선형회귀( y = ax + b)와 같다. 몸무게(X)로 키(Y)를 예측한다고 하면, 우리가 구하고 싶은 것은 기울기 a와 절편 b — 이 둘을 딥러닝에서는 각각 가중치(Weight, W)와 편향(Bias, b)이라 부르고, 합쳐서 파라미터라고 한다.
식으로 쓰면 y = Wx + b다. x는 모델에 넣는 독립변수로 딥러닝에서는 Feature라 부르고, y는 예측하려는 종속변수로 Target이라 부른다.

작은 데이터셋으로 회귀선 읽기

한 사람의 몸무게만으로 키를 완벽하게 알 수는 없지만, 회귀의 입력과 출력 관계를 익히기에는 단순하고 직관적이다. 아래 예제 데이터는 실제 인구 통계가 아니라 계산 과정을 설명하기 위해 만든 작은 학습용 데이터셋이다. 각 행에서 몸무게가 xx, 키가 yy다.

몸무게 x (kg)

키 y (cm)

58

174

59

175

60

176

61

176

62

178

57.057.558.058.559.059.560.060.561.061.562.062.563.0172173174175176177178179180몸무게 x (kg)키 y (cm)
실제값176실제값 176예측값175.8예측값 175.8잔차ei=yiy^i잔차 e_i = y_i - \hat{y}_i실제관측값실제 관측값60kg예측값60kg 예측값잔차yy^잔차 y - ŷ

파란 점은 실제 관측값이고, 주황색 직선은 다섯 점과의 전체 오차가 가장 작도록 구한 회귀선이다. 점들이 정확히 한 직선 위에 있지 않아도 회귀는 데이터의 전반적인 증가 경향을 하나의 식으로 요약한다. 이 데이터에서 구한 식은 y^=0.9x+121.8\hat{y} = 0.9x + 121.8이다. 모자 기호가 붙은 y^\hat{y}는 실제값이 아니라 모델이 계산한 예측값이라는 뜻이다.
예를 들어 몸무게가 x=60x = 60kg이면 모델의 예측은 y^=0.9×60+121.8=175.8\hat{y} = 0.9 \times 60 + 121.8 = 175.8cm이고 실제값은 176cm다. 두 값의 차이인 yy^=0.2y - \hat{y} = 0.2cm를 잔차(residual)라고 한다. 선형회귀 학습은 모든 데이터의 잔차를 함께 작게 만드는 가중치 WW와 편향 bb를 찾는 과정이다.

잔차를 제곱해 더하는 최소자승법

그래프의 보라색 점선은 같은 몸무게에서 회귀선이 예측한 값 y^i\hat{y}_i와 실제 관측값 yiy_i 사이의 수직 거리다. 이 거리에 부호를 붙인 ei=yiy^ie_i = y_i - \hat{y}_i를 잔차라고 한다. 점이 회귀선 위에 있으면 잔차는 양수, 아래에 있으면 음수이며, 선 위에 정확히 놓이면 0이다.
잔차를 그대로 더하면 양수와 음수가 서로 상쇄된다. 그래서 최소자승법은 각 잔차를 제곱한 뒤 모두 더한 잔차제곱합(SSE)을 가장 작게 만드는 WWbb를 고른다.
SSE(W,b)=i=1n(yi(Wxi+b))2\operatorname{SSE}(W,b)=\sum_{i=1}^{n}(y_i-(Wx_i+b))^2
제곱에는 세 가지 효과가 있다. 부호가 사라져 잔차가 상쇄되지 않고, 큰 오차에 더 큰 벌점을 주며, 목적함수가 미분하기 쉬운 매끄러운 곡선이 된다. 따라서 ‘최소자승’은 ‘잔차의 제곱합을 최소화한다’는 뜻이다.

MSE는 제곱합을 데이터 개수로 나눈 값

평균제곱오차(MSE)는 SSE를 데이터 개수 nn으로 나눈 평균이다. 같은 데이터에서는 양의 상수 nn으로 나누어도 최솟값을 만드는 회귀선은 같지만, 데이터 개수가 다른 실험끼리 손실 크기를 비교하기가 쉬워진다.
MSE=1ni=1n(yiy^i)2\operatorname{MSE}=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2
이 예제의 예측값은 차례로 174.0, 174.9, 175.8, 176.7, 177.6cm이고 잔차는 0.0, 0.1, 0.2, -0.7, 0.4cm다. 따라서 MSE=02+0.12+0.22+(0.7)2+0.425=0.14\operatorname{MSE}=\frac{0^2+0.1^2+0.2^2+(-0.7)^2+0.4^2}{5}=0.14가 된다. MSE의 단위는 원래 단위의 제곱인 cm2\mathrm{cm}^2이다. 원래 단위인 cm로 해석하고 싶다면 MSE에 제곱근을 씌운 RMSE를 사용하며, 이 예제에서는 약 0.374cm다.

최적의 기울기와 절편을 한 번에 구하기

입력 변수가 하나인 단순 선형회귀에서는 SSE를 WWbb로 각각 미분해 0이 되는 지점을 풀면 다음 닫힌 해를 얻는다. xˉ\bar{x}yˉ\bar{y}는 각각 입력과 실제값의 평균이다.
W=i=1n(xixˉ)(yiyˉ)i=1n(xixˉ)2,b=yˉWxˉW=\frac{\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})}{\sum_{i=1}^{n}(x_i-\bar{x})^2},\qquad b=\bar{y}-W\bar{x}

이 데이터에서는 xˉ=60\bar{x}=60, yˉ=175.8\bar{y}=175.8이므로 W=0.9W=0.9, b=121.8b=121.8을 얻는다. 이 회귀선은 평균점 (xˉ,yˉ)=(60,175.8)(\bar{x},\bar{y})=(60,175.8)을 지나며, 가능한 모든 직선 중 SSE와 MSE를 가장 작게 만든다.

파라미터는 어떻게 구할까: 5단계

W와 b는 처음부터 알 수 없다. 임의의 값을 넣어보고, 예측값과 실제값의 차이를 줄여가며 찾아낸다. 이 과정을 다섯 단계로 나눠보면 이후 딥러닝 전체 파이프라인의 틀이 그대로 보인다.

단계

내용

1. 데이터 정의

Feature(x)와 Target(y) 데이터를 준비한다.

2. 모델(가설) 정의

y = Wx + b 형태의 식을 세우고 W, b를 임의의 값으로 초기화한다.

3. 손실 함수 정의

예측값과 실제값의 차이를 수치로 재는 기준을 정한다 — 회귀에서는 흔히 MSE(Mean Squared Error)를 쓴다.

4. 오차 최소화

손실이 최소가 되는 방향으로 파라미터를 조정한다.

5. 파라미터 계산

오차가 충분히 작아진 최종 W, b로 회귀식을 확정한다.

통계학의 선형회귀는 4단계에서 미분으로 손실을 한 번에 최소화하는 최소자승법(Least Squares Method)을 쓴다. 딥러닝은 같은 4단계를 경사하강법(Gradient Descent)으로 여러 번 반복해서 조금씩 접근한다는 점이 다르다. 다음 글에서 경사하강법을 자세히 다룬다.

통계적 회귀와 딥러닝, 같은 틀을 다르게 채운다

5단계의 틀은 같지만, 딥러닝은 여기에 세 가지를 더 얹는다.

단계

선형회귀(통계)

딥러닝

예측값 계산

Wx + b를 그대로 예측값으로 쓴다

Wx + b에 활성 함수(Activation Function)를 씌워 비선형성을 더한다

오차 계산

MSE(평균제곱오차)로 잔차를 계산

손실함수(Loss/Cost Function) — 회귀는 MSE, 분류는 Cross Entropy 등 목적에 맞게 선택

파라미터 업데이트

최소자승법으로 한 번에 최적해 계산

역전파(Backpropagation)로 손실이 줄어드는 방향을 구하고, Optimizer로 반복 업데이트

반복

필요 없음(닫힌 해)

정해진 반복 횟수(Epoch)만큼 업데이트를 되풀이

즉 딥러닝은 “선형회귀 + 비선형성(활성 함수) + 반복 최적화(역전파·Optimizer·Epoch)”로 요약할 수 있다. 다음 글들에서 이 요소들을 하나씩 뜯어본다.

코드로 최소자승법 직접 구현하기

scikit-learn 없이 numpy만으로 최소자승법 공식을 직접 적용해, PDF의 몸무게-키 예시와 같은 구조의 데이터를 학습해본다.

import numpy as np

x = np.array([58, 59, 60, 61, 62], dtype=float)  # 몸무게(Feature)
y = np.array([174, 175, 176, 176, 178], dtype=float)  # 키(Target)

x_mean, y_mean = x.mean(), y.mean()
W = np.sum((x - x_mean) * (y - y_mean)) / np.sum((x - x_mean) ** 2)
b = y_mean - W * x_mean

y_pred = W * x + b
mse = np.mean((y - y_pred) ** 2)

print(f"W={W:.3f}, b={b:.3f}, MSE={mse:.3f}")
W=0.900, b=121.800, MSE=0.140

회귀식은 대략 y = 0.9x + 121.8로 구해졌고, 예측값과 실제값의 평균제곱오차(MSE)는 0.14로 매우 작다. 딥러닝에서는 이 W, b를 한 번에 계산하는 대신 경사하강법으로 조금씩 근사해간다 — 그 이유와 과정은 다음 글에서 다룬다.

정리

딥러닝의 예측 구조는 특별한 게 아니라 선형회귀 y = Wx + b에서 출발한다. 다섯 단계(데이터 정의 → 모델 정의 → 손실 정의 → 오차 최소화 → 파라미터 계산)의 틀은 통계와 딥러닝이 같지만, 딥러닝은 여기에 비선형 활성 함수, 역전파, Optimizer, 반복(Epoch)을 더해 더 복잡한 관계까지 학습할 수 있게 확장한 것이다.

참고 자료

Linear Regression — scikit-learn 공식 문서 — 최소자승법(Ordinary Least Squares)의 정의와 수식 (2026-08-07 확인)

댓글 0

댓글을 불러오는 중…