본문 바로가기
두두 IT/딥러닝

03. 선형회귀 pytorch_linear_regression

by DoDo's 2026. 5. 26.
반응형

"컴퓨터에게 데이터(X, y)를 주고 오차가 최소가 되는 완벽한 가중치($W$)와 편향($b$)의 값을 찾아내게 만드는 것"입니다.

 

A. 큰 그림: 도대체 선형 회귀를 '왜' 하는 건가요?

결론부터 말씀드리면, "과거의 데이터를 보고 미래를 예측하는 마법의 공식(규칙)을 찾기 위해서"입니다.

우리가 현실에서 이런 질문을 던진다고 해볼게요.

  • "내가 하루에 4시간 공부하면, 이번 시험에서 몇 점을 받을까?"
  • "우리 동네 평수가 30평이면, 집값이 대충 얼마일까?"

이걸 맞히려면 과거의 데이터(족보)가 필요합니다.

  • 1시간 공부한 A는 20점
  • 2시간 공부한 B는 40점
  • 3시간 공부한 C는 60점...

사람이라면 이 데이터를 보고 "아! (공부 시간) $\times$ 20을 하면 점수가 나오는구나!" 하고 단번에 규칙을 깨닫습니다. 여기서 $\times 20$이라는 규칙을 찾는 것, 이게 바로 선형 회귀의 전부입니다!

이걸 컴퓨터의 언어(수학)로 폼나게 쓴 것이 바로 $y = W \cdot X + b$ 입니다.

  • $X$: 원인 (공부 4시간)
  • $y$: 결과 (예측 점수 80점)
  • $W$ (Weight, 가중치): 원인이 결과에 미치는 영향력 (위 예시에서는 20)
  • $b$ (Bias, 편향): 기본 점수 (공부를 0시간 해도 찍어서 맞히는 기본 점수)

즉, 선형 회귀란 데이터를 가장 잘 설명하는 완벽한 $W$$b$를 컴퓨터가 노가다를 통해 찾아내는 과정입니다.

B. 코드는 어떻게 분석하나요? (컴퓨터의 노가다 과정)

컴퓨터는 사람처럼 한 번에 "아 곱하기 20이네!" 하고 깨닫지 못합니다. 완전 바보라서 일단 '아무 숫자나 찍고 보는 5단계'를 거칩니다. 이 흐름만 이해하면 파이토치 코드가 동화책처럼 읽힙니다.

  • 1단계 (일단 찍어! / 추론): 컴퓨터가 $W$를 100, $b$를 5라고 대충 찍습니다. "1시간 공부하면 105점이겠네!" (pred = model(inputs))
  • 2단계 (얼마나 틀렸지? / Loss 계산): 정답(20점)과 비교해 봅니다. "헐, 85점이나 틀렸네..." 이 틀린 정도를 오차(MSE Loss)라고 합니다. (loss = loss_fn(pred, target))
  • 3단계 (어느 쪽으로 고칠까? / 미분 Backward): 컴퓨터가 수학(미분)을 써서 반성합니다. "아, $W$를 100에서 좀 많이 줄여야 오차가 줄어들겠구나!" (loss.backward())
  • 4단계 (수정하자! / Optimizer Step): 미분한 결과를 바탕으로 $W$를 100에서 90으로 깎습니다. (optimizer.step())
  • 5단계 (기억 지우기 / Zero Grad): 다음 반성을 위해 이번 미분 계산을 머릿속에서 지웁니다. (optimizer.zero_grad())

코드를 보면 이 5단계가 for epoch in range(1000): 이라는 반복문 안에 갇혀 있습니다. 컴퓨터에게 이 반성 과정을 수천 번 반복시켜서 완벽한 $W$(20)와 $b$(0)를 찾아내는 것이 바로 그 길고 복잡했던 코드의 정체입니다.

백문이 불여일견이죠! 우리가 수식과 코드로 짰던 "컴퓨터가 완벽한 $W$$b$를 찾아가는 과정"을 직접 눈으로 보고 손으로 만져볼 수 있게 시뮬레이터를 만들어 드렸습니다.

슬라이더를 직접 움직여서 선을 데이터(점)에 맞춰보시고, 오차(MSE)가 어떻게 변하는지 확인해 보세요. 그리고 '최적화 시작' 버튼을 누르면, 여러분이 짰던 5단계 코드(경사하강법)가 작동하며 선이 스스로 정답을 찾아가는 마법을 볼 수 있습니다.

 


1. 선형 회귀의 핵심 방정식 (Matrix Multiplication)

선형 회귀는 입력값($X$)에 가중치($W$)를 곱하고 편향($b$)을 더해 예측값($\hat{y}$)을 구합니다. 데이터의 개수와 특성(Feature)이 많아지면 이를 행렬 곱셈(@, matmul)으로 한 번에 계산합니다.

🍎 사과·오렌지 수확량 예측 행렬식 해부

