경사하강법의 변형

기존 경사하강법의 문제점

  • 기존의 경사하강법(배치 경사하강법)은 전체 데이터셋을 사용하여 손실 값을 계산하기 때문에, 데이터셋이 클 경우 메모리 부족이나 비효율적인 계산이 발생할 수 있음
  • 이러한 문제를 해결하기 위해 전체 데이터셋을 모델에 통과시키는 대신에 랜덤 샘플링한 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)

 

미니배치 크기

  • 미니배치의 크기가 작을수록 파라미터 업데이트 횟수가 늘어남
  • 너무 작을 경우 전체 데이터셋과의 편차로 인해 학습이 불안정(편향)해질 수 있고
  • 너무 크게 설정하면 메모리 부족 문제가 발생할 수 있음