C.W.K.
Stream
Lesson 01 of 06 · published

회귀: 데이터 통과하는 최선의 선

~10 min · regression, linear, fitting

Level 0수학 초심자
0 XP0/59 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete

원조 학습 알고리즘

점들이 흩뿌려져 있어. 그 관계를 선으로 요약하고 싶어. 선형 회귀 = 점에서 선까지 거리 제곱합 최소화하는 선 찾기. 끝. 아이디어 전체.

왜 "학습" 이라 불러? 선을 미리 모르고 — 데이터가 말하게 두니까. 선의 기울기와 절편이 데이터에서 학습된 파라미터. 모던 딥러닝 = 근본적으로 이 같은 루프의 fancy 버전: 파라메트릭 모델, 오차 함수, 오차 최소화하는 파라미터 찾기.

수학, 짧게

1-D 입력 와 타겟 , 원함. (기울기), (절편) 가 학습할 거. Loss = mean squared error:

최소화하는 찾기. 1-D 선형회귀엔 closed-form 해. 신경망엔 없음 — gradient descent 사용.

왜 중요

  • 모든 신경망의 마지막 layer = extras 있는 선형회귀.
  • 지도학습의 모든 손실 함수 = 거리-제곱 아이디어 일반화.
  • ML 에서 할 모든 "fitting" 이 같은 모양: 파라메트릭 모델 + loss + 옵티마이저.
선형 회귀 = 모든 학습 알고리즘의 seed. 이해하면 나머지 지도학습 = "차원 더, 모델 fancy, 같은 루프."

Code

Closed-form 최소자승·python
import numpy as np

# 장난감 데이터셋 — y ≈ 2x + 1 + 노이즈
np.random.seed(42)
x = np.random.uniform(0, 10, 50)
y = 2.0 * x + 1.0 + np.random.normal(0, 1, 50)

# Closed-form 선형 회귀 (최소자승)
A = np.vstack([x, np.ones_like(x)]).T   # 디자인 행렬 [x, 1]
w, b = np.linalg.lstsq(A, y, rcond=None)[0]
print(f"학습됨: y = {w:.3f} x + {b:.3f}")     # 2.0, 1.0 근처
Gradient descent flavor·python
import torch

# 같은 문제, gradient descent flavor — 딥러닝 레시피
x = torch.linspace(0, 10, 50)
y = 2.0 * x + 1.0 + torch.randn(50)

w = torch.tensor(0.0, requires_grad=True)
b = torch.tensor(0.0, requires_grad=True)

for step in range(200):
    pred = w * x + b
    loss = ((pred - y) ** 2).mean()
    loss.backward()
    with torch.no_grad():
        w -= 0.01 * w.grad
        b -= 0.01 * b.grad
        w.grad.zero_()
        b.grad.zero_()
print(f"학습됨: y = {w.item():.3f} x + {b.item():.3f}")
MLX flavor — mx.grad, requires_grad 불필요·python
import mlx.core as mx

# MLX flavor — 함수형 gradient (mx.grad). requires_grad X, .backward() X.
mx.random.seed(0)
x = mx.linspace(0, 10, 50)
y = 2.0 * x + 1.0 + mx.random.normal(shape=(50,))

def loss_fn(w, b, x, y):
    pred = w * x + b
    return ((pred - y) ** 2).mean()

# argnums=(0, 1) — 첫 두 인자에 대한 gradient
grad_fn = mx.grad(loss_fn, argnums=(0, 1))

w, b = mx.array(0.0), mx.array(0.0)
for step in range(200):
    gw, gb = grad_fn(w, b, x, y)
    w = w - 0.01 * gw
    b = b - 0.01 * gb
print(f"학습됨: y = {w.item():.3f} x + {b.item():.3f}")

External links

Exercise

100개 (x, y) 점 생성, y = -3x + 5 + 가우시안 노이즈. np.linalg.lstsq 또는 PyTorch gradient descent 로 기울기/절편 복원. 진짜 값 (-3, 5) 와 비교.
Hint
Loss 안 떨어지면 학습률 너무 높음 (oscillation) 또는 너무 낮음 (crawl). 0.01 에서 시작.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.