수학

MATH / 중급 46번

경사하강법 유도와 학습률 상한이 2/L인 이유

1차 근사에서 경사하강 갱신식을 끌어내고, 그래디언트의 립시츠 상수 L로 손실이 반드시 줄어드는 구간 0 < η < 2/L을 유도합니다. 수렴에서 진동을 거쳐 발산으로 넘어가는 경계를 이차함수에서 재현하고, 조건수가 반복 수를 몇 배로 늘리는지 계산합니다.

PALDYN Team33 MIN READ

학습률을 3×10−43\times10^{-4} 에서 3×10−33\times10^{-3} 으로 올렸더니 몇 스텝 만에 손실이 nan이 되었습니다. 흔한 일이고, 대개 "학습률이 너무 컸다"로 정리하고 넘어갑니다. 그런데 너무 크다는 것은 무엇보다 큰 것일까요. 이 글의 답은 정확한 수 하나입니다.

지난 글에서 지형을 2차까지 근사하는 법과 헤세의 고윳값이 곡률이라는 것을 세웠습니다. 그 도구로 경사하강 갱신식을 유도하고, 손실이 반드시 줄어드는 학습률의 구간이 0<η<2/L0 < \eta < 2/L 임을 증명한 뒤, 그 경계를 이차함수에서 숫자로 재현합니다.

최급강하 방향의 유도

1차 근사와 코시-슈바르츠

지금 위치 xx 에서 한 걸음 Δ\Delta 를 옮깁니다. 걸음의 크기는 ∥Δ∥=r\|\Delta\| = r 로 고정하고, 방향만 고르는 문제로 놓습니다. 1차 근사를 씁니다.

f(x+Δ)≈f(x)+∇f(x)⋅Δf(x + \Delta) \approx f(x) + \nabla f(x)\cdot\Delta

f(x)f(x) 는 고정이므로 줄이려면 ∇f(x)⋅Δ\nabla f(x)\cdot\Delta 를 가장 작게 만들어야 합니다. 코시–슈바르츠 부등식이 이 값의 하한을 줍니다.

∇f(x)⋅Δ ≥ −∥∇f(x)∥ ∥Δ∥=−r ∥∇f(x)∥\nabla f(x)\cdot\Delta \ \ge\ -\|\nabla f(x)\|\,\|\Delta\| = -r\,\|\nabla f(x)\|

등호는 두 벡터가 정확히 반대 방향일 때만 성립합니다.

Δ⋆=− r ∇f(x)∥∇f(x)∥\Delta^\star = -\,r\,\frac{\nabla f(x)}{\|\nabla f(x)\|}

경사하강법. 크기를 정해 놓고 1차 근사를 가장 많이 줄이는 방향은 그래디언트의 반대쪽뿐이다.

rr 을 η∥∇f(x)∥\eta\|\nabla f(x)\| 로 잡으면 노름이 약분되어 익숙한 식이 됩니다.

xt+1=xt−η ∇f(xt)x_{t+1} = x_t - \eta\,\nabla f(x_t)

크기를 고정하면 가장 많이 내려가는 방향은 −∇f 하나뿐이다

가장 가파르다는 말의 단서

이 유도에는 조용히 깔린 전제가 하나 있습니다. 걸음의 크기를 무엇으로 쟀는가입니다. 위에서는 ∥Δ∥\|\Delta\| 를 L2 노름으로 읽었고, 코시–슈바르츠는 L2 노름에 딸린 부등식입니다. 자를 바꾸면 답도 바뀝니다.

"가장 가파른 방향은 −∇f-\nabla f 다"라는 문장은 그래서 반쪽입니다. 온전한 문장은 이렇습니다 — 걸음을 유클리드 거리로 재기로 했을 때 가장 가파른 방향이 −∇f-\nabla f 입니다. 최적화 알고리즘이 여럿인 까닭의 절반이 여기서 나옵니다. 저마다 다른 자를 들고 있으면 저마다 다른 "가장 가파른 방향"을 얻습니다.

최대 노름과 sign-SGD

자를 하나 바꿔 봅니다. 걸음의 크기를 최대 노름 ∥Δ∥∞=max⁡i∣Δi∣\|\Delta\|_\infty = \max_i |\Delta_i| 로 재기로 합니다 — 좌표 하나하나가 rr 을 넘지만 않으면 된다는 제약입니다. 이때 ∇f⋅Δ\nabla f\cdot\Delta 의 하한은 코시–슈바르츠가 아니라 그 일반형인 횔더 부등식이 줍니다.

∇f(x)⋅Δ ≥ −∥∇f(x)∥1 ∥Δ∥∞=−r∑i∣∂f∂xi∣\nabla f(x)\cdot\Delta \ \ge\ -\|\nabla f(x)\|_1\,\|\Delta\|_\infty = -r\sum_i\left|\frac{\partial f}{\partial x_i}\right|

등호가 성립하려면 좌표마다 Δi\Delta_i 가 그래디언트 성분과 반대 부호로 꽉 차 있어야 합니다.

Δi⋆=− r sign⁡ ⁣(∂f∂xi)\Delta_i^\star = -\,r\,\operatorname{sign}\!\left(\frac{\partial f}{\partial x_i}\right)

