수학

MATH / 중급 44번

손실 지형: 딥러닝은 볼록이 아닌데 왜 학습이 되는가

볼록성을 다변수로 확장하고, 뉴런을 맞바꿔도 손실이 같다는 사실 하나로 신경망 손실이 볼록일 수 없음을 손으로 증명합니다. 그리고 고차원에서 진짜 장애물이 국소최소가 아니라 안장점인 이유를 헤세 고윳값의 부호로 셈해 봅니다.

PALDYN Team45 MIN READ

학습 곡선이 내려갑니다. 손실이 2.7에서 1.9로, 다시 1.4로 떨어지고 모델은 쓸 만해집니다. 그런데 최적화 교과서를 펴면 수렴을 보장하는 정리들은 거의 전부 볼록함수를 전제하고, 신경망의 손실은 볼록이 아닙니다. 보장이 없는 채로 매일 학습이 되고 있는 셈입니다.

지난 글까지가 순전파와 역전파의 식이었다면, 이 단원은 그 식을 어떻게 내려가는가입니다. 첫 글인 여기서는 내려갈 지형이 어떻게 생겼는지를 봅니다. 볼록이 정확히 무엇을 보장하는지, 신경망이 왜 그 조건에서 벗어나는지, 그리고 벗어났는데도 학습이 되는 이유를 셈으로 확인합니다.

볼록집합과 볼록함수

젠센 부등식 글에서 한 변수 볼록함수를 "현이 그래프 위에 있다"로 정의했습니다. 파라미터가 수억 개인 지형을 다루려면 이것을 벡터로 옮겨야 합니다.

볼록결합

먼저 정의역부터입니다. 집합 C⊆RnC \subseteq \mathbb{R}^n 가 볼록집합이라는 것은, 그 안의 두 점을 잇는 선분이 통째로 집합 안에 있다는 뜻입니다.

x,y∈C,  0≤t≤1   ⟹   tx+(1−t)y∈Cx, y \in C, \ \ 0 \le t \le 1 \ \implies \ tx + (1-t)y \in C

tx+(1−t)ytx + (1-t)y 는 tt 를 1에서 0으로 줄이며 xx 에서 yy 로 곧게 이동하는 점입니다. 이것을 두 점의 볼록결합이라고 부릅니다. 원판·정육면체·반평면은 볼록집합이고, 도넛이나 초승달은 아닙니다 — 구멍이나 파인 곳을 가로지르는 선분이 집합 밖으로 나가기 때문입니다.

볼록집합과 볼록함수의 정의

볼록함수의 세 조건

볼록집합 위에서 정의된 ff 가 볼록함수라는 것은 같은 선분 위에서 함수값이 현을 넘지 않는다는 뜻입니다.

f(tx+(1−t)y)≤tf(x)+(1−t)f(y)f\big(tx + (1-t)y\big) \le t f(x) + (1-t) f(y)

왼쪽은 "먼저 섞고 그다음 함수에 넣은 값", 오른쪽은 "먼저 함수에 넣고 그다음 섞은 값"입니다. 섞은 다음이 언제나 더 작거나 같다 — 정의는 이 한 문장이고, 아래에서 신경망을 반박할 때 쓸 것도 정확히 이 부등식입니다.

미분 가능하면 같은 조건을 두 가지로 더 적을 수 있습니다.

  • 1차 조건: f(y)≥f(x)+∇f(x)⋅(y−x)f(y) \ge f(x) + \nabla f(x)\cdot(y - x) 가 모든 x,yx, y 에서 성립한다.
  • 2차 조건: 헤세 행렬 ∇2f(x)\nabla^2 f(x) 가 모든 xx 에서 양반정치다.

헤세 행렬은 이계편도함수를 모아 놓은 n×nn \times n 대칭 행렬 [∇2f]ij=∂2f/∂xi∂xj[\nabla^2 f]_{ij} = \partial^2 f / \partial x_i \partial x_j 입니다. 다변수 테일러 전개에서 이것이 어디서 나오고 곡률로 어떻게 읽히는지는 다음 글이 맡고, 여기서는 부호 판정에만 씁니다. 양반정치(positive semidefinite)는 모든 벡터 zz 에 대해 zT∇2f z≥0z^{\mathsf T} \nabla^2 f\, z \ge 0 이라는 뜻이고, 대칭 행렬 글에서 본 대로 이것은 모든 고윳값이 0 이상이라는 말과 같습니다.

1차 조건이 말하는 것은 "접평면이 그래프 아래에 깔린다"입니다. 2차 조건은 "어느 방향으로 잘라도 위로 굽는다"입니다. 세 조건은 같은 성질을 서로 다른 해상도로 본 것입니다 — 정의는 두 점, 1차 조건은 한 점과 그 기울기, 2차 조건은 한 점의 굽음만 봅니다.

강볼록

볼록은 "아래로 굽지 않는다"까지만 말합니다. 곧게 펴진 방향, 곧 고윳값이 0인 방향이 있어도 볼록입니다. 여기서 한 단 더 조이면 강볼록입니다. 두 대칭 행렬 사이의 A⪯BA \preceq B 는 B−AB - A 가 양반정치라는 뜻이고, 이 기호로 적으면

μI ⪯ ∇2f(x) ⪯ βI(μ>0)\mu I \ \preceq\ \nabla^2 f(x) \ \preceq\ \beta I \qquad (\mu > 0)

