RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (117)
    • Study Note (80)
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (26)
      • Machine Learning (16)
      • Streamlit (9)
      • Django (1)
      • Deep Learning (12)
      • dbt (2)
      • SQL (3)
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/Deep Learning

AI는 어떻게 '최적의 선'을 찾을까? (선형회귀와 경사하강법)

2025. 12. 30. 16:03

지난 시간에 우리는 딥러닝의 기본 언어인 $y=wx+b$를 배웠습니다. 오늘은 이 식을 활용해 데이터의 패턴(선형 관계)을 찾아내고, 오차를 줄여나가는 과정을 배웁니다. 이것이 바로 AI 학습의 본질입니다.

 

1. 선형 회귀 (Linear Regression): 데이터에 줄 긋기

선형 회귀란 독립 변수($x$)와 종속 변수($y$) 사이의 관계를 가장 잘 나타내는 직선(선형 모델)을 찾는 것입니다.

  • 독립 변수 ($x$): 원인이 되는 정보. (예: BMI 지수, 흡연량)
  • 종속 변수 ($y$): 결과가 되는 정보. (예: 혈압, 수명)

① 단순 선형 회귀 (Simple Linear Regression)

변수가 하나인 경우입니다.

  • 수식: $H(x) = wx + b$
  • 의료 예시: "BMI 수치($x$)가 높으면 혈압($y$)도 높을까?"

② 다중 선형 회귀 (Multiple Linear Regression)

현실 세계는 복잡하죠. 변수가 여러 개인 경우입니다.

  • 수식: $H(x) = w_{1}x_{1} + w_{2}x_{2} + ... + w_{n}x_{n} + b$ 5
  • 의료 예시: "BMI($x_1$), 나이($x_2$), 음주량($x_3$)이 혈압($y$)에 복합적으로 영향을 미친다."

 

2. 오차 측정하기: 비용 함수 (Cost Function)

우리가 그은 선($\hat{y}$)이 실제 데이터($y$)와 얼마나 차이가 나는지 계산해야 합니다.

이 차이를 잔차(Residual)라고 하며, 이를 계산하는 함수를 비용 함수(Cost Function) 또는 손실 함수(Loss Function)라고 합니다.

우리의 목표는 비용 함수 $cost(w, b)$의 값을 최소화하는 $w$와 $b$를 찾는 것입니다.

 

대표적인 오차 계산법

  1. MAE (Mean Absolute Error): 오차의 절대값 평균. 직관적입니다.
    • 왜 제곱을 할까요? 오차를 양수로 만들고, 큰 오차에 더 큰 페널티를 주기 위해서입니다. 또한 미분 계산이 용이해서 회귀 문제에서 가장 많이 쓰입니다.
  2. MSE (Mean Squared Error): 오차를 제곱해서 평균을 냅니다.
  3. RMSE (Root MSE): MSE에 루트를 씌워 실제 값과 단위를 맞춰줍니다.

3. 최적의 해답 찾기: 경사하강법 (Gradient Descent)

비용 함수(오차)를 그래프로 그리면, 아래로 볼록한 밥그릇 모양(2차 함수)이 됩니다12. 이 그릇의 가장 낮은 바닥(최소 오차 지점)을 찾아가야 합니다.

변수가 많아지면 수학 공식(최소제곱법)만으로는 풀기 어렵기 때문에 경사하강법을 사용합니다.

경사하강법의 원리

  1. 현재 위치에서 기울기(미분) 구하기: 내가 지금 오르막에 있는지 내리막에 있는지 확인합니다.
  2. 반대 방향으로 이동: 기울기가 양수(+)면 $w$를 줄이고, 음수(-)면 $w$를 늘립니다.
  3. 학습률 (Learning Rate, $\alpha$) 만큼 이동: 보폭을 결정합니다.
$$w := w - \alpha \frac{\partial}{\partial w}cost(w,b)$$

 

(새로운 $w$는 현재 $w$에서 '기울기 $\times$ 학습률'을 뺀 값이다)

 

학습률(Learning Rate)의 중요성

  • 너무 크면: 최소 지점을 지나쳐서 핑퐁처럼 튕겨 나가거나 발산합니다 (Overshooting).
  • 너무 작으면: 바닥까지 내려가는 데 100만 년이 걸립니다.

4. 내 눈으로 확인하는 선형 회귀

이론만으로는 와닿지 않죠?

