4-1. 신경망 기초: 선형 회귀

1. 선형 회귀의 이해: 가장 단순한 신경망

신경망은 복잡한 패턴을 학습하고 예측을 수행하는 강력한 도구입니다. 이 복잡한 신경망의 가장 기본적인 형태가 바로 선형 회귀(Linear Regression) 모델입니다. 선형 회귀는 말 그대로 "선형적인 관계"를 모델링하는 방법으로, 입력 변수와 출력 변수 간의 관계를 가장 잘 나타내는 "선"을 찾는 것을 목표로 합니다. 이러한 단순성 덕분에 선형 회귀는 신경망의 기본 원리를 이해하는 데 매우 유용한 시작점이며, 복잡한 모델을 구축하기 위한 기반을 다지는 데 필수적입니다.

선형 회귀는 19세기 말부터 통계학에서 널리 사용되어 왔으며, 오늘날 머신러닝 분야에서도 기본적인 예측 모델로 널리 활용됩니다. 예를 들어, 주택 가격 예측, 광고 클릭률 예측, 고객 생애 가치(CLTV) 예측 등 다양한 문제에 적용될 수 있습니다.

1) 선형 회귀의 개념

선형 회귀는 독립 변수(x)와 종속 변수(y) 사이의 선형 관계를 모델링합니다. 이 관계는 다음과 같은 선형 방정식으로 표현됩니다.

$$ y = wx + b $$

여기서:

  • y는 종속 변수 (예측값)
  • x는 독립 변수 (입력값)
  • w는 가중치(weight) 또는 기울기 (slope)
  • b는 편향(bias) 또는 절편 (intercept)

wb는 모델의 파라미터(parameter)라고 하며, 이 값들을 학습 데이터를 통해 최적화하는 것이 선형 회귀 모델의 학습 과정입니다. 즉, 주어진 데이터에 가장 적합한 선을 그리기 위해 wb 값을 조정하는 것입니다.

2) 선형 회귀의 예시

예를 들어, 집의 크기(x, 평방 피트)와 집의 가격(y, 달러) 사이의 관계를 예측하는 선형 회귀 모델을 생각해 봅시다. 모델이 학습을 통해 w <mark class="highlight"><strong><u> 200b </u></strong></mark> 10000을 얻었다면, 이 모델은 다음과 같은 예측을 할 수 있습니다.

$$ y = 200x + 10000 $$

이 모델은 집의 크기가 1000 평방 피트인 경우, 약 210,000 달러 (200 * 1000 + 10000)의 가격으로 예측합니다.

2. 손실 함수: 모델의 성능 측정

선형 회귀 모델의 핵심은 주어진 데이터에 가장 적합한 선을 찾는 것입니다. 이를 위해 모델의 성능을 평가하는 지표가 필요하며, 이 역할을 하는 것이 바로 손실 함수(Loss Function)입니다. 손실 함수는 모델의 예측값과 실제값 사이의 차이를 측정하여, 모델이 얼마나 "잘못" 예측하고 있는지를 나타내는 척도입니다.

1) 손실 함수의 역할

손실 함수는 모델이 훈련 데이터에 얼마나 잘 적합하는지 정량적으로 평가합니다. 모델의 예측값과 실제값의 차이가 클수록 손실 함수의 값은 커지고, 차이가 작을수록 손실 함수의 값은 작아집니다. 손실 함수의 값을 최소화하는 방향으로 모델의 파라미터(wb)를 조정하는 것이 학습의 목표입니다.

2) 평균 제곱 오차 (MSE)

선형 회귀에서 가장 일반적으로 사용되는 손실 함수는 평균 제곱 오차(Mean Squared Error, MSE)입니다. MSE는 예측값과 실제값의 차이(오차)를 제곱한 값들의 평균을 계산합니다. 제곱을 하는 이유는 오차의 크기를 강조하고, 양수와 음수의 오차가 서로 상쇄되는 것을 방지하기 위함입니다. MSE의 수식은 다음과 같습니다.

$$ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y_i})^2 $$

여기서:

  • n은 데이터 샘플의 개수
  • y_i는 실제 값
  • $\hat{y_i}$는 모델의 예측 값

MSE는 직관적이고 미분 가능하기 때문에 경사 하강법과 같은 최적화 알고리즘에 적합합니다.

3) MSE 예시

예를 들어, 3개의 데이터 포인트가 있고, 실제 값(y)과 모델의 예측 값($\hat{y}$)이 다음과 같다고 가정해 봅시다.

i 실제 값 (y) 예측 값 ($\hat{y}$)
1 2 1
2 4 3
3 6 5

MSE는 다음과 같이 계산됩니다.

  1. 각 데이터 포인트의 오차: $(2-1)^2 = 1$, $(4-3)^2 = 1$, $(6-5)^2 = 1$
  2. 오차의 평균: $(1 + 1 + 1) / 3 = 1$

