기존 경사하강법의 문제점
- 기존의 경사하강법(배치 경사하강법)은 전체 데이터셋을 사용하여 손실 값을 계산하기 때문에, 데이터셋이 클 경우 메모리 부족이나 비효율적인 계산이 발생할 수 있음
- 이러한 문제를 해결하기 위해 전체 데이터셋을 모델에 통과시키는 대신에 랜덤 샘플링한 K개의 샘플로 나누어 모델에 통과시키는 방법을 사용
확률적 경사하강법(SGD)
- SGD는 데이터셋의 샘플을 하나씩 사용하여 기울기를 계산하고 파라미터를 업데이트
- 각 샘플을 순차적으로 처리하며, 기울기의 변동성이 크지만 계산 비용이 적고 빠르게 수렴
- 비복원 추출을 통해 각 Epoch마다 다른 샘플을 선택
Pytorch에서의 구현
# batch_size=1, shuffle=True
train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=1, shuffle=True)
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
미니배치 경사 하강법
- 전체 데이터셋을 작은 배치(미니배치)로 나누어 기울기를 계산하고 가중치를 업데이트하는 방법
- 배치 경사 하강법보다 계산 비용이 적고, SGD보다 안정적
- 일반적으로 확률적 경사하강법을 사용할 때는 미니배치 경사하강법을 적용
Pytorch에서의 구현
# batch_size=[64, 128, 256], shuffle=True
train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
Epoch와 Iteration
- Epoch: 전체 데이터셋의 샘플들이 전부 한번 모델을 통과하는 과정
- Iteration: 한 개의 미니배치를 모델에 통과시키고 파라미터를 업데이트 하는 과정
- Total Iterations = Epochs × (Total Samples / Batch Size)
미니배치 크기
- 미니배치의 크기가 작을수록 파라미터 업데이트 횟수가 늘어남
- 너무 작을 경우 전체 데이터셋과의 편차로 인해 학습이 불안정(편향)해질 수 있고
- 너무 크게 설정하면 메모리 부족 문제가 발생할 수 있음