Chapter 03

학습: 경사하강과 역전파

2장의 신경망은 가중치만 잘 정해 주면 거의 어떤 함수든 흉내 낼 수 있다. 문제는 그 "잘 정한 가중치"를 사람이 손으로 찾을 수 없다는 것이다. Llama 3 8B에는 숫자가 약 80억 개 있다. 이 장은 그 숫자들을 데이터로부터 자동으로 맞춰 가는 방법, 즉 학습을 다룬다. 오차를 하나의 숫자(손실)로 재고, 그 숫자를 줄이는 방향(기울기)을 연쇄법칙으로 계산하고, 조금씩 내려간다. 이 단순한 절차 하나가 손글씨 인식부터 GPT까지 모든 현대 신경망을 학습시킨다.

학습이란 무엇인가: 손실을 줄이는 탐색

신경망은 입력 \(x\)를 받아 예측 \(\hat y = f_\theta(x)\)를 내놓는 함수다. 여기서 \(\theta\)는 모든 가중치와 편향을 한 줄로 늘어놓은 거대한 벡터다. 학습(training)은 정답이 붙은 데이터 \(\{(x_i, y_i)\}\)를 보고 "예측이 정답과 얼마나 다른가"를 재는 함수, 곧 손실 함수(loss function) \(\mathcal L(\theta)\)를 가장 작게 만드는 \(\theta\)를 찾는 일이다.

$$\theta^\star = \arg\min_\theta \; \mathcal L(\theta), \qquad \mathcal L(\theta) = \frac{1}{N}\sum_{i=1}^{N} \ell\big(f_\theta(x_i),\, y_i\big)$$
\(\ell\)은 데이터 한 개에 대한 손실, \(\mathcal L\)은 그 평균이다. 학습은 "\(\theta\) 공간에서 \(\mathcal L\)이 가장 낮은 곳 찾기"라는 최적화 문제다.

파라미터가 2개라면 \(\mathcal L(\theta_1,\theta_2)\)를 지도 위의 고도처럼 그릴 수 있다. 이것을 손실 지형(loss landscape)이라 부른다. 파라미터가 80억 개면 80억 차원 지형이 되어 그림으로 그릴 수 없지만, 원리는 같다. 어디가 가장 낮은지 전체를 볼 수는 없으니, 현재 위치에서 발밑의 기울기만 보고 내리막으로 한 걸음씩 걷는다. 이것이 경사하강이다.

미니배치 (x, y) 모델 fθ 순전파 예측 ŷ 로짓 / 값 손실 ℓ(ŷ, y) 스칼라 하나 역전파: ∇θℓ 연쇄법칙 옵티마이저 θ ← θ − η∇ℓ 한 번의 학습 스텝 (iteration) — 수십만~수백만 번 반복 순전파(검정 화살표)로 손실을 재고, 역전파(분홍 화살표)로 기울기를 거꾸로 흘려 보낸 뒤 가중치를 조금 고친다
그림 3-1. 학습 루프. 데이터 묶음을 모델에 통과시켜 손실을 계산(순전파)하고, 손실의 각 파라미터에 대한 기울기를 계산(역전파)한 다음, 옵티마이저가 기울기 반대 방향으로 파라미터를 조금 옮긴다. LLM 사전학습도 정확히 이 루프를 수십만 번 돈다.

이 장의 순서는 이 루프를 그대로 따른다. 먼저 손실을 어떻게 정의할지(2절), 기울기 방향으로 얼마나 움직일지(3절), 기울기를 어떻게 효율적으로 구할지(4절)를 본 뒤, 데이터를 쪼개 쓰는 미니배치(5절), 더 똑똑한 옵티마이저(6절), 학습률 일정(7절), 그리고 깊은 망과 일반화에서 생기는 문제(8·9절)를 다룬다. 마지막으로 LLM 학습이 실제로 어떤 규모인지 숫자로 확인한다.

손실 함수: MSE와 교차 엔트로피

손실 함수는 "얼마나 틀렸는가"를 하나의 0 이상 숫자로 바꾸는 규칙이다. 어떤 규칙을 고르느냐에 따라 모델이 무엇을 중요하게 배울지가 달라진다. 가장 많이 쓰는 두 가지를 보자.

평균 제곱 오차 (회귀)

집값, 온도처럼 연속값을 맞추는 회귀(regression)에서는 차이의 제곱을 평균 낸 MSE(Mean Squared Error)를 쓴다.

$$\mathcal L_{\text{MSE}} = \frac1N\sum_{i}\big(\hat y_i - y_i\big)^2, \qquad \frac{\partial \mathcal L_{\text{MSE}}}{\partial \hat y_i} = \frac{2}{N}\big(\hat y_i - y_i\big)$$
기울기가 오차에 비례한다. 크게 틀리면 크게, 조금 틀리면 조금 고친다. 오차가 정규분포를 따른다고 가정한 최대우도 추정과 같다.

교차 엔트로피 (분류)

분류에서는 모델이 클래스마다 점수(로짓(logit)) \(z_k\)를 내고, 소프트맥스로 확률 \(p_k = e^{z_k}/\sum_j e^{z_j}\)를 만든다. 정답 클래스가 \(c\)라면 손실은 정답에 준 확률의 음의 로그다. 이것이 교차 엔트로피(cross-entropy)이며, 7장에서 볼 LLM의 사전학습 손실도 정확히 이것이다(정답 = 실제 다음 토큰).

$$\mathcal L_{\text{CE}} = -\log p_c, \qquad \frac{\partial \mathcal L_{\text{CE}}}{\partial z_k} = p_k - \mathbb 1[k=c]$$
소프트맥스와 −log를 합쳐 미분하면 놀랍도록 간단한 "예측 확률 − 정답(원-핫)"이 된다. 정답 확률이 1이면 손실 0, 0.5면 \(\ln 2 \approx 0.69\), 0.01이면 \(4.6\), 0이면 무한대다.