크기가 아예 사라지고 부호만 남았습니다. 그래디언트 성분이 0.0010.001 이든 100100 이든 그 좌표는 똑같이 rr 만큼 움직입니다. 이 갱신식에 sign-SGD라는 이름이 붙어 있고, Adam이 실제로 하는 일과 닮았다는 지적이 자주 나오는 것도 이 때문입니다 — Adam은 각 좌표를 그 좌표의 그래디언트 크기로 나누므로 결과가 부호 쪽으로 밀립니다.

같은 그래디언트라도 걸음을 재는 자를 바꾸면 최적 방향이 달라진다

좌표의 축척과 방향

한 발 더 갑니다. 자를 그대로 두고 좌표만 바꿔도 방향이 바뀝니다. 파라미터를 xi→100 xix_i \to 100\,x_i 로 다시 쓰면 그 좌표의 편도함수는 100100 분의 1이 되고, 그래디언트 벡터가 가리키는 쪽이 통째로 돌아갑니다. 함수는 그대로인데 방향만 달라졌습니다.

그래서 그래디언트는 함수에만 딸린 값이 아니라 좌표계에도 딸린 값입니다. 입력 표준화가 학습을 바꾸는 이유, 층마다 스케일이 다르면 한 학습률로 다 맞출 수 없는 이유가 전부 이 한 줄에서 나옵니다. 아래에서 조건수를 다룰 때 같은 이야기가 숫자로 돌아옵니다.

L-매끄러움

립시츠 상수와 곡률

위의 유도가 옳은 것은 1차 근사가 맞는 동안뿐입니다. rr 을 키우면 근사가 어긋나고, 어긋나면 "가장 많이 줄이는 방향"이라는 근거가 사라집니다. 그래서 얼마나 커도 되는지를 재려면 근사의 오차를 위에서 눌러 줄 무언가가 필요합니다.

그 무언가가 이것입니다. 함수 ff 가 L-매끄럽다는 것은 그래디언트가 립시츠 연속이라는 뜻입니다.

∥∇f(x)−∇f(y)∥ ≤ L ∥x−y∥\|\nabla f(x) - \nabla f(y)\| \ \le\ L\,\|x - y\|

립시츠 상수는 "입력이 1만큼 움직일 때 출력이 최대 얼마나 움직이는가"의 상한입니다. 여기서는 입력이 위치, 출력이 그래디언트입니다. 즉 LL 은 기울기가 변하는 속도의 상한이고, 기울기가 변하는 속도는 곧 곡률입니다.

두 번 미분 가능하면 관계가 정확히 드러납니다. L-매끄러움은 모든 점에서

λmax⁡(∇2f(x)) ≤ L\lambda_{\max}\big(\nabla^2 f(x)\big) \ \le\ L

과 같습니다. LL 은 지형 전체에서 가장 가파르게 굽은 곳의 곡률입니다. 지난 글의 λmax⁡\lambda_{\max} 를 전 구간에 걸쳐 최대로 잡은 값입니다.

하강 보조정리

이제 1차 근사의 오차를 LL 로 누릅니다. d=y−xd = y - x 라 두고 g(t)=f(x+td)g(t) = f(x + td) 를 미적분의 기본정리로 적습니다.

f(y)−f(x)=∫01∇f(x+td)⋅d dtf(y) - f(x) = \int_0^1 \nabla f(x + td)\cdot d\ dt

양변에서 1차 항 ∇f(x)⋅d\nabla f(x)\cdot d 를 빼면

f(y)−f(x)−∇f(x)⋅d=∫01(∇f(x+td)−∇f(x))⋅d dtf(y) - f(x) - \nabla f(x)\cdot d = \int_0^1 \big(\nabla f(x+td) - \nabla f(x)\big)\cdot d\ dt

적분 안의 내적을 코시–슈바르츠와 L-매끄러움으로 차례로 누릅니다. ∥x+td−x∥=t∥d∥\|x + td - x\| = t\|d\| 이므로

(∇f(x+td)−∇f(x))⋅d ≤ L t ∥d∥⋅∥d∥=L t ∥d∥2\big(\nabla f(x+td) - \nabla f(x)\big)\cdot d \ \le\ L\,t\,\|d\|\cdot\|d\| = L\,t\,\|d\|^2

이고, ∫01Lt∥d∥2dt=L2∥d∥2\int_0^1 L t \|d\|^2 dt = \tfrac{L}{2}\|d\|^2 입니다.

하강 보조정리. f(y) ≤ f(x)+∇f(x)⋅(y−x)+L2∥y−x∥2f(y) \ \le\ f(x) + \nabla f(x)\cdot(y-x) + \dfrac{L}{2}\|y - x\|^2

근사가 아니라 부등식입니다. 어디서나 성립하는 상계이고, 오른쪽은 yy 에 대한 이차함수 — 위로 열린 포물면입니다. 곡률이 LL 인 그릇을 접점에 얹으면 함수가 그 아래에 완전히 들어간다는 그림입니다.

하강 보조정리: 곡률 L의 포물면이 함수를 위에서 덮는다