입니다. 왼쪽 부등식은 헤세의 가장 작은 고윳값이 어디서나 μ\mu 이상이라는 것, 곧 모든 방향으로 적어도 그만큼은 굽는다는 뜻입니다. 오른쪽은 가장 큰 고윳값이 β\beta 이하라는 것, 어느 방향으로도 그보다 가파르게 굽지는 않는다는 뜻입니다. 교과서는 흔히 β\beta 를 LL 로 적지만 이 글에서 LL 은 손실이라 이름을 바꿨습니다. 고윳값이 전부 0보다 큰 행렬을 양정치라고 부르므로, 강볼록은 "헤세가 양정치이고 그 가장 작은 고윳값이 μ\mu 밑으로 내려가지 않는다"입니다.

이 조건이 사 주는 것은 속도입니다. 지금 자리의 그래디언트 반대쪽으로 조금씩 옮기는 절차가 경사하강법이고, 한 걸음은

θk+1=θk−η ∇f(θk)\theta_{k+1} = \theta_k - \eta\, \nabla f(\theta_k)

입니다. 여기서 θ\theta 는 파라미터 벡터, η\eta 는 한 걸음의 보폭인 학습률입니다. 학습률을 1/β1/\beta 로 두면 강볼록 함수에서

f(θk)−f⋆ ≤ (1−μβ)k (f(θ0)−f⋆)f(\theta_k) - f^\star \ \le\ \Big(1 - \frac{\mu}{\beta}\Big)^{k}\,\big(f(\theta_0) - f^\star\big)

가 성립합니다. f⋆f^\star 는 최솟값입니다. 남은 거리가 매 걸음 일정한 비율로 줄어드는 지수적 수렴이고, 그 비율을 μ\mu 와 β\beta 의 비가 정합니다. 아래 코드에서 쓸 선형회귀 예제는 헤세의 고윳값이 15.12에서 45.86 사이라 1−μ/β≈0.6701 - \mu/\beta \approx 0.670 이고, 스무 걸음이면 처음 거리의 0.67020≈3.3×10−40.670^{20} \approx 3.3 \times 10^{-4} 밑으로 내려간다는 보장이 나옵니다. 목표값을 아무렇게나 정해 실제로 돌려 보면 7×10−97 \times 10^{-9} 까지 내려갑니다 — 정리는 상한이지 예측이 아닙니다. 두 고윳값이 멀어질수록 비율이 1에 붙어 느려진다는 것만 기억해 두면, 다음 글의 조건수가 바로 그 이야기입니다.

L2 정칙화

손실에 파라미터 크기의 벌점 λ2∥θ∥2\tfrac{\lambda}{2}\|\theta\|^2 을 더하는 것을 L2 정칙화라고 하고, 경사하강 쪽에서 보면 매 걸음 파라미터를 1−ηλ1 - \eta\lambda 배로 줄이는 효과라 가중치 감쇠라고도 부릅니다. 이 항의 헤세는 λI\lambda I 입니다. 그러니 볼록한 ff 에 더하면

∇2(f+λ2∥θ∥2)=∇2f+λI ⪰ λI\nabla^2\Big(f + \tfrac{\lambda}{2}\|\theta\|^2\Big) = \nabla^2 f + \lambda I \ \succeq\ \lambda I

가 되어 저절로 μ=λ\mu = \lambda 인 강볼록이 됩니다. 고윳값 0이던 방향도 전부 λ\lambda 만큼 들어 올려지기 때문입니다.

신경망에서는 이 논리가 절반만 통합니다. 뒤에서 보듯 신경망 손실은 볼록이 아니어서 헤세에 음의 고윳값이 있는 자리가 있고, 거기에 λ\lambda 를 더해도 −5+λ-5 + \lambda 처럼 여전히 음수로 남을 수 있습니다. 강볼록이 되는 것은 헤세의 가장 작은 고윳값이 −λ-\lambda 보다 큰 곳, 대개 좋은 최소점의 바로 근처뿐입니다. 그래서 신경망에서 "L2를 더하면 강볼록"은 국소적으로만 참이고, 그 근처에 들어간 뒤의 수렴 속도를 설명할 뿐 거기까지 가는 길은 설명하지 못합니다.

볼록성이 보장하는 것

임계점과 전역최소

그래디언트가 0인 점을 임계점이라고 부릅니다. 볼록성이 왜 그렇게 대접받는지는 1차 조건에서 두 줄로 나옵니다. ∇f(x⋆)=0\nabla f(x^\star) = 0 인 임계점을 잡습니다.

f(y) ≥ f(x⋆)+∇f(x⋆)⏟= 0⋅(y−x⋆) = f(x⋆)f(y) \ \ge\ f(x^\star) + \underbrace{\nabla f(x^\star)}_{=\,0}\cdot(y - x^\star) \ =\ f(x^\star)

모든 yy 에 대해 성립하므로 x⋆x^\star 는 정의역 전체에서 가장 낮은 점, 곧 전역최소입니다. 주변 가까이에서만 가장 낮은 점을 국소최소라고 부르는데, 볼록함수에서는 이 둘이 갈리지 않습니다.

볼록함수에서는 그래디언트가 0인 점이 곧 전역최소다. 전역최소가 아닌 임계점은 따로 없다.

볼록이면 임계점이 하나뿐이고 그것이 전역최소다

이것이 전부이자 전부입니다. 볼록이면 "여기가 바닥인가, 아니면 더 낮은 데가 어딘가 있나"를 고민할 필요가 없습니다. 손에 든 그래디언트가 0이면 끝난 것입니다.

볼록한 손실

우리가 쓰는 손실 중에도 볼록한 것이 있습니다. 선형회귀의 제곱오차 L(w)=∥Xw−y∥2L(w) = \|Xw - y\|^2 는 헤세가 2XTX2X^{\mathsf T}X 이고

zT(2XTX)z=2 ∥Xz∥2 ≥ 0z^{\mathsf T}(2X^{\mathsf T}X)z = 2\,\|Xz\|^2 \ \ge\ 0