분류인데 MSE를 쓰면 안 될까? 쓸 수는 있지만 학습이 나빠진다. 시그모이드/소프트맥스 출력은 확률이 0이나 1 근처로 포화되면 기울기 \(p(1-p)\)가 0에 가까워진다. MSE는 이 포화 기울기를 그대로 곱하므로, 모델이 "정답일 확률 0.001"이라고 확신에 차서 틀린 상황에서 오히려 기울기가 거의 0이 되어 고쳐지지 않는다. 교차 엔트로피는 −log의 기울기 \(-1/p\)가 포화 항을 정확히 상쇄해서, 크게 틀릴수록 기울기가 −1에 가까운 최대값을 유지한다. 아래에서 직접 확인해 보자.

SIMULATOR

손실 함수 비교: MSE vs 교차 엔트로피

손실 vs 예측 확률 p
로짓에 대한 기울기 크기 |∂ℓ/∂z|
정답 레이블 y
예측 p = σ(z)—
교차 엔트로피—
MSE (p − y)²—
∂CE/∂z—
∂MSE/∂z—
해볼 것: ① 그래프 위를 좌우로 끌어 p를 바꿔 보자(슬라이더와 같다). y = 1인데 p를 0.001까지 내리면 CE는 약 6.9까지 치솟지만 MSE는 1에서 멈춘다. ② 오른쪽 기울기 그래프에서 p → 0(확신에 찬 오답)일 때 CE의 기울기는 1 근처로 유지되고, MSE의 기울기는 0으로 사라진다. MSE가 가장 크게 틀린 샘플을 가장 느리게 고치는 셈이다. ③ y = 0으로 바꾸면 그림이 좌우로 뒤집힌다. 두 손실 모두 p = y에서 0이고 기울기도 0이다.
정보 이론으로 본 교차 엔트로피

참 분포 \(q\)와 모델 분포 \(p\) 사이의 교차 엔트로피 \(H(q,p) = -\sum_k q_k \log p_k\)는 "\(p\)를 기준으로 만든 부호로 \(q\)에서 나온 사건을 적을 때 필요한 평균 비트(나트) 수"다. 정답이 원-핫이면 \(-\log p_c\)만 남는다. \(H(q,p) = H(q) + D_{\text{KL}}(q\,\|\,p)\)이므로 교차 엔트로피 최소화는 모델 분포를 데이터 분포에 KL 발산 의미로 가깝게 만드는 일이다. 언어 모델의 퍼플렉시티 \(e^{\mathcal L_{\text{CE}}}\)는 이 값을 "평균 몇 개 후보 중에서 헷갈리는가"로 바꾼 것이다(7장).

경사하강법과 학습률

다변수 함수 \(\mathcal L(\theta)\)의 기울기(gradient) \(\nabla_\theta \mathcal L = (\partial\mathcal L/\partial\theta_1, \dots, \partial\mathcal L/\partial\theta_n)\)는 현재 위치에서 함수가 가장 가파르게 증가하는 방향을 가리키는 벡터다(크기는 그 방향의 경사도). 그러니 반대 방향으로 조금 움직이면 손실이 줄어든다. 이것이 경사하강법(gradient descent)이다.

$$\theta_{t+1} = \theta_t - \eta\, \nabla_\theta \mathcal L(\theta_t)$$
\(\eta\)는 학습률(learning rate), 한 걸음의 보폭을 정하는 하이퍼파라미터다. 1차 테일러 전개 \(\mathcal L(\theta - \eta g) \approx \mathcal L(\theta) - \eta\|g\|^2\)에서 보듯, \(\eta\)가 충분히 작으면 매 스텝 손실이 반드시 줄어든다.

문제는 "충분히 작은"이 얼마냐다. 너무 작으면 영원히 걸리고, 너무 크면 골짜기를 건너뛰어 반대편 벽으로 튕겨 나간다. 가장 단순한 1차원 이차 함수 \(\mathcal L = \tfrac{\lambda}{2}\theta^2\)으로 정확히 계산할 수 있다. 기울기가 \(\lambda\theta\)이므로 갱신은 \(\theta_{t+1} = (1-\eta\lambda)\theta_t\)다. 곱해지는 인자 \(|1-\eta\lambda|\)가 1보다 작아야 수렴하므로

$$0 < \eta < \frac{2}{\lambda}, \qquad \text{가장 빠른 수렴: } \eta = \frac1\lambda \;(\text{한 번에 바닥})$$
다차원에서는 \(\lambda\) 자리에 헤시안(2차 미분 행렬)의 가장 큰 고윳값 \(\lambda_{\max}\)가 들어간다. 가장 가파른 방향이 학습률의 상한을 정하고, 가장 완만한 방향(\(\lambda_{\min}\))이 수렴 속도를 정한다. 그 비율 \(\kappa = \lambda_{\max}/\lambda_{\min}\)를 조건수(condition number)라 한다.
η = 0.1 : 너무 작음 (느림) θ (출발 -2, 인자 1−2η = 0.8) η = 0.4 : 적당함 θ (출발 -2, 인자 1−2η = 0.2) η = 1.05 : 너무 큼 (발산) θ (출발 -1.5, 인자 1−2η = -1.1)
그림 3-2. \(\mathcal L = \theta^2\)(\(\lambda = 2\))에서 학습률에 따른 경사하강 궤적(실제 계산값). 왼쪽: \(\eta = 0.1\)이면 매 스텝 0.8배씩 줄어 느리게 수렴한다. 가운데: \(\eta = 0.4\)면 0.2배씩 줄어 몇 스텝 만에 바닥이다. 오른쪽: \(\eta = 1.05 > 2/\lambda = 1\)이면 인자가 −1.1이 되어 좌우로 튕기며 발산한다.