L이 없는 손실

LL 이 아예 존재하지 않는 함수가 있습니다. 가장 가까운 예가 절댓값 f(x)=∣x∣f(x) = |x| 입니다. 원점 왼쪽에서 기울기가 −1-1, 오른쪽에서 +1+1 이라 xx 가 조금만 움직여도 그래디언트가 2만큼 뜁니다. ∥x−y∥\|x-y\| 를 아무리 작게 잡아도 부등식 2≤L∥x−y∥2 \le L\|x-y\| 를 만족하는 유한한 LL 이 없습니다.

ReLU가 정확히 같은 모양입니다. 꺾인 점에서 도함수가 0에서 1로 뛰고, 그 점을 지나는 신경망의 손실은 원리상 L-매끄럽지 않습니다. 그런데도 경사하강이 굴러가는 것은 꺾인 점이 측도 0인 자리라 학습 중에 정확히 밟을 일이 거의 없고, 그 점을 뺀 구간마다는 매끄럽기 때문입니다. 보조정리가 깨지는 것과 알고리즘이 안 도는 것은 다른 이야기이고, 이론이 주는 보장이 사라졌을 뿐 경험적으로는 잘 돕니다.

구간마다 다른 L

존재하더라도 문제가 남습니다. LL 은 지형 전체의 최대 곡률이라, 어딘가 한 군데만 몹시 가파르면 그 값이 전체를 대표해 버립니다. 손실 지형은 대개 평평한 벌판과 좁고 깊은 골짜기가 섞여 있어서, 전역 LL 로 정한 η=1/L\eta = 1/L 은 벌판에서 쓸모없이 작습니다. 이론의 상한이 실무의 학습률보다 훨씬 보수적인 것이 이 때문입니다.

지금 있는 자리의 LL 을 재는 것은 어렵지 않습니다. 정의를 그대로 쓰면 됩니다.

L^=max⁡x≠y ∥∇f(x)−∇f(y)∥∥x−y∥\hat{L} = \max_{x \ne y}\ \frac{\|\nabla f(x) - \nabla f(y)\|}{\|x - y\|}

두 점을 가까이 뽑아 그래디언트 차의 노름을 거리로 나누고, 여러 쌍에서 가장 큰 값을 취합니다. 헤세 전체를 만들지 않고도 국소 곡률의 하한을 얻는 손쉬운 방법이라, 학습률을 고를 때 자주 쓰이는 어림입니다.

학습률 상한 2/L

상한의 유도

이제 상계에 경사하강 갱신을 그대로 넣습니다. y=x−η∇f(x)y = x - \eta\nabla f(x) 이므로 y−x=−η∇f(x)y - x = -\eta\nabla f(x) 이고 ∥y−x∥2=η2∥∇f(x)∥2\|y-x\|^2 = \eta^2\|\nabla f(x)\|^2 입니다.

f(xt+1) ≤ f(xt)−η∥∇f∥2+L2η2∥∇f∥2f(x_{t+1}) \ \le\ f(x_t) - \eta\|\nabla f\|^2 + \frac{L}{2}\eta^2\|\nabla f\|^2

∥∇f∥2\|\nabla f\|^2 로 묶습니다.

f(xt+1) ≤ f(xt)−η(1−Lη2)∥∇f(xt)∥2f(x_{t+1}) \ \le\ f(x_t) - \eta\left(1 - \frac{L\eta}{2}\right)\|\nabla f(x_t)\|^2

∥∇f∥2≥0\|\nabla f\|^2 \ge 0 이므로 손실이 반드시 줄어들려면 앞의 계수가 양수여야 합니다.

η(1−Lη2)>0   ⟺   η>0 이고 Lη2<1\eta\left(1 - \frac{L\eta}{2}\right) > 0 \ \iff\ \eta > 0 \ \text{이고}\ \frac{L\eta}{2} < 1

학습률 상한. 0<η<2L0 < \eta < \dfrac{2}{L} 이면 매 스텝 손실이 줄어든다.

최적 학습률 1/L

한 걸음 더 갑니다. 감소량 η−L2η2\eta - \tfrac{L}{2}\eta^2 를 η\eta 에 대해 최대로 만드는 지점은 미분해서 1−Lη=01 - L\eta = 0, 즉

η⋆=1L,그때 감소량 ≥ 12L∥∇f(xt)∥2\eta^\star = \frac{1}{L}, \qquad \text{그때 감소량} \ \ge\ \frac{1}{2L}\|\nabla f(x_t)\|^2

입니다. 가장 좋은 학습률은 상한의 절반이고, 상한에서 조금 떨어진 자리가 아니라 정확히 그 절반입니다.

η\eta 를 00 에서 2/L2/L 로 키우면 감소량은 η=1/L\eta = 1/L 까지 늘다가 다시 줄어 2/L2/L 에서 00 이 됩니다. 그 너머는 보장이 사라집니다.

줄어드는 것과 닿는 것

여기서 문장을 정확히 읽어야 합니다. 방금 얻은 것은 매 스텝 손실이 줄어든다이지 최솟값에 닿는다가 아닙니다. 줄어들기만 하면서 영원히 못 닿는 수열이 얼마든지 있습니다.