주신 코드의 농업 가상 데이터 행렬식은 컴퓨터 내부에서 다음과 같이 차원(Shape)을 맞추며 계산됩니다.

$$\hat{y} = X \cdot W + b$$
  • $X$ (입력 데이터 행렬): shape: (5, 3) ➔ [5개의 데이터(날짜/지역), 3개의 특성(온도, 강수량, 습도)]
  • $W$ (가중치 행렬): shape: (3, 2) ➔ [3개의 특성 개수, 2개의 정답 개수(사과, 오렌지)]
  • $b$ (편향 행렬): shape: (2, ) ➔ 브로드캐스팅에 의해 각 행마다 [b1, b2]가 더해집니다.
  • $\hat{y}$ (예측 결과 행렬): 행렬 곱셈 결과 (5, 3) @ (3, 2) = (5, 2) 가 되어 5개 데이터에 대한 사과, 오렌지 예측값이 한 번에 튀어나옵니다.

2. 손실 함수: MSE(Mean Squared Error)

예측값($\hat{y}$)이 나왔다면 진짜 정답($y$)과 얼마나 차이가 나는지 '벌점'을 매겨야 합니다. 회귀 문제에서는 주로 평균 제곱 오차(MSE)를 사용합니다.

$$MSE = \frac{1}{n} \sum_{i=1}^{n} (\hat{y}_i - y_i)^2$$
  • 왜 제곱을 할까요? 오차가 음수든 양수든 상관없이 오직 '거리'만 보기 위함이고, 오차가 클수록 더 큰 벌점(제곱)을 부여하여 모델이 정신을 바짝 차리게 만들기 위해서입니다.
  • 목표: 이 MSE 손실(Loss) 값이 0에 가깝게 만드는 $W$$b$를 찾는 것이 딥러닝의 궁극적인 목표입니다.

3. 딥러닝 무한 루프 (Training Loop) 5단계

모델이 학습하는 과정은 전 세계 모든 딥러닝 모델(ChatGPT 포함)이 완벽하게 동일한 5단계 루프를 돕니다. 코드가 실행되는 순서대로 머릿속에 기억해 두세요.

Python
 
for epoch in range(epochs):

1단계: 추론 (Forward Pass)

  • 코드: pred = model(inputs) (또는 직접 선형 식 계산)
  • 의미: 현재 가지고 있는 가중치($W$)와 편향($b$)으로 시험 문제를 풀어 예측값(pred)을 구합니다. 처음에는 무작위 값이라 엉터리 점수가 나옵니다.

2단계: 오차 계산 (Loss Calculation)

  • 코드: loss = loss_fn(pred, targets)
  • 의미: 채점을 합니다. 내 예측값과 실제 정답이 얼마나 다른지 MSE 공식으로 벌점 점수(loss)를 계산합니다.

3단계: 오차 역전파 (Backward Pass - 미분)

  • 코드: loss.backward()
  • 의미: 벌점 점수를 바탕으로 미분을 수행합니다. "가중치($W$)와 편향($b$)을 각각 어느 방향으로 얼만큼 수정해야 벌점(loss)이 줄어들지" 계산하여 각각의 .grad 방에 저장합니다.

4단계: 가중치 업데이트 (Optimization - 경사하강법)

  • 코드: optimizer.step() (직접 구현 시 weight.data = weight.data - lr * weight.grad)
  • 의미: 계산된 미분값(.grad)과 학습률(lr)을 곱해 기존 가중치와 편향을 조금 더 똑똑한 방향으로 한 걸음 수정합니다.

5단계: 기울기 초기화 (Zero Gradient)

  • 코드: optimizer.zero_grad() (직접 구현 시 weight.grad = None)
  • 의미: 파이토치는 미분값을 계속 더해서 누적하는 성질이 있으므로, 다음 라운드(Next Epoch) 시험을 보기 전에 기존에 계산해 둔 미분 노트를 깨끗이 지웁니다.

💡 최종 요약: 직접 구현 vs PyTorch 빌트인

노트 후반부의 nn.Linear와 torch.optim을 쓰는 이유는 "우리가 손으로 가중치를 만들고 사칙연산을 직접 적던 귀찮은 과정들을 파이토치가 조립식 장난감처럼 깔끔하게 대신 해주기 때문"입니다. 내부 메커니즘은 완벽하게 일치합니다!

혹시 5단계 학습 루프 중에서 개념적으로 삐걱거리거나 매끄럽게 연결되지 않는 부분이 있다면 단 한 군데라도 좋으니 편하게 말씀해 주세요!

 


 

1부: 밑바닥부터 만드는 선형 회귀 (From Scratch)

