수학

MATH / 중급 45번

테일러 2차 근사와 헤세 행렬: 곡률, 안장점, 조건수

손실 지형을 지금 서 있는 자리에서 이차함수로 흉내 내면 헤세 행렬이 나옵니다. 고윳값이 방향별 곡률이라는 것을 레일리 몫으로 확인하고, 조건수가 등고선을 얼마나 길쭉하게 만드는지 계산합니다. '날카로운 최소점'과 '잘 조건화된 문제'를 정확히 읽는 도구입니다.

PALDYN Team34 MIN READ

최적화 이야기에는 눈으로 그려지지 않는 말이 자주 나옵니다. "이 최소점은 날카롭다", "저쪽은 평평해서 일반화가 잘된다", "문제가 잘 조건화되어 있으면 빨리 수렴한다". 세 문장 모두 정확한 수학적 대상을 가리키고 있고, 그 대상은 하나입니다.

지난 글에서 헤세 행렬을 부호 판정에만 썼습니다. 이 글에서 그것이 다변수 테일러 전개의 어디서 나오는지를 유도하고, 고윳값이 곧 방향별 곡률이라는 해석을 세웁니다. 이 단원의 남은 글들 — 학습률의 상한, 모멘텀의 이득, Adam이 무엇을 근사하는가 — 이 전부 여기서 나온 결과를 씁니다.

방향 하나로 자르기

테일러 첫걸음에서 한 변수 함수를 다항식으로 흉내 냈습니다.

g(t)≈g(0)+g′(0) t+12g′′(0) t2g(t) \approx g(0) + g'(0)\,t + \tfrac12 g''(0)\,t^2

파라미터가 nn 개인 함수에 이것을 쓰려면 요령이 하나 필요합니다. 방향을 하나 고정해서 1변수로 만드는 것입니다.

1변수로 자르기

점 xx 에서 단위벡터 uu 방향으로 걸어가며 함숫값을 재는 함수를 만듭니다.

g(t)=f(x+t u)g(t) = f(x + t\,u)

gg 는 실수 하나를 받아 실수 하나를 내는 보통 함수입니다. 연쇄법칙으로 미분합니다. x+tux + tu 의 ii 번째 성분이 xi+tuix_i + t u_i 이므로 tt 에 대한 도함수가 uiu_i 이고,

g′(t)=∑i∂f∂xi(x+tu) ui=∇f(x+tu)⋅ug'(t) = \sum_i \frac{\partial f}{\partial x_i}(x + tu)\,u_i = \nabla f(x + tu)\cdot u

t=0t = 0 에서 읽으면 g′(0)=∇f(x)⋅ug'(0) = \nabla f(x)\cdot u 입니다. 이 값을 방향도함수라 하고, 그 방향으로 한 걸음 갈 때 함숫값이 얼마나 빨리 변하는지를 나타냅니다.

방향 하나를 고르면 곡면이 1변수 곡선으로 잘린다

두 번 미분하기

한 번 더 미분합니다. 이번에는 ∂f/∂xi\partial f/\partial x_i 각각에 같은 연쇄법칙을 적용합니다.

g′′(t)=∑i∑j∂2f∂xj∂xi(x+tu) ujui=uT∇2f(x+tu) ug''(t) = \sum_i \sum_j \frac{\partial^2 f}{\partial x_j \partial x_i}(x + tu)\, u_j u_i = u^{\mathsf T} \nabla^2 f(x+tu)\, u

t=0t = 0 에서 값을 읽습니다.

g′(0)=∇f(x)⋅ug'(0) = \nabla f(x)\cdot u — 방향 uu 로 갈 때의 기울기

g′′(0)=uT∇2f(x) ug''(0) = u^{\mathsf T} \nabla^2 f(x)\, u — 방향 uu 로 갈 때의 굽음

두 식의 모양이 다르다는 데 주목합니다. 기울기는 uu 에 한 번 걸리고 굽음은 두 번 걸립니다. 그래서 uu 를 −u-u 로 뒤집으면 기울기는 부호가 바뀌는데 굽음은 그대로입니다. 뒤로 걸으면 오르내림은 반대가 되지만 길이 굽은 정도는 같다는 뜻이고, 이 비대칭이 뒤에 나올 모든 것의 밑바탕입니다.

2차 테일러 근사

이제 1변수 테일러를 그대로 넣고 Δ=tu\Delta = t u 로 되돌립니다.

f(x+Δ)≈f(x)+∇f(x)⋅Δ+12 ΔT∇2f(x) Δf(x + \Delta) \approx f(x) + \nabla f(x)\cdot\Delta + \tfrac12\,\Delta^{\mathsf T}\nabla^2 f(x)\,\Delta