이라 어디서나 양반정치입니다. 로지스틱 회귀의 교차엔트로피도 가중치에 대해 볼록입니다. 선형 모델까지는 볼록의 세계입니다. 층을 하나 얹는 순간 그 세계가 끝나는데, 그 전에 볼록이 약속하지 않는 것부터 짚어야 합니다.

유일성과 존재

위 논증은 "임계점이 있으면 그것이 전역최소다"입니다. 두 가지가 빠져 있습니다.

  • 최소점이 하나라는 보장이 없다.
  • 최소점이 있다는 보장도 없다.

첫째는 바닥이 평평한 볼록함수가 보여 줍니다. f(x)=max⁡(0, ∣x∣−1)2f(x) = \max(0,\ |x| - 1)^2 은 볼록인데 −1≤x≤1-1 \le x \le 1 전체에서 값이 0이라 최소점이 구간 하나를 통째로 이룹니다. 선형회귀도 XX 의 열이 서로 겹쳐 XTXX^{\mathsf T}X 에 고윳값 0이 생기면 같은 일이 일어나, 최소점이 직선이나 평면을 이룹니다. 다만 볼록함수의 최소점들은 언제나 볼록집합을 이룹니다 — 최소점 둘을 잇는 선분 위에서 함숫값이 현, 곧 최솟값 이하이기 때문입니다. 최소점이 여럿이어도 서로 떨어진 섬이 되지는 못하고 한 덩어리로 붙어 있습니다. 이 사실이 다음 절에서 신경망을 반박하는 열쇠입니다.

둘째는 한없이 내려가는 볼록함수가 보여 줍니다. e−xe^{-x} 는 볼록이고 xx 가 커질수록 0에 다가가지만 0에 닿는 xx 는 없습니다. 하한은 있는데 그 값을 갖는 점이 없으니 임계점도 없고, 위 논증은 적용될 자리가 없습니다.

바닥이 평평한 볼록함수와 한없이 내려가는 볼록함수

두 경우를 막는 것이 앞의 강볼록입니다. 모든 방향으로 μ\mu 이상 굽으면 평평한 바닥이 생길 수 없고, 멀리 갈수록 이차함수 이상으로 올라가므로 한없이 내려갈 수도 없습니다. 강볼록이면 최소점이 정확히 하나 있습니다.

선형분리와 로지스틱 회귀

둘째 경우는 교과서 속 예외가 아니라 로지스틱 회귀에서 실제로 생깁니다. 두 클래스를 가르는 초평면이 있어 오분류 없이 나눌 수 있는 데이터를 선형분리 가능하다고 부릅니다. 가장 작은 예로, 1차원 입력 x=1x = 1 은 정답 1, x=−1x = -1 은 정답 0이고 편향 없이 가중치 ww 하나만 있다고 합시다. 시그모이드 σ(z)=1/(1+e−z)\sigma(z) = 1/(1+e^{-z}) 로 확률을 내면 두 점의 교차엔트로피는 똑같이 log⁡(1+e−w)\log(1 + e^{-w}) 이고, 합은

L(w)=2log⁡(1+e−w)L(w) = 2\log(1 + e^{-w})

입니다. 값을 몇 개 찍어 보면 이렇습니다.

ww L(w)L(w) L′(w)L'(w)
0 1.386 −1.000
1 0.627 −0.538
2 0.254 −0.238
5 0.0134 −0.0134
10 0.0000908 −0.0000908

손실은 계속 줄고 기울기는 0에 다가가지만 0이 되지 않습니다. ww 를 키울수록 두 점을 더 자신 있게 맞히므로 손실을 0으로 만드는 유한한 ww 가 없는 것입니다. 경사하강은 ww 를 끝없이 키우고, 멈추는 곳은 우리가 정한 반복 횟수입니다. 볼록인데도 최소점이 무한대에 있는 셈이고, 여기에 L2 항을 더하면 강볼록이 되어 유한한 최소점 하나가 생깁니다.

치환 대칭성과 비볼록성

치환 대칭성

신경망 손실이 비볼록이라는 것은 실험적 관찰이 아니라 한 줄로 증명되는 사실입니다. 필요한 것은 대칭성 하나뿐입니다.

은닉층의 뉴런 두 개를 통째로 맞바꿉니다 — 첫째 뉴런의 입력 가중치와 출력 가중치를 둘째 것과 바꿔 답니다. 그러면 은닉 유닛의 계산 순서만 바뀔 뿐 망이 계산하는 함수가 글자 그대로 같습니다. 손실도 당연히 같습니다. 은닉 뉴런이 hh 개면 이런 재배열이 h!h! 가지 있고, 전역최소 하나가 있으면 그것과 손실이 똑같은 점이 최소 h!h! 개 있다는 뜻입니다. 이것을 치환 대칭성이라고 부릅니다.

앞 절에서 본 대로 볼록함수라면 최소점들이 한 덩어리로 붙어 있어야 하고, 그 덩어리 안의 어느 선분 위에서도 손실이 최솟값에 머물러야 합니다. 치환으로 얻은 최소점 둘 사이를 직선으로 걸어 보면 됩니다.

중점 반례

가장 작은 망으로 손계산을 해 보겠습니다. 입력이 2차원, 은닉 뉴런이 2개(ReLU), 출력이 스칼라입니다.

f(x)=v1 relu(w1⋅x)+v2 relu(w2⋅x)f(x) = v_1\,\mathrm{relu}(w_1 \cdot x) + v_2\,\mathrm{relu}(w_2 \cdot x)

데이터는 한 점입니다. x=(1,0)x = (1, 0), 정답 t=1t = 1, 손실은 L=(f(x)−t)2L = (f(x) - t)^2.

