지난 시간에 다항 선형 회귀에 대하여 정리를 해보았고
이번에는 선형 회귀뿐만 아니라 딥러닝에서 매우 중요한
미니 배치 경사하강법(Minibatch Gradient Descent)에 대하여
정리해보도록 하겠습니다!!
학습 목표
미니배치 경사 하강법(Minibatch Gradient descent)을 배우고 Dataset & DataLoader 사용법에 대해 알아본다.
핵심 키워드
미니배치 경사 하강법(Minibatch Gradient descent)
Dataset, DataLoader
1. 미니배치 경사 하강법(Minibatch Gradient descent)
지난번에 마무리하면서 설명하였듯이 실생활에 사용될 모델을 학습하기 위해서 우리는 수십만 장의 데이터가 필요합니다. 이렇게 많은 데이터를 한 번에 학습시킨다는 것은 메모리가 감당할 수 없을 뿐만 아니라 학습 능률에도 좋지 않습니다. 따라서 우리는 아래의 그림과 같이 하나의 데이터셋을 여러 개로 나누어 학습시키는 미니 배치 경사 하강법(Minibatch Gradient descent) 아이디어를 생각해냈습니다.
우리가 지난 시간에 배웠던 경사하강법을 사용한다면 전체 데이터를 가지고 한 번에 학습을 진행하므로 최적의 값에 안정적으로 수렴할 수 있습니다. 단, 계산량이 매우 많겠죠? 하지만 미니 배치 경사 하강법을 사용하면 전체 데이터의 일부분만 가지고 수행하므로 최적의 값을 수행하는 데 있어 아래와 같이 버벅거림이 있을 수 있습니다. 하지만 훈련 속도가 매우 빠르겠죠?
미니 경사하강법을 이해하기 위해서는 먼저 간단한 용어에 대해서 이해를 해야 합니다.
epoch : 전체 데이터를 몇 번 학습시키는가? (ex. 위에 그림에서는 전체 데이터의 크기가 총 2000이기 때문에 2000개의 데이터를 모두 학습했을 때 epoch가 1 증가하는 겁니다.)
batch size : mini batch의 크기 (ex. 위에 예시에서 총 2000개의 데이터를 200개씩 잘라서 10개의 그룹으로 만들었습니다. 이때 한 개의 그룹(mini batch)의 크기인 200이 batch size가 됩니다.)
iteration : 한개의 epoch 안에서 일어나는 매개변수 W, b의 업데이트 횟수 (ex. 미니 경사 하강법을 수행하게 되면 하나의 mini batch를 학습시킬 때마다 W, b를 개선하게 됩니다. 따라서 1번의 epoch에 10번의 iteration이 발생합니다.)
2. 미니배치 경사하강법(Minibatch Gradient descent) 실습
이제 앞에서 실습했던 예제를 미니배치 경사 하강법으로 구현해보도록 하겠습니다.
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import TensorDataset # 텐서데이터셋
from torch.utils.data import DataLoader # 데이터로더
# data
x_train = torch.FloatTensor([[73, 80, 75],
[93, 88, 93],
[89, 91, 90],
[96, 98, 100],
[73, 66, 70]])
y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
먼저 동일하게 사용되는 모듈과 데이터를 준비해보았습니다.
dataset = TensorDataset(x_train, y_train) # dataset 선언
dataloader = DataLoader(dataset, batch_size=2, shuffle=True) # dataset을 2개씩 minibatch로 나눠줌
여기 처음 보는 dataset과 dataloader가 나옵니다. 하지만 이 두 개 모두 위에서 설명한 개념입니다. dataset은 내가 학습시킬 데이터들입니다. dataloader은 dataset을 여러 mini batch들로 나누기 위한 크기를 정하는 것입니다. 그럼 shuffle=True의 의미는 무엇일까요? 바로 한 번의 epoch를 수행할 때마다 mini batch들의 순서를 바꿔주겠다는 겁니다. 서플을 수행하냐? 모델이 순서를 기억할 수 있기 때문입니다. 수천번 학습을 진행하다 보면 모델이 데이터셋의 순서에 익숙해져 원활한 학습이 이루어지지 않을 수 있기 때문에 이를 방지하기 위해 서플을 진행하는 겁니다.
model = nn.Linear(3,1)
optimizer = torch.optim.SGD(model.parameters(),lr=1e-5)
nb_epochs=20
for epoch in range(nb_epochs + 1):
for batch_idx, samples in enumerate(dataloader):
x_train, y_train = samples
prediction = model(x_train)
cost = F.mse_loss(prediction, y_train)
optimizer.zero_grad()
cost.backward()
optimizer.step()
print('Epoch {:4d}/{} Batch {}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, batch_idx+1, len(dataloader),
cost.item()
))
※enumerate() : (indx, data)
총 20번의 학습을 통해 데이터를 학습시켜 보았습니다.
이렇게 mini bath는 매우 큰 데이터를 학습시키는 데 있어서 필수적인 방법입니다. 지금은 데이터의 양이 매우 적어 크게 체감할 수 없었지만 이후에 더 큰 데이터를 가지고 직접 학습시켜보고 싶네요 ㅎㅎ
자! 미니 배치 경사 하강법까지 이렇게 정리가 끝났습니다.
이제 몇 개의 강의만 더 정리하면 Chapter 1에 대한 정리가 끝나가네요.
얼른 딥러닝 알고리즘에 대해서 공부하고 싶네요 ㅎㅎ
차근차근 하나씩 정리해나가도록 하겠습니다!!!
다음 시간에는 분류에 대해서 배우도로고 하겠습니다.
조금만 더 아자아자!!!!!! 파이팅~~~!!!
'모두를 위한 딥런닝 by PyTorch' 카테고리의 다른 글
Lab-06 Softmax Classification (0) | 2021.08.14 |
---|---|
Lab-05 Logistic Regression (0) | 2021.08.12 |
Lab-04-1 Multivariable Linear regression (0) | 2021.08.08 |
Lab-02,03 Linear Regression (0) | 2021.08.07 |
Lab-01 Tensor Manipulation (0) | 2021.08.07 |