세 항이 하는 일이 다릅니다. 첫째는 지금 높이, 둘째는 기울어짐(1차, 벡터가 담당), 셋째는 굽음(2차, 행렬이 담당)입니다.

담당하는 대상의 모양이 왜 다른지도 여기서 보입니다. 기울어짐은 방향마다 수 하나씩이므로 nn 개의 수, 곧 벡터로 충분합니다. 굽음은 두 방향의 짝마다 수가 하나씩 필요하므로 n×nn \times n 개, 곧 행렬이 있어야 합니다. 파라미터가 백만 개면 기울기는 백만 개의 수인데 헤세는 1조 개입니다 — 이 차이가 2차 방법을 실제로는 잘 쓰지 못하는 이유입니다.

헤세 행렬

가운데 등장한 행렬에 이름을 붙입니다. 헤세 행렬은 이계편도함수를 n×nn\times n 으로 늘어놓은 것입니다.

[∇2f]ij=∂2f∂xi∂xj\big[\nabla^2 f\big]_{ij} = \frac{\partial^2 f}{\partial x_i \partial x_j}

슈바르츠 정리

ff 의 이계편도함수가 연속이면 미분 순서를 바꿔도 값이 같습니다. 이것을 슈바르츠 정리라고 하며, 그 결과로 헤세는 대칭 행렬이 됩니다.

이 대칭성이 뒤에 나올 모든 것의 전제입니다. 대칭 행렬 글에서 본 대로 대칭이면 실수 고윳값과 직교하는 고유벡터를 가지기 때문입니다. 대칭이 아니었다면 고윳값이 복소수일 수 있고, "이 방향의 곡률" 같은 말이 아예 성립하지 않습니다.

실무에서는 이 정리 덕분에 계산이 절반으로 줄기도 합니다. n×nn \times n 성분 가운데 실제로 구해야 하는 것은 대각선과 그 위쪽뿐이라 n(n+1)/2n(n+1)/2 개입니다.

이차형식

ΔTHΔ\Delta^{\mathsf T} H \Delta 는 그 글에서 다룬 이차형식입니다. 임계점 — 기울기가 0인 점 — 에서는 1차 항이 0이라 이 2차 항 혼자 근처의 모양을 정합니다.

f(x+Δ)≈f(x)+12 ΔTHΔf(x + \Delta) \approx f(x) + \tfrac12\,\Delta^{\mathsf T} H \Delta

그래서 임계점의 종류를 묻는 일이 이차형식의 부호를 묻는 일로 바뀝니다. 어느 Δ\Delta 에 대해서도 이 값이 양수이면 사방이 위로 올라가니 골짜기 바닥이고, 음수이면 봉우리 꼭대기이며, 방향에 따라 부호가 갈리면 어느 쪽으로는 오르고 어느 쪽으로는 내려가는 자리입니다. 부호를 방향마다 따지는 대신 한 번에 읽는 방법이 다음 절의 고윳값입니다.

손으로 구하는 헤세

한 예를 끝까지 해 봅니다.

f(x,y)=x3−3xy+y3f(x, y) = x^3 - 3xy + y^3

편도함수를 구합니다.

∂f∂x=3x2−3y,∂f∂y=−3x+3y2\frac{\partial f}{\partial x} = 3x^2 - 3y, \qquad \frac{\partial f}{\partial y} = -3x + 3y^2

둘이 함께 0인 점을 찾으면 y=x2y = x^2 이고 x=y2x = y^2 이므로 x4=xx^4 = x, 즉 x=0x = 0 또는 x=1x = 1 입니다. 임계점이 (0,0)(0,0) 과 (1,1)(1,1) 둘입니다.

이계편도함수는

∂2f∂x2=6x,∂2f∂x∂y=−3,∂2f∂y2=6y\frac{\partial^2 f}{\partial x^2} = 6x, \qquad \frac{\partial^2 f}{\partial x \partial y} = -3, \qquad \frac{\partial^2 f}{\partial y^2} = 6y

이므로 헤세는 H(x,y)=[6x−3−36y]H(x,y) = \begin{bmatrix} 6x & -3 \\ -3 & 6y \end{bmatrix} 입니다. 섞인 항이 −3-3 으로 상수이고 대각선 밖 두 자리가 같으니 대칭이 눈으로 확인됩니다.

두 임계점에 넣습니다.

H(0,0)=[0−3−30],H(1,1)=[6−3−36]H(0,0) = \begin{bmatrix} 0 & -3 \\ -3 & 0 \end{bmatrix}, \qquad H(1,1) = \begin{bmatrix} 6 & -3 \\ -3 & 6 \end{bmatrix}

