최적화는 "가장 좋은 것"을 찾는 일입니다. 오차가 가장 작은 곡선, 무게가 가장 가벼운 빔, 손실이 가장 작은 신경망. 수학적으로는 함수 f(x)의 최솟값을 찾는 문제이고, 미적분은 그 답이 ∇f=0인 곳에 있다고 말해 줍니다. 그러나 ∇f=0은 대개 풀 수 없는 비선형 연립방정식이고, 도함수가 아예 없거나, 변수가 수백만 개이거나, 데이터가 너무 많아 f 한 번 계산하기도 버겁습니다. 이 장은 내리막을 따라 한 걸음씩 가는 반복법의 공학입니다. 1차원 구간을 줄이는 황금 분할에서 출발해 경사 하강과 직선 탐색, 조건수가 만드는 지그재그와 모멘텀, 곡률을 쓰는 뉴턴과 그 값싼 대용품 BFGS, 도함수 없는 넬더–미드, 곡선 맞춤의 레벤버그–마쿼트, 제약 조건, 데이터가 많을 때의 확률적 경사 하강, 그리고 국소 최솟값의 함정에서 빠져나오는 담금질 기법까지 갑니다.
단봉 함수에서 황금 분할 탐색이 구간을 매번 0.618배로 줄이는 이유를 설명하고, 포물선 보간과 결합한 브렌트 방법의 아이디어를 안다.
하강 방향과 아르미호 조건을 정의하고, 되돌아가기 직선 탐색을 손으로 수행한다.
이차 함수에서 경사 하강의 수렴률 (κ−1)/(κ+1)을 조건수로 설명하고, 모멘텀이 이를 (κ−1)/(κ+1)로 줄이는 효과를 측정한다.
뉴턴 방법의 2차 수렴과 헤세 행렬이 양정치가 아닐 때의 실패를 알고, BFGS의 할선 조건과 갱신 공식을 쓴다.
넬더–미드 심플렉스의 반사·확장·수축·축소 규칙을 따라가고, 비선형 최소제곱을 가우스–뉴턴과 레벤버그–마쿼트로 푼다.
벌칙법·라그랑주 승수·KKT 조건으로 제약 최적화를 다루고, 확률적 경사 하강과 담금질 기법이 왜 필요한지 설명한다.
이 수식이 없었다면학습하는 기계와 가벼운 날개
음성 인식기와 번역기 안의 신경망은 수십억 개의 숫자로 이루어져 있고, 그 숫자들은 누가 손으로 정한 것이 아니라 "예측이 틀린 정도"를 나타내는 함수를 줄이는 방향으로 수없이 조금씩 고쳐서 얻었습니다. 항공기 날개와 자동차 차체의 모양, 반도체 공정의 조건, GPS 수신기가 위성 신호에서 위치를 뽑는 계산, 실험 데이터에 모델 곡선을 맞추는 일도 모두 어떤 함수를 가장 작게 만드는 문제입니다. 이 함수들은 식으로 풀리지 않으니, 답은 반복으로만 얻습니다.
기울기를 따라 내려가는 생각은 코시(Augustin-Louis Cauchy)가 1847년에 연립방정식을 풀려고 제안한 것으로 알려져 있습니다. 20세기 중반 이후 컴퓨터와 함께 준뉴턴 방법(BFGS), 넬더–미드 심플렉스, 레벤버그–마쿼트 같은 오늘날의 표준 도구가 나왔고, SciPy의 minimize와 least_squares, MATLAB의 fminunc·fminsearch·lsqnonlin, 딥러닝 프레임워크의 옵티마이저가 그것들을 구현합니다.
목적 함수 f(x)→기울기·곡률로 내리막 찾기→xₖ₊₁ = xₖ + αₖ pₖ→학습·맞춤·설계
1차원 최소화: 황금 분할 탐색과 포물선 보간
도함수 없이 골짜기 바닥 찾기
배관의 지름을 키우면 재료비가 늘고 펌프 동력비가 줄어듭니다. 총비용 f(d)는 어딘가에서 최소가 되지만, f를 한 번 계산하려면 유동 시뮬레이션을 한 번 돌려야 해서 도함수는 구할 수 없습니다. 함숫값 비교만으로 최소점을 가둬 갈 수 있을까요? 3장의 이분법은 부호 하나로 근을 가뒀습니다. 최솟값을 가두려면 점이 몇 개 필요할까요?
근은 부호가 바뀌는 두 점이면 가둬지지만, 최솟값은 세 점이 필요합니다. a<c<b이고 f(c)<f(a), f(c)<f(b)이면 연속함수의 최솟값은 (a,b) 안에 있습니다. 가운데가 양 끝보다 낮은 "골짜기 모양"이기 때문입니다.
정의 15.1 (단봉 함수와 최소 가둠)[a,b]의 어떤 점 x∗에 대해 f가 [a,x∗]에서 감소하고 [x∗,b]에서 증가하면 f를 [a,b]에서 단봉 함수(unimodal function)라 한다. 단봉 함수에서 두 내부 점 c<d를 비교하면 f(c)<f(d)일 때 x∗∈[a,d], 그렇지 않으면 x∗∈[c,b]이다.
두 내부 점을 비교할 때마다 구간의 일부를 버립니다. 남는 점 하나는 다음 단계에서 다시 쓰고 싶습니다. 그러면 단계마다 f를 한 번만 새로 계산하면 됩니다. 구간 길이를 1로 두고 내부 점을 c=1−τ, d=τ에 놓았다고 합시다. [0,τ]가 남으면 옛 c=1−τ가 새 구간의 d 자리 τ⋅τ에 와야 하므로 1−τ=τ2, 곧
τ2+τ−1=0⟹τ=25−1=0.6180339…
황금비 φ=1.618…의 역수 1/φ. 이 비율로 점을 놓으면 버리고 남은 구간 안에서 옛 점이 다시 같은 비율의 자리에 놓인다.
그림 15-1. 황금 분할 탐색. 두 내부 점 중 높은 쪽 바깥을 버리면, 낮은 점은 새 구간 안에서 다시 황금비 자리에 놓인다. 단계마다 함숫값 하나로 구간이 0.618배가 된다.
function golden(f, a, b, tol)
t = (sqrt(5) - 1) / 2 // 0.618...
c = b - t*(b - a); fc = f(c)
d = a + t*(b - a); fd = f(d)
while b - a > tol
if fc < fd then// 최소는 [a, d]
b = d; d = c; fd = fc
c = b - t*(b - a); fc = f(c)
else// 최소는 [c, b]
a = c; c = d; fc = fd
d = a + t*(b - a); fd = f(d)
return (a + b) / 2
정리 15.2 (황금 분할 탐색의 수렴)f가 [a0,b0]에서 단봉이면 황금 분할 탐색의 k번째 구간은 최소점을 포함하고 길이가 τk(b0−a0), τ=0.618이다. 따라서 오차는 1차 수렴(점근 상수 0.618)하고, 구간 길이를 ε 이하로 만드는 데 필요한 함수 계산은 약 log(ε/(b0−a0))/logτ번이다.
왜 이분법보다 느린가. 이분법은 한 번에 1/2로 줄였다. 최소 탐색은 비교에 점 두 개가 필요하고 한 점만 재사용할 수 있으므로 함수 계산당 0.618이 최선이다(점 두 개를 매번 새로 놓으면 계산 두 번에 1/2, 곧 계산당 1/2≈0.707). 피보나치 탐색이 정해진 계산 횟수에서 아주 조금 더 낫지만 극한에서 같은 비율이다. ∎
k = 0: f(c)<f(d)이므로 [0,1.236068]이 남고, 옛 c=0.763932가 새 d가 된다. 새로 계산할 것은 c=0.472136 하나뿐이다.
k = 1에서는 f(c)>f(d)라 왼쪽을 버린다. 표의 대각선을 따라 같은 값(0.618836, 0.615338, 0.613709)이 한 칸씩 옮겨 가는 것이 재사용이다.
구간 길이의 비는 매번 정확히 0.618이다. 길이를 10−6으로 줄이려면 log(10−6/2)/log0.618=30.2, 곧 31번의 새 계산이 필요하다.
황금 분할은 안전하지만 1차 수렴이라 느립니다. 함수가 매끄러우면 더 좋은 길이 있습니다. 세 점 (x0,f0), (x1,f1), (x2,f2)를 지나는 포물선을 그리고 그 꼭짓점으로 건너뛰는 포물선 보간(successive parabolic interpolation)입니다.
5장의 보간 다항식을 2차로 만든 뒤 도함수가 0인 점. 가장 오래된 점을 버리고 (x1,x2,x3)로 되풀이한다.
예제 15.1의 함수에 x=0,1,2에서 출발해 적용하면 오차가 9.8×10−2, 3.7×10−2, 1.2×10−2, 4.8×10−4, 7.6×10−5, 1.1×10−6, 5.9×10−9, 1.3×10−10으로 줄어듭니다. 여덟 번에 황금 분할의 서른 번 이상보다 정확합니다. 수렴 차수는 p3=p+1의 실근 p≈1.3247로 알려진 초선형입니다. 그 대신 포물선이 위로 볼록하거나 세 점이 거의 일직선이면 엉뚱한 곳으로 뛰거나 분모가 0이 됩니다. 그래서 실무의 브렌트 방법(Brent's method)은 최소 가둠 구간을 늘 유지하면서, 포물선 걸음이 구간 안에 떨어지고 충분히 줄어들 때만 받아들이고 그렇지 않으면 황금 분할 걸음을 씁니다. 3장의 브렌트 근 찾기와 같은 "빠른 방법 + 안전망" 설계입니다. SciPy의 minimize_scalar와 MATLAB의 fminbnd가 이 방식입니다.
SIMULATOR
구간 줄이기: 황금 분할 vs 포물선 보간
f(x)와 현재 구간·점
|x − x*| (로그 눈금) vs 함수 계산 횟수
방법
단계 k—
현재 추정 x—
|x − x*|—
구간 길이 / 이전—
k
x (새 점)
f(x)
구간 [a, b]
|x − x*|
해볼 것: ① 'eˣ − 2x'에서 황금 분할을 몇 단계 돌리면 구간 비율이 늘 0.618이고 오차 그래프가 곧은 직선(1차 수렴)입니다. 포물선 보간으로 바꾸면 그래프가 아래로 휘어집니다(초선형). ② '미분 불가' 함수에서는 포물선 보간이 꼭짓점 근처에서 헤매지만 황금 분할은 아무렇지 않게 줄어듭니다. ③ '골짜기 여러 개'에서는 단봉 가정이 깨져, 황금 분할도 가장 깊은 골짜기가 아닌 곳에 갇힐 수 있습니다. 모델: 포물선 보간은 x = a, (a+b)/2, b에서 출발하고 안전장치 없이 돌립니다. x*는 촘촘한 표본 + 정밀 탐색으로 구한 전역 최소점입니다.
경사 하강과 직선 탐색: 아르미호 조건
얼마나 멀리 걸을까
여러 변수 함수에서 가장 가파른 내리막은 −∇f 방향입니다(CalculusBook 15장). 방향은 알았지만 걸음 크기가 문제입니다. 너무 크면 골짜기 건너편 벽으로 올라가 버리고, 너무 작으면 영원히 걷습니다. f(x,y)=x2+10y2에서 (1,1)부터 걸음 α=1로 −∇f=(−2,−20)을 따라가면 함숫값이 11에서 3611로 뜁니다. 매 걸음 적당한 α를 싸게 고르는 규칙이 필요합니다.
일반적인 반복은 xk+1=xk+αkpk입니다. pk는 방향, αk>0은 걸음 크기입니다. ∇fkTpk<0이면 pk를 하강 방향(descent direction)이라 합니다. 테일러 전개 f(xk+αpk)=f(xk)+α∇fkTpk+O(α2)에서 충분히 작은 α는 반드시 f를 줄입니다. 경사 하강(gradient descent)은 pk=−∇fk를 씁니다.
걸음 크기는 1변수 함수 φ(α)=f(xk+αpk)를 줄이는 1차원 문제, 곧 직선 탐색(line search)입니다. 앞 절의 방법으로 φ를 정확히 최소화할 수도 있지만 그것은 낭비입니다. 우리가 원하는 것은 충분히 줄이는 것뿐입니다.
정의 15.3 (아르미호 조건과 되돌아가기) 상수 0<c<1(흔히 c=10−4)에 대해
f(xk+αpk)≤f(xk)+cα∇fkTpk
를 아르미호 조건(Armijo condition, sufficient decrease)이라 한다. 오른쪽은 기울기 φ′(0)를 c배로 완만하게 만든 직선이다. 되돌아가기 직선 탐색(backtracking)은 α=1에서 시작해 이 조건을 만족할 때까지 α←ρα(흔히 ρ=1/2)로 줄인다.
그림 15-2. 아르미호 조건. 곡선 φ(α)가 완만한 직선 φ(0)+cαφ′(0) 아래에 있는 α만 받아들인다. 처음 기울기가 음수이므로 작은 α는 늘 조건을 만족하고, 되돌아가기는 유한 번 안에 멈춘다.
function backtrack(f, x, p, g, c = 1e-4, rho = 0.5)
alpha = 1; fx = f(x); slope = dot(g, p) // slope < 0 이어야 한다while f(x + alpha*p) > fx + c*alpha*slope
alpha = rho * alpha
return alpha
function gradient_descent(f, grad, x, tol)
while norm(grad(x)) > tol
g = grad(x); p = -g
x = x + backtrack(f, x, p, g) * p
return x
α=1: 새 점 (−1,−19), f=3611. 거절. α=1/2: f=810. α=1/4: 160.25. α=1/8: 23.06. 모두 거절.
α=1/16: 새 점 (0.875,−0.25), f=1.3906≤10.9975. 채택.
둘째 걸음도 α=1/16에서 (0.765625,0.0625), f=0.6252. 셋째는 α=1/8에서 (0.574219,−0.09375), f=0.4176. y는 부호를 바꾸며 출렁이고 x는 느리게 준다. 다음 절의 주제다.
아르미호 조건은 "너무 긴 걸음"만 막습니다. "너무 짧은 걸음"은 되돌아가기가 α=1에서 출발해 필요한 만큼만 줄이는 것으로 막습니다. 준뉴턴 방법처럼 α=1이 자연스러운 방법에는 기울기 조건 ∇f(xk+αpk)Tpk≥c2∇fkTpk(c<c2<1)를 더한 울프 조건(Wolfe conditions)을 씁니다. 이 두 조건만으로 다음이 보장됩니다.
증명의 핵심. 립시츠 조건에서 f(x−αg)≤f(x)−α(1−2Lα)∥g∥2이므로 α≤2(1−c)/L이면 아르미호 조건이 성립한다. 되돌아가기는 그런 α를 ρ배 이상 지나쳐 줄이지 않는다. 그러면 매 걸음 f가 cαmin∥∇fk∥2 이상 줄고, f가 아래로 유계이므로 그 합은 유한하다. ∎
정리는 정류점(∇f=0)으로 간다는 것만 말합니다. 그것이 최솟값인지, 얼마나 빨리 가는지는 말하지 않습니다. 속도는 함수의 모양, 정확히는 헤세 행렬의 조건수가 정합니다.
조건수와 지그재그, 그리고 모멘텀
좁고 긴 골짜기
예제 15.2에서 y는 금방 0 근처로 갔지만 x는 한 걸음에 10~25%씩밖에 줄지 않았습니다. 골짜기가 y 방향으로는 가파르고(∂2f/∂y2=20) x 방향으로는 완만해서(=2), 가파른 쪽 벽에 맞춰 걸음을 줄이면 완만한 쪽으로는 거의 나아가지 못합니다. 이 비 20/2=10이 무엇을 정하는지 정확히 알아봅시다.
최솟값 근처의 매끄러운 함수는 이차 함수 f(x)=21xTAx(A는 대칭 양정치)처럼 보입니다. 고유값을 0<μ=λmin≤⋯≤λmax=L이라 하고 조건수κ=L/μ를 둡니다(12장의 행렬 조건수와 같은 양). 등고선은 축 길이 비가 κ인 타원입니다.
정리 15.5 (이차 함수에서 경사 하강의 수렴률) 이차 함수에 고정 걸음 α의 경사 하강을 쓰면 오차는 ek+1=(I−αA)ek이고, 가장 좋은 고정 걸음 α=2/(L+μ)에서
∥ek+1∥≤κ+1κ−1∥ek∥.
정확한 직선 탐색을 쓰면 함숫값에 대해 f(xk+1)−f∗≤(κ+1κ−1)2(f(xk)−f∗)이다(칸토로비치 부등식).
증명의 핵심.I−αA의 고유값은 1−αλi다. 그 절댓값의 최대 max(∣1−αμ∣,∣1−αL∣)는 두 값이 같아지는 α=2/(L+μ)에서 가장 작고, 그 값이 (L−μ)/(L+μ)다. 13장의 반복 해법에서 스펙트럼 반지름이 수렴률을 정한 것과 같은 계산이다. 실제로 경사 하강은 Ax=0에 쓴 리처드슨 반복이다. ∎
κ=100이면 수렴률은 99/101=0.980이고, 오차를 10−6배로 줄이려면 ln10−6/ln0.980=691걸음이 필요합니다. κ에 비례하는 걸음 수입니다. 정확한 직선 탐색도 소용없습니다. 걸음마다 그 방향으로는 최소가 되므로 다음 기울기는 지금 방향에 수직이고, 경로는 직각으로 꺾이는 지그재그가 됩니다.
예제 15.3 (지그재그의 비율)f=21(x2+10y2)(κ=10)를 (10,1)에서 정확한 직선 탐색으로 경사 하강하라.
f0=21(100+10)=55. 걸음 크기는 α=gTg/gTAg(이차 함수에서 φ′(α)=0의 해).
배로 줄어든다. κ=100이면 9/11=0.818, 오차 10−6까지 약 69걸음으로 경사 하강의 691걸음보다 10배 적다. 필요한 걸음 수가 κ가 아니라 κ에 비례한다. 13장의 켤레 기울기법이 같은 κ 법칙을 직선 탐색과 A-직교 방향으로 얻는다.
네스테로프(Yurii Nesterov)의 가속 경사법은 기울기를 "모멘텀으로 미리 가 본 점"에서 재는 변형으로, 이차 함수가 아닌 볼록 함수에서도 비슷한 가속을 보장합니다. 딥러닝 옵티마이저의 momentum=0.9가 이 β입니다. 다만 β를 너무 크게 두면 공이 골짜기 바닥을 지나쳐 오래 출렁입니다.
SIMULATOR
학습률과 모멘텀: 좁은 골짜기의 지그재그
f = ½(x² + κy²) 등고선과 경로 (출발점 끌기)
f(xₖ) − f* (로그 눈금) vs 걸음 k
경사 하강 (같은 α, β = 0)모멘텀 (α, β)
걸음 수 (f − f* ≤ 10⁻¹⁰·f₀) GD—
모멘텀—
이론 최선 (κ−1)/(κ+1)—
이론 최선 (√κ−1)/(√κ+1)—
해볼 것: ① κ = 50, 'α = 2/(L+μ)'에서 빨간 경로의 지그재그와 걸음 수를 보고, '최적 α, β'를 눌러 파란 경로의 걸음 수와 비교하세요. ② α × L을 2보다 크게 하면 가장 가파른 방향의 인자 |1 − αL|가 1을 넘어 경사 하강이 발산합니다. ③ β를 0.95까지 올리면 공이 바닥을 지나쳐 오래 출렁입니다. 모델: L = κ, μ = 1, 최대 600걸음. 걸음 크기는 L에 대한 비로 정하므로 αL = 1은 가파른 방향을 한 걸음에 끝내는 값입니다.
뉴턴 방법과 헤세 행렬
곡률을 알면 한 번에
이차 함수 f=21xTAx−bTx의 최소점은 Ax=b의 해입니다. 기울기만 쓰는 방법은 수백 걸음이 걸리지만, A를 알면 연립방정식 한 번으로 끝납니다. 일반 함수에서도 매 점에서 이차 근사를 만들고 그 최소점으로 건너뛰면 어떨까요?
xk 근처의 2차 테일러 근사 m(p)=fk+∇fkTp+21pT∇2fkp를 최소화하면 ∇2fkp=−∇fk입니다. ∇2f는 2계 편도함수의 행렬, 곧 헤세 행렬(Hessian)입니다(CalculusBook 15장: 임계점 판정).
정의 15.8 (최적화의 뉴턴 방법)∇2f(xk)pk=−∇f(xk)를 풀고 xk+1=xk+αkpk로 간다. αk=1이면 순수 뉴턴, 직선 탐색으로 고르면 감쇠 뉴턴이다. 이것은 4장의 다변수 뉴턴 방법을 방정식 ∇f=0에 쓴 것이다(야코비안 = 헤세 행렬).
정리 15.9 (뉴턴 방법의 2차 수렴)∇2f가 립시츠 연속이고 최소점 x∗에서 양정치이면, x∗에 충분히 가까운 곳에서 순수 뉴턴 방법은 ∥xk+1−x∗∥≤C∥xk−x∗∥2으로 수렴한다. 또 뉴턴 걸음은 좌표의 선형 변환에 영향을 받지 않으므로(아핀 불변) 조건수가 수렴 속도에 들어가지 않는다.
대가는 둘입니다. 첫째, 헤세 행렬을 계산하고 n×n 연립방정식을 풀어야 하므로 한 걸음에 약 n3/3번(촐레스키, 12장)의 연산이 듭니다. 둘째, 헤세 행렬이 양정치가 아니면 이차 근사에 최솟값이 없고, pk가 오르막이나 안장점 쪽을 가리킬 수 있습니다. 그래서 실무의 뉴턴 방법은 직선 탐색을 붙이고, ∇2fk가 양정치가 아니면 ∇2fk+τI처럼 대각을 키워 양정치로 만듭니다(수정 뉴턴). 큰 τ에서는 걸음이 −∇f/τ, 곧 짧은 경사 하강이 됩니다.
예제 15.4 (로젠브록 함수의 순수 뉴턴) 최적화 알고리즘의 고전적 시험 함수 f(x,y)=(1−x)2+100(y−x2)2는 최소점 (1,1)에서 f=0이고, 바닥이 바나나 모양으로 휜 좁은 골짜기를 가진다. 최소점의 헤세 행렬 [802−400−400200]의 고유값은 1001.6과 0.399, 조건수 약 2508이다. 출발점 (−1.2,1).
k
x
y
f
‖xₖ − x*‖
0
−1.200000
1.000000
24.2
2.20
1
−1.175281
1.380674
4.73
2.21
2
0.763115
−3.175034
1412
4.18
3
0.763430
0.582825
5.60×10⁻²
4.80×10⁻¹
4
0.999995
0.944027
3.13×10⁻¹
5.60×10⁻²
5
0.999996
0.999991
1.85×10⁻¹¹
9.63×10⁻⁶
6
1.000000
1.000000
3.43×10⁻²⁰
1.85×10⁻¹¹
둘째 걸음에서 f가 4.73에서 1412로 뛰었다. 순수 뉴턴은 f가 줄어든다는 보장이 없다. 이차 근사가 멀리까지 맞지 않기 때문이다.
그런데도 여섯 걸음 만에 10−11에 닿았다. 마지막 세 걸음의 오차 5.6×10−2→9.6×10−6→1.9×10−11은 자릿수가 대략 두 배씩 느는 2차 수렴이다.
같은 출발점에서 아르미호 되돌아가기를 붙인 감쇠 뉴턴은 21걸음(∥∇f∥<10−8)이 걸리지만 매 걸음 f가 줄어든다. 되돌아가기 경사 하강은 같은 기준까지 19435걸음이 걸린다.
준뉴턴 방법: BFGS
헤세 행렬 없이 곡률 배우기
변수가 1000개인 설계 문제에서 헤세 행렬은 50만 개(대칭이라 절반)의 2계 도함수이고, 한 걸음에 109번 가까운 연산의 선형계를 풀어야 합니다. 그런데 매 걸음 기울기는 어차피 계산합니다. 두 점의 기울기 차이에는 곡률 정보가 들어 있습니다. 그것만으로 뉴턴에 가까운 속도를 낼 수 있을까요?
1차원에서 f′′(xk+1)≈(fk+1′−fk′)/(xk+1−xk), 곧 할선 기울기입니다(3장의 할선법). 다변수에서 sk=xk+1−xk, yk=∇fk+1−∇fk라 하면 헤세 행렬의 근삿값 Bk+1에 대해 할선 조건Bk+1sk=yk를 요구합니다. 방정식은 n개인데 미지수는 n(n+1)/2개이므로, 지금의 Bk에서 가장 조금 바꾸는 것을 고릅니다. 4장의 브로이든 방법도 같은 생각이었습니다. 최적화에서 가장 성공한 공식은 1970년에 브로이든, 플레처, 골드파브, 샤노(Broyden, Fletcher, Goldfarb, Shanno)가 각각 발표한 BFGS 갱신입니다.
정의 15.10 (BFGS 갱신) 역헤세 근사 Hk≈(∇2fk)−1를 두고 pk=−Hk∇fk, 울프 조건을 만족하는 αk로 걸은 뒤 ρk=1/(ykTsk)로
Hk+1=(I−ρkskykT)Hk(I−ρkykskT)+ρkskskT.
Hk+1yk=sk(할선 조건)를 만족한다. 행렬–벡터 곱과 바깥곱만 쓰므로 한 걸음에 O(n2) 연산, 선형계 풀이가 없다. 흔히 H0=I로 시작한다.
(1)의 핵심. 임의의 z=0에 대해 w=z−ρk(skTz)yk라 하면 zTHk+1z=wTHkw+ρk(skTz)2. 두 항 모두 0 이상이고, 둘 다 0이려면 skTz=0이고 w=z=0이어야 한다. ∎
function bfgs(f, grad, x, tol)
H = I; g = grad(x)
while norm(g) > tol
p = -H * g
alpha = line_search(f, x, p, g) // 울프 조건, 처음 시도는 alpha = 1
s = alpha * p; x = x + s
g_new = grad(x); y = g_new - g; g = g_new
if dot(y, s) > 0 then// 곡률 조건이 깨지면 갱신을 건너뛴다
r = 1 / dot(y, s)
H = (I - r*s*y') * H * (I - r*y*s') + r*s*s'
return x
변수가 수만 개 이상이면 n×n 행렬 H를 저장하는 것조차 부담입니다. L-BFGS(limited-memory BFGS)는 최근 m개(흔히 5~20)의 (s,y) 쌍만 저장하고 H∇f를 두 번의 루프로 직접 계산합니다. 메모리와 연산이 O(mn)이라, 기상 자료 동화나 큰 회귀 모델처럼 변수가 수백만 개인 문제의 표준입니다.
로젠브록, 출발 (−1.2, 1), ‖∇f‖ < 10⁻⁸까지
반복 수
한 걸음 비용
도함수
경사 하강 + 되돌아가기
19435
O(n)
기울기
감쇠 뉴턴 + 되돌아가기
21
O(n³)
기울기 + 헤세
BFGS + 되돌아가기 (H₀ = I)
35
O(n²)
기울기
표는 이 장의 스크립트로 직접 센 값입니다. BFGS는 헤세 행렬 없이 뉴턴의 두 배 안쪽 걸음으로 끝납니다. 처음 몇 걸음은 H0=I라 경사 하강처럼 걷다가, 곡률을 배워 가며 걸음이 길어지고 끝에서는 뉴턴처럼 빠르게 수렴합니다. 아래 시뮬레이터에서 출발점을 끌어 세 방법의 경로를 비교하세요.
SIMULATOR
바나나 골짜기 경주: 경사 하강 · 뉴턴 · BFGS
등고선과 경로 (출발점 끌기)
f(xₖ) − f* (로그) vs 반복 k (로그)
경사 하강뉴턴BFGS최소점
경사 하강 반복 · f 계산—
뉴턴—
BFGS—
도착점 (BFGS)—
해볼 것: ① 기본 출발점 (−1.2, 1)에서 빨간 경사 하강이 골짜기 바닥을 따라 수천 걸음 기어가는 동안 뉴턴과 BFGS는 수십 걸음에 끝납니다(오른쪽 그래프의 로그 가로축). ② '순수 뉴턴'을 켜면 경로가 골짜기 밖으로 크게 튀었다 돌아옵니다(예제 15.4). ③ 힘멜블라우 함수에는 최소점이 넷 있습니다. 출발점을 옮기면 방법마다 다른 최소점에 도착하기도 합니다. 모델: 되돌아가기 c = 10⁻⁴, ρ = 1/2, 멈춤 ‖∇f‖ < 10⁻⁸ 또는 20000번. 뉴턴은 헤세 행렬이 양정치가 아니면 τI를 더해 고칩니다.
도함수 없는 방법: 넬더–미드 심플렉스
시뮬레이터는 기울기를 주지 않는다
회로 시뮬레이터나 유한 요소 해석 프로그램은 설계 변수를 넣으면 성능 숫자 하나를 돌려줄 뿐입니다. 결과에 잡음이 섞이거나 매끄럽지 않은 경우도 많습니다. 9장의 수치 미분으로 기울기를 어림할 수도 있지만 변수마다 계산이 한 번씩 더 들고, 잡음이 있으면 차분 몫이 엉망이 됩니다. 함숫값의 크기 비교만으로 여러 변수에서 내려갈 수 있을까요?
1965년 넬더와 미드(John Nelder, Roger Mead)가 발표한 방법은 n차원에서 꼭짓점 n+1개의 심플렉스(2차원에서는 삼각형)를 굴립니다. 가장 나쁜 꼭짓점을 나머지의 무게중심 반대편으로 뒤집고, 그쪽이 좋으면 더 늘리고, 나쁘면 줄입니다. 삼각형이 골짜기를 따라 아메바처럼 기어가다 바닥에서 오그라듭니다.
정의 15.12 (넬더–미드 방법의 한 단계) 꼭짓점을 f(x1)≤⋯≤f(xn+1)로 정렬하고, 가장 나쁜 점을 뺀 무게중심 xˉ를 구한다.
확장: fr<f1이면 xe=xˉ+2(xˉ−xn+1)을 계산해 fe<fr이면 xe, 아니면 xr을 받는다.
수축: fr≥fn이면 fr<fn+1일 때 바깥 수축 xˉ+21(xr−xˉ), 아니면 안쪽 수축 xˉ+21(xn+1−xˉ)을 시도해, 더 나으면 받는다.
축소: 수축도 실패하면 모든 점을 가장 좋은 점 쪽으로 절반 당긴다: xi←x1+21(xi−x1).
예제 15.5 (넬더–미드 세 단계)f(x,y)=x2−4x+y2−y−xy(최소점 (3,2), f∗=−7), 처음 삼각형 (0,0), (1.2,0), (0,0.8).
f 값은 (1.2,0): −3.36, (0,0.8): −0.16, (0,0): 0. 가장 나쁜 점 (0,0)을 뺀 무게중심 xˉ=(0.6,0.4). 반사점 (1.2,0.8), fr=−4.48은 가장 좋은 −3.36보다 좋으므로 확장점 (1.8,1.2)을 보면 fe=−5.88. 확장 채택.
새 삼각형에서 가장 나쁜 점 (0,0.8), 무게중심 (1.5,0.6). 반사점 (3,0.4), fr=−4.44는 가장 좋은 −5.88과 둘째 −3.36 사이. 반사 채택.
가장 나쁜 점 (1.2,0), 무게중심 (2.4,0.8). 반사점 (3.6,1.6), fr=−6.24로 최고 기록. 확장점 (4.8,2.4)은 fe=−4.32로 더 나쁘므로 반사점을 받는다.
계속하면 51단계 뒤 삼각형의 지름이 10−6 아래로 줄고 가장 좋은 꼭짓점은 (3.0000004,2.0000001)이다.
넬더–미드는 단순하고 잡음에 강해서 지금도 MATLAB의 fminsearch와 SciPy의 method="Nelder-Mead"로 널리 쓰입니다. 그러나 이론적 보장이 약합니다. 맥키넌(K. McKinnon)은 1998년에 2변수의 매끄러운 볼록 함수에서도 심플렉스가 최소점이 아닌 점으로 오그라드는 예를 보였습니다. 차원이 커지면(n≳10) 매우 느려지기도 합니다. 그래서 도함수 없는 최적화의 현대적 방법(패턴 탐색, 대리 모델 기반 방법)은 수렴이 증명된 규칙을 쓰고, 넬더–미드는 "변수 몇 개, 기울기 없음, 빨리 대충"에 쓰는 도구로 남았습니다. 실패하면 다시 시작(재시작)하는 것이 흔한 처방입니다.
SIMULATOR
넬더–미드: 기어가는 삼각형
꼭짓점 세 개를 끌어 처음 삼각형 정하기
현재 심플렉스반사확장수축축소
단계—
이번 동작—
가장 좋은 f—
심플렉스 지름—
해볼 것: ① 예제 함수에서 '다음 단계'를 세 번 눌러 확장 → 반사 → 반사(예제 15.5)를 확인하세요. ② 로젠브록에서는 삼각형이 골짜기를 따라 늘어나며 휘어 가다 바닥에서 오그라듭니다. 동작 횟수를 세어 보세요. ③ '이차 함수 + 잡음'에서도 삼각형은 잡음 크기 정도까지는 내려갑니다. 비교만 하므로 기울기 어림이 필요 없습니다. 모델: 계수 반사 1, 확장 2, 수축 1/2, 축소 1/2. 지름 10⁻⁷ 이하에서 멈춥니다.
비선형 최소제곱: 가우스–뉴턴과 레벤버그–마쿼트
감쇠 곡선에 모델 맞추기
방사성 시료나 RC 회로의 방전 측정값 (ti,yi)에 y=ae−bt를 맞추고 싶습니다. 7장의 최소제곱은 모델이 매개변수에 대해 선형일 때였습니다. 여기서 b는 지수 안에 있습니다. 로그를 취해 직선으로 맞추는 요령은 잡음의 무게를 비틀고, 음수 측정값이 있으면 아예 쓸 수 없습니다. 제곱합 S(a,b)=∑i(ae−bti−yi)2을 직접 최소화해야 합니다.
잔차 벡터 r(β), ri=m(ti;β)−yi와 그 야코비안 Jij=∂ri/∂βj를 두면 S=∥r∥2의 기울기는 2JTr, 헤세 행렬은 2JTJ+2∑iri∇2ri입니다. 맞춤이 좋으면 잔차 ri가 작으므로 둘째 항을 버릴 수 있습니다. 2계 도함수 없이 뉴턴 방법을 흉내 내는 셈입니다.
정의 15.13 (가우스–뉴턴과 레벤버그–마쿼트) 가우스–뉴턴 걸음은 선형 최소제곱 minδ∥Jδ+r∥2의 해, 곧
λ→0이면 가우스–뉴턴(빠르지만 무모함), λ가 크면 δ≈−JTr/λ(조심스러운 짧은 경사 하강)입니다. 레벤버그(Kenneth Levenberg, 1944)는 λI를, 마쿼트(Donald Marquardt, 1963)는 변수의 단위에 맞춰 대각 성분을 늘리는 λdiag를 제안했습니다. 이것은 "이차 근사를 믿을 수 있는 반경 안에서만 걷는다"는 신뢰 영역(trust region) 방법의 원조이기도 합니다. λ는 그 반경의 역수 구실을 합니다.
예제 15.6 (지수 감쇠 맞춤) 데이터 t=0,1,2,3,4, y=2.00,1.25,0.72,0.46,0.27, 모델 ae−bt, 어림 출발 (a,b)=(3,3), S=3.003.
가우스–뉴턴: 첫 걸음이 (1.998,−5.122)로 가서 S=2.5×1018. b<0이면 모델이 e5t로 폭발한다. 이후 a≈0 근처를 헤매다 발산한다.
레벤버그–마쿼트(λ0=0.01): 첫 걸음에서 λ=0.01,0.1,1의 걸음은 S를 1.3×1018, 5.9×1015, 1.8×104으로 키워 모두 버리고, λ=10에서 (2.914,2.289), S=2.505로 줄어 받는다.
최적 잔차 0.0084,−0.0273,0.0243,−0.0068,0.0059는 부호가 섞여 있고 크기가 비슷하다. 모델이 데이터를 잘 설명한다는 신호다. 출발점이 좋은 (1,−0.5)이면 가우스–뉴턴도 6걸음 안에 같은 답에 간다.
SIMULATOR
곡선 맞춤: 가우스–뉴턴 vs 레벤버그–마쿼트
데이터(끌기)와 모델 a·e^(−bt)
매개변수 평면 (a, b): S의 등고선과 경로 (출발점 끌기)
방법
걸음—
(a, b)—
S = Σr²—
λ—
k
a
b
S
시도한 λ (거절 수)
해볼 것: ① 출발 (3, 3)에서 가우스–뉴턴으로 '한 걸음'을 누르면 b가 음수로 튀며 S가 10¹⁸까지 커집니다. 레벤버그–마쿼트로 바꾸면 λ를 키워 짧게 걷고 6~7걸음에 수렴합니다(예제 15.6). ② 데이터 점 하나를 크게 끌어 이상치를 만들면 맞춤 곡선이 그 점 쪽으로 끌려갑니다. 제곱합이 큰 잔차를 크게 벌하기 때문입니다(7장의 강건 회귀). ③ 오른쪽 등고선은 바나나처럼 휜 골짜기입니다. a와 b가 서로 보상할 수 있어(a를 키우고 b도 키우기) 골짜기가 비스듬합니다. 모델: λ₀ = 0.01, 받으면 λ/10, 버리면 10λ. 멈춤은 S의 상대 변화 10⁻¹² 이하.
제약 최적화: 벌칙법, 라그랑주 승수, KKT 조건
예산 안에서 가장 좋은 설계
빔의 무게를 최소화하되 응력은 허용값 이하, 두께는 0 이상이어야 합니다. 포트폴리오의 위험을 최소화하되 비중의 합은 1이어야 합니다. 제약이 없는 방법들은 이런 조건을 모릅니다. 무시하고 풀면 두께가 음수인 빔이 나옵니다. 제약을 지키면서 최적을 찾는 방법은 크게 두 갈래입니다. 제약을 목적 함수에 벌금으로 넣어 제약 없는 문제로 바꾸거나, 최적점이 만족해야 할 방정식을 직접 풉니다.
문제를 minf(x), 등식 제약 hj(x)=0, 부등식 제약 gi(x)≤0으로 씁니다. 가장 단순한 길은 벌칙법(penalty method)입니다.
Q(x;μ)=f(x)+2μj∑hj(x)2+2μi∑max(0,gi(x))2
제약을 어기면 그 제곱에 비례하는 벌금을 낸다. μ를 키워 가며 Q를 앞 절들의 방법으로 최소화하고, 앞 단계의 답을 다음 단계의 출발점으로 쓴다.
최적점에서는 f의 등고선이 제약 곡면에 접합니다. 그렇지 않다면 제약면을 따라 조금 움직여 f를 더 줄일 수 있기 때문입니다. 접한다는 것은 두 기울기가 평행하다는 뜻, 곧 라그랑주 승수(Lagrange multiplier) 조건 ∇f+λ∇h=0입니다(CalculusBook 15장: 라그랑주 승수). 부등식이 섞이면 이것이 다음과 같이 확장됩니다.
정리 15.14 (KKT 조건, 1차 필요조건)x∗가 국소 최소점이고 적절한 제약 자격 조건(예: 활성 제약의 기울기들이 일차 독립)이 성립하면, 승수 λj, μi가 있어
μ=1,10,100이면 xμ=0.25,0.4545,0.4950. 제약 위반 h=2xμ−1=−1/(1+μ)은 1/μ처럼 준다. 벌칙법의 답은 늘 조금 제약을 어긴다.
μh(xμ)=−μ/(1+μ)=−0.5,−0.909,−0.990은 참 승수 −1로 간다. 벌금의 기울기가 승수 역할을 하는 것이다.
대가: Q의 헤세 행렬 2I+μ[1111]의 고유값은 2와 2+2μ, 조건수 1+μ. 정확하게 하려고 μ를 키울수록 문제가 나빠진다(3절의 지그재그).
이 병을 고친 것이 증강 라그랑주 방법(augmented Lagrangian)입니다. Q에 승수 항 λh를 더해 두고, 매 단계 λ←λ+μh(x)로 승수를 고치면 μ를 무한히 키우지 않아도 정확한 답에 갑니다. 반대 방향의 장벽법(내점법)은 −μ∑log(−gi)를 더해 안쪽에서 벽에 다가가며, 선형·이차 계획법의 대규모 해법이 이 계열입니다. 부등식 예: min(x−2)2+(y−1)2, g=x+y−1≤0의 답은 (2,1)을 직선에 수직으로 내린 (1,0)이고 ∇f=(−2,−2)이므로 ∇f+μ∇g=0에서 μ=2≥0. 제약이 걸려 있고 승수가 양수, KKT를 만족합니다.
SIMULATOR
벌칙법과 KKT: 벌금을 키우면 제약 위로
제약 없는 최소점 c를 끌기
제약
등고선
제약 경계벌칙 해 x(μ)와 그 경로참 제약 최소점∇f, ∇g 화살표
x(μ)—
제약 위반—
승수 어림 μ·위반 / 참값—
∇²Q의 조건수—
해볼 것: ① 등식 제약에서 μ를 0.1부터 1000까지 올리면 주황 점이 점선 경로를 따라 보라 점(참 답)에 다가가고, 승수 어림이 참값에 가까워지는 동시에 조건수가 1 + μ에 비례해 커집니다. ② 'x + y ≤ 1'에서 c를 직선 아래쪽으로 끌면 제약이 풀리고(비활성) 승수가 0, 위쪽이면 걸리고 승수가 양수입니다. 상보성 μ·g = 0을 확인하세요. ③ 원판 제약에서 c를 원 밖으로 끌면 최적점에서 ∇f와 ∇g가 반대 방향으로 나란합니다. 모델: f = (x − c₁)² + 2(y − c₂)², μ는 로그 슬라이더. 벌칙 해는 Q에 뉴턴 방법을 써서 구합니다.
확률적 경사 하강: 데이터가 너무 많을 때
기울기 한 번에 백만 장의 사진
기계 학습의 손실 함수는 데이터 하나하나의 손실을 평균한 F(w)=N1∑i=1Nℓi(w)입니다. N이 백만이면 기울기를 한 번 계산하는 데 백만 번의 계산이 듭니다. 그런데 처음에는 대충의 방향만 알아도 됩니다. 사진 100장으로 어림한 기울기로 만 번 걷는 것과 백만 장 전체의 정확한 기울기로 한 번 걷는 것, 어느 쪽이 나을까요?
정의 15.15 (확률적 경사 하강과 미니배치) 매 걸음 {1,…,N}에서 크기 B의 미니배치Bk를 무작위로 뽑아
wk+1=wk−αkgk,gk=B1i∈Bk∑∇ℓi(wk)
로 간다. 데이터 전체를 한 바퀴 도는 것을 1 에포크(epoch)라 한다. 줄여서 SGD(stochastic gradient descent).
gk는 참 기울기의 불편 추정량입니다: E[gk]=∇F(wk). 그 분산은 데이터별 기울기의 분산 σ2에 대해 약 σ2/B입니다(복원 추출). 그래서 배치를 4배로 늘리면 잡음의 표준편차가 절반이 되지만 비용은 4배입니다. 잡음 때문에 SGD는 고정 걸음으로는 최소점에 멈추지 못하고, 걸음 크기에 비례하는 반경 안에서 계속 흔들립니다. 정확히 수렴시키려면 걸음을 줄여야 하고, 로빈스–먼로(Robbins–Monro) 조건 ∑αk=∞, ∑αk2<∞(예: αk∝1/k)가 표준적인 충분조건입니다. 첫 조건은 어디든 갈 수 있을 만큼 걷는다는 것, 둘째는 잡음의 누적이 유한하다는 것입니다.
실무에서 SGD가 이기는 이유는 비용 계산에 있습니다. 데이터에 중복이 많으면(비슷한 사진이 많으면) 작은 배치의 기울기도 이미 좋은 방향이고, 같은 계산량으로 훨씬 많은 걸음을 걷습니다. 딥러닝에서는 모멘텀과 좌표별 걸음 크기 조절을 합친 Adam 같은 변형이 표준이며, 걸음 크기 일정(learning rate schedule)을 조절하는 것이 학습의 중요한 기술입니다.
SIMULATOR
미니배치 크기와 걸음: SGD로 직선 맞추기
손실 F(w₀, w₁) 등고선과 SGD 경로
F − F* (로그) vs 에포크 (기울기 계산 수 / N)
배치 크기 B
에포크—
걸음 수—
(w₀, w₁) / 최적—
F − F*—
해볼 것: ① B = 200(전체)은 매끄러운 경로지만 에포크당 한 걸음뿐입니다. B = 10으로 바꾸면 경로가 비틀거리지만 같은 에포크에 훨씬 멀리 갑니다(오른쪽 그래프). ② B = 1로 두면 F − F*가 어느 수준에서 더 내려가지 않고 출렁입니다. '걸음 줄이기'를 켜면 다시 내려갑니다. ③ α를 1 가까이 올리면 B = 1에서 흔들림 반경이 커집니다. 모델: N = 200개 점 yᵢ = 1 + 2xᵢ + 잡음(표준편차 0.5), xᵢ ∈ [−1, 2], 손실 F = (1/2N)Σ(w₀ + w₁xᵢ − yᵢ)², 출발 (−2, −1). 배치는 매 걸음 무작위 복원 추출.
국소 최솟값과 전역 최적화: 담금질 기법
가장 가까운 골짜기가 가장 깊은 골짜기는 아니다
지금까지의 방법은 모두 내리막만 갑니다. 출발점이 속한 골짜기의 바닥에 도착하면 거기서 멈춥니다. 단백질 구조, 회로 배치, 일정표 짜기 같은 문제의 목적 함수에는 골짜기가 셀 수 없이 많습니다. 더 깊은 골짜기로 가려면 때로는 오르막을 받아들여야 합니다. 얼마나, 언제 받아들일까요?
볼록 함수에서는 모든 국소 최솟값이 전역 최솟값이라 이 걱정이 없습니다(선형·이차 계획법, 최소제곱이 여기에 속합니다). 볼록이 아니면 전역 최솟값을 보장하는 일반적인 효율적 방법은 없다고 보는 것이 안전합니다. 실무의 처방은 여러 출발점(다중 시작)에서 국소 방법을 돌려 가장 좋은 것을 고르거나, 무작위성을 일부러 넣는 것입니다. 후자의 대표가 금속을 천천히 식혀 결정 결함을 없애는 열처리에서 이름을 딴 담금질 기법(simulated annealing)입니다. 1983년 커크패트릭, 겔라트, 베키(Kirkpatrick, Gelatt, Vecchi)가 최적화에 쓰면서 널리 알려졌습니다.
정의 15.16 (메트로폴리스 수락 규칙과 냉각) 현재 점 x 근처에서 무작위 후보 x′를 뽑고 Δ=f(x′)−f(x)라 할 때, 온도 T에서
P(수락)={1e−Δ/TΔ≤0,Δ>0
로 받아들인다. T를 Tk+1=γTk(γ는 1보다 조금 작은 수)처럼 천천히 낮춘다.
뜨거울 때(T가 클 때)는 거의 모든 오르막을 받아들여 넓게 돌아다니고, 식으면 내리막만 받는 국소 탐색이 됩니다. 높이 1의 언덕을 넘을 확률은 T=1에서 e−1=0.368, T=0.1에서 e−10=4.5×10−5입니다. 그래서 얕은 골짜기에서는 일찍 빠져나오고, 깊은 골짜기에 머무는 시간이 상대적으로 길어집니다. 이론적으로는 Tk∝1/logk처럼 아주 느리게 식히면 전역 최솟값에 확률 1로 간다는 결과가 있지만, 그 속도는 실용적이지 않습니다. 실무에서는 등비 냉각과 재가열을 섞어 쓰고, 결과를 "보장된 최적"이 아니라 "좋은 해"로 받아들입니다. 유전 알고리즘, 입자 군집 최적화, 베이즈 최적화도 같은 문제를 다른 방식으로 다룹니다.
SIMULATOR
담금질 기법: 오르막을 받아들여 골짜기 탈출
울퉁불퉁한 f(x)와 두 탐색자
현재 f (선)와 온도 T (점선) vs 단계
국소 탐색 (내리막만)담금질전역 최소점
단계 · 온도 T—
국소 탐색 f—
담금질 f (최고 기록)—
오르막 수락률 (최근)—
해볼 것: ① 기본값으로 실행하면 빨간 국소 탐색은 출발한 골짜기에 갇히고, 파란 담금질은 뜨거울 때 언덕을 넘나들다 식으면서 깊은 골짜기에 자리 잡습니다. ② T₀를 0.1로 낮추면 담금질도 국소 탐색과 비슷하게 갇힙니다. ③ γ를 0.95로 하면(급랭) 빨리 식어 얕은 골짜기에 머무는 경우가 많습니다. 시드를 바꿔 몇 번 시도해 보세요. 모델: f(x) = 0.05x² + sin 3x + 0.6 sin 7x, x ∈ [−8, 8], 출발 x = 6(얕은 골짜기), 후보는 현재 점 ± 정규 잡음(표준편차 0.3), 2000단계. 기본 설정에서 시드 1~20 중 절반쯤이 전역 최소점의 골짜기를 찾습니다.
이 도구가 쓰이는 곳
어떤 최적화 방법을 고를지는 문제의 네 가지 성질, 곧 도함수가 있는가, 변수가 몇 개인가, 제약이 있는가, 볼록인가로 대부분 정해집니다.