따라서 이 모델의 MSE는 1입니다. MSE 값이 작을수록 모델의 예측 성능이 좋다는 것을 의미합니다.

3. 경사 하강법: 모델 학습의 핵심

손실 함수를 통해 모델의 성능을 평가했다면, 이제 모델의 파라미터(wb)를 업데이트하여 손실을 최소화해야 합니다. 이를 위해 사용되는 가장 기본적인 최적화 알고리즘이 경사 하강법(Gradient Descent)입니다. 경사 하강법은 손실 함수의 기울기(경사)를 이용하여 손실이 감소하는 방향으로 파라미터를 반복적으로 업데이트하는 방법입니다.

1) 경사 하강법의 원리

경사 하강법은 손실 함수를 "언덕"으로 비유하고, 모델의 파라미터를 "언덕을 내려가는 공"으로 비유할 수 있습니다. 경사 하강법의 목표는 공이 가장 낮은 지점(손실 함수의 최소값)에 도달하도록 하는 것입니다. 이를 위해 공은 현재 위치에서 가장 가파른 경사(기울기)의 반대 방향으로 이동합니다.

각 파라미터(wb)는 손실 함수에 대한 편미분을 통해 기울기를 계산하고, 이 기울기에 학습률(learning rate)을 곱하여 파라미터를 업데이트합니다. 학습률은 파라미터가 업데이트되는 "속도"를 조절하는 하이퍼파라미터입니다. 학습률이 너무 크면 발산할 수 있고, 너무 작으면 학습 속도가 느려질 수 있습니다.

2) 경사 하강법의 수식

경사 하강법을 사용하여 wb를 업데이트하는 수식은 다음과 같습니다.

$$ w := w - \alpha \frac{\partial MSE}{\partial w} $$

$$ b := b - \alpha \frac{\partial MSE}{\partial b} $$

여기서:

  • α는 학습률
  • $\frac{\partial MSE}{\partial w}$는 MSE를 w에 대해 편미분한 값
  • $\frac{\partial MSE}{\partial b}$는 MSE를 b에 대해 편미분한 값

MSE의 편미분 값은 다음과 같이 계산됩니다.

$$ \frac{\partial MSE}{\partial w} = \frac{2}{n} \sum_{i=1}^{n} (y_i - \hat{y_i}) \cdot (-x_i) $$

$$ \frac{\partial MSE}{\partial b} = \frac{2}{n} \sum_{i=1}^{n} (y_i - \hat{y_i}) \cdot (-1) $$

3) 경사 하강법의 과정

경사 하강법의 학습 과정은 다음과 같습니다.

  1. 모델의 예측값 계산: 입력 x에 현재 wb를 적용하여 $\hat{y}$를 계산합니다.
  2. 손실 계산: MSE를 사용하여 손실을 계산합니다.
  3. 기울기 계산: MSE를 wb에 대해 편미분하여 기울기를 계산합니다.
  4. 파라미터 업데이트: 계산된 기울기와 학습률을 사용하여 wb를 업데이트합니다.
  5. 반복: 1-4단계를 정해진 횟수만큼 또는 손실이 특정 임계값 이하로 감소할 때까지 반복합니다.

경사 하강법의 과정을 시각적으로 보여주는 이미지

4. 선형 회귀의 구현 (PyTorch)

선형 회귀 모델을 직접 구현해 보겠습니다. PyTorch를 사용하여 선형 회귀 모델을 구축하고, 손실 함수와 경사 하강법을 적용하여 학습하는 과정을 살펴보겠습니다.

import torch
import torch.nn as nn
import torch.optim as optim

# 1. 데이터 준비
# 예시 데이터 (집 크기, 가격)
X_train = torch.tensor([[1.0], [2.0], [3.0], [4.0]]) # 집 크기 (평방 피트)
y_train = torch.tensor([[2.0], [4.0], [5.0], [7.0]]) # 집 가격 (달러)

