앞서 공부한 Regression을 구현해보자.
그전에 머신러닝을 구현하기 위한 프레임워크들의 특징을 비교해보자.
먼저, 가장 쉽고 기본적인 연산에 활용되는 Numpy는 backpropagation을 해야하는 머신러닝에서 활용하기에 어려움이 존재한다. 모든 미분 식을 직접 계산하고 코드로 작성해야 하고 GPU를 사용하고 싶을 때에는 GPU로 값을 보내 연산하고 값을 다시 받을 수 없기 때문에 적합하지 않다.
그에 반해, PyTorch는 backpropagation 구현을 위해 backward()라는 함수를 한 번 호출하면 자동으로 계산해주며, 내부적으로 CUDA, cuDNN이라는 API를 통해 GPU를 사용할 수 있다는 장점이 있다. 여기서 CUDA는 NVIDIA에서 GPU를 통한 연산을 가능하게 만든 API모델이고, cuDNN은 CUDA를 이용해 딥러닝 연산을 가속해주는 라이브러리이다. 즉, PyTorch는 심층신경망을 만들 때 함수 및 기울기 계산, GPU를 이용한 연산 가속 등의 장점이 있기 때문에 딥러닝 프레임워크로 사용하기 좋다.
TensorFlow는 PyTorch처럼 모두 연산에 GPU를 사용할 수 있는 딥러닝 프레임워크이다. PyTorch는 Define by Run 방식으로 그래프를 만듦과 동시에 값이 할당되어 직관적이고 쉬운 반면, TensorFlow는 Define and Run 방식으로 연산 그래프를 미리 만들고 실제 연산할 때 값을 전달하여 결과를 얻는다. 그래프를 고정하고 값만 전달하는 TensorFlow가 더 빠를 수 있지만 실제로 실험에 많이 사용되는 모델로 벤치마킹한 결과 PyTorch가 TensorFlow보다 2.5배 빨랐다고 한다. 모델과 사용한은 함수마다 차이는 있겠지만 PyTorch가 속도 면에서 전반적으로 TensorFlow보다 빠르거나 밀리지 않는다.
그래서 우리는 PyTorch로 구현하고자 한다.
우리가 Regression의 Cost Function으로 사용했던 Mean Square Error(MSE)는 PyTorch에서 직접 작성할 수도 있지만 torch.nn 모듈을 이용하여 간단하게 나타낼 수 있다. Linear Hypothesis도 마찬가지이다. 간단한 Linear Regression 예제를 작성해보자.
import torch
import torch.optim as optim
torch.manual_seed(1)
x_train = torch.FloatTensor([[1],[2],[3]])
y_train = torch.FloatTensor([[5],[6],[7]])
W = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
optimizer = optim.SGD([W,b], lr=0.01) #stochastic gradient descent
epochs = 3000
for epoch in range(epochs):
H = x_train * W + b
cost = torch.mean((H - y_train) ** 2)
optimizer.zero_grad()
cost.backward()
optimizer.step()
if (epoch+1) % 300 == 0:
print('Epoch {:4d}/{} Cost: {:.6f}'.format(
(epoch+1), epochs, cost.item()
))
nn.Module를 이용하여 코드를 바꿔보자.
import torch
import torch.nn as nn
import torch.nn.functional as F
torch.manual_seed(1)
x_train = torch.FloatTensor([[1],[2],[3]]) # training example 3개
y_train = torch.FloatTensor([[5],[6],[7]]) # input과 output의 dimension = 1
model = nn.Linear(1,1) # input과 output의 dimension
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # stochastic gradient descent
epochs = 3000
for epoch in range(epochs):
prediction = model(x_train) # Hypothesis
cost = F.mse_loss(prediction, y_train) # Mean Square Error
optimizer.zero_grad()
cost.backward()
optimizer.step()
if (epoch+1) % 300 == 0:
print('Epoch {:4d}/{} hypothesis: {} Cost: {:.6f}'.format(
(epoch+1), epochs, prediction.squeeze().detach(), cost.item()
))
Linear Regression을 이용한 가설 모델을 세우면 model = torch.nn.Linear(input의 dimension, output의 dimension) 으로 나타낼 수 있다.
MSE를 이용한 cost function은 cost = torch.nn.functional.mse_loss(hypothesis, y_train)로 나타낼 수 있다.
Stochastic Gradient Descent은 optimizer = torch.optim.SGD(model.parameters(), lr =$\alpha$)로 나타낼 수 있다.
[출처] 한양대학교 장준혁 교수님 인공지능개론 수업
'인공지능' 카테고리의 다른 글
[인공지능개론] Neural Networks② (0) | 2024.05.08 |
---|---|
[인공지능개론] Neural Networks① (0) | 2024.05.07 |
[인공지능개론] Regression④ (0) | 2024.05.07 |
[인공지능개론] Regression③ (0) | 2024.05.06 |
[인공지능개론] Regression① (0) | 2024.05.06 |
댓글