앞의 것은 고윳값이 33 과 −3-3 이고 뒤의 것은 99 와 33 입니다. 무엇을 뜻하는지는 다음 절에서 읽습니다.

방향별 곡률

HH 가 대칭이므로 스펙트럼 정리로 직교 대각화됩니다.

H=QΛQT,Q=[ v1 ⋯ vn ],Λ=diag(λ1,…,λn)H = Q\Lambda Q^{\mathsf T}, \qquad Q = [\,v_1\ \cdots\ v_n\,],\quad \Lambda = \mathrm{diag}(\lambda_1, \dots, \lambda_n)

viv_i 는 서로 수직인 단위 고유벡터입니다. 이제 u=viu = v_i 를 넣어 봅니다.

viTHvi=viT(λivi)=λi ∥vi∥2=λiv_i^{\mathsf T} H v_i = v_i^{\mathsf T}(\lambda_i v_i) = \lambda_i\,\|v_i\|^2 = \lambda_i

고유벡터 viv_i 방향으로 걸어갈 때의 굽음이 정확히 λi\lambda_i 다. 고윳값은 그 방향의 곡률이다.

일반적인 방향 uu 는 어떨까요. uu 를 고유벡터로 펼쳐 u=∑iciviu = \sum_i c_i v_i 라 두면 ∥u∥2=∑ci2=1\|u\|^2 = \sum c_i^2 = 1 이고

uTHu=∑iλici2u^{\mathsf T} H u = \sum_i \lambda_i c_i^2

고윳값들의 가중평균입니다. 가중치가 음이 아니고 합이 1이므로 이 값은 언제나 최소·최대 고윳값 사이에 갇힙니다.

λmin⁡ ≤ uTHu ≤ λmax⁡(∥u∥=1)\lambda_{\min} \ \le\ u^{\mathsf T} H u \ \le\ \lambda_{\max} \qquad (\|u\| = 1)

이 값 uTHu/uTuu^{\mathsf T}Hu / u^{\mathsf T}u 를 레일리 몫이라고 부릅니다. 정리하면 가장 완만한 방향의 곡률이 λmin⁡\lambda_{\min}, 가장 가파른 방향의 곡률이 λmax⁡\lambda_{\max} 이고, 그 방향은 각각의 고유벡터입니다.

이제 앞의 말들이 번역됩니다.

  • 날카로운 최소점 — λmax⁡\lambda_{\max} 가 크다. 조금만 벗어나도 손실이 확 오른다.
  • 평평한 최소점 — 고윳값이 전반적으로 작다. 파라미터가 흔들려도 손실이 잘 안 오른다.
  • 평지 — λ≈0\lambda \approx 0 인 방향이 있다. 그 방향으로는 굽음도 기울기도 거의 없다.

부호가 전부 같을 때

고윳값이 전부 양수인 행렬을 양정치라고 합니다. 모든 방향의 곡률이 양수이니 어느 쪽으로 걸어도 위로 굽고, 임계점이라면 그 자리가 국소최소입니다. 사방이 올라가는 그릇 바닥입니다.

전부 음수인 음정치는 그 반대로 봉우리 꼭대기입니다. 앞 절의 H(1,1)=[6−3−36]H(1,1) = \begin{bmatrix} 6 & -3 \\ -3 & 6 \end{bmatrix} 이 고윳값 9와 3이라 양정치이고, 따라서 (1,1)(1,1) 은 국소최소입니다.

2×2에서는 고윳값을 구하지 않고도 판정할 수 있습니다. 두 고윳값의 곱이 행렬식이고 합이 대각합이므로, 행렬식이 양수이면 두 고윳값의 부호가 같고 그 부호는 대각합이 알려 줍니다. 위의 예에서 det⁡=36−9=27>0\det = 36 - 9 = 27 > 0 이고 대각합이 12>012 > 0 이라 둘 다 양수입니다.

부호가 섞일 때

고윳값에 양수와 음수가 함께 있으면 안장점입니다. 말안장처럼 앞뒤로는 내려가고 좌우로는 올라가는 자리이고, 최소도 최대도 아닙니다.

가장 단순한 예가 f(x,y)=x2−y2f(x,y) = x^2 - y^2 입니다. 헤세가 [200−2]\begin{bmatrix} 2 & 0 \\ 0 & -2 \end{bmatrix} 이라 xx 방향의 곡률이 +2+2, yy 방향이 −2-2 입니다. 원점에서 xx 축을 따라 걸으면 올라가고 yy 축을 따라 걸으면 내려갑니다.