닿는다는 쪽을 말하려면 감소량을 TT 스텝 동안 더해야 합니다. η=1/L\eta = 1/L 로 두고 부등식을 t=0t = 0 부터 T−1T-1 까지 더하면 왼쪽이 망원경처럼 접혀

12L∑t=0T−1∥∇f(xt)∥2 ≤ f(x0)−f⋆\frac{1}{2L}\sum_{t=0}^{T-1}\|\nabla f(x_t)\|^2 \ \le\ f(x_0) - f^\star

가 됩니다. f⋆f^\star 는 손실의 최솟값입니다. 합이 유한한 값에 갇혀 있으므로 항들이 0으로 가야 하고, 가장 작은 항을 골라 적으면

min⁡t<T ∥∇f(xt)∥ ≤ 2L(f(x0)−f⋆)T\min_{t < T}\ \|\nabla f(x_t)\| \ \le\ \sqrt{\frac{2L\big(f(x_0)-f^\star\big)}{T}}

그래디언트가 1/T1/\sqrt{T} 규모로 줄어듭니다. 이것이 볼록성을 가정하지 않았을 때 얻을 수 있는 전부입니다 — 그래디언트가 작은 점에 다다른다는 말이지, 그 점이 최솟값이라는 말은 아닙니다. 안장점에서도 그래디언트는 0입니다.

미니배치에서의 단서

한 가지가 더 남습니다. 위의 모든 계산은 진짜 그래디언트 ∇f\nabla f 를 쓴다고 가정했습니다. 실제로 쓰는 것은 미니배치에서 잰 추정값 gg 이고, E[g]=∇f\mathbb{E}[g] = \nabla f 이지만 E[∥g∥2]=∥∇f∥2+σ2/B\mathbb{E}[\|g\|^2] = \|\nabla f\|^2 + \sigma^2/B 입니다. 뒤의 항이 분산에서 온 잡음입니다.

이것을 하강 보조정리에 넣으면 감소량 식에 L2η2σ2/B\tfrac{L}{2}\eta^2\sigma^2/B 가 더 붙습니다. 그래디언트가 0에 가까워져도 이 항은 사라지지 않으므로 손실이 어느 선 아래로는 안 내려가고 그 선을 맴돕니다. 가장 단순한 예로 f(x)=12λx2f(x) = \tfrac12\lambda x^2 에 표준편차 σ\sigma 의 잡음을 섞으면 E[xt+12]=(1−ηλ)2E[xt2]+η2σ2\mathbb{E}[x_{t+1}^2] = (1-\eta\lambda)^2\mathbb{E}[x_t^2] + \eta^2\sigma^2 이고, 고정점은

E[x∞2]=η2σ21−(1−ηλ)2\mathbb{E}[x_\infty^2] = \frac{\eta^2\sigma^2}{1 - (1-\eta\lambda)^2}

입니다. λ=1\lambda = 1, σ=1\sigma = 1 로 계산해 보면 이렇습니다.

η\eta (1−ηλ)2(1-\eta\lambda)^2 맴도는 자리 E[x∞2]\mathbb{E}[x_\infty^2]
0.05 0.9025 0.0256
0.1 0.81 0.0526
0.2 0.64 0.1111
0.5 0.25 0.3333

학습률을 줄이면 맴도는 자리가 같이 내려갑니다. 학습 막바지에 학습률을 낮추는 것이 왜 손실을 한 단 더 떨어뜨리는지가 이 표에 그대로 있습니다. 배치 크기 BB 를 키워 σ2/B\sigma^2/B 를 줄이는 것도 같은 일을 합니다.

이차함수에서의 경계

한 스텝이 곱셈 하나

가장 단순한 예로 경계가 정확한지 확인합니다. f(x)=12λx2f(x) = \tfrac12\lambda x^2 이면 ∇f=λx\nabla f = \lambda x 이고 f′′=λf'' = \lambda 이므로 L=λL = \lambda 입니다. 갱신식은

xt+1=xt−ηλxt=(1−ηλ) xtx_{t+1} = x_t - \eta\lambda x_t = (1 - \eta\lambda)\,x_t

한 스텝이 곱셈 하나입니다. tt 스텝 뒤에는 xt=(1−ηλ)tx0x_t = (1-\eta\lambda)^t x_0 이므로 거듭제곱의 크기가 전부를 정합니다.

∣1−ηλ∣<1   ⟺   −1<1−ηλ<1   ⟺   0<η<2λ=2L|1 - \eta\lambda| < 1 \ \iff\ -1 < 1 - \eta\lambda < 1 \ \iff\ 0 < \eta < \frac{2}{\lambda} = \frac{2}{L}

상계에서 얻은 조건과 정확히 같습니다. 이 경우에는 부등식이 아니라 등호로 딱 맞는 경계입니다.

부호와 손실이 갈리는 구간

λ=1\lambda = 1, x0=1x_0 = 1 로 여섯 가지 학습률을 돌려 봅니다. 손실은 f=x2/2f = x^2/2 이므로 마지막 열은 x6x_6 에서의 손실입니다.

