KIMGONOW← 수업 목록

인공지능 기초

경사하강법을 활용한 선형 회귀 모델의 구현

데이터와 코드에서 시작해, 눈으로 경사하강법을 관찰하고 이론으로 연결합니다.

01

경사하강법 예제

y = mx 모델의 데이터와 Python 코드를 읽고, 내려받아 직접 실행해 보세요.

linear_regression.py
import pandas as pd
import numpy as np

m = np.float64(0)  # 학습할 기울기: 예측 모델은 y = mx
alpha = np.float64(0.01)  # 학습률

df = pd.read_csv('linear_regression_data.csv')
raw_data = df.sample(frac=1, random_state=42)
n = raw_data.shape[0]

X_train = raw_data.iloc[:int(n * 0.8), 0]
Y_train = raw_data.iloc[:int(n * 0.8), 1]
X_test = raw_data.iloc[int(n * 0.8):, 0]
Y_test = raw_data.iloc[int(n * 0.8):, 1]

while True:
    mse = ((m * X_train - Y_train) ** 2).mean()
    # MSE'(m): 현재 m에서 MSE 곡선의 접선 기울기
    differ_m = (2 * X_train * (m * X_train - Y_train)).mean()

    if abs(differ_m) < 0.00001:
        print(f'최적의 m값: {m} / 이때의 MSE: {mse}')
        break

    m = m - alpha * differ_m

mse_test = ((m * X_test - Y_test) ** 2).mean()
print(f'테스트 데이터의 MSE: {mse_test}')
linear_regression_data.csvCSV 다운로드 ↓
xy
00
0.250.09
0.50.24
0.750.36
10.54
1.250.67
1.50.84
1.750.92
21.11
2.251.16
2.51.39
2.751.48
31.62
3.251.87
3.51.94
3.752.13
42.21
4.252.39
4.752.64
52.79

원본 20행 전체 · 실행할 때 .py와 .csv를 같은 폴더에 두세요.

02

경사하강법 시뮬레이터

m과 학습률을 바꾸면서 예측 직선, 오차, MSE와 접선을 함께 관찰하세요.

y = mx로 예측하고, 기울기 m만 학습합니다. 전체 20개 중 고정된 훈련 데이터 16개를 사용합니다. 같은 데이터에서 m을 바꾸면 MSE 곡선 위의 위치가 이동합니다.

데이터와 예측 직선

y = mx
예측 직선실제값과의 오차

m에 따른 MSE

주황색 접선 = 미분값
현재 m현재 접선학습 1회 후 예상 위치
현재 MSE—
현재 미분값 MSE′(m)—
학습 1회 후 m—
학습 1회 후 미분값—
m_new = m − α × MSE′(m)

학습이전 m이전 미분새 m새 미분새 MSE

곡선과 접선은 현재 데이터에서 직접 계산합니다. 표는 학습 버튼을 누른 뒤의 실제 변화를 기록합니다.

03

경사하강법 관련 이론

수행평가의 네 가지 주제를 원리와 수식으로 정리합니다.

주제 1

데이터 분리의 목적

훈련 데이터는 모델의 기울기 m을 학습하는 데 사용합니다. 테스트 데이터는 학습에 쓰지 않고, 새로운 데이터에 대한 예측 성능을 마지막에 평가합니다. 예제에서는 데이터를 섞은 뒤 80%를 훈련, 20%를 테스트에 사용합니다.

학습에 사용한 데이터만으로 평가하면 모델이 외운 내용을 잘 맞히는 것도 좋은 성능으로 보일 수 있습니다. 분리의 목적은 일반화 성능을 확인하는 것입니다.

평균으로 결측치를 채우거나 표준화할 때도 훈련 데이터에서만 기준을 계산하고, 그 기준을 테스트 데이터에 적용합니다. 모델과 학습률을 여러 번 비교해 선택할 때는 검증 데이터를 따로 쓰고, 테스트 데이터는 최종 평가에 남겨 둡니다.

주제 2

성능지표(MSE) 도출 과정

예측 모델은 y = mx입니다. i번째 데이터의 입력값을 xᵢ, 실제값을 yᵢ라고 하면 예측값은 mxᵢ입니다.

  1. 한 점에서 차이의 제곱 구하기

    i번째 점의 예측값과 실제값의 차이를 제곱합니다. 제곱하면 양수와 음수의 오차가 서로 상쇄되지 않습니다.

    (예측값 − 실제값)² = (mxᵢ − yᵢ)²
  2. 1번째부터 n번째까지 모두 더하기

    각 데이터 점에서 구한 차이의 제곱을 더합니다. 시그마(Σ)는 지정한 범위의 값을 모두 더하라는 뜻입니다.

    ∑i=1n(mxi−yi)2
  3. 데이터 개수로 나누어 MSE 구하기

    제곱의 합을 데이터 점의 개수 n으로 나누면 평균 제곱 오차, MSE가 됩니다.

    MSE(m)=1n∑i=1n(mxi−yi)2

MSE는 0 이상이며, 작을수록 예측값이 실제값에 가깝습니다. m을 바꾸면 예측값과 MSE도 달라지므로 MSE(m)으로 표현합니다.

주제 3

경사하강법의 원리

MSE(m)은 m에 따라 변하는 함수입니다. MSE′(m)은 현재 m에서 MSE 곡선의 접선 기울기, 즉 미분값을 뜻합니다.

MSE′(m) = (2/n) Σᵢ₌₁ⁿ xᵢ(mxᵢ − yᵢ)
m_new = m − α × MSE′(m)

MSE′(m) > 0이면 접선이 오른쪽 위로 향하므로 m을 줄입니다. MSE′(m) < 0이면 접선이 오른쪽 아래로 향하므로 m을 늘립니다. 이렇게 미분값의 반대 방향으로 조금씩 이동하면 MSE가 줄어듭니다.

y = mx 모델의 MSE(m)은 m에 대한 이차함수입니다. x가 모두 0이 아니라면 아래로 볼록한 곡선이 되고, MSE′(m) = 0인 지점에서 최솟값을 가집니다. 적절한 학습률로 위 과정을 반복해 그 지점의 m을 찾습니다.

주제 4

학습률의 역할과 크기에 따른 변화

학습률 α는 한 번의 학습에서 이동하는 크기를 결정합니다. 같은 미분값이라도 α가 커지면 m의 변화량 |α × 미분값|이 커집니다.

너무 작은 α는 이동이 느리고 많은 반복이 필요합니다. 적절한 α는 안정적으로 최솟값에 접근합니다. 너무 큰 α는 최솟값을 지나치며 진동하거나 오차가 점점 커져 발산할 수 있습니다. α=0이면 전혀 이동하지 않습니다.

A = mean(x²)
안정적 수렴 조건: 0 < α < 1/A

이 수렴 조건은 여기의 한 변수 이차함수에 해당합니다. 데이터의 크기가 커지면 A도 커져 더 작은 학습률이 필요합니다. 시뮬레이터에서 학습률을 바꾸며 미분값과 다음 MSE를 비교해 보세요.