앞 절의 H(0,0)=[0−3−30]H(0,0) = \begin{bmatrix} 0 & -3 \\ -3 & 0 \end{bmatrix} 도 고윳값이 33 과 −3-3 이라 안장점입니다. 2×2 판정으로는 det⁡=−9<0\det = -9 < 0 인 것만 봐도 됩니다 — 행렬식이 음수이면 두 고윳값의 부호가 다르므로 무조건 안장점입니다.

고윳값이 0일 때

고윳값에 0이 끼어 있으면 2차 항만으로는 판정할 수 없습니다. 그 방향으로 2차까지 완전히 평평하니, 실제로 오르는지 내리는지는 3차 이상의 항이 정하기 때문입니다.

두 함수를 나란히 놓으면 분명해집니다.

f(x,y)=x4+y2,g(x,y)=−x4+y2f(x,y) = x^4 + y^2, \qquad g(x,y) = -x^4 + y^2

둘 다 원점이 임계점이고, 헤세도 원점에서 [0002]\begin{bmatrix} 0 & 0 \\ 0 & 2 \end{bmatrix} 로 똑같습니다. 그런데 ff 는 xx 축을 따라 x4x^4 만큼 올라가므로 원점이 국소최소이고, gg 는 −x4-x^4 만큼 내려가므로 안장점입니다. 같은 헤세가 다른 답에 대응하니 헤세만으로는 가를 수가 없습니다.

이 일이 실제 손실에서도 일어납니다. f(x,y)=ex+yf(x,y) = e^{x+y} 를 원점에서 보면 헤세가 [1111]\begin{bmatrix}1&1\\1&1\end{bmatrix} 이고 고윳값이 22 와 00 입니다. (1,−1)(1,-1) 방향으로는 2차까지 봐도 완전히 평평합니다 — 지난 글에서 말한 평지가 이렇게 생겼습니다.

고차원의 안장점

"학습이 국소 최소에 갇힌다"는 말을 자주 듣습니다. 위의 판정을 파라미터 수만큼 늘려 보면 이 통념이 흔들립니다.

임계점이 국소최소이려면 고윳값 dd 개가 전부 양수여야 합니다. 부호가 저마다 독립적으로 정해진다고 거칠게 치면, 그럴 확률이 2−d2^{-d} 입니다.

차원 dd 전부 양수일 확률
2 1/4
10 약 1/1,000
100 약 10−3010^{-30}
1,000,000 사실상 0

그러니 고차원에서 마주치는 임계점은 거의 전부 안장점입니다. 국소최소는 드물고, 드문 만큼 갇힐 일도 드뭅니다. 학습이 느려지는 자리는 대개 최소점이 아니라 기울기가 아주 작아진 안장점 근처의 평지이고, 그곳은 갇힌 것이 아니라 나가는 방향을 찾는 데 오래 걸리는 것입니다. 빠져나갈 방향이 적어도 하나는 있다는 점에서 사정이 다릅니다.

동전 던지기 모형은 어디까지나 규모를 가늠하는 셈이라는 점은 짚어 둡니다. 실제 손실에서는 고윳값의 부호 비율이 그 자리의 손실 값과 함께 움직여서, 손실이 낮은 자리일수록 음의 고윳값이 줄어듭니다. 그래도 "전부 양수"라는 조건이 차원과 함께 급격히 어려워진다는 결론은 그대로입니다.

조건수와 등고선

임계점 근처에서는 f(x+Δ)≈f(x)+12ΔTHΔf(x+\Delta) \approx f(x) + \tfrac12 \Delta^{\mathsf T}H\Delta 이므로 등고선의 모양을 손으로 구할 수 있습니다.

타원의 반축

고유벡터 좌표계 y=QTΔy = Q^{\mathsf T}\Delta 로 옮기면 직교변환이 길이를 보존하므로

12ΔTHΔ=12∑iλiyi2=c\tfrac12\Delta^{\mathsf T}H\Delta = \tfrac12 \sum_i \lambda_i y_i^2 = c

λi\lambda_i 가 전부 양수이면 이것은 축이 고유벡터 방향인 타원이고, ii 번째 반축의 길이는 yi2=2c/λiy_i^2 = 2c/\lambda_i 에서

ai=2cλia_i = \sqrt{\dfrac{2c}{\lambda_i}}

입니다. 고윳값이 클수록 그 축은 짧습니다. 가파른 방향으로는 조금만 가도 손실이 cc 만큼 오르기 때문입니다.

가장 긴 축과 가장 짧은 축의 비가 지형이 얼마나 길쭉한지를 재는 숫자이고, 그것이 조건수입니다.

