확률적 경사하강: 노이즈 섞인 그래디언트로 걷기

학습률 스케줄: 정해 둔 스텝 수 안에서 줄인다

로빈스–먼로 조건은 학습률을 끝없이 줄여 가면 결국 바닥에 닿는다고 말하지만, 실제 학습에는 끝이 있다. GPU를 쓸 수 있는 시간이 정해져 있으니, 학습을 시작하기 전에 몇 스텝을 걸을지부터 정한다. 정해진 스텝 수 안에서 할 일은 둘이다. 처음에는 바닥까지 멀리 가야 하니 학습률이 커야 하고, 끝에는 노이즈 플로어를 낮춰야 하니 학습률이 작아야 한다. 그 사이를 어떤 모양으로 이어야 할까?

역사: 계단에서 코사인으로

로시칠로프와 후터(2016)의 그림 1에 실린 학습률 스케줄 가운데 셋을 다시 그림. 회색 계단은 자고루이코와 코모다키스(2016)의 넓은 ResNet 설정(0.1에서 시작해 60, 120, 160번째 에포크에 0.2배)이다. 초록과 갈색 점선은 코사인으로 줄였다가 다시 올리는 스케줄(50 에포크마다, 또는 주기를 10, 20, 40, …으로 늘리며)이다. 원 그림은 세로축이 로그 눈금이다(sources/sgd/figs.py)
로시칠로프와 후터(2016)의 그림 1에 실린 학습률 스케줄 가운데 셋을 다시 그림. 회색 계단은 자고루이코와 코모다키스(2016)의 넓은 ResNet 설정(0.1에서 시작해 60, 120, 160번째 에포크에 0.2배)이다. 초록과 갈색 점선은 코사인으로 줄였다가 다시 올리는 스케줄(50 에포크마다, 또는 주기를 10, 20, 40, …으로 늘리며)이다. 원 그림은 세로축이 로그 눈금이다(sources/sgd/figs.py)

2010년대 이미지 분류의 학습률은 대개 계단처럼 줄였다. 카이밍 허(Kaiming He)와 동료들의 ResNet 논문(2015년 공개, 층을 건너뛰는 잔차 연결을 쓴 합성곱 신경망)은 이미지넷(이미지 약 128만 장을 1000가지로 분류하는 데이터)에서 학습률을 0.1로 시작해 오차가 더 줄지 않을 때마다 10분의 1로 줄였고, 배치 크기 256으로 60만 스텝까지 학습했다. CIFAR-10(가로세로 32픽셀 이미지 6만 장)에서는 미리 정해 둔 3만 2천 스텝과 4만 8천 스텝에서 10분의 1씩 줄이고 6만 4천 스텝에서 멈췄다. 이렇게 하면 잘 되지만 언제 몇 배로 줄일지를 데이터와 모델마다 정해야 한다.

일리야 로시칠로프(Ilya Loshchilov)와 프랑크 후터(Frank Hutter)는 2016년 논문 「다시 시작하는 확률적 경사하강(SGDR: Stochastic Gradient Descent with Warm Restarts)」(이듬해 표현 학습 국제 학회 ICLR에 실림)에서 다른 모양을 냈다. 한 주기 안에서 학습률을 코사인 곡선의 반 바퀴를 따라 최댓값에서 최솟값으로 매끄럽게 줄이고, 주기가 끝나면 학습률을 다시 최댓값으로 올려 처음부터 줄이는 것이다. 파라미터는 그대로 두고 학습률만 다시 올리므로 「따뜻한 다시 시작(warm restart)」이라 불렀다. 그들은 이 스케줄이 당시 쓰이던 스케줄보다 2~4배 적은 에포크로 비슷하거나 더 좋은 결과를 낸다고 보고했고, 다시 시작하기 직전의 모델들을 모아 CIFAR-10에서 오류율 3.14%, CIFAR-100(같은 크기의 이미지를 100가지로 분류)에서 16.21%를 얻었다. 그 뒤로 다시 시작하는 부분은 빼고 학습 전체를 코사인 한 주기로 줄이는 쓰임이 널리 퍼졌다.

1000스텝 예산으로 학습률 스케줄 다섯