파이토치의 편리한 도구를 쓰기 전, 수학 공식 그대로 컴퓨터에게 노가다를 시키는 과정입니다. (공부시간 $\rightarrow$ 점수 예측)

  • 파라미터 수동 정의 (requires_grad=True):모델이 찾아야 할 정답(가중치와 편향)을 처음엔 랜덤 숫자(randn)로 찍습니다. 이때 requires_grad=True를 반드시 켜주어야 파이토치가 "아, 이 변수들은 나중에 미분해서 값을 고쳐나가야 하는 애들이구나!" 하고 추적을 시작합니다.
  •  
  • Python
     
    weight = torch.randn(1, 1, requires_grad=True)
    bias = torch.randn(1, requires_grad=True)
    
  • 수동 오차 계산 (MSE): loss = torch.mean((pred - y_train)2)
  • 파이토치 도구 없이 (예측값 - 정답)을 빼고 제곱해서 평균을 직접 냅니다.
  • 수동 가중치 업데이트 (.data의 비밀):이 부분이 꽤 중요합니다. 업데이트를 할 때 그냥 weight = ... 이라고 쓰지 않고 반드시 .data를 붙입니다. 왜냐하면 미분 추적 엔진을 건드리지 않고, 알맹이(숫자 값)만 몰래 바꿔치기 하기 위해서입니다.
  • Python
     
    weight.data = weight.data - lr * weight.grad
    
  • grad 초기화: weight.grad = None
  • 업데이트가 끝나면 다음 반복을 위해 기존 미분값을 비워줍니다.

2부: 미분 엔진 끄기 (torch.no_grad())

학습(Train)이 다 끝나고 났을 때 등장하는 아주 중요한 코드입니다.

Python
 
with torch.no_grad():
    p = linear_model(X_train)
  • 이유: 학습할 때는 가중치를 고쳐야 하니 미분 엔진(requires_grad)이 팽팽하게 돌아가며 메모리를 씁니다. 하지만 이미 학습이 다 끝난 모델로 실전 테스트(추론)를 할 때는 미분을 할 필요가 없습니다.
  • 그래서 no_grad() 블록 안에서 실행하여 "이제 미분 계산 안 해도 되니까 메모리 아껴!"라고 컴퓨터에게 알려주는 것입니다.

3부: 다중 입력 & 다중 출력 (사과와 오렌지)

단순한 1차원을 넘어, 현실의 복잡한 데이터를 다루는 파트입니다.

  • 행렬 크기(Shape)의 비밀:
    • 입력 $X$: (5, 3) (5일 치 데이터, 3가지 날씨)
    • 가중치 $W$: (3, 2) (3가지 날씨가 2가지 과일에 미치는 영향)
    • 이 둘을 행렬 곱셈(@)하면 자연스럽게 (5, 2) 크기의 사과/오렌지 예측값이 나옵니다.
  • 딥러닝 필수 용어 정리 (교안 내용 발췌):
    • Node (Unit, Neuron): 날씨 데이터가 가중치와 곱해져서 나온 '개별 예측 결과(연산의 최소 단위)' 하나하나를 신경망 세포에 빗대어 뉴런 또는 노드라고 부릅니다.
    • Layer (층): 사과를 예측하는 유닛과 오렌지를 예측하는 유닛들을 하나로 길게 묶어놓은 덩어리를 '레이어'라고 부릅니다. (딥러닝은 이 레이어가 수십~수백 개 겹쳐 있는 것입니다.)

4부: 파이토치 빌트인(Built-in) 도구로 진화

수동으로 하던 모든 노가다를 우아하게 한 줄로 끝내는 마법의 파트입니다.

  • nn.Linear(3, 2): 3부에서 직접 randn(3, 2)로 만들었던 $W$$b$, 그리고 requires_grad=True 세팅까지 이 한 줄이 전부 알아서 내부에 만들어 줍니다.
  • nn.MSELoss(): 수동으로 수식을 적었던 오차 계산을 대신 해주는 기계입니다.
  • torch.optim.SGD: .data를 꺼내서 학습률(lr)을 곱하고 빼주던 그 귀찮은 수동 업데이트 과정을 optimizer.step() 한 방에 처리해 주는 최적화 반장님입니다.
  • 최종 조립 (train 함수):
  • 교안의 맨 마지막 코드는 이 모든 빌트인 도구들을 모아 "추론 $\rightarrow$ 오차 계산 $\rightarrow$ 미분 $\rightarrow$ 업데이트 $\rightarrow$ 초기화" 라는 5단계 표준 루프를 찍어내는 함수로 예쁘게 포장한 최종 완성본입니다.

3부에서 등장한 Node, Neuron, Layer의 개념과 다중 입력/출력이 곱해지는 과정을 머릿속에 시각적으로 그릴 수 있도록 대화형 신경망(Neural Network) 시뮬레이터를 준비했습니다. 슬라이더로 날씨를 바꿔보며 레이어 내부에서 어떤 연산이 일어나는지 확인해 보세요!

반응형

'두두 IT > 딥러닝' 카테고리의 다른 글

04. 첫번째 딥러닝-MLP 구현  (0) 2026.05.26
02. tensor 다루기  (0) 2026.05.26
01. 딥러닝 개요 (Deep Learning Overview)  (1) 2026.05.22