κ=λmax⁡λmin⁡,amax⁡amin⁡=λmax⁡λmin⁡=κ\kappa = \frac{\lambda_{\max}}{\lambda_{\min}}, \qquad \frac{a_{\max}}{a_{\min}} = \sqrt{\frac{\lambda_{\max}}{\lambda_{\min}}} = \sqrt{\kappa}

조건수가 κ\kappa 이면 등고선 타원의 길이 비가 κ\sqrt{\kappa} 다. κ=100\kappa = 100 이면 10배 길쭉한 골짜기다.

제곱근이 끼는 것을 놓치기 쉽습니다. 조건수는 곡률의 비이고 축 길이는 곡률의 제곱근에 반비례하므로, 조건수가 100배 나빠져도 눈에 보이는 길쭉함은 10배만 심해집니다. 거꾸로 말하면 눈으로 보아 10배쯤 길쭉한 골짜기는 이미 조건수가 100이라는 뜻입니다.

조건수가 커질수록 등고선이 길쭉해진다

손으로 구하는 조건수

손으로 하나 채워 봅니다. f(x,y)=12(5x2+6xy+5y2)f(x,y) = \tfrac12(5x^2 + 6xy + 5y^2) 의 헤세는

H=[5335]H = \begin{bmatrix} 5 & 3 \\ 3 & 5 \end{bmatrix}

입니다. 고윳값은 det⁡(H−λI)=(5−λ)2−9=0\det(H - \lambda I) = (5-\lambda)^2 - 9 = 0 에서 5−λ=±35 - \lambda = \pm 3, 즉 λ=8\lambda = 8 과 λ=2\lambda = 2 입니다. 고유벡터는 각각 (1,1)/2(1,1)/\sqrt2 와 (1,−1)/2(1,-1)/\sqrt2 이고, 레일리 몫으로 확인하면

12[11][5335][11]=12(8+8)=8,12[1−1][5335][1−1]=12(2+2)=2\frac{1}{2}\begin{bmatrix}1&1\end{bmatrix}\begin{bmatrix}5&3\\3&5\end{bmatrix}\begin{bmatrix}1\\1\end{bmatrix} = \frac{1}{2}(8 + 8) = 8, \qquad \frac{1}{2}\begin{bmatrix}1&-1\end{bmatrix}\begin{bmatrix}5&3\\3&5\end{bmatrix}\begin{bmatrix}1\\-1\end{bmatrix} = \frac{1}{2}(2 + 2) = 2

축 방향 두 개의 곡률이 8과 2입니다. 조건수는 κ=4\kappa = 4, 등고선의 길이 비는 4=2\sqrt4 = 2 입니다. 축이 아닌 방향, 예컨대 u=(1,0)u = (1,0) 을 넣으면 uTHu=5u^{\mathsf T}Hu = 5 로 2와 8 사이에 들어옵니다.

고윳값은 고유벡터 방향의 곡률이고 다른 방향은 그 사이에 갇힌다

여기서 한 가지를 눈여겨볼 만합니다. 원래 식의 계수 5, 6, 5 는 축과 아무 관계가 없는데 골짜기의 축은 (1,1)(1,1) 과 (1,−1)(1,-1) 방향으로 나왔습니다. 섞인 항 6xy6xy 가 축을 좌표축에서 45도 돌려 놓은 것입니다. 섞인 항이 없으면 헤세가 대각행렬이 되어 축이 좌표축과 일치하고, 그때는 고윳값이 곧 대각 성분입니다.

2차 근사의 오차

2차 항을 더하는 것이 실제로 얼마나 이득인지를 숫자로 봅니다.

오차의 차수

f(x,y)=ex+yf(x,y) = e^{x+y} 를 원점에서 전개합니다. f(0)=1f(0) = 1, ∇f(0)=(1,1)\nabla f(0) = (1,1), H=[1111]H = \begin{bmatrix}1&1\\1&1\end{bmatrix} 이므로 Δ=(Δ1,Δ2)\Delta = (\Delta_1, \Delta_2), s=Δ1+Δ2s = \Delta_1 + \Delta_2 라 두면

f(Δ)≈1+s+12s2f(\Delta) \approx 1 + s + \tfrac12 s^2

Δ=(0.1, 0.05)\Delta = (0.1,\ 0.05) 이면 s=0.15s = 0.15 이고 참값은 e0.15=1.1618342e^{0.15} = 1.1618342 입니다.

근사 값 오차
0차 (상수) 1.0000000 0.1618342
1차 (접평면) 1.1500000 0.0118342
2차 (헤세까지) 1.1612500 0.0005842