배달 1000건 회귀에서 스텝 수를 T = 1000으로 정하고, 배치 크기 10으로 학습률 스케줄 다섯을 비교했다. 큰 학습률은 0.02(ηa = 0.21), 작은 학습률은 그 10분의 1인 0.002다. 계단은 0.02로 시작해 500스텝에서 0.002로, 750스텝에서 0.0002로 줄인다. 코사인은 0.02에서 0까지 매끄럽게 줄이고, 1/k 꼴은 0.02 × 100/(k + 100)이다. 씨앗 200개로 돌린 초과 손실의 평균은 다음과 같다.

학습률 스케줄 k = 10 k = 50 k = 500 k = 750 k = 1000
고정 0.02 0.782 0.0122 0.0138 0.0113 0.0128
고정 0.002 54.0 10.07 0.00108 0.00129 0.00122
계단 0.782 0.0122 0.0138 0.00130 0.00055
코사인 0.782 0.0122 0.00625 0.00213 0.00057
1/k 꼴 0.972 0.00822 0.00192 0.00156 0.00114

고정 0.02는 50스텝 만에 노이즈 플로어 0.012에 닿고 거기서 멈춘다. 고정 0.002는 노이즈 플로어가 열 분의 일이지만 50스텝 뒤에도 초과 손실이 10이다. 계단과 코사인은 처음에는 고정 0.02와 똑같이 빨리 내려가고, 끝에서는 고정 0.002보다 낮은 0.00055~0.00057에 닿는다. 두 스케줄은 모양이 달라도 학습률의 합이 10.55와 10.01로 비슷하고, 끝의 학습률이 작다는 점이 같다. 배달 1000건 회귀에서는 1/k 꼴도 0.00114로 나쁘지 않다.

이처럼 스텝마다 쓸 학습률을 미리 정해 둔 규칙을 학습률 스케줄 (스텝 번호에 따라 학습률을 바꾸는 규칙 / learning rate schedule)이라 한다. 코사인 스케줄은 다음 식이다.