파라미터 A는 w1=(1,0), v1=1,w2=(0,1), v2=−1w_1 = (1,0),\ v_1 = 1,\quad w_2 = (0,1),\ v_2 = -1 입니다.

fA(x)=1⋅relu(1)+(−1)⋅relu(0)=1−0=1⇒L(A)=(1−1)2=0f_A(x) = 1\cdot\mathrm{relu}(1) + (-1)\cdot\mathrm{relu}(0) = 1 - 0 = 1 \quad\Rightarrow\quad L(A) = (1-1)^2 = 0

파라미터 B는 두 뉴런을 맞바꾼 것입니다. w1=(0,1), v1=−1,w2=(1,0), v2=1w_1 = (0,1),\ v_1 = -1,\quad w_2 = (1,0),\ v_2 = 1

fB(x)=−1⋅relu(0)+1⋅relu(1)=0+1=1⇒L(B)=0f_B(x) = -1\cdot\mathrm{relu}(0) + 1\cdot\mathrm{relu}(1) = 0 + 1 = 1 \quad\Rightarrow\quad L(B) = 0

둘 다 손실 0인 전역최소입니다. 이제 중점 M=12A+12BM = \tfrac12 A + \tfrac12 B 를 파라미터마다 평균해서 만듭니다.

w1=(1,0)+(0,1)2=(0.5, 0.5),v1=1+(−1)2=0w_1 = \tfrac{(1,0)+(0,1)}{2} = (0.5,\ 0.5), \quad v_1 = \tfrac{1 + (-1)}{2} = 0

w2=(0,1)+(1,0)2=(0.5, 0.5),v2=−1+12=0w_2 = \tfrac{(0,1)+(1,0)}{2} = (0.5,\ 0.5), \quad v_2 = \tfrac{-1 + 1}{2} = 0

출력 가중치가 둘 다 0이 되었습니다. 중점의 망은 무엇을 넣든 0을 뱉습니다.

fM(x)=0⋅relu(0.5)+0⋅relu(0.5)=0⇒L(M)=(0−1)2=1f_M(x) = 0 \cdot \mathrm{relu}(0.5) + 0 \cdot \mathrm{relu}(0.5) = 0 \quad\Rightarrow\quad L(M) = (0-1)^2 = 1

볼록함수라면 L(M)≤12L(A)+12L(B)=0L(M) \le \tfrac12 L(A) + \tfrac12 L(B) = 0 이어야 합니다. 실제로는 1>01 > 0 입니다. 반례 하나로 끝났습니다 — 신경망의 손실은 볼록이 아닙니다.

두 전역최소의 중점에서 손실이 솟는다

무엇이 일어났는지가 중요합니다. 두 뉴런을 평균 내니 둘이 똑같아졌고, 서로를 상쇄해 표현력을 잃었습니다. 치환 대칭성이 만든 여러 최소점 사이의 직선 위에는 이런 봉우리가 낍니다 — 그래서 비볼록성은 신경망의 사고가 아니라 구조가 보장하는 성질입니다. 파라미터를 늘리고 층을 쌓으면 대칭은 더 늘어날 뿐입니다.

곡선 경로

그런데 A에서 B로 가는 길이 직선뿐인 것은 아닙니다. 두 끝점 사이에 조종점 C 하나를 두고 (1−s)2A+2s(1−s) C+s2B(1-s)^2 A + 2s(1-s)\, C + s^2 B 로 움직이는 곡선을 이차 베지에 곡선이라고 부릅니다. s=0s = 0 이면 A, s=1s = 1 이면 B이고, 그 사이에서는 C 쪽으로 휘어 지나갑니다. C를 w1=w2=(0.5, 0.5), v1=v2=2w_1 = w_2 = (0.5,\ 0.5),\ v_1 = v_2 = 2 로 잡고 곡선 위 파라미터를 성분마다 계산하면, 입력의 첫 성분에 곱해지는 가중치는

w1의 첫 성분=1−s,w2의 첫 성분=sw_1 \text{의 첫 성분} = 1 - s, \qquad w_2 \text{의 첫 성분} = s

이고, 출력 가중치는

v1=1+2s−4s2,v2=−1+6s−4s2v_1 = 1 + 2s - 4s^2, \qquad v_2 = -1 + 6s - 4s^2

입니다. x=(1,0)x = (1, 0) 에서는 첫 성분만 살아남고 0≤s≤10 \le s \le 1 에서 두 값이 음수가 아니므로 ReLU가 그대로 통과시킵니다.

f(x)=(1+2s−4s2)(1−s)+(−1+6s−4s2) s=1f(x) = (1 + 2s - 4s^2)(1 - s) + (-1 + 6s - 4s^2)\,s = 1

전개하면 ss 의 항이 전부 지워지고 1만 남습니다. 곡선 위 어디서나 출력이 정답과 같으니 손실은 처음부터 끝까지 0입니다. 곡선의 한가운데 s=0.5s = 0.5 에서 은닉 가중치는 둘 다 (0.5, 0.5)(0.5,\ 0.5) 로 중점 M과 똑같습니다. 다른 것은 출력 가중치 하나로, M에서는 0으로 상쇄됐던 것이 곡선에서는 둘 다 1입니다. 같은 은닉층이라도 출력 쪽을 맞춰 주면 손실이 오르지 않는다는 뜻입니다.

이 장난감 망만의 일이 아닙니다. 2018년 무렵 두 연구 모임이 따로따로, 독립적으로 학습한 두 신경망의 최소점을 직선으로 이으면 가운데서 손실이 크게 솟지만 한 번 꺾인 선이나 베지에 곡선으로 이으면 손실이 거의 낮은 채 이어진다고 보고했습니다. 이 현상을 모드 연결성이라고 부릅니다.

직선 경로와 곡선 경로의 손실 단면