걸음을 절반으로 줄여 Δ=(0.05, 0.025)\Delta = (0.05,\ 0.025) 로 하면 1차 오차는 0.00288420.0028842, 2차 오차는 0.00007170.0000717 입니다. 1차 오차는 4.1배, 2차 오차는 8.1배 줄었습니다 — 각각 O(∥Δ∥2)O(\|\Delta\|^2) 과 O(∥Δ∥3)O(\|\Delta\|^3) 이라는 차수 그대로입니다.

2차 항을 더하면 근사가 훨씬 넓게 맞는다

이 표가 이 단원 전체의 전제입니다. 걸음이 작으면 2차 근사가 아주 잘 맞고, 잘 맞는 동안에는 지형이 사실상 이차함수입니다. 다음 글부터 학습률을 논할 때 "손실이 반드시 줄어드는 구간"을 계산할 수 있는 것이 이 덕분입니다.

어디까지 믿을 것인가

차수가 3이라는 말은 걸음을 늘리면 오차가 세제곱으로 커진다는 말이기도 합니다. 위의 표를 거꾸로 읽으면 걸음을 2배로 하면 2차 오차가 8배가 됩니다. 그러니 "2차 모형을 쓴다"는 결정에는 언제나 "어느 반지름 안에서"라는 단서가 따라붙어야 합니다.

그 반지름을 미리 계산으로 정하기는 어렵습니다. 3차 항의 크기를 알아야 하는데 그것을 알 바에는 3차까지 쓰면 되기 때문입니다. 그래서 실제로는 써 보고 고치는 방식을 씁니다. 이것이 신뢰영역 방법의 얼개입니다.

한 걸음마다 두 수를 견줍니다.

ρ=실제 줄어든 손실2차 모형이 예측한 감소\rho = \frac{\text{실제 줄어든 손실}}{\text{2차 모형이 예측한 감소}}

ρ\rho 가 1에 가까우면 모형이 그 걸음 크기에서 잘 맞고 있다는 뜻이고, 0에 가깝거나 음수이면 모형이 이미 깨진 자리까지 걸어간 것입니다. 그래서 규칙이 단순해집니다.

ρ\rho 판단 다음 걸음
크다 (0.75 이상) 모형이 잘 맞는다 반지름을 늘린다
중간 쓸 만하다 반지름을 그대로 둔다
작다 (0.25 이하) 모형이 깨졌다 반지름을 줄이고 그 걸음은 물린다

경사하강법의 학습률과 견주면 차이가 분명합니다. 학습률은 걸음의 배율을 정하고 신뢰영역은 걸음의 최대 길이를 정합니다. 그리고 학습률은 대개 미리 정한 일정대로 줄이는데, 신뢰영역의 반지름은 ρ\rho 라는 측정값을 보고 늘었다 줄었다 합니다. 2차 근사가 어디까지 맞는지를 매 걸음 재는 셈입니다.

코드로 확인하기

유한차분으로 만드는 헤세

헤세를 손으로 적지 않고 유한차분으로 만들어 봅니다. 기울기 검사 글의 중심차분을 두 번 쓰는 방식입니다.

import numpy as np

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

f = lambda v: 0.5 * (5*v[0]**2 + 6*v[0]*v[1] + 5*v[1]**2)
H = hessian(f, np.zeros(2))
print(np.round(H, 6))
# [[5. 3.]
#  [3. 5.]]

lam, V = np.linalg.eigh(H)
print("고윳값", lam, " 조건수", lam[-1]/lam[0], " 축 비율", np.sqrt(lam[-1]/lam[0]))
# 고윳값 [2. 8.]  조건수 4.000000000000001  축 비율 2.0

이중 루프가 n2n^2 번 돌고 한 번마다 함수를 네 번 부르므로 호출 수가 4n24n^2 입니다. 파라미터가 백만 개인 모형에 이 방식을 쓸 수 없는 이유가 여기 있습니다. 대칭성을 써서 절반만 구해도 규모는 그대로입니다.

레일리 몫 훑어보기

레일리 몫이 정말 두 고윳값 사이에 갇히는지 방향을 돌려 가며 봅니다.

for deg in range(0, 181, 30):
    a = np.deg2rad(deg)
    u = np.array([np.cos(a), np.sin(a)])
    print(f"{deg:3d}°  uᵀHu = {u @ H @ u:.4f}")

#   0°  uᵀHu = 5.0000
#  30°  uᵀHu = 7.5981
#  60°  uᵀHu = 7.5981
#  90°  uᵀHu = 5.0000
# 120°  uᵀHu = 2.4019
# 150°  uᵀHu = 2.4019
# 180°  uᵀHu = 5.0000

45°(고유벡터 (1,1)(1,1))에서 8, 135°에서 2가 나오고 나머지는 전부 그 사이입니다. 0°와 180°의 값이 같은 것이 앞에서 말한 비대칭의 확인입니다 — 방향을 뒤집어도 굽음은 그대로입니다.

