콘텐츠로 이동

P5-7.6 보충학습: 학습률 조절 전략

Section ID: P5-7.6 Version: v2026.07.23

P5-7.2에서는 learning rate를 한 번의 update 보폭으로 읽었습니다. 하지만 실제 학습 설정을 보다 보면 learning rate가 처음부터 끝까지 고정되지 않고, warmup, decay, cosine schedule 같은 이름으로 계속 바뀌는 장면을 만납니다.

여기서 독자가 바로 붙잡아야 할 질문은 새 optimizer가 또 나온 것인가가 아니라, 같은 optimizer를 쓰더라도 왜 보폭 운영 정책을 시간에 따라 다르게 두는가입니다. 이 관점은 뒤에서 학습 로그, fine-tuning 설정, 논문 실험표를 읽을 때도 optimizer 선택보폭 운영 정책을 분리해 보는 기준이 됩니다.

learning rate schedule이 필요한 질문

  • 고정 learning rate와 시간에 따라 바뀌는 learning rate를 왜 구분하는가?
  • warmup은 왜 초반에 보폭을 천천히 키우는 장치로 읽어야 하는가?
  • decay는 왜 후반 보폭을 줄이는 장치로 읽어야 하는가?
  • scheduler 계열을 수학식 암기가 아니라 보폭 운영 패턴으로 구분할 수 있는가?

이 절에서는 scheduler의 구현 API보다 학습 초반, 학습 중반, 학습 후반에 보폭을 어떻게 운영할 것인가를 설명하는 데 집중합니다.

warmup과 decay의 판단 기준

  • learning rate scheduler를 보폭 운영 정책으로 설명할 수 있습니다.
  • warmup과 decay가 각각 어느 학습 구간 문제를 완화하려는지 말할 수 있습니다.
  • step decay, linear decay, cosine decay를 큰 차원에서 구분할 수 있습니다.
  • 학습 로그를 읽을 때 scheduler 질문을 언제 먼저 꺼내야 하는지 설명할 수 있습니다.

왜 고정 learning rate만으로 설명이 끝나지 않는가

고정 learning rate는 P5-7.2의 입문 설명에는 아주 적절합니다. 하지만 실제 학습은 모든 구간에서 같은 보폭이 좋은 경우만 있는 것은 아닙니다.

  • 학습 초반에는 파라미터가 아직 거칠게 흔들릴 수 있습니다.
  • 중반에는 빠르게 전진하는 보폭이 유리할 수 있습니다.
  • 후반에는 작은 차이를 미세하게 다듬는 보폭이 더 낫기도 합니다.

그래서 scheduler는 optimizer를 바꾸는 장치라기보다, 같은 optimizer가 학습 시간축 위에서 어떤 보폭 정책으로 움직일지 정하는 장치라고 읽는 편이 안전합니다.

이 문장을 더 직접적으로 풀면 다음과 같습니다. optimizer는 어떻게 움직일까를 정하고, scheduler는 언제 크게 움직이고 언제 작게 움직일까를 정합니다. 둘은 같은 층위가 아닙니다. optimizer를 바꾸지 않아도 scheduler를 바꿀 수 있고, 같은 scheduler를 두고 optimizer만 바꿀 수도 있습니다. 이 구분이 먼저 잡혀야 Adam을 쓴다, cosine decay를 쓴다, warmup을 넣는다가 서로 다른 종류의 선택이라는 점이 흐려지지 않습니다.

또 한 가지 중요한 점은, scheduler를 이해할 때 처음부터 복잡한 공식이 꼭 필요한 것은 아니라는 것입니다. 먼저 봐야 하는 것은 학습 시간축 위에서 보폭을 한 번 정해 두고 끝낼 것인가, 아니면 구간별로 다르게 운영할 것인가입니다. 이 질문이 선명하면, 뒤에서 어떤 라이브러리 함수 이름이 나오더라도 길을 잃지 않게 됩니다.