직선과 길

반례가 부순 것이 무엇이었는지 정확히 말해 둘 필요가 있습니다. 볼록성의 정의는 "두 점을 잇는 직선 위에서 손실이 현 아래"이고, 반례는 바로 그 직선 위에서 손실이 솟는 것을 보였습니다. 반례가 부순 것은 직선이지 길이 아닙니다.

"두 최소점 사이에 손실이 낮은 채로 걸어갈 수 있는 길이 있는가"는 다른 질문이고, 위 곡선은 적어도 이 예에서 답이 "있다"임을 보여 줍니다. 같은 망에서 꺾인 길도 손으로 만들 수 있습니다. A에서 뉴런 2는 입력이 0이라 아무것도 내보내지 않으므로 먼저 v2v_2 를 −1에서 1로 옮겨도 손실이 그대로입니다. 다음으로 두 뉴런의 첫 성분을 1−s1-s 와 ss 로 맞바꾸면 출력이 (1−s)+s=1(1-s) + s = 1 로 유지됩니다. 마지막으로 이제 입력이 0이 된 뉴런 1의 v1v_1 을 1에서 −1로 옮깁니다. 둘째 성분은 xx 의 둘째 값이 0이라 아무 때나 옮겨도 됩니다. 세 토막 내내 손실이 0입니다.

그러니 신경망의 지형은 "떨어진 섬 여럿"보다 "봉우리를 사이에 두고 휘어진 골짜기로 이어진 저지대"에 가깝습니다. 볼록이 아니라는 것과 최소점들이 서로 막혀 있다는 것은 같은 말이 아닙니다.

ReLU의 스케일 대칭

양의 동차성

치환은 뉴런 두 개를 맞바꾸는 이산적인 대칭입니다. ReLU 망에는 뉴런 하나 안에서 연속적으로 움직이는 대칭이 하나 더 있습니다. 양수 α\alpha 에 대해

relu(αz)=max⁡(0, αz)=αmax⁡(0, z)=α relu(z)\mathrm{relu}(\alpha z) = \max(0,\ \alpha z) = \alpha \max(0,\ z) = \alpha\,\mathrm{relu}(z)

입니다. 입력을 α\alpha 배 하면 출력도 정확히 α\alpha 배가 되는 이 성질을 양의 동차성이라고 부릅니다. α\alpha 가 음수면 max가 뒤집혀 성립하지 않으므로 "양의"가 붙습니다.

이제 한 뉴런의 입력 가중치를 α\alpha 배 하고 출력 가중치를 1/α1/\alpha 배 합니다. 그 뉴런이 내보내는 값은

vα relu(α w⋅x)=vα⋅α relu(w⋅x)=v relu(w⋅x)\frac{v}{\alpha}\,\mathrm{relu}(\alpha\, w \cdot x) = \frac{v}{\alpha}\cdot \alpha\,\mathrm{relu}(w \cdot x) = v\,\mathrm{relu}(w \cdot x)

로, 글자 그대로 원래와 같습니다. 어떤 입력을 넣어도 같으니 망 전체가 같은 함수이고 손실도 같습니다.

손실이 같은 곡선

앞 절의 A에 적용해 봅시다. 뉴런 1의 w1=(1,0), v1=1w_1 = (1, 0),\ v_1 = 1 을 (α,0)(\alpha, 0) 과 1/α1/\alpha 로 바꾸면 출력은 1α⋅α=1\tfrac{1}{\alpha}\cdot\alpha = 1 이라 손실이 모든 α>0\alpha > 0 에서 0입니다. α\alpha 가 0.25, 0.5, 1, 2, 4일 때 뉴런 1의 두 값은 (0.25, 4), (0.5, 2), (1, 1), (2, 0.5), (4, 0.25)입니다.

이 점들은 떨어져 있는 것이 아니라 α\alpha 가 연속으로 움직이며 그리는 곡선 위에 있습니다. 뉴런 1의 첫 가중치를 aa, 출력 가중치를 vv 라 하면 그 곡선은 쌍곡선 a v=1a\,v = 1 입니다. 최소점이 점이 아니라 곡선입니다. 치환 대칭은 최소점을 h!h! 개로 불리고, 스케일 대칭은 그 하나하나를 뉴런 수만큼의 차원을 가진 곡면으로 늘립니다.

스케일 대칭이 만드는 평평한 골짜기

헤세의 영 고윳값

곡선 위에서 손실이 변하지 않으면 그 방향의 곡률은 0입니다. (a,v)(a, v) 두 변수만 떼어 보면 손실은 (av−1)2(a v - 1)^2 이고 점 (1,1)(1, 1) 에서의 헤세는

∇2L=2(v22av−12av−1a2)∣(1,1)=(2222)\nabla^2 L = 2\begin{pmatrix} v^2 & 2av - 1 \\ 2av - 1 & a^2 \end{pmatrix}\Bigg|_{(1,1)} = \begin{pmatrix} 2 & 2 \\ 2 & 2 \end{pmatrix}

입니다. 고윳값은 4와 0이고, 0에 해당하는 고유벡터는 (1,−1)(1, -1) 방향입니다. 쌍곡선 (α,1/α)(\alpha, 1/\alpha) 를 α=1\alpha = 1 에서 미분하면 접선이 (1,−1)(1, -1) 이니 정확히 골짜기가 뻗은 방향입니다. 고윳값 4는 골짜기를 가로지르는 방향, 곧 ava v 가 1에서 벗어나는 방향의 가파름입니다.