아래 시뮬레이터에서 네 가지 손실 지형 위에 공을 놓고 굴려 보자. 등고선이 촘촘한 곳이 가파른 곳이다. 협곡 지형은 한 방향 곡률이 다른 방향의 10배인 타원형 골짜기로, 실제 신경망 손실 지형에서 흔한 "조건수가 나쁜" 상황이다. 로젠브록은 휘어진 바나나 모양 골짜기, 다중 극소는 출발점에 따라 다른 웅덩이에 빠지는 지형이다.

SIMULATOR

손실 지형 위의 경사하강

지형
속도 (스텝/프레임)
실행
—
스텝—
손실 L—
|∇L|—
위치 (θ₁, θ₂)—
발산 경계 2/λmax—
해볼 것: ① 지형 아무 곳이나 클릭(또는 끌기)해 출발점을 정한다. 볼 지형(λ = 2)에서 η를 0.5로 맞추면 한 스텝에 바닥, 1을 넘기면 발산 경고가 뜬다. ② 협곡에서는 가파른 θ₂ 방향(λ = 10) 때문에 η < 0.2여야 하는데, 그러면 완만한 θ₁ 방향(λ = 1)으로는 거북이처럼 기어간다. η = 0.18 근처에서 지그재그를 관찰하자. 이것이 6절 Momentum과 Adam의 동기다. ③ 다중 극소에서 출발점을 바꿔 가며 어느 웅덩이에 빠지는지 보자. 경사하강은 "가장 낮은 곳"이 아니라 "가까운 내리막 끝"을 찾는다. 아래 그래프는 스텝별 손실(로그 축, 최솟값 기준)이다.
고차원에서는 극소보다 안장점이 문제

2차원 그림 때문에 "나쁜 극소에 갇히는 것"이 가장 큰 위험처럼 보이지만, 수백만 차원에서는 사정이 다르다. 기울기가 0인 임계점에서 헤시안 고윳값이 모두 양수일 확률은 차원이 커질수록 급격히 작아져, 대부분의 임계점은 어떤 방향으로는 오르막, 다른 방향으로는 내리막인 안장점(saddle point)이다. 큰 신경망에서 찾아지는 극소들은 손실 값이 서로 비슷하다는 경험적·이론적 결과가 많다(Dauphin et al., 2014; Choromanska et al., 2015). 실제로 더 골치 아픈 것은 평평한 고원과 나쁜 조건수다.

역전파: 연쇄법칙으로 기울기 나르기

경사하강에는 모든 파라미터에 대한 \(\partial\mathcal L/\partial\theta_j\)가 필요하다. 파라미터마다 \(\theta_j\)를 살짝 바꿔 손실을 다시 재는 수치 미분은 파라미터가 \(n\)개면 순전파를 \(n\)번(중심 차분이면 \(2n\)번) 해야 한다. 80억 번은 불가능하다. 역전파(backpropagation)는 순전파 한 번 + 역전파 한 번, 대략 순전파 비용의 3배로 모든 기울기를 정확히 구한다(Rumelhart, Hinton & Williams, 1986). 비결은 미적분의 연쇄법칙과 중간값 재사용이다.

$$\frac{\partial \mathcal L}{\partial u} = \sum_{v \,\in\, \text{children}(u)} \frac{\partial \mathcal L}{\partial v}\,\frac{\partial v}{\partial u}$$
계산을 작은 연산 노드의 그래프로 쪼개면, 노드 \(u\)의 전역 기울기 \(\partial\mathcal L/\partial u\)는 \(u\)를 사용하는 모든 자식 노드의 전역 기울기에 국소 기울기 \(\partial v/\partial u\)를 곱해 더한 것이다. 출력 쪽에서 입력 쪽으로 한 번 훑으면 모든 노드의 기울기가 나온다.
L = (σ(w·x + b) − y)² 를 5개 연산으로 쪼갠 계산 그래프 w x m=w·x b z=m+b a=σ(z) y d=a−y L=d² ×2d ×1 ×a(1−a) ×1 ×x ∂L/∂w = 2d · 1 · a(1−a) · 1 · x 검정: 순전파(값을 앞으로) · 분홍: 역전파(기울기를 뒤로, 국소 기울기를 곱하며)
그림 3-3. 뉴런 하나짜리 회귀의 계산 그래프. 순전파는 왼쪽에서 오른쪽으로 값을 계산해 저장하고, 역전파는 \(\partial L/\partial L = 1\)에서 출발해 각 간선의 국소 기울기를 곱해 가며 오른쪽에서 왼쪽으로 흐른다. 경로를 따라 곱한 것이 곧 연쇄법칙이다.

