[PyTorch] Linear Regression 실습 : 모두를 위한 딥러닝 시즌2

2024. 8. 30. 22:26Artificial Intelligence/모두를 위한 딥러닝 (PyTorch)

Linear regression 이론 요약

 Cost의 정의 및 함수식에서 각 변수가 의미하는바, 일반 합 대신 제곱 합의 평균을 사용하는 이유가 중요하다. Cost는 평균 잔차 제곱(Mean Squared Error, MSE)으로도 불린다.

Linear regression 구현 코드

 입력은 x_train 변수에, 출력은 y_train 변수에 저장한다. Weight와 Bias를 모두 0으로 초기화함으로써, 항상 출력 0을 예측한다. requires_grad를 True로 설정하여, 학습하도록 명시한다. torch.mean을 사용하여 MSE를 간편하게 계산할 수 있다.

 

 Gradient descent는 다음과 같이 구현한다. torch.optim 라이브러리를 사용하여, [W, b] 텐서를 학습한다. lr은 Learning rate를 의미한다. 학습률은 파라미터를 업데이트할 때 기울기에 곱해지는 스칼라값으로, 업데이트되는 크기를 조절한다. 이어서 아래의 주요 3단계를 진행한다.

1. zero_grad로 gradient를 초기화
2. backward로 gradient 계산
3. step으로 개선

 

아래 코드는 Linear Regression을 통해, 주어진 데이터로 최선의 예측을 하도록 학습한다.

 

라이브러리 import

import torch
import torch.optim as optim
import time

 

Linear Regression & Gradient Descent

# Data definition
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[2], [4], [6]])

# Initialize Weight and bias
W = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)

# Optimizer definition
optimizer = optim.SGD([W, b], lr=0.01)  # Stochastic gradient descent
nb_epochs = 1000

start_time = time.time()

for epoch in range(1, nb_epochs + 1):
    hypothesis = x_train * W + b  # Hypothesis
    cost = torch.mean((hypothesis - y_train) ** 2)  # Compute loss

    # Gradient Descent
    optimizer.zero_grad()  # Initialize gradient
    cost.backward()  # Calculate gradient
    optimizer.step()  # Update parameters

    print(f'Epoch {epoch}, Loss: {cost}, W: {W.item()}, b: {b.item()}')
    
end_time = time.time()
print(f"Elapsed time: {end_time - start_time} seconds")

실행 결과 분석

 강의에는 계산한 값을 체크하는 코드가 없길래 직접 Epoch, Loss, Weight, Bias 값을 출력하는 코드를 추가했다. 입력했던 x_train과 y_train 데이터로 대강 직선을 그린다면 y = 2x가 나올 텐데, 옵티마이저도 잘 학습하여 y=2x에 가깝게 최적화되었다. 반복문이 실행되는 동안 값을 찍어보니, Epoch 숫자가 적을 때는 Loss가 크고, Weight와 Bias도 y=2x와는 조금 차이가 있다. Epoch = 1,000일 때를 보면 Loss가 약 0.0006 수준으로 줄었고, Weight는 약 1.97로 2에 가까워졌으며 Bias도 약 0.066으로 조금 줄었다.

학습 초반의 Loss, Weight, Bias
학습 후반의 Loss, Weight, Bias

느낀 점

  • 여러 단계의 분석 파이프라인 중 한 단계가 아닌, Linear regression과 Gradient descent만을 중점적으로 분석하니까 각 코드의 의미에 대해 남는 게 더 많다.
  • x, y 훈련 데이터가 매우 간단하고 반복할 코드가 많지 않다 보니, 학습 시간이 0.4~0.5초쯤으로 짧았다. 그리고 데이터가 아주 적었는데도 y=2x에 가깝게 최적화가 돼서 신기했다. 
  • 처음에 W와 b 변수를 그대로 출력했다가 텐서 형태로 나왔다. item 함수를 추가하여 기본 데이터 타입으로 변경할 수 있음을 알게 되었다.

 

*참고 자료

모두를 위한 딥러닝 시즌2 - [PyTorch] Lab-02 Linear regression

https://youtu.be/kyjBMuNM1DI?feature=shared