일반적으로도 같습니다. 최소점에서는 그래디언트가 0이므로, 손실이 일정한 곡선의 접선 방향으로 헤세의 이차형식이 0이 되고, 양반정치 행렬에서 이차형식이 0인 방향은 고윳값 0의 고유벡터입니다. ReLU 망의 은닉 뉴런마다 이런 방향이 하나씩 생기므로, 신경망 손실의 최소점에서 헤세는 양정치일 수 없습니다. 기대할 수 있는 최선은 양반정치입니다. 앞 절의 강볼록은 헤세가 어디서나 μI\mu I 이상이기를 요구하니, 최소점 근처에서조차 L2 없이는 성립하지 않습니다.

가중치 감쇠와 균형

여기에 L2 항 λ2(a2+v2)\tfrac{\lambda}{2}(a^2 + v^2) 를 더하면 사정이 바뀝니다. 원래 손실은 곡선 위에서 전부 0이니, 곡선 위에서 달라지는 것은 벌점뿐입니다.

a2+v2=α2+1α2 ≥ 2a^2 + v^2 = \alpha^2 + \frac{1}{\alpha^2} \ \ge\ 2

등호는 α=1\alpha = 1, 곧 a=v=1a = v = 1 에서만 섭니다. 위에서 찍은 다섯 점의 a2+v2a^2 + v^2 는 16.06, 4.25, 2, 4.25, 16.06입니다. 가중치 감쇠는 평평한 골짜기에서 입력 가중치의 크기와 출력 가중치의 크기가 같은 자리 하나를 골라 줍니다. 여러 성분이 있는 일반적인 경우에도 α2∥w∥2+∥v∥2/α2\alpha^2\|w\|^2 + \|v\|^2/\alpha^2 을 최소로 하는 α\alpha 에서 ∥αw∥=∥v/α∥\|\alpha w\| = \|v/\alpha\| 가 됩니다.

곡률로 보면, 고윳값 0이던 골짜기 방향에 벌점이 곡률을 새로 얹어 준 것입니다. 앞에서 "L2를 더하면 국소적으로 강볼록"이라 한 것이 여기서 구체적인 모양을 얻습니다 — 평평한 골짜기가 L2 덕에 바닥 한 점을 가진 오목한 그릇으로 바뀝니다.

임계점 네 갈래

헤세 고윳값의 부호

볼록이 아니라는 것은 "그래디언트가 0인 점이 전역최소가 아닐 수 있다"는 뜻입니다. 그러면 임계점에 어떤 종류가 있는지가 문제가 되고, 헤세의 고윳값 부호가 그것을 정합니다. 양수와 음수 고윳값이 섞여 어떤 방향으로는 올라가고 어떤 방향으로는 내려가는 임계점을 안장점이라고 부릅니다.

헤세 고윳값 임계점의 종류 경사하강이 만나면
전부 양수 국소최소 갇힌다
전부 음수 국소최대 조금만 밀려도 벗어난다
양수와 음수가 섞임 안장점 음수 방향으로 빠져나간다
상당수가 0 근처 평지 나가긴 하는데 아주 느리다

임계점 네 갈래와 헤세 고윳값의 부호

안장점은 국소최소와 결정적으로 다릅니다. 음의 고윳값이 있고, 그 고유벡터 방향으로 가면 손실이 내려갑니다. 내려가는 길이 열려 있다는 뜻입니다. 경사하강은 그 방향의 그래디언트가 작아 오래 머물지만 결국은 빠져나갑니다. 다음 글부터 다룰 모멘텀과 적응적 학습률이 실제로 하는 일이 이 체류 시간을 줄이는 것입니다.

안장점의 비율

여기서 차원이 결정적입니다. 임계점이 국소최소이려면 고윳값 nn 개가 하나도 빠짐없이 양수여야 합니다. 부호가 서로 독립인 동전 던지기라면 그 확률은

P(모두 양수)=2−nP(\text{모두 양수}) = 2^{-n}

입니다. 파라미터가 100개만 되어도 2−100≈8×10−312^{-100} \approx 8 \times 10^{-31} 이고, 요즘 모델의 nn 은 10910^9 을 넘습니다. 임의로 고른 임계점이 국소최소일 가능성은 사실상 없고, 거의 전부가 안장점입니다.

부호가 독립이라는 가정은 정확하지 않습니다. 실제 헤세의 고윳값들은 서로 밀어내며 반원 모양으로 퍼지고, 그 때문에 전부 같은 부호가 되기는 동전 던지기보다 오히려 더 어렵습니다. 무작위 대칭행렬로 세어 보면 2−n2^{-n} 보다 훨씬 빨리 줄어듭니다.

nn 고윳값이 전부 양수인 비율 (20만 회) 동전 던지기 2−n2^{-n}
1 0.4999 0.5
2 0.1467 0.25
3 0.0250 0.125
4 0.00257 0.0625
5 0.00010 0.03125
6 0 (한 번도 없음) 0.0156

파라미터가 여섯 개만 되어도 20만 번을 뽑는 동안 한 번도 안 나왔습니다.

영 고윳값 덩어리

그런데 무작위 대칭행렬은 신경망 헤세의 한 가지를 빠뜨립니다. 앞 절의 스케일 대칭은 은닉 뉴런마다 고윳값 0을 하나씩 강제했습니다. 은닉 뉴런이 수백만이면 0이 수백만 개입니다. 여기에 입력이 0이라 아무것도 내보내지 않는 뉴런, 서로 거의 같은 일을 하는 뉴런처럼 대칭에 가까운 구조가 더해지면 0 근처의 고윳값은 더 늘어납니다.

실제로 학습된 망의 헤세 스펙트럼을 재 보면 고윳값 대부분이 0 근처에 뭉친 큰 덩어리를 이루고, 그 밖으로 소수의 큰 고윳값만 떨어져 나와 있다는 관찰이 반복되어 왔습니다. 표의 "평지" 줄은 드문 예외가 아니라 신경망 지형의 기본값인 셈입니다. 그래서 신경망에서 "국소최소"라 부르는 것도 엄밀히는 대개 평평한 방향을 잔뜩 품은 저지대이고, 앞에서 본 곡선 경로가 그 평평한 방향을 따라 이어집니다.