ηk=ηmin⁡+12(ηmax⁡−ηmin⁡)(1+cos⁡π kT)\textcolor{#006600}{\eta}_{\textcolor{#a67a63}{k}} = \textcolor{#006600}{\eta}_{\min} + \frac{1}{2}\left(\textcolor{#006600}{\eta}_{\max} - \textcolor{#006600}{\eta}_{\min}\right)\left(1 + \cos\frac{\pi\,\textcolor{#a67a63}{k}}{\textcolor{#a67a63}{T}}\right)
ηkk번째 스텝의 학습률ηmax⁡, ηmin⁡학습률의 최댓값(처음)과 최솟값(끝)k스텝 번호T정해 둔 스텝 수 (다시 시작하는 스케줄이면 한 주기의 길이)\begin{array}{ll} \textcolor{#006600}{\eta}_{\textcolor{#a67a63}{k}} & \textcolor{#a67a63}{k}\text{번째 스텝의 학습률} \\ \textcolor{#006600}{\eta}_{\max},\ \textcolor{#006600}{\eta}_{\min} & \text{학습률의 최댓값(처음)과 최솟값(끝)} \\ \textcolor{#a67a63}{k} & \text{스텝 번호} \\ \textcolor{#a67a63}{T} & \text{정해 둔 스텝 수 (다시 시작하는 스케줄이면 한 주기의 길이)} \end{array}

k = 0에서 1 + cos 0 = 2라 학습률이 최댓값이고, k = T에서 1 + cos π = 0이라 최솟값이다. 처음과 끝에서는 천천히 바뀌고 가운데에서 가장 빨리 준다. 계단과 비교하면 언제 몇 배로 줄일지를 정할 필요 없이 스텝 수 T만 알면 되는데, 1/k 꼴은 T를 모르는 스케줄이라, 정해 둔 끝에서 학습률이 얼마일지를 고를 수 없다.

직접 움직여 보기위젯 2: 학습률 스케줄새 창에서 열기 ↗

ML에서: GPT-3의 코사인 스케줄

큰 언어 모델은 대부분 코사인 스케줄을 쓴다. GPT-3 논문(브라운 외, 2020)은 모든 크기의 모델을 학습할 때 학습률을 2600억 토큰(토큰은 글을 잘게 자른 조각으로, 언어 모델이 한 번에 하나씩 읽는 단위다)에 걸쳐 코사인으로 처음 값의 10%까지 줄이고, 그 뒤로는 10%에서 학습을 이어 갔다고 적었다. 전체 학습은 3000억 토큰이었다. 같은 문단에는 처음 3억 7500만 토큰 동안 학습률을 직선으로 올렸다는 설정과, 배치 크기를 학습 초반 40억~120억 토큰에 걸쳐 작은 값에서 점점 키웠다는 설정도 있다. 학습률을 왜 처음에 올리는지는 이 장의 마지막 개념인 워밍업에서 본다.

문제 10. 계량컵에 물 500ml 붓기

계량컵에 물을 정확히 500ml 채우려 한다. 붓는 양은 마음먹은 양의 10%쯤 손이 떨려서(표준편차) 실제로는 조금 더 붓기도, 덜 붓기도 한다. 남은 양을 보고 다시 부을 수 있다. (가) 한 번에 500ml를 부으면 마지막 오차의 표준편차는 얼마인가? (나) 남은 양의 반씩 두 번 부으면? 처음에 90%를 붓고 나머지를 부으면? (다) 「90%, 다시 남은 양의 90%, 나머지」로 세 번 부으면? 처음부터 남은 양의 10%씩 조금씩 스무 번 부으면?

김민준 M01
김민준

1만 번 흉내 내면 한 번에 다 부을 때 50.3ml, 반씩 두 번이면 25.3ml예요. 많이 나눌수록 정확하니까 10%씩 스무 번이 제일 좋겠죠.

선생님 T01
선생님

10%씩 스무 번 부으면 마지막에 붓는 양은 얼마죠?

김민준 M01
김민준

열아홉 번 동안 남은 양의 10%씩 부으면 500 × 0.9¹⁹ = 67.5ml가 남아요. 마지막에 그걸 한 번에 부어요.

선생님 T01
선생님

그 마지막 한 번의 손떨림은요?

김민준 M05
김민준

6.75ml라서 오차가 6.77ml예요. 스무 번이나 부었는데 90%를 먼저 붓고 나머지를 부은 6.74ml와 같아요.

이서연 S01
이서연

마지막 오차는 마지막에 부은 양이 정해. 그러니까 처음엔 크게 부어서 빨리 다가가고, 끝에 붓는 양을 작게 하는 게 중요해. 「90%, 90%, 나머지」는 마지막에 5ml만 부으니까 0.92ml야.

선생님 T02
선생님

1000스텝 예산의 학습률 스케줄 표와 비교하면 어떤가요?

이서연 S01
이서연

고정 0.002가 10%씩 조금씩 붓기 같아요. 끝은 정확해도 다가가는 데 오래 걸려요.

김민준 M01
김민준

계단이랑 코사인은 「90%, 90%, 나머지」 쪽이네. 처음엔 크게, 끝에선 작게.

이서연 S07
이서연

그럼 끝의 노이즈 플로어는 마지막 구간의 학습률이 정하겠네요.

김민준 M11
김민준

보고서 분량 맞출 때도 처음엔 문단째로 지우고, 마감 직전엔 단어 하나씩 고치는 게 계단·코사인 스케줄이네요. 처음부터 단어 하나씩 고치면 마감까지 못 끝내요.

문제 11. 계단의 마지막 구간은 왜 덜 내려가나

1000스텝 예산의 계단 스케줄은 750스텝에서 학습률을 0.002에서 0.0002로 줄인다. 노이즈 플로어 식으로 학습률 0.002와 0.0002의 노이즈 플로어는 각각 0.00115와 0.00011이다. 그런데 씨앗 200개로 잰 초과 손실은 750스텝 뒤 0.00130, 1000스텝 뒤 0.00055다. (가) 왜 0.0002의 노이즈 플로어보다 다섯 배 높은 데서 끝났는가? (나) 학습률이 바뀐 뒤 새 노이즈 플로어로 내려가는 데는 대략 몇 스텝이 걸리는가? (다) 코사인 스케줄은 끝에서 학습률이 0인데도 왜 초과 손실이 0이 아닌가?

김민준 M01
김민준

학습률을 열 분의 일로 줄이면 노이즈 플로어도 바로 열 분의 일이 되니까 0.00011이어야 하는데요. 씨앗이 모자라서 그런가요?

선생님 T01
선생님

학습률을 바꾼 바로 그 순간, w는 어디에 있죠?

김민준 M04
김민준

그 전 학습률 0.002의 노이즈 플로어 높이쯤에 흩어져 있어요. 거기서 새 노이즈 플로어까지 다시 내려가야 하는군요.

이서연 S01
이서연

노이즈를 빼면 거리가 스텝마다 (1 − ηa)배라서, 거리의 제곱은 1/(2ηa)스텝쯤마다 e분의 1로 줄어.

선생님 T01
선생님

η = 0.0002면 얼마나 걸리죠?

이서연 S01
이서연

ηa = 0.0021이라 1/(ηa) = 482스텝이에요. 남은 250스텝 동안 거리 제곱은 (1 − ηa)⁵⁰⁰ = 0.35배밖에 안 줄어요.

김민준 M07
김민준

0.00130의 0.35배가 0.00046이고, 새 노이즈 플로어 0.00011이 거기 더해지니까 0.00055 근처네. 잰 값이랑 맞아.

선생님 T14
선생님

그러면 학습률이 작을수록 무엇이 같이 느려지죠?

이서연 S01
이서연

노이즈 플로어가 낮아지는 대신, 그 낮은 노이즈 플로어까지 내려가는 데 걸리는 스텝이 1/(ηa)로 늘어요.

선생님 T01
선생님

(다)의 코사인 끝은요? 학습률이 0인데요.

이서연 S08
이서연

끝의 학습률이 0이어도… 그 직전 몇백 스텝의 학습률로는 바닥까지 다 내려갈 시간이 없었겠네요. 학습률이 스텝마다 줄어드는 속도를 손실이 쫓아가지 못한 만큼 남아요. 미분방정식에서 시상수보다 빨리 입력을 바꾸면 출력이 따라가지 못하는 것과 같아요.

김민준 M07
김민준

학습 마지막에 학습률을 줄였으면 그 뒤로도 충분히 걸어야 효과를 다 보는 거네요. ResNet 스케줄에서 마지막으로 줄인 뒤 1만 6천 스텝을 더 간 게 그래서였을 것 같아요.

문제 12. 코사인을 10%까지만 내리면

GPT-3처럼 코사인 스케줄의 최솟값을 처음 학습률의 10%로 둔다. 배달 1000건 회귀(배치 크기 10, T = 1000, 최댓값 0.02)에서 (가) 최솟값 0과 0.002의 1000스텝 뒤 초과 손실은 각각 얼마인가? (나) 최솟값 0.002의 노이즈 플로어는 식으로 얼마이고, 잰 값과 비교하면? (다) 정해 둔 스텝 수가 끝난 뒤에도 학습을 더 이어 갈 수 있다면 어느 쪽이 나은가? (풀어 본 뒤 위젯 2의 「문제 12 불러오기」로 확인해 보자.)

김민준 M01
김민준

씨앗 200개로 0까지 내리면 0.00057, 10%까지 내리면 0.00125예요. 0까지가 두 배 좋으니까 GPT-3도 0까지 내리는 게 나았겠네요.

선생님 T01
선생님

0.00125는 어디서 본 숫자에 가깝죠?

이서연 S01
이서연

학습률 0.002의 노이즈 플로어 식이 0.00115야. 학습률을 0.002에서 멈추니까 손실도 그 노이즈 플로어 근처에서 멈춘 거지. 0까지 내린 쪽은 학습률이 계속 줄어서 그보다 낮게 내려가고.

선생님 T02
선생님

그런데 GPT-3는 2600억 토큰 뒤에도 10%로 학습을 이어 갔어요. 1000스텝 뒤에 더 걷는다면 두 스케줄은 각각 어떻게 될까요?

이서연 S06
이서연

0까지 내린 쪽은 학습률이 0이라 더 걸어도 한 발짝도 안 움직여요. 데이터를 더 봐도 배울 수가 없어요.

김민준 M01
김민준

10%로 멈춘 쪽은 그 학습률로 계속 배우고. 대신 노이즈 플로어 0.00115 근처에 머물겠네.

선생님 T01
선생님

그럼 (다)는요?

이서연 S01
이서연

정해 둔 끝에서 바로 멈출 거면 0까지가 낫고, 끝 뒤로 더 배울 일이 있으면 0이 아닌 최솟값이 필요해요.

김민준 M07
김민준

스케줄이 끝나면 학습률이 0이 되니까, 모델을 더 학습시키려면 스케줄을 처음부터 다시 짜야 하는 거네요. 로시칠로프와 후터가 학습률을 다시 올린 것도 같은 고민이었을 수 있겠어요. 체크포인트에서 이어서 학습시키는 실험을 할 때 학습률이 0에 붙어서 아무것도 안 변했던 적이 있어요.