주제: DT-5 Gradient Accumulation (Effective Batch Size 증가)

분류: foundations

타입: concept

난이도: 중급

선수지식: 있음 — SGD, batch 학습, 역전파

문제 설정

딥러닝 학습에서는 큰 batch size가 더 안정적인 gradient를 제공하는 경우가 많습니다.

하지만 GPU 메모리 제한 때문에 큰 batch를 한 번에 처리할 수 없는 경우가 많습니다.

이 문제를 해결하기 위해 사용하는 방법이 Gradient Accumulation입니다.

직관 비유

여러 mini-batch의 gradient를 누적한 뒤 한 번에 업데이트합니다.

1. 일반적인 SGD 업데이트

일반적인 학습 과정:

for batch in data:
    loss = model(batch)
    loss.backward()
    optimizer.step()

수식:

w <- w - eta ∇L_batch

기호 의미

주의점

batch가 작으면 gradient noise가 커질 수 있습니다.

2. Gradient Accumulation

Gradient accumulation은 여러 mini-batch의 gradient를 누적합니다.

for i, batch in enumerate(data):
    loss = model(batch)
    loss.backward()

    if (i+1) % k == 0:
        optimizer.step()
        optimizer.zero_grad()

즉 k개의 mini-batch gradient를 합칩니다.

수식

g=ΣLi

업데이트:

w <- w - eta g

기호 의미

3. Effective Batch Size

Gradient accumulation을 사용하면 실제 batch size가 증가한 것과 같은 효과를 얻습니다.

Beff=Bxk

기호 의미

예시

mini-batch accumulation effective batch
16 4 64
32 8 256

4. 왜 필요한가

직관 설명

여러 작은 batch를 모아 하나의 큰 batch처럼 학습합니다.

5. Gradient 평균

실제 구현에서는 gradient 평균을 사용하는 경우가 많습니다.

g=(1/k)ΣLi

이 경우 learning rate 조정이 필요 없습니다.

주의점

평균을 사용하지 않으면 learning rate scaling이 필요합니다.

6. DDP와 Gradient Accumulation

DDP에서도 gradient accumulation을 사용할 수 있습니다.

방법:

효과

통신 횟수를 줄일 수 있습니다.

7. 메모리와 계산 비용

방법 GPU 메모리 batch 효과
큰 batch 높음 높음
gradient accumulation 낮음 높음

코드-수식 연결

개념 PyTorch 코드 설명
gradient 계산 loss.backward() gradient 누적
gradient reset optimizer.zero_grad() gradient 초기화
파라미터 업데이트 optimizer.step() 누적 후 업데이트

자주 하는 오해 5개

체크리스트 (스스로 설명 가능해야 하는 질문)