P5-7.6 보충학습: 학습률 조절 전략¶
Section ID:
P5-7.6Version: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 이름이 훨씬 덜 추상적으로 느껴집니다.
그래프로 보면 차이가 더 직접 보입니다.
같은 손실 곡선 위에서도 보폭이 너무 작으면 거의 움직이지 않고, 적절하면 낮은 손실 쪽으로 가며, 너무 크면 지나칠 수 있습니다. 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