본문 바로가기
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

흩어진 점을 선 하나로 요약하기

선형회귀는 입력과 연속값 목표 사이 관계를 직선이나 초평면으로 그려. 1차원에선 . 네 데이터로 기울기 와 절편 를 정하는 거야.

가장 흔한 기준은 잔차 의 제곱평균 최소화.

여기서 ‘최선’은 자연법칙이 아님. 네가 고른 손실함수 안에서 최선이야. 제곱오차는 큰 잔차를 더 세게 벌주고, 오차에 확률 가정을 붙이면 가우시안 잡음 아래 최대우도추정과 이어져. 자를 바꾸면 최고점도 바뀐다.

해를 구하는 두 길

작은 선형 최소제곱은 선형대수로 직접 풀 수 있어. 실제 코드에선 역행렬을 만들기보다 lstsq나 QR·SVD 기반 해법 사용. 신경망처럼 비선형 합성이 크고 복잡한 모형은 닫힌형식 해가 없으니까 기울기 기반 최적화를 반복해.

딥러닝과 이어지는 것, 안 이어지는 것

선형층 , 손실, 최적화 골격은 딥러닝에도 이어져. 하지만 모든 마지막 층이 ‘선형회귀’는 아니야. 분류기는 logits 뒤에 softmax 해석과 교차엔트로피가 붙고, 생성모델과 구조화 예측엔 또 다른 출력분포와 목적함수가 들어가.

지도학습 손실 전부가 제곱거리 변형인 것도 아님. 절대오차, 로그우도, 순위 손실처럼 네 데이터와 목표에 맞는 자가 따로 있어.

선형회귀는 학습 루프를 투명하게 보여 주는 첫 모형. 모든 학습법의 조상이라고 떠받들 필요 없어. 모형·손실·추정의 역할을 갈라 보는 좋은 현미경이면 충분해.

Code

최소제곱 해를 직접 구하기·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 근처
경사하강법으로 같은 선 찾기·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 `mx.grad`로 기울기 구하기·python
import mlx.core as mx

# MLX는 함수 변환 mx.grad로 기울기를 구해. PyTorch의
# requires_grad나 .backward()와는 다른 방식이야.
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): 첫 두 인자에 대한 기울기
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

y = -3x + 5 + ε이고 ε가 가우시안 잡음인 점 100개를 만들어. np.linalg.lstsq와 PyTorch 경사하강법으로 기울기와 절편을 각각 추정하고 참값 (-3, 5)와 비교해.
Hint
손실이 줄지 않으면 기울기 계산과 학습률을 확인해. 0.01에서 시작하되 입력 척도와 손실 정의에 따라 알맞은 값이 달라질 수 있어.

Progress

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

댓글 0

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

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