η\eta ∥1−ηλ∥\|1-\eta\lambda\| x0→x6x_0 \to x_6 f(x6)f(x_6) 무슨 일이
0.5 0.50 1, 0.5, 0.25, 0.125, 0.0625, 0.0312, 0.0156 0.000122 부호를 지키며 수렴
1.0 0.00 1, 0, 0, 0, 0, 0, 0 0 한 걸음에 도착
1.5 0.50 1, −0.5, 0.25, −0.125, 0.0625, −0.0312, 0.0156 0.000122 부호가 바뀌며 수렴
1.9 0.90 1, −0.9, 0.81, −0.729, 0.6561, −0.5905, 0.5314 0.141 크게 튀며 아주 느리게 수렴
2.0 1.00 1, −1, 1, −1, 1, −1, 1 0.5 영원히 진동 — 경계
2.1 1.10 1, −1.1, 1.21, −1.331, 1.4641, −1.6105, 1.7716 1.569 발산

학습률에 따라 수렴·진동·발산으로 갈린다

η=0.5\eta = 0.5 와 η=1.5\eta = 1.5 의 손실 열이 똑같습니다. ∣1−ηλ∣|1-\eta\lambda| 가 둘 다 0.5라 ∣xt∣|x_t| 가 같기 때문입니다. 위치는 한쪽이 부호를 지키고 다른 쪽이 매 스텝 뒤집는데, 손실만 보면 구별이 안 됩니다. 손실 곡선이 얌전히 내려가고 있다고 해서 파라미터가 얌전히 움직이는 중이라고 읽으면 안 된다는 뜻입니다.

1/L<η<2/L1/L < \eta < 2/L 이 그 구간입니다 — 부호는 매 스텝 오가는데 손실은 단조로 줄어듭니다. η=1/L=1\eta = 1/L = 1 에서 한 걸음에 끝나는 것도 위의 η⋆=1/L\eta^\star = 1/L 그대로입니다.

안정성의 가장자리

η=2/L\eta = 2/L 은 발산이 아니라 진동의 경계입니다 — 줄어들지도 커지지도 않습니다. 실제 학습에서 손실이 nan으로 가는 것은 이 선을 넘은 다음이고, 넘는 순간 ∣1−ηλ∣t|1-\eta\lambda|^t 가 지수적으로 커집니다.

흥미로운 것은 실제 신경망 학습이 이 선 아래 안전한 자리에 머무르지 않는다는 점입니다. 학습이 진행되면 손실 지형의 λmax⁡\lambda_{\max} 가 커지는데, 그 값이 2/η2/\eta 에 닿으면 손실이 잠깐 튀고, 튀면서 곡률이 다시 낮은 자리로 밀려납니다. 결과적으로 λmax⁡\lambda_{\max} 가 2/η2/\eta 근처를 오래 맴돕니다. 이 관찰에 안정성의 가장자리(edge of stability)라는 이름이 붙어 있습니다. 손실이 단조로 내려가지 않고 잔물결을 치면서도 전체적으로는 내려가는 곡선이 여기서 나옵니다.

조건수와 반복 수

상한은 최대 고윳값, 속도는 최소 고윳값

방향이 여럿이면 이야기가 달라집니다. f(x)=12xTHxf(x) = \tfrac12 x^{\mathsf T}Hx 에서 HH 를 고유벡터 좌표계로 옮기면 H=diag(λ1,…,λn)H = \mathrm{diag}(\lambda_1,\dots,\lambda_n) 이 되고, 좌표마다 서로 독립인 1차원 문제가 됩니다.

yi(t)=(1−ηλi)t yi(0)y_i^{(t)} = (1 - \eta\lambda_i)^t\,y_i^{(0)}

전부 수렴하려면 모든 ii 에서 ∣1−ηλi∣<1|1-\eta\lambda_i| < 1 이어야 하므로 가장 큰 고윳값이 상한을 정합니다.

0<η<2λmax⁡0 < \eta < \frac{2}{\lambda_{\max}}

그런데 수렴 속도는 가장 작은 고윳값이 정합니다. 전체가 줄어드는 속도는 가장 느린 좌표의 속도이므로

ρ(η)=max⁡i ∣1−ηλi∣=max⁡(∣1−ηλmin⁡∣, ∣1−ηλmax⁡∣)\rho(\eta) = \max_i\,|1 - \eta\lambda_i| = \max\big(|1-\eta\lambda_{\min}|,\ |1-\eta\lambda_{\max}|\big)

한쪽을 줄이면 다른 쪽이 커지므로, 최적은 둘이 같아지는 자리입니다. 1−ηλmin⁡=−(1−ηλmax⁡)1 - \eta\lambda_{\min} = -(1 - \eta\lambda_{\max}) 를 풀면

η⋆=2λmax⁡+λmin⁡,ρ⋆=λmax⁡−λmin⁡λmax⁡+λmin⁡=κ−1κ+1\eta^\star = \frac{2}{\lambda_{\max} + \lambda_{\min}}, \qquad \rho^\star = \frac{\lambda_{\max}-\lambda_{\min}}{\lambda_{\max}+\lambda_{\min}} = \frac{\kappa - 1}{\kappa + 1}