"BMI와 혈당 수치" 가상 데이터를 만들고, 직접 $w$(기울기)와 $b$(절편)를 조절하며 오차(MSE)가 어떻게 변하는지 확인해보는 시뮬레이터를 만들었습니다.

import streamlit as st
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

st.title("Interactive: 선형 회귀와 오차(Cost)")

# 1. 가상 의료 데이터 생성 (BMI와 혈당)
np.random.seed(42)
n_samples = 50
bmi = np.random.rand(n_samples) * 20 + 15  # BMI 15~35
# 실제 관계: 혈당 = 3 * BMI + 20 + 노이즈
glucose = 3 * bmi + 20 + np.random.randn(n_samples) * 5 

df = pd.DataFrame({'BMI': bmi, 'Glucose': glucose})

# 2. 사이드바: 사용자가 w와 b를 직접 조절 (AI가 하는 일을 흉내내기)
st.sidebar.header("파라미터 조절 (Learning)")
w = st.sidebar.slider("가중치 (w, 기울기)", 0.0, 10.0, 1.0, step=0.1)
b = st.sidebar.slider("편향 (b, 절편)", 0.0, 100.0, 0.0, step=1.0)

# 3. 예측 및 오차 계산
df['Prediction'] = w * df['BMI'] + b
df['Error'] = df['Glucose'] - df['Prediction'] # 잔차
mse = (df['Error'] ** 2).mean() # MSE 계산

# 4. 시각화
fig, ax = plt.subplots(figsize=(10, 6))

# 데이터 점 찍기
ax.scatter(df['BMI'], df['Glucose'], color='blue', label='Actual Data', alpha=0.6)

# 사용자가 만든 예측선 그리기
ax.plot(df['BMI'], df['Prediction'], color='red', linewidth=2, label=f'Model: y = {w}x + {b}')

# 잔차(오차) 시각화 - 빨간 점선
for i in range(len(df)):
    ax.plot([df['BMI'][i], df['BMI'][i]], 
            [df['Glucose'][i], df['Prediction'][i]], 
            color='gray', linestyle='--', alpha=0.5)

ax.set_xlabel("BMI")
ax.set_ylabel("Glucose Level")
ax.set_title(f"Linear Regression Simulation (MSE: {mse:.2f})")
ax.legend()
ax.grid(True, alpha=0.3)

st.pyplot(fig)

# 5. 결과 해석
st.subheader("학습 현황판")
col1, col2 = st.columns(2)
col1.metric("현재 비용(MSE)", f"{mse:.2f}")
col2.success("목표: MSE를 최소화하는 w(약 3.0)와 b(약 20.0)를 찾아보세요!")

st.markdown("""
> Tip: $w$와 $b$를 조절할 때마다 그래프의 빨간 선이 움직입니다. 
> 파란 점들과 빨간 선 사이의 회색 점선(잔차) 길이가 짧아질수록 MSE(오차)가 줄어듭니다.
""")

 

마무리

오늘 배운 경사하강법은 딥러닝 모델이 학습하는 유일한 방법입니다. 아무리 복잡한 AI라도 결국은 "비용 함수(Cost Function)라는 밥그릇의 바닥을 찾아 조금씩 이동하는 과정"일 뿐입니다.

위 코드를 실행해 보시고, 직접 손으로 슬라이더를 움직이며 "내가 경사하강법 알고리즘이 되었다"고 생각하고 오차를 줄여보세요!

 

'Study Note > Deep Learning' 카테고리의 다른 글

[PyTorch] 의료 데이터를 위한 텐서(Tensor) 완전 정복  (1) 2025.12.31
[PyTorch 기초] 의료 데이터를 텐서(Tensor)로 만드는 법  (1) 2025.12.30
딥러닝의 그릇 '텐서(Tensor)'와 도구 '파이토치'  (0) 2025.12.30
수학으로 한 방에 풀까, 조금씩 찾아갈까? (최소제곱법 vs 경사하강법)  (0) 2025.12.30
의료 데이터 분석가, 딥러닝의 기초 체력을 다지다  (0) 2025.12.30
    'Study Note/Deep Learning' 카테고리의 다른 글
    • [PyTorch 기초] 의료 데이터를 텐서(Tensor)로 만드는 법
    • 딥러닝의 그릇 '텐서(Tensor)'와 도구 '파이토치'
    • 수학으로 한 방에 풀까, 조금씩 찾아갈까? (최소제곱법 vs 경사하강법)
    • 의료 데이터 분석가, 딥러닝의 기초 체력을 다지다
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바