손실 지형을 지금 서 있는 자리에서 이차함수로 흉내 내면 헤세 행렬이 나옵니다. 고윳값이 방향별 곡률이라는 것을 레일리 몫으로 확인하고, 조건수가 등고선을 얼마나 길쭉하게 만드는지 계산합니다. '날카로운 최소점'과 '잘 조건화된 문제'를 정확히 읽는 도구입니다.
PALDYN Team//34 MIN READ
45MATH
중급
테일러전개 · 헤세행렬
최적화 이야기에는 눈으로 그려지지 않는 말이 자주 나옵니다. "이 최소점은 날카롭다", "저쪽은 평평해서 일반화가 잘된다", "문제가 잘 조건화되어 있으면 빨리 수렴한다". 세 문장 모두 정확한 수학적 대상을 가리키고 있고, 그 대상은 하나입니다.
지난 글에서 헤세 행렬을 부호 판정에만 썼습니다. 이 글에서 그것이 다변수 테일러 전개의 어디서 나오는지를 유도하고, 고윳값이 곧 방향별 곡률이라는 해석을 세웁니다. 이 단원의 남은 글들 — 학습률의 상한, 모멘텀의 이득, Adam이 무엇을 근사하는가 — 이 전부 여기서 나온 결과를 씁니다.
두 식의 모양이 다르다는 데 주목합니다. 기울기는 u 에 한 번 걸리고 굽음은 두 번 걸립니다. 그래서 u 를 −u 로 뒤집으면 기울기는 부호가 바뀌는데 굽음은 그대로입니다. 뒤로 걸으면 오르내림은 반대가 되지만 길이 굽은 정도는 같다는 뜻이고, 이 비대칭이 뒤에 나올 모든 것의 밑바탕입니다.
2차 테일러 근사
이제 1변수 테일러를 그대로 넣고 Δ=tu 로 되돌립니다.
f(x+Δ)≈f(x)+∇f(x)⋅Δ+21ΔT∇2f(x)Δ
세 항이 하는 일이 다릅니다. 첫째는 지금 높이, 둘째는 기울어짐(1차, 벡터가 담당), 셋째는 굽음(2차, 행렬이 담당)입니다.
담당하는 대상의 모양이 왜 다른지도 여기서 보입니다. 기울어짐은 방향마다 수 하나씩이므로 n 개의 수, 곧 벡터로 충분합니다. 굽음은 두 방향의 짝마다 수가 하나씩 필요하므로 n×n 개, 곧 행렬이 있어야 합니다. 파라미터가 백만 개면 기울기는 백만 개의 수인데 헤세는 1조 개입니다 — 이 차이가 2차 방법을 실제로는 잘 쓰지 못하는 이유입니다.
헤세 행렬
가운데 등장한 행렬에 이름을 붙입니다. 헤세 행렬은 이계편도함수를 n×n 으로 늘어놓은 것입니다.
[∇2f]ij=∂xi∂xj∂2f
슈바르츠 정리
f 의 이계편도함수가 연속이면 미분 순서를 바꿔도 값이 같습니다. 이것을 슈바르츠 정리라고 하며, 그 결과로 헤세는 대칭 행렬이 됩니다.
이 대칭성이 뒤에 나올 모든 것의 전제입니다. 대칭 행렬 글에서 본 대로 대칭이면 실수 고윳값과 직교하는 고유벡터를 가지기 때문입니다. 대칭이 아니었다면 고윳값이 복소수일 수 있고, "이 방향의 곡률" 같은 말이 아예 성립하지 않습니다.
실무에서는 이 정리 덕분에 계산이 절반으로 줄기도 합니다. n×n 성분 가운데 실제로 구해야 하는 것은 대각선과 그 위쪽뿐이라 n(n+1)/2 개입니다.
이차형식
ΔTHΔ 는 그 글에서 다룬 이차형식입니다. 임계점 — 기울기가 0인 점 — 에서는 1차 항이 0이라 이 2차 항 혼자 근처의 모양을 정합니다.
f(x+Δ)≈f(x)+21ΔTHΔ
그래서 임계점의 종류를 묻는 일이 이차형식의 부호를 묻는 일로 바뀝니다. 어느 Δ 에 대해서도 이 값이 양수이면 사방이 위로 올라가니 골짜기 바닥이고, 음수이면 봉우리 꼭대기이며, 방향에 따라 부호가 갈리면 어느 쪽으로는 오르고 어느 쪽으로는 내려가는 자리입니다. 부호를 방향마다 따지는 대신 한 번에 읽는 방법이 다음 절의 고윳값입니다.
손으로 구하는 헤세
한 예를 끝까지 해 봅니다.
f(x,y)=x3−3xy+y3
편도함수를 구합니다.
∂x∂f=3x2−3y,∂y∂f=−3x+3y2
둘이 함께 0인 점을 찾으면 y=x2 이고 x=y2 이므로 x4=x, 즉 x=0 또는 x=1 입니다. 임계점이 (0,0) 과 (1,1) 둘입니다.
이계편도함수는
∂x2∂2f=6x,∂x∂y∂2f=−3,∂y2∂2f=6y
이므로 헤세는 H(x,y)=[6x−3−36y] 입니다. 섞인 항이 −3 으로 상수이고 대각선 밖 두 자리가 같으니 대칭이 눈으로 확인됩니다.
두 임계점에 넣습니다.
H(0,0)=[0−3−30],H(1,1)=[6−3−36]
앞의 것은 고윳값이 3 과 −3 이고 뒤의 것은 9 와 3 입니다. 무엇을 뜻하는지는 다음 절에서 읽습니다.
고유벡터 vi 방향으로 걸어갈 때의 굽음이 정확히 λi 다. 고윳값은 그 방향의 곡률이다.
일반적인 방향 u 는 어떨까요. u 를 고유벡터로 펼쳐 u=∑icivi 라 두면 ∥u∥2=∑ci2=1 이고
uTHu=∑iλici2
고윳값들의 가중평균입니다. 가중치가 음이 아니고 합이 1이므로 이 값은 언제나 최소·최대 고윳값 사이에 갇힙니다.
λmin≤uTHu≤λmax(∥u∥=1)
이 값 uTHu/uTu 를 레일리 몫이라고 부릅니다. 정리하면 가장 완만한 방향의 곡률이 λmin, 가장 가파른 방향의 곡률이 λmax 이고, 그 방향은 각각의 고유벡터입니다.
이제 앞의 말들이 번역됩니다.
날카로운 최소점 — λmax 가 크다. 조금만 벗어나도 손실이 확 오른다.
평평한 최소점 — 고윳값이 전반적으로 작다. 파라미터가 흔들려도 손실이 잘 안 오른다.
평지 — λ≈0 인 방향이 있다. 그 방향으로는 굽음도 기울기도 거의 없다.
부호가 전부 같을 때
고윳값이 전부 양수인 행렬을 양정치라고 합니다. 모든 방향의 곡률이 양수이니 어느 쪽으로 걸어도 위로 굽고, 임계점이라면 그 자리가 국소최소입니다. 사방이 올라가는 그릇 바닥입니다.
전부 음수인 음정치는 그 반대로 봉우리 꼭대기입니다. 앞 절의 H(1,1)=[6−3−36] 이 고윳값 9와 3이라 양정치이고, 따라서 (1,1) 은 국소최소입니다.
2×2에서는 고윳값을 구하지 않고도 판정할 수 있습니다. 두 고윳값의 곱이 행렬식이고 합이 대각합이므로, 행렬식이 양수이면 두 고윳값의 부호가 같고 그 부호는 대각합이 알려 줍니다. 위의 예에서 det=36−9=27>0 이고 대각합이 12>0 이라 둘 다 양수입니다.
부호가 섞일 때
고윳값에 양수와 음수가 함께 있으면 안장점입니다. 말안장처럼 앞뒤로는 내려가고 좌우로는 올라가는 자리이고, 최소도 최대도 아닙니다.
가장 단순한 예가 f(x,y)=x2−y2 입니다. 헤세가 [200−2] 이라 x 방향의 곡률이 +2, y 방향이 −2 입니다. 원점에서 x 축을 따라 걸으면 올라가고 y 축을 따라 걸으면 내려갑니다.
앞 절의 H(0,0)=[0−3−30] 도 고윳값이 3 과 −3 이라 안장점입니다. 2×2 판정으로는 det=−9<0 인 것만 봐도 됩니다 — 행렬식이 음수이면 두 고윳값의 부호가 다르므로 무조건 안장점입니다.
고윳값이 0일 때
고윳값에 0이 끼어 있으면 2차 항만으로는 판정할 수 없습니다. 그 방향으로 2차까지 완전히 평평하니, 실제로 오르는지 내리는지는 3차 이상의 항이 정하기 때문입니다.
두 함수를 나란히 놓으면 분명해집니다.
f(x,y)=x4+y2,g(x,y)=−x4+y2
둘 다 원점이 임계점이고, 헤세도 원점에서 [0002] 로 똑같습니다. 그런데 f 는 x 축을 따라 x4 만큼 올라가므로 원점이 국소최소이고, g 는 −x4 만큼 내려가므로 안장점입니다. 같은 헤세가 다른 답에 대응하니 헤세만으로는 가를 수가 없습니다.
이 일이 실제 손실에서도 일어납니다. f(x,y)=ex+y 를 원점에서 보면 헤세가 [1111] 이고 고윳값이 2 와 0 입니다. (1,−1) 방향으로는 2차까지 봐도 완전히 평평합니다 — 지난 글에서 말한 평지가 이렇게 생겼습니다.
고차원의 안장점
"학습이 국소 최소에 갇힌다"는 말을 자주 듣습니다. 위의 판정을 파라미터 수만큼 늘려 보면 이 통념이 흔들립니다.
임계점이 국소최소이려면 고윳값 d 개가 전부 양수여야 합니다. 부호가 저마다 독립적으로 정해진다고 거칠게 치면, 그럴 확률이 2−d 입니다.
차원 d
전부 양수일 확률
2
1/4
10
약 1/1,000
100
약 10−30
1,000,000
사실상 0
그러니 고차원에서 마주치는 임계점은 거의 전부 안장점입니다. 국소최소는 드물고, 드문 만큼 갇힐 일도 드뭅니다. 학습이 느려지는 자리는 대개 최소점이 아니라 기울기가 아주 작아진 안장점 근처의 평지이고, 그곳은 갇힌 것이 아니라 나가는 방향을 찾는 데 오래 걸리는 것입니다. 빠져나갈 방향이 적어도 하나는 있다는 점에서 사정이 다릅니다.
동전 던지기 모형은 어디까지나 규모를 가늠하는 셈이라는 점은 짚어 둡니다. 실제 손실에서는 고윳값의 부호 비율이 그 자리의 손실 값과 함께 움직여서, 손실이 낮은 자리일수록 음의 고윳값이 줄어듭니다. 그래도 "전부 양수"라는 조건이 차원과 함께 급격히 어려워진다는 결론은 그대로입니다.
조건수와 등고선
임계점 근처에서는 f(x+Δ)≈f(x)+21ΔTHΔ 이므로 등고선의 모양을 손으로 구할 수 있습니다.
축 방향 두 개의 곡률이 8과 2입니다. 조건수는 κ=4, 등고선의 길이 비는 4=2 입니다. 축이 아닌 방향, 예컨대 u=(1,0) 을 넣으면 uTHu=5 로 2와 8 사이에 들어옵니다.
여기서 한 가지를 눈여겨볼 만합니다. 원래 식의 계수 5, 6, 5 는 축과 아무 관계가 없는데 골짜기의 축은 (1,1) 과 (1,−1) 방향으로 나왔습니다. 섞인 항 6xy 가 축을 좌표축에서 45도 돌려 놓은 것입니다. 섞인 항이 없으면 헤세가 대각행렬이 되어 축이 좌표축과 일치하고, 그때는 고윳값이 곧 대각 성분입니다.
2차 근사의 오차
2차 항을 더하는 것이 실제로 얼마나 이득인지를 숫자로 봅니다.
오차의 차수
f(x,y)=ex+y 를 원점에서 전개합니다. f(0)=1, ∇f(0)=(1,1), H=[1111] 이므로 Δ=(Δ1,Δ2), s=Δ1+Δ2 라 두면
걸음을 절반으로 줄여 Δ=(0.05,0.025) 로 하면 1차 오차는 0.0028842, 2차 오차는 0.0000717 입니다. 1차 오차는 4.1배, 2차 오차는 8.1배 줄었습니다 — 각각 O(∥Δ∥2) 과 O(∥Δ∥3) 이라는 차수 그대로입니다.
이 표가 이 단원 전체의 전제입니다. 걸음이 작으면 2차 근사가 아주 잘 맞고, 잘 맞는 동안에는 지형이 사실상 이차함수입니다. 다음 글부터 학습률을 논할 때 "손실이 반드시 줄어드는 구간"을 계산할 수 있는 것이 이 덕분입니다.
어디까지 믿을 것인가
차수가 3이라는 말은 걸음을 늘리면 오차가 세제곱으로 커진다는 말이기도 합니다. 위의 표를 거꾸로 읽으면 걸음을 2배로 하면 2차 오차가 8배가 됩니다. 그러니 "2차 모형을 쓴다"는 결정에는 언제나 "어느 반지름 안에서"라는 단서가 따라붙어야 합니다.
그 반지름을 미리 계산으로 정하기는 어렵습니다. 3차 항의 크기를 알아야 하는데 그것을 알 바에는 3차까지 쓰면 되기 때문입니다. 그래서 실제로는 써 보고 고치는 방식을 씁니다. 이것이 신뢰영역 방법의 얼개입니다.
한 걸음마다 두 수를 견줍니다.
ρ=2차모형이예측한감소실제줄어든손실
ρ 가 1에 가까우면 모형이 그 걸음 크기에서 잘 맞고 있다는 뜻이고, 0에 가깝거나 음수이면 모형이 이미 깨진 자리까지 걸어간 것입니다. 그래서 규칙이 단순해집니다.
ρ
판단
다음 걸음
크다 (0.75 이상)
모형이 잘 맞는다
반지름을 늘린다
중간
쓸 만하다
반지름을 그대로 둔다
작다 (0.25 이하)
모형이 깨졌다
반지름을 줄이고 그 걸음은 물린다
경사하강법의 학습률과 견주면 차이가 분명합니다. 학습률은 걸음의 배율을 정하고 신뢰영역은 걸음의 최대 길이를 정합니다. 그리고 학습률은 대개 미리 정한 일정대로 줄이는데, 신뢰영역의 반지름은 ρ 라는 측정값을 보고 늘었다 줄었다 합니다. 2차 근사가 어디까지 맞는지를 매 걸음 재는 셈입니다.
코드로 확인하기
유한차분으로 만드는 헤세
헤세를 손으로 적지 않고 유한차분으로 만들어 봅니다. 기울기 검사 글의 중심차분을 두 번 쓰는 방식입니다.
import numpy as npdef 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 Hf = 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
이중 루프가 n2 번 돌고 한 번마다 함수를 네 번 부르므로 호출 수가 4n2 입니다. 파라미터가 백만 개인 모형에 이 방식을 쓸 수 없는 이유가 여기 있습니다. 대칭성을 써서 절반만 구해도 규모는 그대로입니다.
레일리 몫 훑어보기
레일리 몫이 정말 두 고윳값 사이에 갇히는지 방향을 돌려 가며 봅니다.
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))에서 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 — 헤세 구하기
다음 함수의 헤세 행렬을 지정된 점에서 구하세요. 대칭인지도 확인하세요.
f(x,y)=x2+3xy+2y2 를 모든 점에서
fx=2x+3y, fy=3x+4y 이므로 fxx=2, fxy=3, fyy=4 입니다. H=[2334] 이고 점과 무관하게 일정합니다 — 이차함수라 헤세가 상수입니다. 대각선 밖 두 자리가 3으로 같아 대칭입니다.
f(x,y)=x2y+y3 를 (1,2) 에서
fx=2xy, fy=x2+3y2 이므로 fxx=2y, fxy=2x, fyy=6y 입니다. (1,2) 에 넣으면 H=[42212] 입니다. 순서를 바꿔 ∂(fy)/∂x=2x 를 구해도 같은 값이라 슈바르츠 정리가 확인됩니다.
아래 행렬이 모두 임계점에서의 헤세라고 할 때, 고윳값을 구하고 그 점이 국소최소·국소최대·안장점 중 무엇인지 답하세요.
H=[2003]
대각행렬이므로 고윳값이 그대로 2 와 3 입니다. 둘 다 양수라 양정치이고 국소최소입니다. 등고선은 y 축 쪽이 조금 더 짧은 타원입니다.
H=[1221]
(1−λ)2−4=0 에서 1−λ=±2 이므로 λ=3 과 λ=−1 입니다. 부호가 갈리므로 안장점입니다. 행렬식이 1−4=−3<0 인 것만 봐도 같은 결론이 나옵니다.
H=[−411−4]
(−4−λ)2−1=0 에서 λ=−3 과 λ=−5 입니다. 둘 다 음수라 음정치이고 국소최대입니다. 행렬식 16−1=15>0 이라 부호가 같고, 대각합 −8<0 이라 그 부호가 음수임을 알 수도 있습니다.
연습 3 — 조건수와 등고선
H=[10001] 의 조건수와 등고선 타원의 길이 비를 구하고, 긴 축이 어느 방향인지 답하세요.
고윳값이 10 과 1 이므로 κ=10 이고 길이 비는 10≈3.16 입니다. 반축이 2c/λ 이라 고윳값이 작은 쪽이 긴 축이므로, 긴 축은 고윳값 1에 딸린 y 축 방향입니다.
H=[4224] 에 대해 같은 것을 구하세요.
(4−λ)2−4=0 에서 λ=6 과 λ=2 입니다. κ=3 이고 길이 비는 3≈1.73 입니다. 고윳값 2에 딸린 고유벡터가 (1,−1) 이므로 긴 축은 그 방향이고, 좌표축에서 45도 기울어져 있습니다.
정리
방향 u 를 고정하면 다변수 함수가 g(t)=f(x+tu) 라는 1변수 함수가 되고, 연쇄법칙에서 g′(0)=∇f⋅u, g′′(0)=uT∇2fu 가 나옵니다. 그래서 2차 테일러 근사는 f(x+Δ)≈f(x)+∇f⋅Δ+21ΔTHΔ 입니다. 기울기는 u 에 한 번, 굽음은 두 번 걸리므로 방향을 뒤집으면 기울기만 부호가 바뀝니다.
헤세 행렬은 이계편도함수의 n×n 표이고 슈바르츠 정리로 대칭입니다. 대칭이라 직교 대각화되고, 그래서 고윳값 이야기를 할 수 있습니다. 벡터인 기울기와 달리 행렬이라 크기가 n2 으로 커집니다.
고유벡터 방향의 곡률이 곧 그 고윳값이고, 일반 방향의 곡률인 레일리 몫은 λmin 과 λmax 사이에 갇힙니다. "날카롭다"는 λmax 가 크다는 뜻, "평평하다"는 고윳값이 작다는 뜻입니다.
고윳값이 전부 양수면 국소최소, 전부 음수면 국소최대, 부호가 섞이면 안장점입니다. 0이 끼면 2차로는 판정할 수 없습니다 — x4+y2 과 −x4+y2 이 원점에서 헤세가 같은데 답이 다릅니다.
고윳값 d 개가 전부 양수여야 국소최소이므로 차원이 커질수록 임계점은 거의 전부 안장점입니다. "국소 최소에 갇힌다"보다는 "안장점 근처 평지에서 느려진다"가 실제에 가깝습니다.
등고선 타원의 i 번째 반축이 2c/λi 이므로 조건수 κ=λmax/λmin 의 제곱근이 곧 타원의 길이 비입니다. κ=100 이면 10배 길쭉합니다. 섞인 항이 축을 좌표축에서 돌려 놓습니다.
걸음이 작으면 2차 근사의 오차가 O(∥Δ∥3) 이라 아주 잘 맞습니다. 거꾸로 걸음이 커지면 세제곱으로 나빠지므로, 어디까지 믿을지를 실제 감소와 예측 감소의 비로 재어 반지름을 조절하는 것이 신뢰영역 방법입니다.
여기까지가 지형을 읽는 도구입니다. 다음 글에서 이 2차 근사를 그대로 써서 경사하강 갱신식을 유도하고, 손실이 반드시 줄어드는 학습률의 구간이 0<η<2/L 임을 계산합니다. 그 L 이 방금 본 λmax 와 어떤 관계인지도 거기서 드러납니다.
실수를 2^b개 격자에 사상할 때 오차의 분산이 왜 Δ²/12인지 유도하고, 그것이 비트당 6.02dB라는 SNR로 번역되는 과정을 실측과 대조했습니다. 이상치 하나가 나머지 값의 유효 비트를 어떻게 먹는지, 그리고 int4에서 성능이 무너지는 지점을 오차 예산으로 미리 계산하는 법까지.
최댓값 빼기, 로그 공간, log1p·expm1, 분산의 두 공식, 정규화의 ε, fp32 누산, 역행렬 대신 solve — 프레임워크가 몰래 해 주는 일곱 가지를 하나씩 꺼내 각각 어떤 고장을 막는지 직접 재 봤습니다. 수식을 그대로 옮긴 코드가 왜 라이브러리보다 나쁜지에 대한 목록입니다.
0.1 + 0.2가 0.3이 아닌 이유부터 시작해 머신 엡실론을 유도하고, 같은 16비트인데 fp16과 bf16이 서로 다른 지점에서 터지는 이유, 비슷한 수를 뺄 때 유효자리가 사라지는 파괴적 상쇄, 그리고 1,000만 개를 순서만 바꿔 더했을 때 오차가 백만 배 갈리는 실험까지 직접 재 봤습니다.