Momentum (Optimization)
모멘텀 최적화는 과거의 그래디언트를 활용해 모델 학습을 가속하고, 노이즈가 있는 업데이트를 완화하며, 학습률과의 균형을 유지하면서 수렴을 개선합니다.
모멘텀은 그래디언트 기반 학습에 이전 업데이트의 정보를 반영하는 최적화 기법입니다. 현재 그래디언트와 이전 그래디언트의 감쇠 이력을 결합해 일관된 방향으로의 이동 속도를 높이고 앞뒤로 반복되는 움직임을 줄입니다. 이를 통해 머신 러닝 모델은 학습 목적 함수를 더 효율적으로 최소화할 수 있습니다. 검색 엔진 최적화는 웹사이트 노출과 관련이 있지만, 모멘텀은 모델 파라미터의 수치 업데이트와 관련이 있습니다.
모멘텀의 작동 방식#
경사 하강법에서 모델은 가중치를 그래디언트의 반대 방향으로 이동시킵니다. 그래디언트는 손실 함수가 가장 빠르게 증가하는 방향입니다. Polyak 모멘텀 또는 헤비볼 방법이라고도 하는 고전적 모멘텀은 이 움직임에 관성을 더합니다. Boris Polyak은 반복 방법 가속에 관한 1964년 연구에서 이 방법을 소개했습니다.
옵티마이저는 파라미터마다 하나씩 누적값을 보유하는 속도 버퍼를 유지합니다. 각 업데이트에서 이전 버퍼에 모멘텀 계수를 곱하고 현재 그래디언트를 더한 다음, 그 결과 버퍼에 학습률을 곱해 가중치에서 뺍니다. 신경망에서는 역전파가 그래디언트를 제공하며, 옵티마이저는 업데이트 사이에 버퍼를 유지합니다.
모멘텀은 손실 표면이 길게 늘어난 경우 특히 유용합니다. 이러한 표면에서는 골짜기를 가로지르는 방향의 곡률은 가파르고, 골짜기 바닥을 따라가는 방향의 곡률은 완만합니다. 골짜기를 따라 반복해서 향하는 그래디언트는 누적되는 반면, 골짜기를 가로지르는 방향에서 번갈아 나타나는 성분은 서로 일부 상쇄됩니다. 확률적 경사 하강법에서는 이러한 기억 기능이 미니배치 간 변동도 완화합니다. 모멘텀의 이차 손실 동역학을 살펴보면 모멘텀이 가속을 제공하는 동시에 최소점 근처에서 진동을 유발할 수 있는 이유를 알 수 있습니다.
모멘텀, 학습률 및 관련 방법#
일반적으로 베타 또는 뮤로 표기하는 모멘텀 계수는 보통 0과 1 사이의 값입니다. 값이 0이면 일반 경사 하강법과 같아지고, 값이 1에 가까울수록 이전 그래디언트를 더 오래 유지합니다. 0.9는 흔히 사용하는 시작값입니다. 정규화하지 않은 속도 버퍼에서 그래디언트가 일정하면, 계수가 0.9일 때 누적 속도는 해당 그래디언트의 10배에 가까워지고 0.99일 때는 100배에 가까워집니다. 따라서 하이퍼파라미터 튜닝에서 모멘텀과 학습률은 서로 큰 영향을 줍니다.
지나치게 공격적인 조합은 오버슈트를 일으킵니다. 업데이트가 최소점을 반복해서 넘어가면서 손실이 진동하거나 발산합니다. 이 현상은 매끄러운 이차 목적 함수에서도 발생합니다. 학습률 스케줄은 학습 중 업데이트 크기를 변경하고, 모멘텀은 방향 이력을 얼마나 유지할지 결정합니다.
서로 밀접하게 관련된 두 가지 최적화 알고리즘은 이 이력을 서로 다른 방식으로 활용합니다.
- 네스테로프 모멘텀은 유지된 속도를 이용해 얻은 미래 위치에서 그래디언트를 계산하므로, 그래디언트가 예상 이동을 보정할 수 있습니다.
- Adam은 지수 가중 그래디언트 평균과 업데이트를 파라미터별로 조정하는 제곱 그래디언트 평균을 결합합니다.
beta1은 그래디언트 기억을 제어합니다.
간단한 PyTorch 예제#
이 PyTorch 예제는 길게 늘어난 이차 목적 함수에서 시작점과 학습률을 동일하게 설정해 비교합니다. 공식 SGD 구현은 모멘텀 버퍼를 자동으로 관리합니다.
import torch
# Curvature is 50 times greater along the second coordinate.
scale = torch.tensor([1.0, 50.0])
for momentum in (0.0, 0.9):
weights = torch.tensor([5.0, 1.0], requires_grad=True)
optimizer = torch.optim.SGD([weights], lr=0.015, momentum=momentum)
for step in range(100):
optimizer.zero_grad()
loss = (scale * weights.square()).sum()
loss.backward()
optimizer.step()
final_loss = (scale * weights.square()).sum().item()
print(f"Momentum {momentum}: loss = {final_loss:.6f}")업데이트 100회 후 손실은 모멘텀이 없을 때 약 0.056531, 모멘텀이 있을 때 약 0.000216입니다. 누적된 방향 이력은 완만한 좌표를 따라가는 진행 속도를 높입니다.
컴퓨터 비전 학습에서의 활용#
모멘텀은 이미지 분류 및 객체 탐지를 위한 합성곱 신경망 학습을 지원합니다. Ultralytics YOLO 학습에서는 optimizer="SGD"를 선택하면 네스테로프 모멘텀이 활성화되고, momentum 설정은 유지되는 업데이트 이력을 제어합니다. 트레이너 구현은 nesterov=True을 사용해 해당 계수를 옵티마이저에 전달합니다.
대표적인 적용 사례는 ImageNet을 위한 최초의 ResNet 학습 절차입니다. 해당 모델은 모멘텀 0.9를 적용한 SGD, 256의 배치 크기, 가중치 감쇠 0.0001, 그리고 오류가 정체되면 10분의 1로 줄이는 초기 학습률 0.1을 사용했습니다.