κ\kappa 는 지난 글의 조건수입니다. 오차를 ε\varepsilon 배로 줄이는 데 필요한 반복 수는 ρt=ε\rho^t = \varepsilon 에서 t=log⁡ε/log⁡ρt = \log\varepsilon / \log\rho 이고, κ\kappa 가 크면 log⁡(1/ρ)≈2/κ\log(1/\rho) \approx 2/\kappa 이므로

t ≈ κ2 log⁡1εt \ \approx\ \frac{\kappa}{2}\,\log\frac{1}{\varepsilon}

반복 수가 조건수에 비례합니다. 손실을 1000분의 1로 줄이는 데 걸리는 스텝을 세어 보면 그대로 나타납니다.

κ\kappa η⋆\eta^\star (λmin⁡=1\lambda_{\min}=1) ρ⋆\rho^\star 오차 10−310^{-3} 까지
1 1 0 1회
4 0.4 0.6 14회
10 0.1818 0.8182 35회
100 0.0198 0.9802 346회
1000 0.0020 0.9980 3454회

조건수가 10배가 되면 반복도 10배입니다. 이것이 길쭉한 골짜기에서 경사하강이 지그재그로 오래 헤매는 이유이고, 원인이 학습률을 잘못 골라서가 아니라는 점이 중요합니다. η⋆\eta^\star 는 이미 최선으로 골랐고, 그래도 κ\kappa 에 비례해 느립니다.

조건수가 커질수록 최적 학습률에서도 수렴이 느려진다

조건수를 낮추는 처방

그렇다면 κ\kappa 자체를 낮추는 쪽으로 손을 써야 합니다. 가장 싼 것이 입력 표준화입니다. 선형 모델 f=12∥Xw−y∥2f = \tfrac12\|Xw - y\|^2 의 헤세는 XTXX^{\mathsf T}X 이고, 특성마다 스케일이 열 배씩 다르면 그 대각 성분도 백 배씩 벌어져 κ\kappa 가 그만큼 커집니다. 각 열의 평균을 빼고 표준편차로 나누면 대각 성분이 고르게 맞춰지고 축이 덜 길쭉해집니다.

위의 「좌표의 축척과 방향」에서 적은 것이 여기서 값으로 돌아왔습니다. 표준화는 데이터를 손보는 일처럼 보이지만 실제로 하는 일은 좌표계를 바꿔 지형을 둥글게 만드는 것입니다.

대각 전처리와 재매개화

좌표마다 다른 학습률을 주는 방법도 있습니다. η\eta 하나 대신 대각행렬 DD 를 놓고 xt+1=xt−D∇f(xt)x_{t+1} = x_t - D\nabla f(x_t) 로 쓰면, D=H−1D = H^{-1} 로 잡을 수 있을 때 한 걸음에 끝납니다. 물론 HH 를 모르니 대각 성분만 어림하는데, 이 대각 전처리가 Adam이 하는 일과 겹치는 자리입니다 — Adam의 분모에 있는 그래디언트 제곱의 이동평균이 곡률의 거친 대리값 노릇을 합니다.

셋째 길은 문제를 아예 다시 매개화하는 것입니다. 같은 함수라도 파라미터를 어떻게 잡느냐에 따라 골짜기가 길쭉할 수도 둥글 수도 있습니다. 정규화 층을 넣어 층마다 스케일을 묶어 두는 것이 신경망에서 이 일에 해당합니다.

코드로 확인하기

1차원 경계

먼저 1차원 경계입니다.

import numpy as np

lam, x0 = 1.0, 1.0
for eta in [0.5, 1.0, 1.5, 1.9, 2.0, 2.1]:
    x, traj = x0, [x0]
    for _ in range(6):
        x = x - eta * (lam * x)
        traj.append(x)
    print(f"η={eta:4.1f}  |1−ηλ|={abs(1-eta*lam):.2f}  " + " ".join(f"{v: .4f}" for v in traj))

# η= 0.5  |1−ηλ|=0.50   1.0000  0.5000  0.2500  0.1250  0.0625  0.0312  0.0156
# η= 1.0  |1−ηλ|=0.00   1.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
# η= 1.5  |1−ηλ|=0.50   1.0000 -0.5000  0.2500 -0.1250  0.0625 -0.0312  0.0156
# η= 1.9  |1−ηλ|=0.90   1.0000 -0.9000  0.8100 -0.7290  0.6561 -0.5905  0.5314
# η= 2.0  |1−ηλ|=1.00   1.0000 -1.0000  1.0000 -1.0000  1.0000 -1.0000  1.0000
# η= 2.1  |1−ηλ|=1.10   1.0000 -1.1000  1.2100 -1.3310  1.4641 -1.6105  1.7716

정확히 η=2\eta = 2 에서 진동이 멈추지도 커지지도 않습니다. 다음은 조건수 10짜리 2차원입니다. L=λmax⁡=10L = \lambda_{\max} = 10 이므로 상한이 2/10=0.22/10 = 0.2 입니다.

H = np.diag([10.0, 1.0])

