이번 강의에서는 Linear Regression에 대하여 정리해보도록 하겠습니다.
모모딥 PyTorch에서는 Linear Regression에 대한
정리가 없어서 위키백과를 참고하여 정리해보도록 하겠습니다.
학습 목표
선형회귀(Linear Regression)에 대해 알아본다.
핵심 키워드
선형 회귀(Linear Regression)
평균 제곱 오차(Mean Squared Error)
경사 하강법(Gradient descent)
1. 선형 회귀(Linear Regression)
선형 회귀는 다음과 같이 직선의 방정식 형태를 띠고 있어서 선형 회귀라는 이름이 붙여졌다. 선형 회귀는 Computer Vision에서 매우 중요한 부분이기 때문에 이에 대하여 명확하게 이해할 필요가 있다.
선형 회귀의 목적은 위의 그림과 같이 데이터들을 가장 잘 나타내 주는 직선의 방정식을 찾는 것이다. 가장 이상적인 직선의 방정식을 찾기 위해 가중치(W), 편차(b)를 찾아가는 과정을 바로 최적화(Optimization)라 한다.
2. 평균 제곱 오차(Mean Squared Error)
우리가 최적화를 하기 위해서는 해당 모델이 데이터를 가장 잘 나타내 주고 있는 가 판단하는 기준이 필요하다. 이를 위해 우리는 손실 함수(Loss function)를 사용하다. Loss function은 모델이 얼마나 데이터를 잘 나타내고 있는지 판단해주는 척도이다. Linear Regression과 data 사이의 오차가 클수록 Loss function의 값은 커진다. 즉, 우리는 최적화(Optimization)를 통해 손실 함수(Loss function)를 작게 만들어줘야 한다. 이때 가장 대표적으로 사용하는 손실 함수(Loss function)가 바로 평균 제곱 오차(Mean Squared Error)이다.
3.경사 하강법(Gradient descent)
이제 경사 하강법을 통해 최적화(Optimization)를 진행해보고자 한다.
먼저 손실 함수(Loss function)가 아래와 같이 볼록한 형태라 생각해보자.
우리는 cost의 값이 가장 작은 오목한 부분을 경사 하강법을 통해 찾아가야 한다. 이를 위해 gradient(기울기)를 구해야 한다. gradient는 평균 제곱 오차를 미분하여 간단하게 구할 수 있다.
이렇게 구한 Gradient에 Learning rate를 곱하여 W 최적화하며 최상의 모델을 찾아가는 것이다. 여기서 Learning rate는 매우 중요한 Hyperparameter이다. Learning rate를 비유하여 설명하면 우리가 산을 내려갈 때 얼마만큼 발을 내디뎌야 하는 가이다. 즉 우리가 gradient를 통해 경사가 급하다는 것을 알았고 얼마만큼 경사가 완만한 곳을 갈지를 정하는 것이 Lerning rate이다.
4. Linear Regression 실습
공부 시간 | 점수 |
1 | 2 |
2 | 4 |
3 | 6 |
다음과 같은 데이터가 주어졌을 때 모델을 학습시키는 과정을 구현해보고자 한다.
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
# 데이터 준비
x_train = torch.FloatTensor([[1],[2],[3]] # x_train.size=(3,1)
y_train = torch.FloatTensor([[2],[4],[6]] # y_train.size=(3,1)
위 표의 데이터를 각각 x_train, y_train에 입력하였다.
#Weight Initialization
W = torch.zeros(1, requires_grad=True) # W를 0으로 초기화, requires_grad는 해당 변수가 학습변수임을 명시
b = torch.zeros(1, requires_grad=True) # b를 0으로 초기화
모델을 학습하기 전 학습을 통해 찾아야될 변수의 값을 초기화하였다.
# Hypothesis
hypothesis = x_train*W + b # H(x)=Wx + b
Linear Regression을 학습하는 과정이기때문에 위와 같이 가설을 설정하였습니다.
# Cost
cost= torch.mean((hypothesis-y_train)**2) # Loss function은 평균 제곱오차로 정의
손실함수는 평균제곱오차로 정의하였다.
# optimizer 설정
optimizer= torch.optim.SGD([W,b], lr=0.01) # 경사하강법을 사용, [W,b] : 학습할 tensor, learning rate=0.01
# 학습
nb_epochs = 1000
for epoch in range(nb_epochs+1):
hypothesis = x_train * W + b
cost=torch.mean((hypothesis-y_train)**2)
# cost 로 H(x) 개선
optimizer.zero_grad() #gradient 초기화
cost.backward() # gradient 계산
opimizer.step() # 모델 개선
#100번마다 로그 출력
if epoch % 100 == 0:
print('Epoch {:4d}/{} W: {:.3f}, b: {:.3f} Cost: {:.6f}'.format(
epoch, nb_epochs, W.item(), b.item(), cost.item()
))
총 1000회 학습을 진행시켰고 학습결과는 아래와 같다.
결과를 통해 볼 수 있듯이 학습을 진행할 수록 우리가 예상했던대로 W는 1에 가까워져 가고 Cost는 0에 가까워져가고 있음을 알 수 있다.
5. nn.Module
실제로는 위에와 같이 수식을 사용하는 대신 PyTorch에서 제공해주는 nn.Module을 더 많이 사용한다고 합니다. 같은 실습을 nn.Module로 진행해보도록 하겠습니다. wikidocs를 참고하여 작성하였습니다!!
# 데이터 준비
x_train = torch.FloatTensor([[1],[2],[3]] # x_train.size=(3,1)
y_train = torch.FloatTensor([[2],[4],[6]] # y_train.size=(3,1)
먼저 동일하게 데이터를 준비합니다.
# LinearRegression Model 정의
class LinearRegressionModel(nn.Model):
def __init__(self):
super().__init__()
self.linear=nn.Linear(1,1) # 단순 선형 회귀이기 때문에input_dim=1, output_dim=1
def forward(self,x): # 어떻게 입력값에서 출력값을 계산하는지 알려준다.
return self.linear(x)
moel = LinearRegressionModel()
model = nn.Linear(1,1)
nn.Linear에서는 input_dim과 output_dim이 인자로 주어집니다. 이번 실습에서는 하나의 x에 하나의 y값이 출력되므로 1, 1 을 입력하면 됩니다. 여기서는 class 함수를 사용하여 구체적으로 정의하였는데 그냥 단순하게 아래와 같이 정의해도 되는 것 같아요! 결론적으로는 같은 의미지만요!
# Hypothesis
prediction=model(x_train)
다음과 같이 가설을 설정하였습니다. linear regression에 x_train을 입력하였다고 생각하면 돼용!
# 평균 제곱 오차
cost = F.mse_loss(hypothesis, y_train) # F.mse_loss를 사용하여 평균 제곱 오차 계산하기
아까는 수식으로 계산했던게 PyTorch에서는 이미 함수로 제공하고 있어요!
# Optimizer 설정
optimizer = optim.SGD(model.parameters(), lr=0.01) # model.parameters() : [W,b]
# 학습
nb_epochs = 1000
for epoch in range(nb_epochs + 1):
# H(x) 계산
prediction = model(x_train)
# cost 계산
cost = F.mse_loss(prediction, y_train)
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
# 100번마다 로그 출력
if epoch % 100 == 0:
params = list(model.parameters())
W = params[0].item()
b = params[1].item()
print('Epoch {:4d}/{} W: {:.3f}, b: {:.3f} Cost: {:.6f}'.format(
epoch, nb_epochs, W, b, cost.item()
))
이렇게 nn.Model에서 제공하는 다양한 함수를 통해 수식을 사용하지 않고 더 빠르게 학습을 진행할 수 있습니다~~^_^
이번 강의를 통해 우리는 Linear Regression 에 대해 배우고 이에 대한 실습을 진행해보았다.
우리는 지금까지 하나의 정보로부터 추측하는 모델에 대하여 배웠습니다.
하지만 현실에서는 여러가지의 수많은 정보를 추합하여 결론을 추측하는 모델이 필요할 것입니다.
따라서 다음 강의에서는 여러가지 정보를 추합하여 어떻게 결론을 추측하는지에 대하여 배우도록 하겠습니다.
완강하는 그 날까지 화이팅!!!!!!!
'모두를 위한 딥런닝 by PyTorch' 카테고리의 다른 글
Lab-06 Softmax Classification (0) | 2021.08.14 |
---|---|
Lab-05 Logistic Regression (0) | 2021.08.12 |
Lab-04-2 Minibatch Gradient Descent (0) | 2021.08.09 |
Lab-04-1 Multivariable Linear regression (0) | 2021.08.08 |
Lab-01 Tensor Manipulation (0) | 2021.08.07 |