작은 장면으로 바꾸면 더 간단합니다. 같은 모델을 10분 동안 학습시킨다고 가정해 보겠습니다. 초반 1분은 아직 방향을 찾는 단계이고, 중간 6분은 빠르게 줄여 가는 단계이며, 마지막 3분은 이미 꽤 괜찮은 자리 근처를 다듬는 단계일 수 있습니다. 이 세 구간이 서로 다르게 느껴진다면, 학습 내내 같은 보폭만 두는 것이 정말 자연스러운가라는 질문이 바로 scheduler의 출발점입니다.

이 장면이 중요한 이유는, 초심자가 learning rate를 처음 배울 때 숫자 하나를 정한다는 감각에 머물기 쉽기 때문입니다. 하지만 scheduler가 들어오면 질문이 바뀝니다. 이제는 어떤 숫자를 고를까가 아니라 이 숫자를 학습 전체에 걸쳐 그대로 둘까를 묻게 됩니다. 이 한 단계만 넘어가도 scheduler 문서가 덜 갑작스럽게 느껴집니다.

아주 작은 수치 예시. 고정 learning rate와 schedule의 차이

예를 들어 6 step 동안 학습한다고 하고, 기본 learning rate 후보가 0.1이라고 해 보겠습니다.

step 고정 learning rate warmup + decay 예시
1 0.1 0.02
2 0.1 0.06
3 0.1 0.10
4 0.1 0.08
5 0.1 0.05
6 0.1 0.02

이 표가 보여 주는 핵심은 간단합니다. 고정 learning rate는 매 step을 같은 보폭으로 읽습니다. 반면 warmup + decay는 처음에는 조심스럽게, 중간에는 충분히, 끝에는 다시 조심스럽게 읽습니다. 초심자는 이 감각만 붙잡아도 scheduler 이름이 훨씬 덜 추상적으로 느껴집니다.

그래프로 보면 차이가 더 직접 보입니다.

고정 learning rate와 warmup plus decay의 보폭 차이

같은 손실 곡선 위에서도 보폭이 너무 작으면 거의 움직이지 않고, 적절하면 낮은 손실 쪽으로 가며, 너무 크면 지나칠 수 있습니다. scheduler는 이 보폭을 학습 시간축 전체에서 어떻게 운영할까의 문제로 넓히는 장치입니다.

warmup은 왜 필요한가

warmup은 learning rate를 처음부터 크게 두지 않고, 작은 값에서 시작해 몇 step 또는 몇 epoch 동안 천천히 올리는 방식입니다.

이 장치가 필요한 이유는 간단합니다. 학습 초반에는 파라미터가 아직 불안정하고, gradient 패턴도 거칠 수 있습니다. 이때 처음부터 큰 보폭을 주면 좋은 방향을 알기 전에 과격하게 튈 수 있습니다.

한 문장으로 줄이면 다음과 같습니다.

warmup은 학습 초반의 거친 움직임을 완화하기 위해, 보폭을 서서히 키우는 장치이다.

이 감각을 더 일상적으로 말하면, warmup은 처음부터 전속력으로 달리지 않는다에 가깝습니다. 학습 초반에는 아직 파라미터가 어디에 있는지도 거칠고, gradient가 어떤 패턴을 보일지도 안정되지 않았습니다. 이때 처음부터 큰 learning rate를 주면, 모델은 방향을 막 알아 가는 단계에서 너무 큰 걸음으로 흔들릴 수 있습니다. warmup은 이런 초반 과속을 줄여, 학습이 리듬을 잡을 시간을 주는 장치라고 보면 됩니다.

예를 들어 학습 로그를 열었더니 첫 수십 step에서 loss가 위아래로 크게 출렁이고, 그 뒤에야 조금 안정된다고 해 보겠습니다. 이때 독자는 모델 구조가 나쁜가, optimizer가 틀렸는가를 먼저 생각할 수 있습니다. 하지만 warmup 관점에서는 질문이 더 단순합니다. 지금은 아직 처음인데, 보폭이 너무 큰 것 아닌가? 이 질문이 바로 warmup을 떠올리는 가장 쉬운 출발점입니다.

아주 짧게 다시 말하면, warmup은 좋은 방향을 아직 충분히 모르는데 크게 걷지 말자에 가깝습니다. 이 한 문장이 들어오면 warmup은 낯선 장치가 아니라, 초반 과속 방지 장치처럼 읽힙니다.

