학습데이터를 한번에 신경망에 통과시키면 모든 학습 데이터를 사용해 파라미터를 업데이트하면 리소스 사용에 있어 비효율적이고 학습 시간이 오래 걸린다. 메모리가 부족해진다.
+---------------------------+
| 전체 데이터셋(100%) |
+---------------------------+
| 모델 학습 |
+---------------------------+
따라서 전체 데이터셋을 여러 작은 그룹으로 나누어 Mini-batch 방법을 사용하는 것이 딥러닝 학습에 있어 일반적이며, 이때 batch size는 하나의 소그룹에 속하는 데이터 수를 의미한다.
+---------------------------+
| 데이터셋(100%) |
| +-----------+-----------+|
| | 미니배치1 | 미니배치2 | ... |
| +-----------+-----------+|
| 모델 학습 |
+---------------------------+
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
# 가상의 데이터 생성
X = torch.randn(1000, 20) # 1000개의 샘플, 각 샘플은 20개의 특성
y = torch.randint(0, 2, (1000,)) # 1000개의 타겟 레이블 (0 또는 1)
# 데이터셋과 데이터로더 생성
dataset = TensorDataset(X, y)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
# 간단한 신경망 모델 정의
model = nn.Sequential(
nn.Linear(20, 50), # 선형레이어
nn.ReLU(), # ReLU활성화함수 레이어
nn.Linear(50, 1), # 선형레이어
nn.Sigmoid() # Sigmoid활성화함수 레이어
)
# 손실 함수와 옵티마이저 설정
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 학습 루프
num_epochs = 10
for epoch in range(num_epochs):
for batch_X, batch_y in dataloader:
optimizer.zero_grad()
outputs = model(batch_X)
loss = criterion(outputs.squeeze(), batch_y.float())
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
전체 데이터셋이 모델을 한 번 완전히 통과한 것을 의미한다. epoch를 늘려 모델이 데이터셋을 여러 번 학습할 수 있도록 하는 것이 일반적이다.
너무 많은 에포크를 사용하면 모델이 overfitting될 수 있으며, 실험을 통해 적절한 에포크 수를 설정하여 모델의 학습을 조절한다.
+---------------------------+
| 에포크 1 |
| +-----------------------+|
| | 데이터셋(100%) |
| +-----------------------+|
| |
| 에포크 2 |
| +-----------------------+|
| | 데이터셋(100%) |
| +-----------------------+|
| |
| ... |
| |
| 에포크 N |
| +-----------------------+|
| | 데이터셋(100%) |
| +-----------------------+|
+---------------------------+
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
# 가상의 데이터 생성
X = np.random.randn(1000, 20) # 1000개의 샘플, 각 샘플은 20개의 특성
y = np.random.randint(0, 2, 1000) # 1000개의 타겟 레이블 (0 또는 1)
# 간단한 신경망 모델 정의
model = Sequential([
Dense(50, activation='relu', input_shape=(20,)),
Dense(1, activation='sigmoid')
])
# 컴파일
model.compile(optimizer=Adam(learning_rate=0.001), loss='binary_crossentropy', metrics=['accuracy'])
# 학습 (에포크 기반)
num_epochs = 10
model.fit(X, y, epochs=num_epochs, batch_size=32)