오차의 차수 재기

마지막으로 테일러 오차의 차수를 확인합니다.

g = lambda v: np.exp(v[0] + v[1])
for d in [np.array([0.1, 0.05]), np.array([0.05, 0.025])]:
    s = d.sum()
    print(f"Δ={d}  1차 오차 {abs(g(d)-(1+s)):.7f}   2차 오차 {abs(g(d)-(1+s+0.5*s*s)):.7f}")

# Δ=[0.1  0.05]  1차 오차 0.0118342   2차 오차 0.0005842
# Δ=[0.05  0.025]  1차 오차 0.0028842   2차 오차 0.0000717

걸음을 절반으로 줄였을 때 1차 오차가 4배, 2차 오차가 8배 줄어드는 것이 각각 제곱과 세제곱이라는 증거입니다.

연습 문제

연습 1 — 헤세 구하기

다음 함수의 헤세 행렬을 지정된 점에서 구하세요. 대칭인지도 확인하세요.

  1. f(x,y)=x2+3xy+2y2f(x,y) = x^2 + 3xy + 2y^2 를 모든 점에서
    fx=2x+3yf_x = 2x + 3y, fy=3x+4yf_y = 3x + 4y 이므로 fxx=2f_{xx} = 2, fxy=3f_{xy} = 3, fyy=4f_{yy} = 4 입니다. H=[2334]H = \begin{bmatrix} 2 & 3 \\ 3 & 4 \end{bmatrix} 이고 점과 무관하게 일정합니다 — 이차함수라 헤세가 상수입니다. 대각선 밖 두 자리가 3으로 같아 대칭입니다.
  2. f(x,y)=x2y+y3f(x,y) = x^2 y + y^3 를 (1,2)(1, 2) 에서
    fx=2xyf_x = 2xy, fy=x2+3y2f_y = x^2 + 3y^2 이므로 fxx=2yf_{xx} = 2y, fxy=2xf_{xy} = 2x, fyy=6yf_{yy} = 6y 입니다. (1,2)(1,2) 에 넣으면 H=[42212]H = \begin{bmatrix} 4 & 2 \\ 2 & 12 \end{bmatrix} 입니다. 순서를 바꿔 ∂(fy)/∂x=2x\partial(f_y)/\partial x = 2x 를 구해도 같은 값이라 슈바르츠 정리가 확인됩니다.
  3. f(x,y)=excos⁡yf(x,y) = e^{x}\cos y 를 (0,0)(0, 0) 에서
    fx=excos⁡yf_x = e^x\cos y, fy=−exsin⁡yf_y = -e^x\sin y 이므로 fxx=excos⁡yf_{xx} = e^x\cos y, fxy=−exsin⁡yf_{xy} = -e^x\sin y, fyy=−excos⁡yf_{yy} = -e^x\cos y 입니다. (0,0)(0,0) 에서 cos⁡0=1\cos 0 = 1, sin⁡0=0\sin 0 = 0 이므로 H=[100−1]H = \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} 입니다.

연습 2 — 고윳값으로 임계점 가르기

아래 행렬이 모두 임계점에서의 헤세라고 할 때, 고윳값을 구하고 그 점이 국소최소·국소최대·안장점 중 무엇인지 답하세요.

  1. H=[2003]H = \begin{bmatrix} 2 & 0 \\ 0 & 3 \end{bmatrix}
    대각행렬이므로 고윳값이 그대로 22 와 33 입니다. 둘 다 양수라 양정치이고 국소최소입니다. 등고선은 yy 축 쪽이 조금 더 짧은 타원입니다.
  2. H=[1221]H = \begin{bmatrix} 1 & 2 \\ 2 & 1 \end{bmatrix}
    (1−λ)2−4=0(1-\lambda)^2 - 4 = 0 에서 1−λ=±21 - \lambda = \pm 2 이므로 λ=3\lambda = 3 과 λ=−1\lambda = -1 입니다. 부호가 갈리므로 안장점입니다. 행렬식이 1−4=−3<01 - 4 = -3 < 0 인 것만 봐도 같은 결론이 나옵니다.
  3. H=[−411−4]H = \begin{bmatrix} -4 & 1 \\ 1 & -4 \end{bmatrix}
    (−4−λ)2−1=0(-4-\lambda)^2 - 1 = 0 에서 λ=−3\lambda = -3 과 λ=−5\lambda = -5 입니다. 둘 다 음수라 음정치이고 국소최대입니다. 행렬식 16−1=15>016 - 1 = 15 > 0 이라 부호가 같고, 대각합 −8<0-8 < 0 이라 그 부호가 음수임을 알 수도 있습니다.