for eta in [0.05, 0.1818, 0.19, 0.20, 0.21]:
    x = np.array([1.0, 1.0])
    for _ in range(60):
        x = x - eta * (H @ x)
    rho = max(abs(1 - eta * 10), abs(1 - eta * 1))
    print(f"η={eta:.4f}  ρ={rho:.4f}   60스텝 후 ‖x‖={np.linalg.norm(x):.3e}")

# η=0.0500  ρ=0.9500   60스텝 후 ‖x‖=4.607e-02
# η=0.1818  ρ=0.8182   60스텝 후 ‖x‖=8.297e-06      ← 최적 2/(10+1)
# η=0.1900  ρ=0.9000   60스텝 후 ‖x‖=1.797e-03
# η=0.2000  ρ=1.0000   60스텝 후 ‖x‖=1.000e+00      ← 경계, 줄지 않는다
# η=0.2100  ρ=1.1000   60스텝 후 ‖x‖=3.045e+02      ← 발산

η⋆=2/(10+1)=0.1818\eta^\star = 2/(10+1) = 0.1818 이 실제로 가장 빠르고, 0.20.2 에서 노름이 딱 1로 멈춰 있고, 0.210.21 에서 300배로 커졌습니다. 세 줄 모두 유도한 그대로입니다.

import math
for k in [1, 4, 10, 100, 1000]:
    rho = (k - 1) / (k + 1)
    it = 1 if rho == 0 else math.log(1e-3) / math.log(rho)
    print(f"κ={k:5d}  η*={2/(k+1):.4f}  ρ={rho:.4f}  10⁻³까지 {it:.1f}회")

# κ=    1  η*=1.0000  ρ=0.0000  10⁻³까지 1.0회
# κ=    4  η*=0.4000  ρ=0.6000  10⁻³까지 13.5회
# κ=   10  η*=0.1818  ρ=0.8182  10⁻³까지 34.4회
# κ=  100  η*=0.0198  ρ=0.9802  10⁻³까지 345.4회
# κ= 1000  η*=0.0020  ρ=0.9980  10⁻³까지 3453.9회

헤세를 유한차분으로 만들어 2/L 재기

식을 몰라도 LL 은 잴 수 있습니다. 함수만 호출할 수 있으면 유한차분으로 헤세를 채운 뒤 가장 큰 고윳값을 읽으면 됩니다.

def hessian_fd(f, x, h=1e-4):
    n = len(x)
    Hm = np.zeros((n, n))
    for i in range(n):
        for j in range(n):
            ei, ej = np.zeros(n), np.zeros(n)
            ei[i], ej[j] = h, h
            Hm[i, j] = (f(x+ei+ej) - f(x+ei-ej) - f(x-ei+ej) + f(x-ei-ej)) / (4*h*h)
    return Hm

f = lambda v: 0.5 * (10.0 * v[0]**2 + v[1]**2)
Hm = hessian_fd(f, np.array([0.3, -0.7]))
L = np.linalg.eigvalsh(Hm).max()
print(round(float(L), 6), round(float(2 / L), 6))
# 10.0 0.2

앞의 실험에서 손으로 넣었던 0.2가 함수만 보고 그대로 나왔습니다. 대칭으로 잡은 네 점 차분이라 hh 를 10−410^{-4} 로 두어도 오차가 작습니다.

이차가 아닌 손실에서는 어디까지 맞는가

LL 이 전역 상수가 아니면 경계가 자리마다 달라집니다. f(x)=x4/4f(x) = x^4/4 를 봅니다. ∇f=x3\nabla f = x^3 이고 f′′=3x2f'' = 3x^2 이라 LL 은 위치에 따라 얼마든지 커집니다.

for x0 in [1.0, 2.0]:
    x = x0
    for _ in range(3):
        x = x - 0.6 * x**3
    print(x0, 3 * x0**2, round(2 / (3 * x0**2), 4), round(float(x), 4))
# 1.0 3.0 0.6667 0.3251
# 2.0 12.0 0.1667 -1143.3269

같은 η=0.6\eta = 0.6 인데 x0=1x_0 = 1 에서는 얌전히 줄고 x0=2x_0 = 2 에서는 세 스텝 만에 1000 넘게 튑니다. 가운데 두 열이 이유를 말해 줍니다 — 출발점의 국소 곡률이 3과 12로 네 배 다르고, 그래서 국소 상한 2/L2/L 이 0.667과 0.167로 갈립니다. 0.60.6 은 앞쪽에서는 상한 아래이고 뒤쪽에서는 상한의 세 배가 넘습니다.

학습률은 지형 전체에 대해 안전한 것이 아니라 지금 서 있는 자리에 대해 안전합니다. 워밍업이 초반에 학습률을 낮게 두는 것, 그래디언트 클리핑이 한 걸음의 크기를 잘라 두는 것이 모두 이 국소성에 대한 대비입니다.