각 연산 노드는 자기 국소 기울기만 알면 된다. 곱셈 \(m = w\cdot x\)는 \(\partial m/\partial w = x\), \(\partial m/\partial x = w\) — 상대편 입력을 그대로 넘긴다. 덧셈은 기울기를 1배로 복사해 나눠 준다. 시그모이드는 \(\sigma'(z) = \sigma(z)(1-\sigma(z))\)로, 순전파에서 계산한 \(a\)를 재사용한다. 그래서 역전파는 순전파 때의 중간값을 메모리에 저장해야 하고, 이것이 학습이 추론보다 메모리를 훨씬 많이 쓰는 이유 중 하나다(10절의 활성값 메모리).

SIMULATOR

계산 그래프에서 순전파·역전파 따라가기

—
단계 실행
학습
손실 L—
∂L/∂w 역전파 / 수치—
∂L/∂b 역전파 / 수치—
상대 오차 (최대)—
해볼 것: ① "순전파 ▶"를 다섯 번 눌러 m → z → a → d → L 순서로 값이 채워지는 것을 본다. ② "◀ 역전파"를 눌러 L에서 출발한 기울기(분홍)가 간선의 국소 기울기(×값)와 곱해지며 거꾸로 흐르는 것을 확인하자. 수치 미분 \((L(w+h)-L(w-h))/2h\)과 10자리 가까이 일치한다. ③ 회색 입력 노드(w, x, b, y)를 좌우로 끌어 값을 바꾸면 모든 값과 기울기가 즉시 다시 계산된다. z를 크게(예: w = 3, x = 2) 만들면 σ가 포화되어 a(1−a) ≈ 0이 되고 ∂L/∂w가 사라진다 — 8절 기울기 소실의 축소판이다. ④ "경사 한 스텝"을 반복해 L이 줄어드는 것을 보자.
역전파 = 역방향 자동 미분

PyTorch·JAX의 loss.backward()는 순전파 때 실행된 연산을 테이프(그래프)에 기록해 두고, 이 시뮬레이터와 똑같이 거꾸로 훑는다. 이것을 역방향 모드 자동 미분(reverse-mode autodiff)이라 한다. 출력이 스칼라(손실) 하나이고 입력(파라미터)이 수십억 개일 때 역방향 모드가 압도적으로 유리하다. 행렬 연산으로 보면 \(Y = XW\)의 역전파는 \(\partial L/\partial X = (\partial L/\partial Y)\,W^\top\), \(\partial L/\partial W = X^\top(\partial L/\partial Y)\)로, 순전파 행렬곱 1번에 역전파 행렬곱 2번이 필요하다. 학습 FLOPs가 "파라미터당 토큰당 6"(순전파 2 + 역전파 4)인 이유다(7장의 \(C \approx 6ND\)).

미니배치 SGD: 에폭, 배치, 노이즈

지금까지는 손실 \(\mathcal L(\theta)\)를 정확히 안다고 가정했다. 하지만 \(\mathcal L\)은 데이터 전체에 대한 평균이고, 데이터가 수조 토큰이면 기울기 한 번 구하는 데 전체를 다 볼 수는 없다. 그래서 무작위로 뽑은 작은 묶음, 미니배치(mini-batch) \(\mathcal B\)의 평균 기울기로 전체 기울기를 추정한다. 이것이 확률적 경사하강법(SGD, Stochastic Gradient Descent)이다.

$$g_t = \frac{1}{|\mathcal B|}\sum_{i\in\mathcal B}\nabla_\theta\, \ell(f_\theta(x_i), y_i), \qquad \mathbb E[g_t] = \nabla_\theta \mathcal L, \qquad \operatorname{Var}[g_t] \approx \frac{\sigma^2}{|\mathcal B|}$$
미니배치 기울기는 전체 기울기의 불편 추정량이고, 분산은 배치 크기에 반비례한다. 배치를 4배 키우면 노이즈의 표준편차는 절반이 된다. 데이터 전체를 한 바퀴 다 쓰는 것을 1 에폭(epoch)이라 한다.

노이즈는 단점만 있는 것이 아니다. 계산이 싸서 같은 시간에 훨씬 많은 스텝을 밟을 수 있고, 약간의 흔들림이 날카로운 극소에서 빠져나와 평평한(일반화가 잘 되는) 극소로 가게 돕는다는 관찰도 있다. 반면 배치가 작으면 바닥 근처에서 계속 떨려 정확히 수렴하지 못하므로, 학습률을 점점 줄여야 한다(7절). 아래는 점 데이터에 직선 \(\hat y = wx + b\)를 MSE로 피팅하는 가장 단순한 경우다. 파라미터가 \((w, b)\) 두 개뿐이라 오른쪽에 손실 지형 전체를 그릴 수 있다.

SIMULATOR

선형회귀를 미니배치 SGD로 학습

데이터와 현재 직선 (점 끌기 / 빈 곳 클릭 = 추가)
(w, b) 평면의 손실 지형 (클릭 = 출발점)
배치 크기
실행
에폭 / 스텝—
전체 손실 (MSE)—
최적 손실 (정규방정식)—
현재 (w, b)—
최적 (w*, b*)—
해볼 것: ① "시작"을 누르고 배치 크기 "전체"(= 배치 경사하강)와 "1"을 비교한다. 전체 배치는 매끈한 곡선으로 최적점(✕)에 가지만, 배치 1은 술 취한 듯 비틀거리며 최적점 주변을 계속 맴돈다. 아래 손실 곡선에서도 바닥의 "떨림"이 보인다. ② 배치 1에서 η를 0.01로 낮추면 떨림이 줄지만 도착이 느려진다. 이것이 학습률 감쇠가 필요한 이유다. ③ 왼쪽에서 점 하나를 멀리 끌어 이상치를 만들면 오른쪽 지형의 바닥(✕)이 즉시 이동하고, 직선이 그 점 쪽으로 끌려간다. MSE가 제곱이라 이상치에 민감하다.
배치 크기, 학습률, 그리고 GPU

GPU는 행렬곱을 크게 묶을수록 효율이 좋아서, 실제로는 하드웨어가 허락하는 한 배치를 키운다. 배치를 \(k\)배 키우면 기울기 노이즈가 줄어드는 만큼 학습률도 키울 수 있다(SGD는 대략 선형, Adam은 대략 \(\sqrt k\)배 규칙이 경험적으로 알려져 있다). 다만 어느 임계 배치 크기(critical batch size)를 넘으면 배치를 늘려도 필요한 스텝 수가 더 줄지 않아 계산만 낭비된다(McCandlish et al., 2018). LLM 사전학습의 배치가 "수백만 토큰"인 것은 이 경계 근처를 노린 것이다.

옵티마이저: Momentum, RMSProp, Adam

3절의 협곡 지형에서 본 문제, 즉 가파른 방향 때문에 학습률을 낮춰야 하고 그 때문에 완만한 방향으로는 기어가는 문제를 고치는 두 가지 아이디어가 있다. 하나는 관성(지그재그 성분은 상쇄되고 일관된 방향 성분은 누적된다), 다른 하나는 좌표별 보폭 조절(기울기가 늘 큰 좌표는 보폭을 줄이고 작은 좌표는 키운다)이다.

출발 — 경사하강 (25스텝) — Momentum (40스텝) θ₂ 방향 곡률 12, θ₁ 방향 곡률 1 — 조건수 12의 협곡
그림 3-4. 협곡 지형 \(\mathcal L = \tfrac12(\theta_1^2 + 12\theta_2^2)\)에서 같은 출발점의 궤적(실제 계산). 분홍: 일반 경사하강(\(\eta = 0.155\))은 가파른 \(\theta_2\) 방향으로 튕기며 25스텝이 지나도 목표에 못 미친다. 보라: Momentum(\(\mu = 0.7\), \(\eta = 0.045\))은 세로 진동이 서로 상쇄되고 가로 방향 속도가 쌓여 부드럽게 바닥에 도달한다.
옵티마이저갱신식 (\(g_t = \nabla\mathcal L(\theta_t)\))아이디어
SGD\(\theta \leftarrow \theta - \eta g_t\)기울기 방향으로 그대로
Momentum\(v \leftarrow \mu v + g_t,\;\; \theta \leftarrow \theta - \eta v\)속도를 누적(지수 이동 합). \(\mu = 0.9\)면 실효 보폭 약 10배
RMSProp\(s \leftarrow \rho s + (1-\rho) g_t^2,\;\; \theta \leftarrow \theta - \eta\, g_t / (\sqrt{s}+\epsilon)\)좌표별로 최근 기울기 크기(RMS)로 나눔
Adam\(m \leftarrow \beta_1 m + (1-\beta_1) g_t,\;\; v \leftarrow \beta_2 v + (1-\beta_2) g_t^2\)
\(\hat m = m/(1-\beta_1^t),\; \hat v = v/(1-\beta_2^t),\;\; \theta \leftarrow \theta - \eta\, \hat m/(\sqrt{\hat v}+\epsilon)\)
Momentum + RMSProp + 초기 편향 보정

Adam(Adaptive Moment Estimation; Kingma & Ba, 2015)은 기울기의 1차 모멘트(평균, \(m\))와 2차 모멘트(제곱 평균, \(v\))를 지수 이동 평균으로 추적한다. \(\hat m/\sqrt{\hat v}\)는 기울기 부호가 일관되면 ±1 근처, 들쭉날쭉하면 0 근처가 되는 "신호 대 잡음비" 같은 양이라, 한 스텝의 크기가 대략 \(\eta\)로 제한된다. 기울기의 절대 크기에 둔감하다는 이 성질 덕분에, 층마다 기울기 스케일이 수십 배씩 다른 Transformer에서도 학습률 하나로 잘 돌아간다. 편향 보정은 \(m, v\)를 0으로 시작해 초반에 값이 작게 나오는 것을 \(1/(1-\beta^t)\)로 키워 주는 장치다. 기본값은 \(\beta_1 = 0.9\), \(\beta_2 = 0.999\)(LLM은 흔히 0.95), \(\epsilon = 10^{-8}\)이다.

SIMULATOR

옵티마이저 레이스

지형
실행
SGDMomentum (μ = 0.9)RMSProp (ρ = 0.9)Adam (0.9, 0.999)
SGD—
Momentum—
RMSProp—
Adam—
해볼 것: ① 협곡에서 출발점을 왼쪽 위 구석으로 클릭해 레이스를 다시 시작하자. SGD는 느리게, Momentum은 휘어 돌며 빠르게, RMSProp·Adam은 처음에 거의 45° 대각선으로 출발한다(좌표별 정규화 때문에 두 좌표가 같은 보폭으로 움직인다). 수치는 "도착 스텝(손실이 최솟값 + 10⁻³ 이내) · 현재 손실"이다. ② 로젠브록에서는 SGD가 휘어진 골짜기를 따라 수천 스텝을 기어가지만 Adam은 훨씬 빨리 (1, 1)에 다가간다. ③ 다중 극소에서 Momentum이 관성 때문에 얕은 웅덩이를 지나쳐 다른 웅덩이로 가는 경우를 찾아보자. ④ 학습률을 바꿔 가며 "모든 문제에서 이기는 옵티마이저는 없다"는 것도 확인하자.
AdamW: 가중치 감쇠를 분리하라

L2 정규화(9절)를 손실에 \(\tfrac{\lambda}{2}\|\theta\|^2\)로 더하면 그 기울기 \(\lambda\theta\)도 Adam의 \(\sqrt{\hat v}\)로 나뉘어, 기울기가 큰 파라미터일수록 정규화가 약해지는 이상한 효과가 생긴다. AdamW(Loshchilov & Hutter, 2019)는 감쇠를 갱신에서 따로 \(\theta \leftarrow \theta - \eta\big(\hat m/(\sqrt{\hat v}+\epsilon) + \lambda\theta\big)\)로 적용한다. GPT-3, Llama 계열 등 대부분의 LLM이 AdamW(\(\beta_2 = 0.95\), 가중치 감쇠 0.1 내외)로 학습된다.

학습률 스케줄: warmup과 cosine decay

학습 내내 같은 학습률을 쓰는 경우는 드물다. 대형 모델 학습의 표준은 두 단계다. 처음 수백~수천 스텝 동안 0에서 최대값까지 선형으로 올리는 warmup, 그 뒤 코사인 곡선을 따라 최소값까지 내리는 cosine decay다.

$$\eta_t = \begin{cases} \eta_{\max}\,\dfrac{t}{T_w} & t < T_w \\[2mm] \eta_{\min} + \tfrac12(\eta_{\max}-\eta_{\min})\Big(1+\cos\dfrac{\pi(t-T_w)}{T-T_w}\Big) & T_w \le t \le T \end{cases}$$
\(T_w\)는 warmup 스텝 수, \(T\)는 전체 스텝 수. warmup이 필요한 이유: 학습 초반에는 Adam의 \(v\) 추정이 불안정하고 무작위 초기 가중치의 기울기가 커서, 바로 큰 학습률을 주면 손실이 튀거나 발산한다. 후반 감쇠는 5절의 "바닥 근처 떨림"을 줄여 더 낮은 손실로 정착시킨다.
SIMULATOR

학습률 스케줄 설계

감쇠 모양
커서 위치 스텝—
그 시점 η—
warmup 스텝—
평균 η (곡선 아래 면적 / T)—
해볼 것: ① 그래프 위를 끌거나 마우스를 올려 시점별 학습률을 읽는다(전체 100,000 스텝 가정). ② "Llama 3 405B 비슷하게"는 논문 값(최대 8×10⁻⁵, warmup 8,000 스텝, 최소 8×10⁻⁷, 총 약 120만 스텝)의 비율을 이 그래프의 길이에 맞춘 것이다. warmup이 전체의 1%도 안 된다. ③ WSD(warmup–stable–decay)는 최대 학습률을 오래 유지하다가 마지막 20%에서만 급히 내리는 방식으로, 중간 체크포인트에서 학습을 연장하기 쉬워 2024년 이후 여러 모델이 쓴다.

초기화와 기울기 소실·폭주

역전파는 층마다 국소 기울기를 곱한다. 층이 \(L\)개면 입력 쪽 기울기는 \(L\)개 인자의 곱이다. 각 인자가 평균적으로 0.9면 50층 뒤 \(0.9^{50} \approx 0.005\), 1.1이면 \(1.1^{50} \approx 117\)이다. 곱셈의 사슬은 1에서 조금만 벗어나도 지수적으로 사라지거나(기울기 소실(vanishing gradient)) 터진다(기울기 폭주(exploding gradient)). 순전파의 활성값도 똑같다.

폭 \(n\)인 층 \(h' = \phi(Wh)\)에서 \(W\)의 원소가 분산 \(\sigma_w^2\)인 독립 난수라면, 선형 부분 \(u = Wh\)의 분산은 \(\operatorname{Var}[u] = n\,\sigma_w^2\,\mathbb E[h^2]\)다. 층을 지나도 크기가 유지되려면 \(n\sigma_w^2\)가 활성화 함수에 맞는 값이어야 한다.

$$\text{Xavier (Glorot, 2010)}:\; \sigma_w^2 = \frac{1}{n}\;(\tanh\text{ 등 원점 대칭}), \qquad \text{He (Kaiming, 2015)}:\; \sigma_w^2 = \frac{2}{n}\;(\text{ReLU})$$
ReLU는 입력의 절반(음수)을 0으로 만들어 2차 모멘트를 절반으로 줄이므로 2배를 보상한다. Xavier의 원래 식은 \(2/(n_{\text{in}}+n_{\text{out}})\)이며 정사각 층에서는 \(1/n\)과 같다.

아래 시뮬레이터는 폭 100인 완전연결층을 최대 50개 쌓고, 표준정규 입력 64개를 실제로 통과시킨 뒤(순전파), 출력 쪽에 무작위 기울기를 넣고 거꾸로 전파한다(역전파). 막대는 층별 활성값과 기울기의 표준편차를 로그 축에 그린 것이다.

SIMULATOR

깊은 망의 활성값·기울기 분포

초기화
활성화
마지막 층 활성값 std—
첫 층 기울기 std—
기울기 비 (첫 층 / 마지막 층)—
선택 층—
해볼 것: ① "작은 랜덤"이면 활성값이 층마다 약 10배씩 줄어 몇 층 만에 0에 붙는다. 기울기도 같이 사라진다. "큰 랜덤 + tanh"면 활성값이 ±1로 포화되고(아래 히스토그램이 양 끝에 몰린다), 포화 구간의 미분이 0이라 역시 기울기가 죽는다. ② tanh + Xavier, ReLU + He 조합이 50층에서도 크기를 비교적 유지하는지 보자. 반대로 ReLU + Xavier는 층마다 절반씩 줄어든다. ③ 막대를 클릭(탭)하면 그 층 활성값의 히스토그램이 아래에 나온다. ④ 잔차 연결을 켜면 기울기에 "그대로 지나가는 길"이 생겨 소실이 사라진다. 다만 He + ReLU에서는 활성값이 층마다 커지므로, 실제 Transformer는 잔차와 정규화(LayerNorm)를 함께 쓴다(6장).
기울기 클리핑

초기화를 잘해도 학습 중 가끔 기울기가 튀는 일(loss spike)이 생긴다. 그래서 LLM 학습은 거의 항상 전체 기울기 벡터의 노름이 임계값(보통 1.0)을 넘으면 그 길이로 잘라 내는 기울기 클리핑(gradient clipping) \(g \leftarrow g\cdot\min(1, c/\|g\|)\)를 쓴다. 방향은 유지하고 보폭만 제한한다.

과적합과 일반화

학습 데이터의 손실을 줄이는 것은 수단일 뿐, 진짜 목표는 처음 보는 데이터에서 잘 맞히는 것, 곧 일반화(generalization)다. 모델이 너무 단순하면 데이터의 패턴을 못 잡고(과소적합(underfitting)), 너무 유연하면 패턴뿐 아니라 우연한 노이즈까지 외워 버린다(과적합(overfitting)). 그래서 데이터를 학습용과 검증용(validation)으로 나누고, 검증 손실을 보며 모델과 하이퍼파라미터를 고른다.

1차: 과소적합 학습 0.186 · 참함수 대비 0.146 4차: 적당함 학습 0.009 · 참함수 대비 0.008 9차: 과적합 학습 ≈ 0 · 참함수 대비 0.260
그림 3-5. 같은 10개 점(참 함수 \(0.8\sin\pi x + 0.3x\)에 노이즈)을 다항식으로 최소제곱 피팅한 결과(실제 계산). 1차는 곡선을 못 따라가고(학습 오차도 큼), 4차는 참 함수(점선)와 비슷하며, 9차는 10개 점을 모두 정확히 지나지만(학습 오차 ≈ 0) 점 사이와 양 끝에서 크게 출렁인다.

과적합을 막는 장치를 통틀어 정규화(regularization)라 한다.

SIMULATOR

다항식 피팅: 차수, 정규화, 학습/검증 오차

● 학습 점 (끌기 / 빈 곳 클릭 = 추가) · ○ 검증 점
차수별 학습·검증 MSE (현재 λ)
데이터
학습 MSE—
검증 MSE—
파라미터 수 / 학습 점 수—
계수 노름 ‖w‖—
해볼 것: ① λ = 0(슬라이더 맨 왼쪽)에서 차수를 0 → 15로 올리며 오른쪽 그래프를 보자. 학습 MSE(실선)는 계속 내려가지만 검증 MSE(점선)는 U자를 그린다. 그 바닥이 최적의 모델 복잡도다. ② 차수 12에서 λ를 10⁻⁴ ~ 10⁻² 정도로 올리면 출렁임이 사라지고 검증 오차가 크게 줄어든다. 계수 노름 ‖w‖도 수십~수백 배 줄어드는 것을 확인하자. λ를 1까지 올리면 이번엔 과소적합이 된다. ③ 빈 곳을 클릭해 학습 점을 20개 이상으로 늘리면, 같은 차수에서도 과적합이 약해진다. 점 하나를 멀리 끌면 고차 다항식만 그 점을 쫓아간다.
거대 모델은 왜 과적합하지 않는가?

고전적 통계는 "파라미터 수 > 데이터 수면 과적합"이라고 말하지만, 현대 신경망은 데이터보다 파라미터가 훨씬 많아도 잘 일반화한다. 파라미터가 데이터 수를 넘어서는 지점 이후 검증 오차가 다시 내려가는 이중 하강(double descent) 현상(Belkin et al., 2019)과 SGD의 암묵적 정규화가 부분적인 설명이다. 한편 LLM 사전학습은 데이터가 워낙 많아 대부분의 토큰을 한 번(1 에폭 이하)만 본다. 이 영역에서는 과적합보다 과소적합이 문제여서, 사전학습 LLM은 드롭아웃을 거의 쓰지 않는다. 학습 손실과 검증 손실이 거의 같이 내려간다.

실제 규모: LLM은 어떻게 학습하는가

지금까지의 모든 요소가 LLM 사전학습에 그대로 들어간다. 손실은 다음 토큰 교차 엔트로피, 옵티마이저는 AdamW, 스케줄은 warmup + cosine(또는 WSD), 기울기 클리핑 1.0, 초기화는 작은 정규분포 + 잔차 경로 스케일링. 달라지는 것은 숫자의 크기다. Llama 3 405B 논문(Meta, 2024)이 공개한 값을 보자.

항목Llama 3 405B (2024)비고
학습 토큰약 15.6T대부분 1 에폭 이하
옵티마이저AdamW\(\beta_2 = 0.95\) 계열이 흔함
최대 / 최소 학습률8×10⁻⁵ / 8×10⁻⁷cosine, 약 120만 스텝
warmup8,000 스텝전체의 1% 미만
배치 크기4M → 8M → 16M 토큰학습 중 단계적으로 키움
계산량약 3.8×10²⁵ FLOPsH100 최대 약 16,000개

배치 크기가 "토큰 수"로 적혀 있는 것에 주목하자. 길이 8,192 토큰 시퀀스 2,048개면 약 1,600만 토큰이다. 한 스텝의 기울기는 이 1,600만 개 다음-토큰 예측의 손실 평균에서 나온다. 이렇게 큰 배치를 GPU 수천 개에 나눠 계산하고(데이터 병렬), 기울기를 모아 평균을 낸 뒤 모두가 같은 갱신을 한다.

혼합 정밀도와 옵티마이저 상태 메모리

현대 학습은 혼합 정밀도(mixed precision)를 쓴다. 행렬곱은 BF16(16비트, 9장)으로 빠르게 하고, 작은 갱신이 반올림으로 사라지지 않도록 가중치의 마스터 사본과 Adam 상태는 FP32로 유지한다. 학습률 10⁻⁵ 수준의 갱신은 BF16 가중치(유효 숫자 약 3자리)에 더하면 그대로 묻혀 버리기 때문이다.

FP32 마스터 가중치4 B BF16 가중치2 B 순전파·역전파BF16 행렬곱 BF16 기울기2 B 캐스트 AdamW 상태: m (4 B) + v (4 B) FP32로 갱신 계산 → 마스터 가중치에 반영 파라미터 1개당: 2 + 2 + 4 + 4 + 4 = 16 바이트 (활성값 제외)
그림 3-6. 혼합 정밀도 AdamW 학습에서 파라미터 하나가 차지하는 메모리. 추론에는 BF16 가중치 2바이트면 되지만, 학습은 그 8배인 약 16바이트가 필요하다. 여기에 순전파 중간값(활성값)이 배치·시퀀스 길이에 비례해 추가된다.
모델파라미터BF16 가중치 (추론)학습 상태 16 B/paramH100 80 GB 최소 개수 (상태만)
GPT-2 small124M0.25 GB2.0 GB1
Llama 3 8B8.03B16 GB128 GB2
Llama 3 70B70.6B141 GB1.13 TB15
Llama 3 405B405B810 GB6.5 TB81

8B 모델조차 학습 상태가 GPU 한 장(80 GB)에 들어가지 않는다. 그래서 가중치·기울기·옵티마이저 상태를 GPU들에 나눠 저장하는 ZeRO / FSDP(Rajbhandari et al., 2020), 층을 나누는 파이프라인 병렬, 행렬 하나를 쪼개는 텐서 병렬을 조합한다. 활성값 메모리는 역전파 때 일부 중간값을 다시 계산하는 활성값 재계산(activation checkpointing)으로 줄인다. 계산량과 토큰 수의 관계, 그리고 모델 크기와 데이터 양을 어떻게 나눌지에 대한 스케일링 법칙은 7장에서 이어진다.

핵심 정리

  1. 학습은 손실 \(\mathcal L(\theta)\)를 최소화하는 최적화다. 회귀는 MSE, 분류와 언어 모델은 교차 엔트로피 \(-\log p_c\)를 쓰며, 소프트맥스+CE의 로짓 기울기는 \(p - y\)로 확신에 찬 오답에서도 사라지지 않는다.
  2. 경사하강 \(\theta \leftarrow \theta - \eta\nabla\mathcal L\)은 \(\eta < 2/\lambda_{\max}\)일 때 수렴한다. 조건수 \(\lambda_{\max}/\lambda_{\min}\)가 크면 지그재그와 느린 수렴이 생긴다.
  3. 역전파는 계산 그래프를 거꾸로 훑으며 국소 기울기를 곱하는 연쇄법칙의 효율적 구현이다. 순전파 중간값을 저장해야 하며, 비용은 순전파의 약 2배(합쳐서 3배)다.
  4. 미니배치 SGD는 전체 기울기의 불편 추정을 쓰며 노이즈 분산은 배치 크기에 반비례한다. 1 에폭 = 데이터 한 바퀴.
  5. Momentum은 관성으로 진동을 상쇄하고, RMSProp은 좌표별로 보폭을 정규화하며, Adam(W)은 둘을 결합한다. LLM 학습은 AdamW + warmup + cosine decay + 기울기 클리핑이 표준이다.
  6. 깊은 망은 초기화 분산이 \(1/n\)(Xavier, tanh) 또는 \(2/n\)(He, ReLU)에서 벗어나면 활성값·기울기가 층마다 지수적으로 사라지거나 폭주한다. 잔차 연결과 정규화가 근본적인 해결책이다.
  7. 과적합은 검증 손실로 감지하고 L2/weight decay, 드롭아웃, 조기 종료, 데이터 확대로 막는다. LLM 사전학습은 1 에폭 이하라 과소적합 쪽에 가깝다.
  8. 혼합 정밀도 AdamW 학습은 파라미터당 약 16바이트가 필요해, 8B 모델도 GPU 여러 장에 상태를 나눠야 한다.

확인 퀴즈

1. 이진 분류에서 정답이 y = 1인데 모델이 p = σ(z) = 0.001을 냈다. 로짓 z에 대한 기울기 크기를 비교하면?

∂CE/∂z = p − y ≈ −0.999로 크기 약 1이다. ∂MSE/∂z = 2(p − y)·p(1 − p) ≈ 2·(−0.999)·0.000999 ≈ −0.002로, 시그모이드 포화 항 p(1 − p)가 기울기를 거의 지운다. 그래서 분류에는 교차 엔트로피를 쓴다.

2. 손실의 헤시안 고윳값이 0.5 ~ 40 사이에 있다. 일반 경사하강이 발산하지 않는 학습률의 상한은?

발산 조건은 가장 큰 고윳값이 정한다: η < 2/λmax = 2/40 = 0.05. 이 학습률에서 가장 완만한 방향(λ = 0.5)의 수렴 인자는 1 − 0.05·0.5 = 0.975로, 매우 느리다. 조건수 80의 대가다.

3. 계산 그래프에서 덧셈 노드 z = m + b와 곱셈 노드 m = w·x가 역전파 때 하는 일로 옳은 것은?

∂z/∂m = ∂z/∂b = 1이므로 덧셈은 받은 기울기를 두 입력에 그대로 나눠 준다(분배기). ∂m/∂w = x, ∂m/∂x = w이므로 곱셈은 서로의 값을 바꿔 곱한다(교환기). 그래서 곱셈의 역전파에는 순전파 때의 입력값 저장이 필요하다.

4. 미니배치 크기를 16에서 64로 키웠다. 미니배치 기울기 노이즈의 표준편차는 대략 어떻게 변하는가?

분산이 1/|B|에 비례하므로 4배 키우면 분산 1/4, 표준편차 1/2이다. 계산량은 4배인데 노이즈는 절반밖에 안 줄기 때문에, 어느 크기 이상에서는 배치를 늘리는 이득이 줄어든다(임계 배치 크기).

5. 50층 ReLU 망을 Xavier(σ² = 1/n)로 초기화했다. 순전파 활성값 크기는 층을 지날수록 어떻게 되는가?

ReLU는 입력의 절반을 0으로 만들어 E[h²]를 절반으로 줄인다. Xavier는 n·σ² = 1이라 이를 보상하지 못하므로 층마다 분산이 ½배, 50층이면 2⁻⁵⁰ ≈ 10⁻¹⁵배가 된다. He 초기화(σ² = 2/n)가 이 2배를 보상한다. 포화는 tanh·시그모이드에서 생기는 현상이다.

6. 70B 파라미터 모델을 혼합 정밀도 AdamW로 학습할 때, 활성값을 제외한 가중치·기울기·옵티마이저 상태 메모리는 대략?

BF16 가중치 2 + BF16 기울기 2 + FP32 마스터 4 + Adam m 4 + v 4 = 16바이트/파라미터. 70×10⁹ × 16 B ≈ 1.12 TB로, H100 80 GB 최소 15장에 나눠 담아야 한다(ZeRO/FSDP). 140 GB는 BF16 추론 가중치만의 크기다.