기계학습 기초 · 최적화
직관에서 출발해 고윳값 분해와 모멘텀 이론까지, 단계적으로 깊어지는 인터랙티브 학습자료. “왜 학습이 골짜기를 튕기며 갈까?”라는 하나의 질문을 세 가지 깊이로 답합니다.
짙은 안개 속 산비탈에 서 있다고 상상해 봅시다. 목표는 골짜기 바닥에 도달하는 것인데, 보이는 것은 발밑 경사뿐입니다. 합리적인 전략은 하나입니다. 가장 가파르게 내려가는 방향으로 한 걸음 딛고, 다시 발밑을 확인한다. 이것이 경사 하강법의 전부입니다.
기계학습에서 “산의 높이”는 모델이 틀린 정도, 즉 손실 함수 L이고, “내가 선 위치”는 모델의 파라미터 w입니다. 발밑 경사는 미분값 L′(w)입니다.
기울기 앞에 붙은 마이너스 부호가 핵심입니다. 기울기는 “올라가는 방향”을 가리키므로, 반대로 가야 내려갑니다. 기울기가 가파르면 크게, 평평하면 작게 움직이므로 바닥 근처에서는 저절로 조심스러워집니다.
경사 하강법 = 지금 위치의 기울기 반대 방향으로, 학습률만큼 이동하기를 반복. 알고리즘은 세 줄이지만, 잘 작동시키는 일은 전적으로 η에 달려 있습니다.
가장 단순한 그릇 L(w) = w2을 봅시다. 여기서 w는 모델의 파라미터(위 비유에서 "내가 선 위치")이고, L은 손실("산의 높이")입니다. w = 0일 때 손실이 0으로 가장 낮으니, 바닥은 원점입니다. 기울기는 2w이므로 갱신식은 아래처럼 곱셈 한 번으로 정리됩니다. 이 한 줄이 뒤에 나올 모든 이야기의 씨앗입니다.
슬라이더를 만지기 전에 숫자를 직접 따라가 봅시다. 출발점은 w0 = 1, 학습률은 η = 0.1. 필요한 것은 곱셈뿐입니다.
두 번째 걸음부터는 미분을 다시 할 필요조차 없습니다. 위 식대로 배율 1−2η = 0.8을 계속 곱하기만 하면 됩니다.
| k | wk | 어떻게 나왔나 | 손실 L = wk2 |
|---|---|---|---|
| 0 | 1 | 출발점 | 1 |
| 1 | 0.8 | 0.8×1 | 0.64 |
| 2 | 0.64 | 0.8×0.8 | 0.4096 |
| 3 | 0.512 | 0.8×0.64 | 0.262 |
| 4 | 0.4096 | 0.8×0.512 | 0.168 |
| 5 | 0.32768 | 0.8×0.4096 | 0.107 |
위치는 매 걸음 0.8배, 손실은 0.64배(= 0.82)씩 줄어듭니다. 바닥(0)에 정확히 닿지는 못하고 한없이 가까워질 뿐입니다. 손실이 절반이 되는 데 약 1.6걸음이 걸리니 10걸음이면 대략 1/100이 됩니다. 아래 슬라이더로 이 0.8을 직접 바꿔 보세요.
η를 움직이며 파란 점이 바닥으로 가는 경로를 관찰하세요. 0.5를 넘는 순간 점이 반대편으로 뛰어넘기 시작합니다.
실험해 보면 η의 값에 따라 완전히 다른 네 개의 체제(regime)가 나타납니다. 배율 r = 1 − 2η의 부호와 절댓값만 보면 됩니다.
| 학습률 범위 | 배율 r = 1−2η | 행동 | 비유 |
|---|---|---|---|
| 0 < η < 0.5 | 0 < r < 1 | 단조 수렴 — 한쪽에서만 접근, 부호 유지 | 조심스레 걸어 내려감 |
| 0.5 < η < 1 | −1 < r < 0 | 진동하며 수렴 — 매번 반대편으로 넘어가되 진폭은 줄어듦 | 좌우로 튕기며 가라앉음 |
| η = 1 | r = −1 | 영구 순환 — 두 점 사이를 영원히 왕복 | 제자리 진자 운동 |
| η > 1 | |r| > 1 | 발산 — 진폭이 커지며 튕겨 나감 | 골짜기 밖으로 날아감 |
이 네 줄이 실제로 어떤 숫자인지, 모두 같은 출발점 w0=1에서 나란히 놓아 봅시다. 하는 일은 앞의 표와 똑같습니다 — 배율 r을 계속 곱할 뿐입니다.
| η | 배율 r | w0 | w1 | w2 | w3 | w4 | 무슨 일이 벌어지나 |
|---|---|---|---|---|---|---|---|
| 0.1 | +0.8 | 1 | 0.8 | 0.64 | 0.512 | 0.4096 | 부호 그대로, 한쪽에서만 접근 |
| 0.5 | 0 | 1 | 0 | 0 | 0 | 0 | 한 걸음에 정확히 바닥 |
| 0.9 | −0.8 | 1 | −0.8 | 0.64 | −0.512 | 0.4096 | 매번 반대편으로 넘어가되 진폭은 줄어듦 |
| 1.0 | −1 | 1 | −1 | 1 | −1 | 1 | 영원히 두 점 왕복 |
| 1.2 | −1.4 | 1 | −1.4 | 1.96 | −2.744 | 3.8416 | 진폭이 커지며 튕겨 나감 |
η=0.1과 η=0.9는 부호만 다르고 크기가 완전히 같습니다(0.8, 0.64, 0.512 …). 배율이 각각 +0.8과 −0.8이기 때문입니다. 학습률을 아홉 배로 키웠는데 수렴 속도는 조금도 빨라지지 않고, 요란하게 진동만 하게 된 것입니다. 즉 “진동한다”와 “느리다”는 서로 다른 문제입니다. 가장 빠른 값은 그 둘 사이인 η=0.5이고, 여기서 배율이 0이 되어 단 한 걸음에 끝납니다.
진동은 학습률이 조금 큰 상태, 발산은 많이 큰 상태입니다. 둘은 종류가 다른 고장이 아니라 같은 축 위의 정도 차이입니다. 그래서 손실 곡선이 톱니처럼 흔들리기 시작하면 “곧 터질 수도 있다”는 조기 경보로 읽어야 합니다.
일반적인 함수에서는 2 대신 곡률(2계 미분) L이 들어가, 수렴 조건이 η < 2/L이 됩니다. 즉 가장 가파르게 휘는 곳의 곡률이 학습률의 상한을 정합니다. 이 사실이 다음 장의 지그재그를 낳습니다.
파라미터가 여럿이면 미분은 그래디언트(편미분 벡터) ∇L이 되고, 갱신식의 모양은 그대로입니다.
여기서 결정적인 사실이 하나 있습니다. “가장 가파른 방향”은 “최솟값을 향하는 방향”이 아닙니다. 등고선이 동그란 그릇이면 둘이 일치하지만, 길쭉한 골짜기 모양이면 그래디언트는 골짜기 바닥을 따라가는 대신 양쪽 벽을 향해 거의 수직으로 서게 됩니다. 그 결과가 지그재그입니다.
아래 지형은 L(x,y) = ½(x2/κ + y2) 입니다. κ가 커질수록 등고선이 옆으로 길게 늘어나 좁고 깊은 협곡이 됩니다.
κ를 키우면 골짜기가 좁아지고, η를 올리면 세로 방향으로 튕기기 시작합니다. β(모멘텀)를 올려 지그재그가 어떻게 눌리는지 확인하세요.
이 지형에서는 두 축이 서로 간섭하지 않으므로, 벡터 갱신식을 두 개의 독립적인 1차원 문제로 쪼갤 수 있습니다. 이것이 지그재그를 이해하는 가장 명확한 방법입니다.
같은 η를 쓰지만 각 축이 느끼는 배율은 서로 다릅니다. 곡률이 큰 축은 ηλ가 커서 배율이 음수가 되기 쉽고(→ 부호가 매번 뒤집힘 = 진동), 곡률이 작은 축은 배율이 1에 가까워 거의 움직이지 않습니다(→ 답답한 전진).
위: 완만한 축(x) · 아래: 가파른 축(y). 막대가 기준선 위아래로 번갈아 서면 그것이 지그재그의 정체입니다. 데모 2의 슬라이더와 실시간으로 연동됩니다. 막대 높이는 압축(0.35승) 스케일 — 급감하는 진폭에서도 부호 교대가 보이도록 한 것입니다.
지그재그는 알고리즘의 버그가 아니라 “가파른 축은 이미 과도하게, 완만한 축은 여전히 부족하게” 움직이는 상태입니다. 하나의 η로 서로 다른 곡률의 축들을 동시에 만족시킬 수 없기 때문에 생기는 구조적 갈등입니다. 진행은 완만한 축이 결정하고, 안정성은 가파른 축이 결정합니다.
두 축의 곡률 비율을 조건수(condition number)라 부릅니다.
이제 딜레마가 선명해집니다.
η를 λmax에 맞추면 λmin 방향은 ηλmin ≈ 2/κ만큼만 줄어들어 κ가 클수록 기어갑니다. 반대로 λmin에 맞춰 η를 키우면 λmax 방향이 폭발합니다. κ가 곧 문제의 난이도인 셈입니다.
LEVEL 1의 1차원 예제에 축을 하나 더한 것이 이번 예제입니다. 달라지는 것은 딱 하나 — 두 축의 곡률이 다르다는 점, 즉 κ > 1입니다. 앞에서는 배율이 1−2η 하나뿐이었지만, 이제는 축마다 배율이 따로 생깁니다. 아래 숫자는 전부 손으로 검산할 수 있으며, 데모 2를 κ=10, η=1.6으로 맞추면 같은 경로를 눈으로 볼 수 있습니다.
기울기는 각 변수로 편미분하면 됩니다. ∂L/∂x = x/10, ∂L/∂y = y이므로 시작점에서 ∇L = (0.5, 2)입니다. 이제 갱신식에 그대로 넣습니다.
단 한 걸음에 지그재그의 씨앗이 심어졌습니다. 게다가 방향 자체가 어긋나 있습니다. 최솟값은 왼쪽으로 5, 아래로 2 떨어져 있는데, 그래디언트 반대 방향은 왼쪽으로 0.5, 아래로 2를 가리킵니다. 두 방향의 각도 차이는 약 54°. “가장 가파른 방향”이 “가야 할 방향”이 아니라는 말이 이 숫자입니다.
점선은 시작점에서 최솟값을 향하는 방향, 파란 선은 실제 경로입니다. 첫 걸음(k=0→1)이 점선과 54° 어긋난 채 바닥을 지나쳐 반대편으로 넘어가고, 그때부터 경로가 톱니처럼 접힙니다. 숫자는 반복 횟수 k. 가로축이 확대되어 그려져 화면상 각도는 실제 값과 다릅니다.
두 번째 걸음부터는 계산을 반복할 필요도 없습니다. 축별로 배율 곱셈일 뿐이니까요.
| k | xk 완만 · 매번 ×0.84 | yk 가파름 · 매번 ×(−0.6) | 손실 Lk |
|---|---|---|---|
| 0 | 5.000 | 2.000 | 3.250 |
| 1 | 4.200 | −1.200 | 1.602 |
| 2 | 3.528 | 0.720 | 0.882 |
| 3 | 2.964 | −0.432 | 0.532 |
| 4 | 2.489 | 0.259 | 0.343 |
| 5 | 2.091 | −0.156 | 0.231 |
| 6 | 1.756 | 0.093 | 0.159 |
| 7 | 1.475 | −0.056 | 0.110 |
| 8 | 1.239 | 0.034 | 0.077 |
| 9 | 1.041 | −0.020 | 0.054 |
| 10 | 0.875 | 0.012 | 0.038 |
이 표에서 읽어야 할 것은 세 가지입니다.
같은 10걸음을 축별로 분리한 것입니다(가로축은 반복 k, 세로축은 좌표값). y는 0선을 매번 가로지르며 튕기고, x는 한 번도 0선을 넘지 않고 완만하게 미끄러집니다. 지그재그는 주황 선, 학습이 끝나지 않는 이유는 초록 선입니다.
수치로 확인하면 격차가 분명합니다. 10걸음 뒤 y는 처음의 0.6%까지 줄었지만 x는 아직 17.5%가 남아 있습니다. 각 축이 1/1000까지 줄어드는 데 필요한 걸음 수는 y축이 14회, x축이 40회입니다. 즉 전체 학습 시간의 3분의 2 가까이가 이미 조용해진 세로축을 데리고 가로축을 기다리는 시간입니다.
| η | 가로 배율 1−η/10 | 세로 배율 1−η | 1/1000 도달 | 무슨 일이 벌어지나 |
|---|---|---|---|---|
| 0.5 | +0.950 | +0.500 | 135회 | 진동은 전혀 없다. 대신 가로축이 거의 멈춰 있어 가장 느리다. |
| 1.0 | +0.900 | 0.000 | 66회 | 세로축이 단 한 걸음에 정확히 0. 지그재그가 완전히 사라지는데도 여전히 66회. |
| 1.6 | +0.840 | −0.600 | 40회 | 세로축은 진동, 가로축은 전진. 위 표의 예제. |
| 1.818 | +0.818 | −0.818 | 35회 | 최적 η★ = 2/(0.1+1). 두 배율의 절댓값이 같아지는 점 — 가장 빠른데 진동은 가장 심하다. |
| 2.1 | +0.790 | −1.100 | 발산 | 세로 배율의 절댓값이 1을 넘어 진폭이 매 걸음 1.1배로 커진다. |
η를 1.0으로 낮추면 지그재그는 완전히 없어집니다. 그런데 수렴은 오히려 1.9배 느려집니다(35회 → 66회). 진동을 없애는 것과 빨리 수렴하는 것은 같은 목표가 아닙니다. 최적점 η★=1.818은 진동을 감수하고 고른 값이며, 거기서도 40걸음 남짓이 필요한 이유는 순전히 κ=10이라는 지형 탓입니다.
세로축은 로그 스케일입니다. 위 표를 그림으로 옮긴 것으로, 기울기가 가파를수록 빠른 학습입니다. η=0.5(회색)는 매끈하지만 가장 완만하고, η=2.1(빨강)만 위로 치솟아 발산합니다. 진동하는 η=1.6·1.818이 오히려 아래쪽에 있다는 점을 보세요.
이 지형의 이론적 최적값은 β★ = 0.270, η★ = 2.309입니다(κ=10이라 β가 관행값 0.9보다 훨씬 작습니다). 같은 시작점에서 손실을 나란히 놓으면 이렇습니다.
| k | 0 | 2 | 4 | 5 | 6 | 8 | 10 |
|---|---|---|---|---|---|---|---|
| 경사 하강법 (η=1.6) | 3.250 | 0.882 | 0.343 | 0.231 | 0.159 | 0.077 | 0.0383 |
| 모멘텀 (η★, β★) | 3.250 | 2.726 | 0.588 | 0.232 | 0.086 | 0.011 | 0.0012 |
초반 네 걸음은 모멘텀이 오히려 손해입니다. 관성 때문에 더 크게 넘어가 k=2에서는 손실이 3배 넘게 높습니다. 그러다 5번째 걸음에서 따라잡고, 10번째 걸음에서는 33배 앞섭니다. 모멘텀은 “첫 걸음을 잘 딛는 방법”이 아니라 “반복이 쌓일수록 유리해지는 방법”입니다. 몇 걸음만 보고 옵티마이저를 판단하면 안 되는 이유이기도 합니다.
왼쪽은 경로, 오른쪽은 손실입니다. 모멘텀(주황)은 초반에 더 크게 넘어갔다가 진동이 스스로 상쇄되며 중심으로 빨려 들어갑니다. 오른쪽 그래프에서 두 선이 교차하는 5번째 걸음이 역전 지점입니다.
이차 함수라면 최적의 η를 정확히 계산할 수 있습니다. 모든 축의 배율 중 최댓값 maxi |1 − ηλi|를 최소화하면 되는데, 이는 양 끝 두 개, 즉 |1−ηλmin|과 |1−ηλmax|가 같아지는 지점입니다.
주목할 점: 최적 학습률에서도 지그재그는 사라지지 않습니다. 정의상 η★λmax = 2κ/(κ+1) > 1이므로 가파른 축의 배율은 항상 음수입니다. 최적점은 “진동 없음”이 아니라 “진동의 감쇠 속도와 전진 속도가 정확히 균형을 이루는 점”입니다.
| 조건수 κ | 최적 ρ = (κ−1)/(κ+1) | 오차 1/1000 반복 수 | 모멘텀 사용 시 | 절감 |
|---|---|---|---|---|
| 10 | 0.818 | 35 | 11 | 3.2× |
| 50 | 0.961 | 173 | 25 | 6.9× |
| 100 | 0.980 | 346 | 35 | 9.9× |
| 1,000 | 0.998 | 3,454 | 110 | 31× |
| 10,000 | 0.9998 | 34,539 | 346 | 100× |
반복 수가 κ에 선형으로 늘어납니다. κ가 10배가 되면 학습 시간도 10배입니다. 그런데 마지막 열이 말하듯, 모멘텀을 쓰면 이 의존성이 κ로 떨어집니다 — 이것이 다음 절의 핵심입니다.
가장 근본적인 해법은 알고리즘이 아니라 지형을 바꾸는 것입니다. 입력 특징을 표준화(평균 0, 분산 1)하거나 배치 정규화·층 정규화를 넣으면 헤세 행렬의 고윳값 분포가 좁아져 κ 자체가 줄어듭니다. 데모 2에서 κ=1 버튼을 누르면 경로가 단 한 걸음의 직선이 되는 것을 볼 수 있습니다. 지그재그 대응책 중 비용 대비 효과가 가장 큽니다.
이전 이동 방향을 관성으로 누적합니다. 공이 골짜기를 구르듯 움직인다는 비유에서 이름이 왔습니다.
왜 지그재그가 줄어들까요? 부호 때문입니다. 진동하는 축의 그래디언트는 +, −, +, −로 번갈아 나타나므로 누적하면 서로 상쇄됩니다. 반면 골짜기를 따라가는 축의 그래디언트는 계속 같은 부호라 누적되어 실효 보폭이 최대 1/(1−β)배(β=0.9면 10배)까지 커집니다. 억눌러야 할 방향은 억누르고, 밀어야 할 방향은 미는 셈입니다.
Nesterov 가속 경사법(NAG)은 “먼저 관성만큼 미리 가본 뒤 그 지점의 기울기를 재는” 변형으로, 과도한 오버슈트를 한 박자 먼저 교정합니다. 일반 볼록 함수에서 O(1/k2) 수렴률을 보장하며, 이는 1차 방법이 도달 가능한 이론적 최적입니다.
“하나의 η로 모든 축을 감당할 수 없다”는 것이 문제였으니, 축마다 η를 다르게 주자는 접근입니다. 최근 그래디언트 제곱의 이동 평균으로 각 축을 나눠 줍니다.
그래디언트가 큰(가파른) 축은 v가 커서 자동으로 보폭이 줄고, 작은 축은 늘어납니다. 대각 근사 전처리(diagonal preconditioning)로 κ를 실질적으로 낮추는 것과 같습니다. 다만 축이 회전된 골짜기(변수 간 상관이 큰 경우)에는 대각 성분만으로 부족해 효과가 제한됩니다.
뉴턴법 wk+1 = wk − H−1∇L은 헤세 행렬의 역행렬을 곱해 지형을 완벽한 원으로 되돌립니다(실질 κ = 1). 이차 함수라면 단 한 걸음에 끝납니다. 문제는 파라미터 n개일 때 H가 n×n이라 딥러닝(n ≈ 10⁹)에서는 계산이 불가능하다는 점. 그래서 L-BFGS(저계수 근사), K-FAC(크로네커 인수분해), Shampoo 같은 근사 2차 방법이 쓰입니다.
초반에는 큰 η로 빠르게 내려오고 후반에는 줄여 진동을 잠재우는 학습률 스케줄(step decay, cosine annealing)이 표준입니다. 초반 발산을 막는 워밍업, 그래디언트 폭발을 잘라내는 클리핑도 함께 쓰입니다. 다만 이들은 증상 완화이지 κ를 줄이지는 않습니다.
같은 골짜기, 같은 시작점, 같은 반복 횟수에서 세 방법의 경로를 겹쳐 봅니다.
경사 하강법과 모멘텀 모두 이론적 최적 파라미터(η★, β★)를 씁니다. 그런데도 파란 경로는 끝까지 벽을 튕기며 기어가고, 주황 경로는 초반에 관성으로 크게 한 번 휘돈 뒤 진동이 스스로 상쇄되며 정확히 안착합니다. κ를 키울수록 아래 손실 곡선의 격차가 벌어집니다.
| 증상 | 가장 흔한 원인 | 먼저 해볼 것 |
|---|---|---|
| 손실이 NaN/Inf가 됨 | η > 2/λmax (발산) | η를 1/3~1/10로, 워밍업, 그래디언트 클리핑 |
| 손실이 톱니처럼 크게 진동하며 잘 안 줄어듦 | η가 임계값 근처 (지그재그) | η 절반으로 ↓, 모멘텀 β=0.9, 입력 정규화 |
| 손실이 거의 평평하게 아주 천천히 감소 | η 과소 또는 κ 과대 | η ↑, 정규화, Adam, 학습률 탐색(LR range test) |
| 초반엔 빠르다가 중반에 정체 | 좁은 골짜기 진입, κ 유효값 상승 | 모멘텀/Nesterov, cosine 스케줄 |
| 학습 손실만 흔들리고 추세는 하락 | 미니배치 노이즈 (지그재그 아님) | 배치 크기 ↑, EMA 평활화 후 재판단 |
| 일부 층만 학습되고 나머지는 정체 | 층간 그래디언트 스케일 불균형 | 층별 학습률, 정규화 층 추가, 가중치 초기화 점검 |