정리

  • 걸음의 크기를 정해 놓고 1차 근사를 가장 많이 줄이는 방향은 코시–슈바르츠의 등호 조건에서 −∇f-\nabla f 하나뿐이다. 여기서 xt+1=xt−η∇f(xt)x_{t+1} = x_t - \eta\nabla f(x_t) 가 나온다.
  • 다만 "가장 가파르다"는 걸음을 유클리드 노름으로 잴 때의 이야기다. 최대 노름으로 재면 답이 부호 함수가 되어 sign-SGD가 나오고, 좌표의 축척을 바꾸면 방향도 함께 바뀐다.
  • L-매끄러움은 그래디언트의 립시츠 상수가 LL 이라는 뜻이고, 두 번 미분 가능하면 LL 은 지형 전체의 최대 곡률 λmax⁡\lambda_{\max} 다. 절댓값과 ReLU처럼 꺾인 자리가 있으면 유한한 LL 이 아예 없다.
  • 그 상수로 1차 근사의 오차를 누르면 하강 보조정리 f(y)≤f(x)+∇f⋅(y−x)+L2∥y−x∥2f(y) \le f(x) + \nabla f\cdot(y-x) + \tfrac{L}{2}\|y-x\|^2 를 얻는다. 근사가 아니라 부등식이다.
  • 여기에 갱신식을 넣으면 f(xt+1)≤f(xt)−η(1−Lη/2)∥∇f∥2f(x_{t+1}) \le f(x_t) - \eta(1 - L\eta/2)\|\nabla f\|^2 이고, 계수가 양수일 조건이 0<η<2/L0 < \eta < 2/L 이다. 감소가 가장 큰 자리는 정확히 그 절반인 η=1/L\eta = 1/L 이다.
  • 매 스텝 줄어든다는 것과 최솟값에 닿는다는 것은 다른 진술이다. 감소량을 TT 스텝 더하면 가장 작은 그래디언트 노름이 1/T1/\sqrt{T} 규모로 줄어든다는 결론까지만 나온다.
  • 미니배치에서는 E[∥g∥2]\mathbb{E}[\|g\|^2] 에 σ2/B\sigma^2/B 가 더 붙어 손실이 어느 선을 맴돈다. 그 선은 η\eta 에 비례해 내려간다.
  • 이차함수에서는 이 경계가 정확하다. η<1/λ\eta < 1/\lambda 는 단조 수렴, 1/λ<η<2/λ1/\lambda < \eta < 2/\lambda 는 부호를 오가며 수렴, η=2/λ\eta = 2/\lambda 는 영원한 진동, 그 위는 발산이다. 가운데 구간에서는 손실만 보아서는 부호가 뒤집히는 것을 알 수 없다.
  • 여러 방향에서는 상한을 λmax⁡\lambda_{\max} 가 정하고 속도를 λmin⁡\lambda_{\min} 이 정한다. 최적 η⋆=2/(λmax⁡+λmin⁡)\eta^\star = 2/(\lambda_{\max}+\lambda_{\min}) 에서도 수렴률이 (κ−1)/(κ+1)(\kappa-1)/(\kappa+1) 이라 반복 수가 조건수에 비례한다. 입력 표준화·대각 전처리·재매개화가 그 κ\kappa 를 낮추는 세 갈래다.

마지막 줄이 다음 글의 출발점입니다. 학습률을 아무리 잘 골라도 조건수에 비례하는 반복은 남습니다. 그 비례를 κ\kappa 에서 κ\sqrt{\kappa} 로 낮추는 것이 모멘텀이고, 다음 글에서 모멘텀과 네스테로프와 EMA가 사실은 같은 점화식이라는 것을 확인한 뒤 좁은 골짜기에서의 이득을 조건수의 함수로 계산합니다.


읽어주셔서 감사합니다. 😊

LATEST

수학의 최신 글

수학2026.09.07

양자화 오차: 격자 사상, 오차 분산, 이상치 채널

실수를 2^b개 격자에 사상할 때 오차의 분산이 왜 Δ²/12인지 유도하고, 그것이 비트당 6.02dB라는 SNR로 번역되는 과정을 실측과 대조했습니다. 이상치 하나가 나머지 값의 유효 비트를 어떻게 먹는지, 그리고 int4에서 성능이 무너지는 지점을 오차 예산으로 미리 계산하는 법까지.

중급18 MIN
수학2026.09.07

수치적으로 안정한 계산 패턴 모음

최댓값 빼기, 로그 공간, log1p·expm1, 분산의 두 공식, 정규화의 ε, fp32 누산, 역행렬 대신 solve — 프레임워크가 몰래 해 주는 일곱 가지를 하나씩 꺼내 각각 어떤 고장을 막는지 직접 재 봤습니다. 수식을 그대로 옮긴 코드가 왜 라이브러리보다 나쁜지에 대한 목록입니다.

중급22 MIN
수학2026.09.07

부동소수점은 어디서 새는가: 반올림, 상쇄, 더하는 순서

0.1 + 0.2가 0.3이 아닌 이유부터 시작해 머신 엡실론을 유도하고, 같은 16비트인데 fp16과 bf16이 서로 다른 지점에서 터지는 이유, 비슷한 수를 뺄 때 유효자리가 사라지는 파괴적 상쇄, 그리고 1,000만 개를 순서만 바꿔 더했을 때 오차가 백만 배 갈리는 실험까지 직접 재 봤습니다.

중급23 MIN