안장점의 지수

안장점마다 음의 고윳값이 몇 개인지가 다르고, 그 개수를 안장점의 지수라고 부릅니다. 지수가 0이면 국소최소, 지수가 크면 내려갈 방향이 그만큼 많은 안장점입니다.

신경망과 무작위 지형에서 임계점을 모아 손실 값과 지수를 함께 찍어 보면, 손실이 높은 임계점일수록 지수가 크고 손실이 낮아질수록 지수가 작아지는 경향이 반복해서 관찰되었습니다. 높은 곳의 임계점은 사방으로 내려갈 길이 열린 고개이고, 내려갈수록 남은 내리막이 줄어 결국 지수 0 근처, 곧 바닥에 이릅니다. 반대로 말하면 손실이 높은 채로 지수가 0인 함정, 곧 나쁜 국소최소는 드뭅니다.

여기까지를 모으면 학습이 되는 이유의 윤곽이 섭니다. 비볼록이라 전역최소를 찾는다는 보장은 없습니다. 대신 고차원에서는 갇히는 함정보다 지나가는 고개가 압도적으로 많고, 도달한 저지대끼리는 손실이 비슷하며, 대칭이 만든 평평한 골짜기로 서로 이어져 있습니다. 어느 최소에 앉느냐보다 거기까지 얼마나 빨리 가느냐가 실무의 문제가 된 이유입니다.

코드로 확인하기

중점의 손실

먼저 중점 반례입니다.

import numpy as np

relu = lambda z: np.maximum(z, 0.0)
x, t = np.array([1.0, 0.0]), 1.0

def loss(W, v):
    return (v @ relu(W @ x) - t) ** 2

W_A, v_A = np.array([[1., 0.], [0., 1.]]), np.array([ 1., -1.])
W_B, v_B = np.array([[0., 1.], [1., 0.]]), np.array([-1.,  1.])   # 두 뉴런을 맞바꾼 것
W_M, v_M = (W_A + W_B) / 2, (v_A + v_B) / 2

print("L(A) =", loss(W_A, v_A))
print("L(B) =", loss(W_B, v_B))
print("L(M) =", loss(W_M, v_M), " 볼록이면 <= ", 0.5 * loss(W_A, v_A) + 0.5 * loss(W_B, v_B))
print("중점의 은닉 가중치:", W_M.tolist(), " 출력 가중치:", v_M.tolist())

# L(A) = 0.0
# L(B) = 0.0
# L(M) = 1.0  볼록이면 <=  0.0
# 중점의 은닉 가중치: [[0.5, 0.5], [0.5, 0.5]]  출력 가중치: [0.0, 0.0]

두 뉴런이 같아지고 출력 가중치가 상쇄되어 사라진 것이 숫자로 보입니다.

무작위 헤세의 부호

다음은 고윳값 부호입니다.

rng = np.random.default_rng(0)

for n in [1, 2, 3, 4, 5, 6]:
    hit = 0
    for _ in range(200_000):
        A = rng.normal(size=(n, n))
        S = (A + A.T) / np.sqrt(2)              # 무작위 대칭행렬
        if np.linalg.eigvalsh(S)[0] > 0:        # 가장 작은 고윳값이 양수인가
            hit += 1
    print(f"n={n}  전부 양수 {hit/200_000:.5f}   2^-n = {2.0**-n:.5f}")

# n=1  전부 양수 0.49991   2^-n = 0.50000
# n=2  전부 양수 0.14673   2^-n = 0.25000
# n=3  전부 양수 0.02504   2^-n = 0.12500
# n=4  전부 양수 0.00257   2^-n = 0.06250
# n=5  전부 양수 0.00010   2^-n = 0.03125
# n=6  전부 양수 0.00000   2^-n = 0.01562

선형회귀 쪽도 확인해 둡니다. 헤세의 고윳값이 전부 양수라 어디서나 볼록이고, 가장 작은 것과 가장 큰 것이 강볼록 절의 μ\mu 와 β\beta 입니다.

X = np.random.default_rng(1).normal(size=(20, 4))
ev = np.linalg.eigvalsh(2 * X.T @ X)
print(np.round(ev, 4), " 1 - mu/beta =", round(1 - ev[0] / ev[-1], 4))
# [15.1246 24.0044 29.0265 45.8561]  1 - mu/beta = 0.6702

스케일 곡선의 곡률

뉴런 1을 α\alpha 배로 늘이고 출력 가중치를 줄여 가며 손실과 벌점을 찍고, (a,v1)(a, v_1) 평면의 헤세를 차분으로 구합니다.

def scale(alpha):                  # 첫 뉴런: w1 <- alpha*w1, v1 <- v1/alpha
    W, v = W_A.copy(), v_A.copy()
    W[0] *= alpha; v[0] /= alpha
    return W, v

for alpha in [0.25, 0.5, 1.0, 2.0, 4.0]:
    W, v = scale(alpha)
    print(f"alpha={alpha:<5} L={loss(W, v)}  ||w1||^2+v1^2={W[0]@W[0] + v[0]**2:.4f}")

def L2(p):                         # p = (w1 의 첫 성분, v1)
    W, v = W_A.copy(), v_A.copy()
    W[0, 0], v[0] = p
    return loss(W, v)

h, p0 = 1e-4, np.array([1.0, 1.0])
H = np.zeros((2, 2))
for i in range(2):
    for j in range(2):
        ei, ej = np.eye(2)[i] * h, np.eye(2)[j] * h
        H[i, j] = (L2(p0+ei+ej) - L2(p0+ei-ej) - L2(p0-ei+ej) + L2(p0-ei-ej)) / (4*h*h)