decay는 왜 필요한가

decay는 학습이 진행될수록 learning rate를 줄이는 쪽의 정책입니다. 입문 단계에서는 다음 감각만 남기면 충분합니다.

  • 초반에는 더 크게 움직여도 괜찮을 수 있습니다.
  • 후반에는 이미 좋은 영역 근처까지 왔으므로, 더 작은 보폭으로 미세 조정하는 편이 낫습니다.

즉, decay는 후반 정밀 조정 모드로 넘어가는 보폭 축소라고 읽으면 됩니다.

이 부분도 한 번 더 풀어 보면, decay는 계속 크게 움직이는 것이 항상 좋은 것은 아니다라는 사실을 반영합니다. 학습 초반에는 거친 오차를 빨리 줄이는 것이 중요할 수 있지만, 후반에는 이미 꽤 괜찮은 위치 근처에 와 있을 수 있습니다. 그 상태에서도 여전히 큰 보폭으로 움직이면 목표 근처를 지나치거나 작은 진동이 오래 남을 수 있습니다. decay는 바로 이 후반 구간에서 이제는 더 조심스럽게 움직이자는 정책으로 읽는 편이 좋습니다.

이것도 작은 장면으로 보면 쉬워집니다. 초반에는 loss가 16 -> 9 -> 4처럼 빠르게 줄어드는 것이 반갑습니다. 하지만 후반에는 0.8 -> 0.6 -> 0.7 -> 0.5처럼 목표 근처에서 오르내리는 장면이 더 신경 쓰입니다. 이때는 더 빨리 가자보다 지나치지 말자가 더 중요합니다. decay는 바로 이 후반 감각에 대응하는 장치라고 읽으면 됩니다.

아주 짧게 다시 말하면, decay는 좋은 자리 근처에서는 발걸음을 줄이자에 가깝습니다. warmup이 초반 과속을 막는다면, decay는 후반 과진동을 줄이는 쪽에 서 있습니다.

scheduler 패턴은 어떻게 다르게 구분하는가

이름 먼저 읽을 감각 보폭이 바뀌는 방식
step decay 계단식으로 줄인다 일정 시점마다 한 번씩 크게 낮춘다
linear decay 직선처럼 천천히 줄인다 시간에 따라 꾸준히 감소한다
cosine decay 끝으로 갈수록 부드럽게 줄인다 완만한 곡선처럼 감소한다
warmup + decay 초반은 키우고, 후반은 줄인다 상승 구간 뒤 감소 구간이 이어진다

이 표는 어느 식이 더 우아한가를 말하는 것이 아닙니다. 독자가 이름을 봤을 때 보폭이 언제 커지고 언제 줄어드는가를 먼저 떠올리도록 돕는 표입니다.

초심자 기준에서는 이 표를 수학식 표로 보지 않는 편이 좋습니다. 이 표는 사실 학습 시간축 위에서 보폭을 어떻게 바꾸겠는가를 적은 운영 표에 가깝습니다.

보폭 운영 패턴으로 다시 묶어 읽기

학습 구간 보폭 운영 질문 자주 연결되는 장치
초반 처음부터 크게 움직이면 너무 거칠지 않은가? warmup
중반 빠르게 전진하는 구간이 필요한가? 비교적 큰 기본 learning rate 유지
후반 목표 근처에서 지나치지 않게 더 작게 움직여야 하는가? decay

이렇게 보면 scheduler는 새 optimizer가 아니라 한 optimizer 위에서 시간에 따라 보폭을 운영하는 규칙입니다.

이 구분을 놓치면 독자는 learning rate를 정했다learning rate schedule을 정했다를 같은 말처럼 받아들이기 쉽습니다. 하지만 실제로는 다릅니다. 전자는 지금 보폭의 기본 크기를 정하는 일이고, 후자는 그 보폭을 학습 전체에 걸쳐 어떻게 바꿔 갈지를 정하는 일입니다. 이 둘이 나뉘어 보여야, 뒤에서 논문이나 실무 설정을 읽을 때 optimizer는 Adam, scheduler는 cosine, warmup 5% 같은 문장을 자연스럽게 분해할 수 있습니다.