# 2. 모델 정의
class LinearRegressionModel(nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(1, 1)  # 입력 1개, 출력 1개

    def forward(self, x):
        return self.linear(x)

model = LinearRegressionModel()

# 3. 손실 함수와 옵티마이저 정의
criterion = nn.MSELoss()  # 평균 제곱 오차
optimizer = optim.SGD(model.parameters(), lr=0.01) # 확률적 경사 하강법, 학습률 0.01

# 4. 학습 루프
num_epochs = 100
for epoch in range(num_epochs):
    # Forward pass
    y_pred = model(X_train)
    loss = criterion(y_pred, y_train)

    # Backward and optimize
    optimizer.zero_grad() # 기울기 초기화
    loss.backward()      # 역전파
    optimizer.step()     # 파라미터 업데이트

    if (epoch+1) % 10 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

# 5. 모델 테스트 (예측)
with torch.no_grad():
    predicted = model(X_train).data.numpy()
    print("예측값:", predicted)

1) 코드 설명

  • 데이터 준비: X_trainy_train은 학습에 사용할 입력 데이터와 실제 값입니다.
  • 모델 정의: LinearRegressionModel 클래스는 nn.Module을 상속받아 선형 회귀 모델을 정의합니다. nn.Linear(1, 1)은 입력 1개, 출력 1개를 갖는 선형 레이어를 생성합니다.
  • 손실 함수와 옵티마이저 정의: nn.MSELoss()는 MSE 손실 함수를, optim.SGD는 확률적 경사 하강법을 사용하여 모델을 학습합니다. model.parameters()는 모델의 학습 가능한 파라미터를, lr=0.01은 학습률을 설정합니다.
  • 학습 루프: 각 에폭(epoch)마다 모델은 입력 데이터를 사용하여 예측하고, 손실을 계산하고, 역전파를 통해 기울기를 계산하고, 옵티마이저를 사용하여 파라미터를 업데이트합니다. optimizer.zero_grad()는 각 에폭 시작 시 기울기를 초기화하고, loss.backward()는 역전파를 수행하며, optimizer.step()은 파라미터를 업데이트합니다.
  • 모델 테스트: 학습된 모델을 사용하여 새로운 입력 데이터에 대한 예측을 수행합니다. torch.no_grad()는 기울기 계산을 비활성화하여 메모리 사용량을 줄입니다.

5. 선형 회귀의 장단점 및 고려 사항

선형 회귀는 단순하고 해석하기 쉬우며, 계산 효율성이 높다는 장점을 가지고 있습니다. 그러나 선형 회귀는 데이터가 선형적인 관계를 따르지 않는 경우, 즉 비선형적인 패턴을 보이는 경우에는 정확도가 낮을 수 있습니다.

1) 장점

  • 단순성: 모델 구조가 간단하여 이해하고 구현하기 쉽습니다.
  • 계산 효율성: 학습 및 예측 속도가 빠릅니다.
  • 해석 용이성: 모델의 파라미터(가중치, 편향)를 통해 입력 변수와 출력 변수 간의 관계를 쉽게 파악할 수 있습니다.
  • 기초 모델: 다른 더 복잡한 모델을 학습하기 위한 기본 개념을 제공합니다.

2) 단점

  • 선형성 가정: 데이터가 선형적인 관계를 따르지 않으면 예측 성능이 저하됩니다.
  • 이상치에 민감: 이상치(outlier)가 모델의 파라미터에 큰 영향을 미칠 수 있습니다.
  • 특징 간의 상호작용 고려 불가: 입력 변수 간의 상호작용을 직접적으로 모델링하지 못합니다.

3) 고려 사항

선형 회귀 모델을 사용할 때는 다음과 같은 사항을 고려해야 합니다.

  • 데이터 전처리: 데이터의 스케일 조정(scaling), 이상치 제거, 결측치 처리 등 데이터 전처리를 통해 모델의 성능을 향상시킬 수 있습니다.
  • 특징 선택: 모델에 사용할 특징(feature)을 신중하게 선택해야 합니다. 관련성이 높은 특징을 선택하면 모델의 성능을 높일 수 있습니다.
  • 정규화: 과적합(overfitting)을 방지하기 위해 정규화 기법을 사용할 수 있습니다. (L1, L2 정규화)
  • 모델 평가: 훈련 데이터뿐만 아니라 검증(validation) 데이터와 테스트(test) 데이터를 사용하여 모델의 일반화 성능을 평가해야 합니다.

6. 결론: 선형 회귀에서 시작하는 신경망 여정

선형 회귀는 신경망의 가장 기본적인 형태이지만, 딥러닝의 핵심 개념인 손실 함수, 경사 하강법, 파라미터 최적화 등을 이해하는 데 매우 중요합니다. 선형 회귀 모델을 통해 얻은 지식은 더 복잡한 신경망 모델을 이해하고 구축하는 데 필요한 기반을 제공합니다.

선형 회귀를 통해 모델의 동작 원리를 이해하고, PyTorch와 같은 프레임워크를 사용하여 모델을 구현하는 경험을 쌓는 것은 딥러닝 분야에서 성공적인 여정을 시작하기 위한 첫걸음이 될 것입니다. 다음 포스트에서는 선형 회귀의 확장된 형태인 로지스틱 회귀에 대해 알아보겠습니다. 로지스틱 회귀는 이진 분류 문제를 해결하는 데 사용되며, 선형 회귀의 개념을 바탕으로 보다 실용적인 문제에 적용할 수 있는 모델입니다.

비슷한 글 추천

Comments (0)

No comments yet. Be the first to comment!