vals, vecs = np.linalg.eigh(H)
print("헤세:", np.round(H, 4).tolist())
print("고윳값:", np.round(vals, 4).tolist(), " 0 쪽 고유벡터:", np.round(vecs[:, 0], 4).tolist())

# alpha=0.25  L=0.0  ||w1||^2+v1^2=16.0625
# alpha=0.5   L=0.0  ||w1||^2+v1^2=4.2500
# alpha=1.0   L=0.0  ||w1||^2+v1^2=2.0000
# alpha=2.0   L=0.0  ||w1||^2+v1^2=4.2500
# alpha=4.0   L=0.0  ||w1||^2+v1^2=16.0625
# 헤세: [[2.0, 2.0], [2.0, 2.0]]
# 고윳값: [0.0, 4.0]  0 쪽 고유벡터: [-0.7071, 0.7071]

손실은 다섯 자리 모두 0이고, 벌점은 α=1\alpha = 1 에서만 가장 작습니다. 차분으로 얻은 헤세가 손으로 구한 것과 같고, 고윳값 0의 고유벡터 (−0.7071, 0.7071)(-0.7071,\ 0.7071) 은 부호만 다른 (1,−1)(1, -1) 방향, 곧 골짜기의 접선입니다.

직선과 곡선의 단면

마지막으로 두 최소를 직선과 이차 베지에 곡선으로 각각 이어 손실 단면을 뽑습니다.

W_C, v_C = np.array([[0.5, 0.5], [0.5, 0.5]]), np.array([2., 2.])   # 곡선의 조종점

def line(s):
    return (1-s)*W_A + s*W_B, (1-s)*v_A + s*v_B

def bezier(s):                                 # 이차 베지에 곡선
    a, b, c = (1-s)**2, 2*s*(1-s), s**2
    return a*W_A + b*W_C + c*W_B, a*v_A + b*v_C + c*v_B

print(" s    직선      곡선")
for s in np.linspace(0, 1, 11):
    print(f"{s:.1f}  {loss(*line(s)):.4f}   {loss(*bezier(s)):.4f}")

#  s    직선      곡선
# 0.0  0.0000   0.0000
# 0.1  0.1296   0.0000
# 0.2  0.4096   0.0000
# 0.3  0.7056   0.0000
# 0.4  0.9216   0.0000
# 0.5  1.0000   0.0000
# 0.6  0.9216   0.0000
# 0.7  0.7056   0.0000
# 0.8  0.4096   0.0000
# 0.9  0.1296   0.0000
# 1.0  0.0000   0.0000

직선 위의 출력은 (1−2s)2(1-2s)^2 이라 손실이 ((1−2s)2−1)2\big((1-2s)^2 - 1\big)^2 로 가운데서 1까지 솟고, 곡선 위에서는 한 번도 0을 벗어나지 않습니다. 같은 두 끝점인데 어느 길로 잇느냐가 단면을 통째로 바꿉니다.

정리

  • 볼록집합은 두 점을 잇는 선분을 품는 집합이고, 볼록함수는 그 선분 위에서 f(tx+(1−t)y)≤tf(x)+(1−t)f(y)f(tx+(1-t)y) \le tf(x)+(1-t)f(y) 를 만족하는 함수다. 미분 가능하면 접평면이 그래프 아래라는 조건, 헤세가 양반정치라는 조건과 같다.
  • 볼록이 주는 것은 "그래디언트가 0이면 전역최소"다. 최소점이 하나라는 것도, 있다는 것도 주지 않는다 — 선형분리 가능한 데이터의 로지스틱 회귀는 최소가 무한대에 있다. 둘을 함께 주는 것은 강볼록이고, 강볼록이면 경사하강이 (1−μ/β)k(1-\mu/\beta)^k 의 비율로 수렴한다.
  • 신경망은 볼록이 아니다. 은닉 뉴런을 맞바꿔도 손실이 같아 최소점이 여럿이고, 그중 둘의 중점에서 두 뉴런이 같아져 L(M)=1>0L(M) = 1 > 0 이 된다. 다만 부서진 것은 직선이지 길이 아니어서, 곡선으로 이으면 손실 0이 그대로 이어진다.
  • ReLU의 양의 동차성 때문에 최소점은 점이 아니라 곡선이고, 그 방향의 헤세 고윳값은 0이다. 신경망 헤세는 최소점에서도 양반정치가 최선이며, 가중치 감쇠가 그 골짜기에서 입력과 출력 가중치의 크기가 같은 자리를 고른다.
  • 그래도 학습이 되는 이유는 차원이다. 고차원의 임계점은 거의 전부 안장점이고, 손실이 높을수록 내려갈 방향이 많으며, 낮은 곳들은 평평한 골짜기로 이어져 있다.

처음의 학습 곡선으로 돌아가면, 2.7에서 1.4로 내려가는 동안 파라미터는 수많은 고개를 지나쳤을 것이고 어느 고개에서도 갇히지 않았습니다. 곡선이 한동안 평평하게 멈춰 있다가 다시 떨어지는 구간이 있다면 그것이 평지나 안장점 근처에서 머문 시간입니다. 빨리 내려가려면 지금 서 있는 자리가 어떻게 굽어 있는지를 알아야 합니다. 이 글에서 부호 판정에만 쓴 헤세 행렬이 실은 각 방향의 곡률을 담고 있습니다. 다음 글에서 다변수 테일러 전개로 헤세가 어디서 나오는지를 유도하고, 고윳값의 비율인 조건수가 등고선을 얼마나 길쭉하게 만드는지를 봅니다.


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

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