사례 및 예시

사례. 같은 optimizer인데도 초반과 후반에 다른 문제가 보이는 경우

Adam이나 momentum optimizer를 하나 골라 학습한다고 해도, 초반과 후반에 보이는 문제는 다를 수 있습니다. 예를 들어 초반에는 loss가 크게 튀고, 중반에는 빠르게 내려가며, 후반에는 목표 근처에서 작은 진동이 오래 남을 수 있습니다.

이때 모든 장면을 optimizer가 나쁜가로 읽으면 너무 크게 묶은 해석이 됩니다. scheduler 관점은 질문을 더 작게 나눕니다.

보이는 장면 먼저 떠올릴 scheduler 질문 읽는 기준
초반 loss가 크게 흔들린다 처음 보폭이 너무 큰가? warmup이 필요한가
중반은 잘 내려가는데 후반에 진동이 크다 후반 보폭이 아직 너무 큰가? decay가 필요한가
전체 학습이 지나치게 느리다 처음부터 끝까지 보폭이 너무 작은가? 기본 learning rate나 schedule 전체가 과보수적인가

현재 절이 닫아야 하는 것은 어떤 scheduler가 유명한가가 아니라, 보폭 운영 질문을 시간축 위에서 나누어 읽는가입니다.

이 사례를 더 풀어 쓰면, 초심자가 실제 로그를 읽을 때 어려운 점은 수치가 아니라 시점입니다. 같은 손실 곡선이라도 초반의 큰 흔들림과 후반의 작은 진동은 같은 원인이 아닐 수 있습니다. 그래서 scheduler 관점은 지금 어느 구간에서 문제가 생기는가를 먼저 보게 만듭니다. 초반의 과격함이면 warmup 질문이 먼저 나오고, 후반의 잔진동이면 decay 질문이 먼저 나옵니다. 이렇게 시간축을 먼저 나누면 원인 추정이 훨씬 덜 뭉뚱그려집니다.

연습 및 예제

다음 로그 해석 문장을 읽고 어떤 보폭 운영 패턴을 먼저 점검할지 적어 봅니다.

로그 해석 문장 먼저 점검할 scheduler 질문 우선 떠올릴 장치
첫 수백 step에서 손실 곡선이 매우 거칠다 초반 보폭을 서서히 키워야 하는가? warmup
충분히 좋아진 뒤에도 목표 근처에서 오르내림이 크다 후반 보폭을 더 줄여야 하는가? decay
특정 milestone 이후 더 미세한 조정으로 넘어가고 싶다 구간별로 보폭을 단계적으로 낮출 것인가? step decay
학습 전체에 걸쳐 부드럽게 줄이고 싶다 계단식보다 연속적으로 줄일 것인가? linear/cosine decay

이 연습의 목적은 scheduler 이름을 외우는 것이 아니라, 보폭 운영 질문을 먼저 떠올리는 습관을 만드는 데 있습니다.

체크리스트

  • learning rate scheduler를 보폭 운영 정책으로 설명할 수 있는가?
  • warmup을 초반에 갑자기 크게 움직이지 않게 하는 장치로 설명할 수 있는가?
  • decay를 후반 미세 조정을 위한 보폭 축소로 설명할 수 있는가?
  • step decay, linear decay, cosine decay를 보폭 패턴으로 읽을 수 있는가?
  • 학습 로그에서 초반 불안정, 후반 진동, 전체 과속/과저속을 scheduler 질문으로 연결할 수 있는가?

출처와 참고 자료

  • PyTorch, torch.optim, PyTorch documentation. lr_scheduler가 epoch 또는 검증 지표에 따라 learning rate를 조정하며 StepLR, LinearLR, CosineAnnealingLR 같은 scheduler를 제공한다는 점을 확인할 때 참고했다. 확인 날짜: 2026-07-19. https://docs.pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate
  • Ilya Loshchilov, Frank Hutter, SGDR: Stochastic Gradient Descent with Warm Restarts, ICLR 2017. cosine annealing과 restart 계열 learning rate schedule의 배경을 확인할 때 참고했다. 확인 날짜: 2026-07-19. https://arxiv.org/abs/1608.03983