연습 3 — 조건수와 등고선

  1. H=[10001]H = \begin{bmatrix} 10 & 0 \\ 0 & 1 \end{bmatrix} 의 조건수와 등고선 타원의 길이 비를 구하고, 긴 축이 어느 방향인지 답하세요.
    고윳값이 1010 과 11 이므로 κ=10\kappa = 10 이고 길이 비는 10≈3.16\sqrt{10} \approx 3.16 입니다. 반축이 2c/λ\sqrt{2c/\lambda} 이라 고윳값이 작은 쪽이 긴 축이므로, 긴 축은 고윳값 1에 딸린 yy 축 방향입니다.
  2. H=[4224]H = \begin{bmatrix} 4 & 2 \\ 2 & 4 \end{bmatrix} 에 대해 같은 것을 구하세요.
    (4−λ)2−4=0(4-\lambda)^2 - 4 = 0 에서 λ=6\lambda = 6 과 λ=2\lambda = 2 입니다. κ=3\kappa = 3 이고 길이 비는 3≈1.73\sqrt3 \approx 1.73 입니다. 고윳값 2에 딸린 고유벡터가 (1,−1)(1,-1) 이므로 긴 축은 그 방향이고, 좌표축에서 45도 기울어져 있습니다.

정리

  • 방향 uu 를 고정하면 다변수 함수가 g(t)=f(x+tu)g(t) = f(x+tu) 라는 1변수 함수가 되고, 연쇄법칙에서 g′(0)=∇f⋅ug'(0) = \nabla f\cdot u, g′′(0)=uT∇2f ug''(0) = u^{\mathsf T}\nabla^2 f\,u 가 나옵니다. 그래서 2차 테일러 근사는 f(x+Δ)≈f(x)+∇f⋅Δ+12ΔTHΔf(x+\Delta) \approx f(x) + \nabla f\cdot\Delta + \tfrac12\Delta^{\mathsf T}H\Delta 입니다. 기울기는 uu 에 한 번, 굽음은 두 번 걸리므로 방향을 뒤집으면 기울기만 부호가 바뀝니다.
  • 헤세 행렬은 이계편도함수의 n×nn\times n 표이고 슈바르츠 정리로 대칭입니다. 대칭이라 직교 대각화되고, 그래서 고윳값 이야기를 할 수 있습니다. 벡터인 기울기와 달리 행렬이라 크기가 n2n^2 으로 커집니다.
  • 고유벡터 방향의 곡률이 곧 그 고윳값이고, 일반 방향의 곡률인 레일리 몫은 λmin⁡\lambda_{\min} 과 λmax⁡\lambda_{\max} 사이에 갇힙니다. "날카롭다"는 λmax⁡\lambda_{\max} 가 크다는 뜻, "평평하다"는 고윳값이 작다는 뜻입니다.
  • 고윳값이 전부 양수면 국소최소, 전부 음수면 국소최대, 부호가 섞이면 안장점입니다. 0이 끼면 2차로는 판정할 수 없습니다 — x4+y2x^4 + y^2 과 −x4+y2-x^4 + y^2 이 원점에서 헤세가 같은데 답이 다릅니다.
  • 고윳값 dd 개가 전부 양수여야 국소최소이므로 차원이 커질수록 임계점은 거의 전부 안장점입니다. "국소 최소에 갇힌다"보다는 "안장점 근처 평지에서 느려진다"가 실제에 가깝습니다.
  • 등고선 타원의 ii 번째 반축이 2c/λi\sqrt{2c/\lambda_i} 이므로 조건수 κ=λmax⁡/λmin⁡\kappa = \lambda_{\max}/\lambda_{\min} 의 제곱근이 곧 타원의 길이 비입니다. κ=100\kappa=100 이면 10배 길쭉합니다. 섞인 항이 축을 좌표축에서 돌려 놓습니다.
  • 걸음이 작으면 2차 근사의 오차가 O(∥Δ∥3)O(\|\Delta\|^3) 이라 아주 잘 맞습니다. 거꾸로 걸음이 커지면 세제곱으로 나빠지므로, 어디까지 믿을지를 실제 감소와 예측 감소의 비로 재어 반지름을 조절하는 것이 신뢰영역 방법입니다.

여기까지가 지형을 읽는 도구입니다. 다음 글에서 이 2차 근사를 그대로 써서 경사하강 갱신식을 유도하고, 손실이 반드시 줄어드는 학습률의 구간이 0<η<2/L0 < \eta < 2/L 임을 계산합니다. 그 LL 이 방금 본 λmax⁡\lambda_{\max} 와 어떤 관계인지도 거기서 드러납니다.


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

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