Chapter 09

수치 미분

미분은 극한 lim⁡h→0(f(x+h)−f(x))/h\lim_{h\to0}\bigl(f(x+h) - f(x)\bigr)/h입니다. 컴퓨터는 극한을 계산할 수 없으니 작은 hh 하나를 골라 몫을 계산합니다. 그런데 hh를 작게 할수록 좋아지는 것은 처음 몇 자리뿐이고, 어느 순간부터 결과가 나빠집니다. 이 장은 그 이유를 테일러 전개(절단 오차)와 부동소수점(반올림 오차)의 줄다리기로 설명하고, 최적의 hh를 계산합니다. 그다음 차수를 올리는 세 가지 길, 곧 점을 더 쓰는 스텐실, 서로 다른 hh의 결과를 섞는 리처드슨 외삽, 뺄셈 자체를 없애는 복소 스텝을 보고, 잡음 섞인 측정 데이터를 미분할 때의 함정을 다룹니다. 마지막으로 차분 없이 기계 정밀도의 도함수를 주는 자동 미분, 곧 신경망 학습의 역전파를 만납니다.

이 수식이 없었다면신경망 학습과 설계 민감도 해석

자동차의 바퀴 속도 센서는 일정한 간격으로 회전 각도를 세고, 제어기는 그 차이를 시간으로 나눠 속도와 가속도를 얻습니다. 항공기 날개 설계 프로그램은 날개 단면의 매개변수 수백 개를 조금씩 바꿀 때 양력이 얼마나 변하는지, 곧 도함수를 알아야 최적화를 할 수 있습니다. 수억 개의 가중치를 가진 신경망은 손실 함수의 기울기를 매 걸음 계산해야 학습됩니다. 함수가 공식이 아니라 프로그램이나 측정값으로만 주어질 때 도함수를 얻는 일이 수치 미분입니다.

차분 몫의 생각은 미적분 이전부터 있었지만, 그 오차를 정량적으로 다루는 일은 컴퓨터와 함께 중요해졌습니다. 1967년 라이니스(J. N. Lyness)와 몰러(C. B. Moler)가 복소수를 써서 도함수를 구하는 방법을 발표했고, 1998년 스콰이어(William Squire)와 트랩(George Trapp)이 이를 한 줄짜리 복소 스텝 공식으로 정리해 널리 알렸습니다. 같은 시기 발전한 자동 미분의 후진 모드는 오늘날 딥러닝 프레임워크의 핵심인 역전파와 같은 알고리즘입니다.

f(x)만 계산할 수 있다→차분 몫의 오차 분석→h* ≈ √ε, 외삽, 복소 스텝, 자동 미분→속도 추정·민감도·역전파

차분 몫: 할선의 기울기로 접선을 어림하기

함수를 프로그램으로만 받았을 때

유체 해석 프로그램이 받음각 α\alpha를 넣으면 양력 계수 CL(α)C_L(\alpha)를 돌려줍니다. 한 번 실행에 몇 분이 걸리고, 공식은 없습니다. 설계자는 dCL/dαdC_L/d\alpha를 알고 싶습니다. 할 수 있는 일은 α\alpha를 조금 바꿔 다시 실행하는 것뿐입니다. 얼마나 조금 바꿔야 할까요? 그리고 몇 번 실행해야 몇 자리를 믿을 수 있을까요?

도함수의 정의(CalculusBook 3장)에서 극한을 떼어 내면 가장 간단한 근사가 나옵니다. 오른쪽 점을 쓰면 전진, 왼쪽 점을 쓰면 후진, 양쪽을 대칭으로 쓰면 중앙 차분입니다.

정의 9.1 (차분 몫) 간격 h>0h \gt 0에 대해
D+f(x)=f(x+h)−f(x)h,D−f(x)=f(x)−f(x−h)h,D0f(x)=f(x+h)−f(x−h)2hD_+f(x) = \frac{f(x+h) - f(x)}{h},\qquad D_-f(x) = \frac{f(x) - f(x-h)}{h},\qquad D_0f(x) = \frac{f(x+h) - f(x-h)}{2h}
를 각각 전진 차분(forward difference), 후진 차분(backward difference), 중앙 차분(central difference) 몫이라 한다. 셋 다 ff를 두 번 계산한다(f(x)f(x)를 이미 알고 있으면 전진·후진은 한 번).
x − hxx + h 접선 (참 기울기) 전진 D₊: 너무 가파름 후진 D₋: 너무 완만함 중앙 D₀: 거의 평행 볼록한 곡선에서 D₊와 D₋의 오차는 부호가 반대이고, 평균 D₀에서 상쇄된다
그림 9-1. 아래로 볼록한 곡선에서 전진 차분의 할선은 접선보다 가파르고, 후진 차분은 완만하다. 두 몫의 평균이 중앙 차분이며, 그 할선(청록)은 접선(점선)과 거의 평행하다. 같은 두 번의 계산으로 정확도가 훨씬 좋아지는 이유가 다음 절의 테일러 전개다.
예제 9.1 (세 차분 비교) f(x)=exf(x) = e^x, x=1x = 1에서 f′(1)=e=2.718281828f'(1) = e = 2.718281828을 근사하라.
hhD+D_+오차D−D_-오차D0D_0오차
0.12.8588421.41×10⁻¹2.586787−1.31×10⁻¹2.7228154.53×10⁻³
0.052.7873866.91×10⁻²2.651443−6.68×10⁻²2.7194151.13×10⁻³
0.012.7319191.36×10⁻²2.704736−1.35×10⁻²2.7183274.53×10⁻⁵

hh를 반으로 줄이면 전진·후진의 오차는 약 반(0.141→0.06910.141 \to 0.0691), 중앙의 오차는 약 4분의 1(4.53×10−3→1.13×10−34.53\times10^{-3} \to 1.13\times10^{-3})이 된다. 전진과 후진의 오차는 부호가 반대이고 크기가 비슷하다. 그림 9-1의 상쇄가 숫자로 보인다.

아래 시뮬레이터에서 점을 곡선 위로 끌고 hh를 줄여 보세요. 할선이 접선으로 돌아 들어가는 속도가 방법마다 다릅니다.

SIMULATOR

할선에서 접선으로: h를 줄이면 무엇이 얼마나 빨리 맞는가

곡선 위의 점 x를 좌우로 끌기
보일 할선
접선전진 D₊후진 D₋중앙 D₀
참 f′(x)—
D₊ 오차 · 오차/h—
D₋ 오차 · 오차/h—
D₀ 오차 · 오차/h²—
해볼 것: ① h를 0.4 → 0.2 → 0.1로 줄이며 '오차/h'(전진·후진)와 '오차/h²'(중앙)가 거의 일정한 것을 보세요. 그 상수가 다음 절의 f″/2와 f‴/6입니다. ② sin 2x에서 점을 변곡점 x = 0으로 끌면 f″ = 0이라 전진 차분도 갑자기 정확해집니다. ③ x³ − 2x는 f‴ = 6으로 일정하므로 중앙 차분의 오차가 정확히 h²입니다. 모델: 정확한 산술(반올림 오차는 다음 절).

테일러 전개로 읽는 오차 차수

예제 9.1의 "반으로 줄이면 반", "반으로 줄이면 4분의 1"은 테일러 전개(CalculusBook 12장: 나머지 항)에서 바로 나옵니다. ff가 충분히 매끄러우면

f(x±h)=f(x)±hf′(x)+h22f′′(x)±h36f′′′(x)+h424f(4)(x)±⋯f(x \pm h) = f(x) \pm hf'(x) + \frac{h^2}{2}f''(x) \pm \frac{h^3}{6}f'''(x) + \frac{h^4}{24}f^{(4)}(x) \pm \cdots

첫 식에서 f(x)f(x)를 빼고 hh로 나누면 D+f=f′+h2f′′+O(h2)D_+f = f' + \frac h2 f'' + O(h^2)입니다. 두 식을 빼면 짝수 차 항이 모두 지워져 f(x+h)−f(x−h)=2hf′+h33f′′′+O(h5)f(x+h) - f(x-h) = 2hf' + \frac{h^3}{3}f''' + O(h^5), 곧 D0f=f′+h26f′′′+O(h4)D_0 f = f' + \frac{h^2}{6}f''' + O(h^4)입니다. 대칭으로 놓은 점이 hh의 홀수 거듭제곱 항을 지운 것이 중앙 차분의 비밀입니다.

정리 9.2 (차분 몫의 절단 오차) ff가 [x−h,x+h][x-h, x+h]에서 필요한 만큼 연속 미분 가능하면, 어떤 ξ\xi, η\eta가 그 구간에 있어
D+f(x)−f′(x)=h2f′′(ξ),D−f(x)−f′(x)=−h2f′′(ξ′),D0f(x)−f′(x)=h26f′′′(η).D_+f(x) - f'(x) = \frac{h}{2}f''(\xi),\qquad D_-f(x) - f'(x) = -\frac{h}{2}f''(\xi'),\qquad D_0f(x) - f'(x) = \frac{h^2}{6}f'''(\eta).
즉 전진·후진 차분은 1차, 중앙 차분은 2차 정확도를 가진다. 이렇게 방법이 버린 항에서 생기는 오차를 절단 오차(truncation error)라 한다.

증명의 핵심. 라그랑주 나머지로 f(x+h)=f(x)+hf′(x)+h22f′′(ξ)f(x+h) = f(x) + hf'(x) + \frac{h^2}{2}f''(\xi)를 쓰면 첫 식이다. 중앙 차분은 f(x±h)f(x\pm h)를 3차 나머지까지 써서 빼면 h36(f′′′(η+)+f′′′(η−))\frac{h^3}{6}\bigl(f'''(\eta_+) + f'''(\eta_-)\bigr)이 남고, 중간값 정리로 두 값의 평균을 한 점 η\eta의 f′′′f'''로 바꾼다. ∎

예제 9.1로 확인해 봅시다. h=0.01h = 0.01에서 전진 오차 예측은 0.012eξ≈0.005×2.73=0.0136\frac{0.01}{2}e^{\xi} \approx 0.005\times 2.73 = 0.0136이고 실제 0.013640.01364입니다. 중앙 오차 예측은 10−46e≈4.53×10−5\frac{10^{-4}}{6}e \approx 4.53\times10^{-5}, 실제와 세 자리가 맞습니다. 오차의 상수까지 예측된다는 점이 중요합니다. 다음 절의 최적 간격 계산과 리처드슨 외삽이 모두 이 상수를 이용합니다.

홀짝의 효과 중앙 차분의 오차 전개에는 h2,h4,h6,…h^2, h^4, h^6, \dots처럼 짝수 거듭제곱만 나타납니다. 그래서 hh를 반으로 줄인 결과와 섞으면 한 번에 두 차수씩 오릅니다(리처드슨 외삽 절). 전진 차분은 h,h2,h3,…h, h^2, h^3, \dots이 모두 있어 한 차수씩만 오릅니다.

절단 오차 대 반올림 오차: 최적의 h

h = 10⁻¹²이면 더 정확할까

정리 9.2만 보면 hh는 작을수록 좋습니다. 그래서 exe^x의 x=1x = 1에서 전진 차분을 h=10−12h = 10^{-12}로 계산하면 2.71871…2.71871\ldots, 오차가 4.3×10−44.3\times10^{-4}입니다. h=10−3h = 10^{-3}일 때의 오차 1.4×10−31.4\times10^{-3}과 별 차이가 없고, h=10−8h = 10^{-8}일 때의 6.6×10−96.6\times10^{-9}보다는 5만 배 나쁩니다. h=10−16h = 10^{-16}이면 답이 0입니다. 무엇이 잘못된 걸까요?

범인은 1장의 자릿수 상쇄입니다. f(x+h)f(x+h)와 f(x)f(x)는 각각 상대 오차 u=ε/2≈1.1×10−16u = \varepsilon/2 \approx 1.1\times10^{-16} 정도로 저장됩니다. hh가 작으면 두 값이 거의 같아서 뺄셈의 결과에는 믿을 수 있는 자리가 몇 개 남지 않고, 그 작은 차이를 다시 작은 hh로 나누면 남은 오차가 1/h1/h배로 커집니다. ff를 계산하는 프로그램 자체의 오차가 δ\delta라면 그 효과는 더 큽니다.

정리 9.3 (최적 간격) 계산된 함숫값이 f^(x)=f(x)(1+δx)\hat f(x) = f(x)(1 + \delta_x), ∣δx∣≤u|\delta_x| \le u를 만족한다고 하자(u=ε/2u = \varepsilon/2, ε\varepsilon은 기계 엡실론). M2=∣f′′∣M_2 = |f''|, M3=∣f′′′∣M_3 = |f'''|를 xx 근처의 상한이라 하면 계산된 차분 몫의 전체 오차는
∣D^+−f′∣≤M22h⏟절단+ε∣f∣h⏟반올림,∣D^0−f′∣≤M36h2+ε∣f∣2h.|\hat D_+ - f'| \le \underbrace{\frac{M_2}{2}h}_{\text{절단}} + \underbrace{\frac{\varepsilon|f|}{h}}_{\text{반올림}},\qquad |\hat D_0 - f'| \le \frac{M_3}{6}h^2 + \frac{\varepsilon|f|}{2h}.
우변을 최소화하는 간격과 그때의 오차는
h+∗=2ε∣f∣M2,E+∗=2ε∣f∣M2 ;h0∗=(3ε∣f∣2M3)1/3,E0∗∼ε2/3.h_+^* = \sqrt{\frac{2\varepsilon|f|}{M_2}},\quad E_+^* = \sqrt{2\varepsilon|f|M_2}\ ;\qquad h_0^* = \left(\frac{3\varepsilon|f|}{2M_3}\right)^{1/3},\quad E_0^* \sim \varepsilon^{2/3}.

증명의 핵심. 분자의 두 함숫값 오차는 각각 u∣f∣u|f| 이하라 차이의 오차가 2u∣f∣=ε∣f∣2u|f| = \varepsilon|f| 이하이고, 이를 hh(중앙은 2h2h)로 나눈다. Ah+B/hAh + B/h는 h=B/Ah = \sqrt{B/A}에서 최소 2AB2\sqrt{AB}, Ah2+B/hAh^2 + B/h는 h3=B/(2A)h^3 = B/(2A)에서 최소다. ∎

f=exf = e^x, x=1x = 1이면 ∣f∣=M2=M3=e|f| = M_2 = M_3 = e라서 h+∗=2ε=2.1×10−8h_+^* = \sqrt{2\varepsilon} = 2.1\times10^{-8}, E+∗≈5.7×10−8E_+^* \approx 5.7\times10^{-8}, h0∗=(1.5ε)1/3=6.9×10−6h_0^* = (1.5\varepsilon)^{1/3} = 6.9\times10^{-6}, E0∗≈6.5×10−11E_0^* \approx 6.5\times10^{-11}입니다. 경험칙으로 기억하면 1차 공식은 h≈ε≈10−8h \approx \sqrt{\varepsilon} \approx 10^{-8}에서 유효 숫자 약 8자리, 2차 공식은 h≈ε3≈6×10−6h \approx \sqrt[3]{\varepsilon} \approx 6\times10^{-6}에서 약 10~11자리를 얻습니다(xx와 ff의 크기에 맞춰 hh를 ε max⁡(1,∣x∣)\sqrt{\varepsilon}\,\max(1, |x|)처럼 비례시킵니다). 배정밀도 16자리를 다 얻지는 못한다는 것이 차분 몫의 본질적 한계입니다. 2계 도함수 (f(x+h)−2f(x)+f(x−h))/h2\bigl(f(x+h) - 2f(x) + f(x-h)\bigr)/h^2은 반올림 오차가 1/h21/h^2로 커지므로 h∗∼ε1/4≈10−4h^* \sim \varepsilon^{1/4} \approx 10^{-4}이고 8자리 정도가 한계입니다.

h를 이진수로 고르기 x+hx + h도 부동소수점 수라서 실제로 더해지는 간격은 hh가 아니라 (x+h)−x(x + h) - x를 반올림한 값입니다. 실무 코드는 temp = x + h; h = temp - x로 실제 간격을 다시 계산하거나, hh를 2의 거듭제곱으로 고릅니다. 그러면 x+hx + h가 정확히 표현되어 오차 하나가 사라집니다.

아래 그래프의 가로축은 hh, 세로축은 오차, 둘 다 로그 눈금입니다. 오른쪽에서는 절단 오차가 기울기 1(또는 2)로 줄고, 왼쪽에서는 반올림 오차가 기울기 −1로 커집니다. 둘이 만나는 바닥이 최적 hh입니다.

SIMULATOR

오차–간격 V자: 절단 오차와 반올림 오차의 줄다리기

전진 D₊중앙 D₀2계 차분모형 · √ε, ∛ε
D₊ 최적 h · 최소 오차—
D₀ 최적 h · 최소 오차—
2계 최적 h · 최소 오차—
모형의 h₊*, h₀*—
해볼 것: ① 오른쪽 가지의 기울기가 1(전진)과 2(중앙), 왼쪽 가지의 기울기가 −1인 것을 보세요. 왼쪽은 들쭉날쭉합니다. 반올림 오차는 우연에 가까운 값이라서입니다. ② 'eˣ, x = 20'으로 바꾸면 |f|가 4.9×10⁸이라 오차의 절대 크기가 커지지만 상대 오차로 보면 같습니다. 세로축은 상대 오차 |D − f′|/|f′|입니다. ③ 2계 차분을 켜면 바닥이 h ≈ 10⁻⁴로 올라가고 왼쪽 기울기가 −2입니다. 모델: IEEE 754 배정밀도로 실제 계산, h = 10−k/8.

고계 도함수와 차분 스텐실

경계에서는 대칭으로 못 놓는다

막대의 열전도 문제에서 왼쪽 끝 x=0x = 0의 열유속 −k T′(0)-k\,T'(0)을 알고 싶습니다. 온도는 격자점 x=0,h,2h,…x = 0, h, 2h, \dots에서만 압니다. 왼쪽에는 점이 없으니 중앙 차분을 쓸 수 없고, 전진 차분은 1차뿐입니다. 한쪽 점만 써서 2차 정확도를 얻을 수 있을까요? 일반적으로, 주어진 점들로 kk계 도함수를 가장 정확하게 근사하는 계수는 어떻게 구할까요?

점의 배치를 x+sjhx + s_jh(sjs_j는 정수 또는 실수 오프셋)라 하고 f(d)(x)≈h−d∑jcjf(x+sjh)f^{(d)}(x) \approx h^{-d}\sum_j c_j f(x + s_jh)를 찾습니다. 각 f(x+sjh)f(x + s_jh)를 테일러 전개해 hkf(k)h^k f^{(k)}의 계수를 모으면 ∑jcjsjk/k!\sum_j c_j s_j^k/k!입니다. k=dk = d일 때 1, 나머지 kk일 때 0이 되게 하면 됩니다.

정리 9.4 (미정 계수법) 서로 다른 오프셋 s1,…,sms_1, \dots, s_m과 d<md \lt m에 대해 연립방정식
∑j=1mcj sj k=k! δkd,k=0,1,…,m−1\sum_{j=1}^{m} c_j\,s_j^{\,k} = k!\,\delta_{kd},\qquad k = 0, 1, \dots, m-1
은 (반데르몽드 행렬이므로) 해가 유일하고, 그 cjc_j로 만든 차분 스텐실(finite-difference stencil) h−d∑cjf(x+sjh)h^{-d}\sum c_jf(x + s_jh)의 오차는 hq−dq!(∑jcjsj q)f(q)(x)+⋯\dfrac{h^{q-d}}{q!}\Bigl(\sum_j c_j s_j^{\,q}\Bigr) f^{(q)}(x) + \cdots이다. 여기서 q≥mq \ge m은 ∑cjsjq≠0\sum c_j s_j^q \ne 0인 첫 지수이고, 정확도 차수는 p=q−d≥m−dp = q - d \ge m - d다. 오프셋이 0에 대해 대칭이면 한 차수를 덤으로 얻는 경우가 많다.

이 연립방정식은 5장의 보간과 같은 이야기입니다. 점들을 지나는 보간 다항식을 만들어 그것을 dd번 미분한 것이 바로 이 스텐실입니다. 그래서 점을 mm개 쓰면 m−1m - 1차 다항식까지 정확히 미분합니다.

예제 9.2 (한쪽 3점 공식과 5점 중앙 공식)
  1. 오프셋 {0,1,2}\{0, 1, 2\}, d=1d = 1: c0+c1+c2=0c_0 + c_1 + c_2 = 0, c1+2c2=1c_1 + 2c_2 = 1, c1+4c2=0c_1 + 4c_2 = 0. 풀면 c2=−12c_2 = -\frac12, c1=2c_1 = 2, c0=−32c_0 = -\frac32. 공식은 f′(x)≈−3f(x)+4f(x+h)−f(x+2h)2hf'(x) \approx \dfrac{-3f(x) + 4f(x+h) - f(x+2h)}{2h}.
  2. 오차: ∑cjsj3=2⋅1−12⋅8=−2\sum c_js_j^3 = 2\cdot1 - \frac12\cdot8 = -2이므로 오차 항은 h23!(−2)f′′′=−h23f′′′\frac{h^2}{3!}(-2)f''' = -\frac{h^2}{3}f'''. 한쪽 점만으로 2차다. 처음 문제의 경계 열유속에 쓰는 공식이다. 같은 차수의 중앙 차분 상수 16\frac16보다 오차 상수가 두 배 크다.
  3. 오프셋 {−2,−1,0,1,2}\{-2, -1, 0, 1, 2\}, d=1d = 1: 계수 112(1,−8,0,8,−1)\frac{1}{12}(1, -8, 0, 8, -1). ∑cjsj5=112(−32+8+8−32)=−4\sum c_js_j^5 = \frac{1}{12}(-32 + 8 + 8 - 32) = -4이라 오차 −h430f(5)-\frac{h^4}{30}f^{(5)}, 4차다.
  4. 오프셋 {−1,0,1}\{-1, 0, 1\}, d=2d = 2: 계수 (1,−2,1)(1, -2, 1), 오차 h212f(4)\frac{h^2}{12}f^{(4)}. 열 방정식·파동 방정식의 격자 계산(16장)에서 가장 많이 쓰는 스텐실이다.
function stencil(s[1..m], d)            // 오프셋 s, 도함수 차수 d < m
  for k = 0 .. m-1
    for j = 1 .. m:  V[k][j] = s[j]^k
    rhs[k] = (k == d) ? k! : 0
  c = solve(V, rhs)                     // 유리수로 풀면 정확한 분수 계수
  q = m
  while sum_j c[j] * s[j]^q == 0:  q = q + 1
  return c, order = q - d, lead = sum_j c[j] * s[j]^q / q!

아래 계산기에서 오프셋을 골라 보세요. 분수 계수, 차수, 오차 상수를 구하고, f(x)=exf(x) = e^{x}에 적용한 실제 오차를 로그–로그로 그려 기울기를 확인합니다.

SIMULATOR

스텐실 계수 계산기: 점을 고르면 공식과 차수가 나온다

오프셋 s (점 x + s·h)
도함수 차수 d
—
점 개수 m—
정확도 차수 p—
오차 주항—
측정 기울기—
해볼 것: ① 프리셋 '중앙 2점'에서 오프셋 0을 추가해도 f′의 계수 c₀ = 0이라 공식이 그대로입니다. 대칭 덕분입니다. ② f″에 '중앙 5점'(−2, −1, 1, 2와 0)을 쓰면 4차 공식 (−1, 16, −30, 16, −1)/12가 나옵니다. ③ 차수가 높은 공식일수록 그래프 왼쪽의 반올림 바닥이 더 일찍(큰 h에서) 나타납니다. 계수의 절댓값 합이 커서 반올림 오차가 증폭되기 때문입니다. 모델: f = eˣ, x = 0.5에서 상대 오차, 계수는 BigInt 유리수로 정확히 계산.

리처드슨 외삽: 서로 다른 h를 섞어 차수 올리기

점을 늘리지 않고 정확도를 올리려면

중앙 차분 D0(h)D_0(h)의 오차는 h26f′′′+O(h4)\frac{h^2}{6}f''' + O(h^4)입니다. f′′′f'''를 모르니 오차를 빼 줄 수는 없습니다. 하지만 hh와 h/2h/2로 두 번 계산하면 오차가 대략 4 대 1이라는 것은 압니다. 두 결과를 적당히 섞으면 h2h^2 항이 사라지지 않을까요?

근사 A(h)A(h)가 참값 AA에 대해 A(h)=A+c1hp+c2hp′+⋯A(h) = A + c_1h^p + c_2h^{p'} + \cdots(p′>pp' \gt p)로 전개된다고 합시다. A(h/2)=A+c1hp/2p+⋯A(h/2) = A + c_1h^p/2^p + \cdots이므로 2pA(h/2)−A(h)=(2p−1)A+O(hp′)2^pA(h/2) - A(h) = (2^p - 1)A + O(h^{p'}). 양변을 2p−12^p - 1로 나누면 c1c_1을 몰라도 주항이 지워집니다.

정리 9.5 (리처드슨 외삽) A(h)=A+c1hp1+c2hp2+⋯A(h) = A + c_1h^{p_1} + c_2h^{p_2} + \cdots이면
A(1)(h)=2p1A(h/2)−A(h)2p1−1=A+O(hp2)A^{(1)}(h) = \frac{2^{p_1}A(h/2) - A(h)}{2^{p_1} - 1} = A + O(h^{p_2})
이다. 이를 되풀이한 리처드슨 외삽(Richardson extrapolation) 표에서 Ti,0=A(h/2i)T_{i,0} = A(h/2^i), Ti,j=2pjTi,j−1−Ti−1,j−12pj−1T_{i,j} = \dfrac{2^{p_j}T_{i,j-1} - T_{i-1,j-1}}{2^{p_j} - 1}이다. 중앙 차분은 pj=2jp_j = 2j(짝수만)이라 열마다 두 차수씩, 전진 차분은 pj=jp_j = j라 한 차수씩 오른다.

이 생각은 영국의 기상학자 리처드슨(Lewis Fry Richardson)이 20세기 초 미분방정식의 차분 해를 개선하려고 쓴 것으로 알려져 있고, 다음 장의 롬베르크 적분, 11장의 외삽 적분법이 모두 같은 구조입니다. 외삽값과 원래 값의 차이 ∣A(1)(h)−A(h/2)∣|A^{(1)}(h) - A(h/2)|는 A(h/2)A(h/2)의 오차 추정으로도 쓰입니다.

예제 9.3 (중앙 차분의 리처드슨 표) f=exf = e^x, x=1x = 1, h0=0.4h_0 = 0.4. 괄호 안은 오차.
hhTi,0T_{i,0} (2차)Ti,1T_{i,1} (4차)Ti,2T_{i,2} (6차)Ti,3T_{i,3} (8차)
0.42.7913515 (7.3×10⁻²)
0.22.7364400 (1.8×10⁻²)2.7181362 (−1.5×10⁻⁴)
0.12.7228146 (4.5×10⁻³)2.7182728 (−9.1×10⁻⁶)2.7182818631 (3.5×10⁻⁸)
0.052.7194146 (1.1×10⁻³)2.7182813 (−5.7×10⁻⁷)2.7182818290 (5.4×10⁻¹⁰)2.718281828458 (−1.2×10⁻¹²)

예를 들어 T1,1=(4×2.7364400−2.7913515)/3=2.7181362T_{1,1} = (4\times2.7364400 - 2.7913515)/3 = 2.7181362. 함숫값 8개(h=0.4,0.2,0.1,0.05h = 0.4, 0.2, 0.1, 0.05의 양쪽)만으로 오차 1.2×10−121.2\times10^{-12}을 얻었다. 같은 함숫값 개수에서 h=0.05h = 0.05의 중앙 차분은 10−310^{-3}이고, 최적 hh의 중앙 차분도 6.5×10−116.5\times10^{-11}이 한계였다. 큰 hh를 쓰므로 반올림 오차가 거의 증폭되지 않는다는 것이 외삽의 숨은 장점이다.

SIMULATOR

리처드슨 외삽 표: 한 행씩 쌓으며 대각선이 수렴하는 속도

기본 근사
함숫값 계산 횟수—
마지막 대각 원소 오차—
같은 계산의 기본 근사 오차—
해볼 것: ① '다음 행'을 눌러 6행까지 쌓으며 그래프의 각 열(색)이 서로 다른 기울기로 떨어지는 것을 보세요. 중앙 차분은 2, 4, 6, 8입니다. ② 기본 근사를 전진 차분으로 바꾸면 열마다 기울기가 1씩만 오릅니다. ③ '√x, x = 0.05'에서 h₀ = 0.04로 두면 x − h가 0에 가까워 전개가 처음 몇 항에서 잘 맞지 않으므로 외삽이 오히려 나빠지는 칸이 생깁니다. 외삽은 전개의 가정이 맞을 때만 효과가 있습니다. 모델: 표의 칸 색이 진할수록 그 열에서 오차가 작음.

잡음 데이터의 미분: 차분은 잡음을 키운다

엔코더 위치로 속도 구하기

모터 축의 각도를 1 kHz(Δt=1\Delta t = 1 ms)로 재는 엔코더가 있습니다. 측정마다 σ=10−3\sigma = 10^{-3} rad 정도의 잡음이 섞입니다. 이웃한 두 측정의 차이를 Δt\Delta t로 나눠 각속도를 구하면 잡음의 크기는 얼마일까요? 더 빨리(Δt\Delta t를 줄여) 재면 좋아질까요, 나빠질까요?

측정값이 yi=f(ti)+eiy_i = f(t_i) + e_i, eie_i가 서로 독립이고 표준편차 σ\sigma인 잡음이라 합시다. 중앙 차분 (yi+1−yi−1)/(2Δt)(y_{i+1} - y_{i-1})/(2\Delta t)에서 잡음 부분의 표준편차는 2σ/(2Δt)=0.707 σ/Δt\sqrt{2}\sigma/(2\Delta t) = 0.707\,\sigma/\Delta t입니다. 위 문제의 값을 넣으면 0.7070.707 rad/s, 각속도가 1 rad/s 정도라면 70%의 잡음입니다. 측정을 더 촘촘히 하면 오히려 1/Δt1/\Delta t로 나빠집니다. 정리 9.3의 반올림 오차가 ε\varepsilon에서 σ\sigma로 커진 판입니다. 미분은 나쁜 조건의 문제입니다(2장). 진폭 σ\sigma인 고주파 잡음 σsin⁡(ωt)\sigma\sin(\omega t)는 미분하면 진폭 σω\sigma\omega가 되기 때문입니다.

처방은 두 가지입니다. 첫째, 차분 간격을 측정 간격보다 넓게 잡습니다. 간격 H=mΔtH = m\Delta t의 중앙 차분은 잡음 σ/(2H)\sigma/(\sqrt2 H), 절단 H2∣f′′′∣/6H^2|f'''|/6이라 정리 9.3과 같은 계산으로 H∗=(3σ/(2M3))1/3H^* = (3\sigma/(\sqrt2 M_3))^{1/3} 근처가 최적입니다. 둘째, 두 점만 쓰지 않고 창 안의 모든 점에 다항식을 최소제곱으로 맞춘 뒤(7장) 그 다항식을 미분합니다. 이를 사비츠키–골레이 필터(Savitzky–Golay filter)라 부릅니다.

정리 9.6 (국소 직선 맞춤의 기울기) 등간격 점 ti+kΔtt_i + k\Delta t, k=−m,…,mk = -m, \dots, m에 직선을 최소제곱으로 맞추면 그 기울기는
f^′(ti)=∑k=−mmk yi+kΔt ∑k=−mmk2,∑k=−mmk2=m(m+1)(2m+1)3\hat f'(t_i) = \frac{\sum_{k=-m}^{m} k\,y_{i+k}}{\Delta t\,\sum_{k=-m}^{m}k^2},\qquad \sum_{k=-m}^m k^2 = \frac{m(m+1)(2m+1)}{3}
이고, 잡음의 표준편차는 σ/(Δt∑k2)\sigma/(\Delta t\sqrt{\sum k^2}), 절단 오차의 주항은 ∑k46∑k2Δt2f′′′\dfrac{\sum k^4}{6\sum k^2}\Delta t^2 f'''이다(창이 대칭이라 2차 항은 지워진다).

m=10m = 10(21점)이면 ∑k2=770\sum k^2 = 770이라 잡음이 σ/(27.7Δt)=0.036 σ/Δt\sigma/(27.7\Delta t) = 0.036\,\sigma/\Delta t, 2점 중앙 차분의 약 20분의 1입니다. 대신 ∑k4/(6∑k2)=50666/4620=11.0\sum k^4/(6\sum k^2) = 50666/4620 = 11.0이라 Δt=0.01\Delta t = 0.01에서 절단 오차가 1.1×10−3∣f′′′∣1.1\times10^{-3}|f'''|로 늘어납니다. 잡음과 해상도(빠른 변화를 따라가는 능력)를 바꾸는 거래입니다.

SIMULATOR

잡음 데이터 미분: 차분 간격과 평활 창의 거래

측정 y = f(t) + 잡음
도함수: 참값 vs 추정
추정 방법
RMS 오차 (전체)—
잡음 이론값—
절단 오차 크기 (잡음 없음)—
해볼 것: ① σ = 10⁻³, Δt = 0.002, m = 1에서 도함수가 잡음투성이입니다. m을 키우면 RMS 오차가 줄다가 다시 늘어납니다. 줄어드는 쪽은 잡음, 늘어나는 쪽은 절단(봉우리가 깎임)입니다. ② 같은 m에서 '직선 맞춤'이 중앙 차분보다 잡음이 훨씬 작습니다. 창의 모든 점을 쓰기 때문입니다. ③ Δt를 줄이면(더 촘촘한 측정) 같은 m에서 잡음이 커집니다. 모델: f(t) = sin t + 0.5 sin 3t, 독립 정규 잡음, 끝 근처 m개 점은 계산하지 않음.
실무 메모 제어기의 미분항(PID의 D)은 거의 항상 저역 통과 필터와 함께 씁니다. 같은 이유입니다. 측정 데이터의 도함수가 정말 필요하면, 데이터에 스플라인(6장)이나 다항식을 맞춘 뒤 미분하거나, 칼만 필터처럼 위치·속도를 모형으로 함께 추정합니다.

복소 스텝 미분: 뺄셈 없는 차분

상쇄를 아예 없앨 수는 없을까

최적 hh의 중앙 차분도 유효 숫자 10자리 근처가 한계였습니다. 원인은 거의 같은 두 수의 뺄셈입니다. 그런데 ff를 계산하는 프로그램이 복소수도 받을 수 있다면, hh를 허수 방향으로 주어 뺄셈을 피할 수 있습니다.

ff가 실수에서 실숫값을 갖는 해석 함수라면 f(x+ih)=f(x)+ihf′(x)−h22f′′(x)−ih36f′′′(x)+⋯f(x + ih) = f(x) + ihf'(x) - \frac{h^2}{2}f''(x) - i\frac{h^3}{6}f'''(x) + \cdots입니다. 실수부와 허수부가 갈라지므로 허수부만 취하면 Im⁡f(x+ih)=hf′(x)−h36f′′′(x)+⋯\operatorname{Im} f(x + ih) = hf'(x) - \frac{h^3}{6}f'''(x) + \cdots.

정리 9.7 (복소 스텝 미분) ff가 xx 근처에서 해석적이고 실축에서 실숫값이면
f′(x)=Im⁡f(x+ih)h+h26f′′′(x)+O(h4).f'(x) = \frac{\operatorname{Im} f(x + ih)}{h} + \frac{h^2}{6}f'''(x) + O(h^4).
이 복소 스텝 미분(complex-step derivative)은 2차 정확도이고, 식에 뺄셈이 없으므로 반올림 오차가 hh에 따라 커지지 않는다. 따라서 h=10−20h = 10^{-20}처럼 아주 작은 hh를 써서 절단 오차를 반올림 수준 아래로 내리면 기계 정밀도의 도함수를 얻는다.

f=exf = e^x, x=1x = 1이면 Im⁡e1+ih/h=esin⁡h/h\operatorname{Im} e^{1+ih}/h = e\sin h/h이고, h=0.1h = 0.1에서 2.71375362.7137536(오차 −4.5×10−3-4.5\times10^{-3}, 중앙 차분과 크기가 같고 부호가 반대), h=10−8h = 10^{-8} 이하에서는 2.7182818284590452.718281828459045, 배정밀도의 ee와 마지막 자리까지 같습니다. 스콰이어와 트랩의 시험 함수 f(x)=ex/sin⁡3x+cos⁡3xf(x) = e^x/\sqrt{\sin^3x + \cos^3x}의 x=1.5x = 1.5에서도 h=10−20h = 10^{-20}의 복소 스텝은 4.053427893898624.05342789389862로 참값과 일치하고, 중앙 차분은 최적 hh에서도 상대 오차 10−1010^{-10} 근처에 머뭅니다.

조건과 함정 ① ff의 프로그램 전체가 복소수로 돌아가야 합니다. abs, max, 조건문처럼 해석적이지 않은 연산은 실수부만 보고 처리하도록 다시 정의해야 합니다. ② 복소 제곱근 같은 함수도 상쇄 없이 구현되어 있어야 합니다. a+ib\sqrt{a + ib}의 허수부를 (∣z∣−a)/2\sqrt{(|z| - a)/2}로 계산하면 bb가 아주 작을 때 ∣z∣−a|z| - a에서 상쇄가 일어나 허수부가 0이 되고, 복소 스텝이 통째로 틀립니다(이 장의 시뮬레이터는 b/(2(∣z∣+a)/2)b/(2\sqrt{(|z|+a)/2})로 계산합니다). ③ 비용은 복소 계산 한 번으로, 실수 계산의 대략 2~4배입니다. 변수가 많으면 변수마다 한 번씩 필요합니다.
SIMULATOR

복소 스텝 vs 차분: 바닥이 사라지는 오차 그래프

전진 D₊중앙 D₀복소 스텝
참 f′(x)—
D₀ (상대 오차)—
복소 스텝 (상대 오차)—
해볼 것: ① k를 키워 가며 중앙 차분은 k ≈ 5에서 바닥을 찍고 다시 나빠지지만 복소 스텝은 k ≥ 8에서 10⁻¹⁶ 아래(그래프 바닥선)에 붙어 있는 것을 보세요. ② 체크박스로 상쇄가 있는 복소 제곱근을 쓰면 첫 번째 함수에서 복소 스텝이 엉뚱한 값으로 떨어집니다. 구현이 해석적 연장을 정확히 계산해야 한다는 뜻입니다. ③ 1/(1 + x²)는 제곱근이 없어 체크박스와 상관없습니다. 모델: 복소 연산은 이 장 스크립트의 직접 구현, 오차 0은 바닥선(10⁻¹⁷)에 표시.

자동 미분: 연쇄 법칙을 기계적으로

근사가 아니라 정확한 도함수를, 프로그램에서

함수가 수천 줄의 프로그램이라도 결국은 덧셈, 곱셈, sin⁡\sin, exp⁡\exp 같은 기본 연산의 연쇄입니다. 각 기본 연산의 도함수는 압니다. 그렇다면 프로그램이 값을 계산하는 바로 그 순서대로 도함수도 함께 계산하면, hh도 근사도 없이 정확한(반올림 수준의) 도함수를 얻을 수 있지 않을까요? 기호 미분처럼 식이 폭발하지도 않고요.

자동 미분(automatic differentiation, AD)은 기호 미분도 수치 미분도 아닙니다. 프로그램의 실행 기록(계산 그래프)에 연쇄 법칙(CalculusBook 4장)을 한 연산씩 적용합니다. 방향이 두 가지입니다.

전진 모드와 이중수

모든 중간값 vv에 그 도함수 v˙=dv/dx\dot v = dv/dx를 짝지어 (v,v˙)(v, \dot v)로 들고 다닙니다. 덧셈은 (a,a˙)+(b,b˙)=(a+b, a˙+b˙)(a, \dot a) + (b, \dot b) = (a + b,\ \dot a + \dot b), 곱셈은 (ab, a˙b+ab˙)(ab,\ \dot ab + a\dot b), 함수는 g(a,a˙)=(g(a), g′(a)a˙)g(a, \dot a) = (g(a),\ g'(a)\dot a)입니다. 이 규칙은 ϵ2=0\epsilon^2 = 0인 새 수 ϵ\epsilon을 도입해 a+a˙ϵa + \dot a\epsilon으로 쓰면 저절로 나옵니다. (a+a˙ϵ)(b+b˙ϵ)=ab+(a˙b+ab˙)ϵ(a + \dot a\epsilon)(b + \dot b\epsilon) = ab + (\dot ab + a\dot b)\epsilon. 이런 수를 이중수(dual number)라 합니다. 복소 스텝에서 i2=−1i^2 = -1 때문에 남던 h2h^2 항이, ϵ2=0\epsilon^2 = 0에서는 완전히 사라진다고 보면 됩니다.

예제 9.4 (이중수로 한 줄씩) f(x)=xsin⁡x+exf(x) = x\sin x + e^x의 x=1x = 1에서 값과 도함수를 구하라. 시작은 v1=(1, 1)v_1 = (1,\ 1)(dx/dx=1dx/dx = 1).
단계연산값 vv도함수 v˙\dot v
v1v_1xx11
v2v_2sin⁡v1\sin v_10.841471cos⁡v1⋅v˙1=0.540302\cos v_1\cdot\dot v_1 = 0.540302
v3v_3v1v2v_1 v_20.841471v˙1v2+v1v˙2=1.381773\dot v_1v_2 + v_1\dot v_2 = 1.381773
v4v_4exp⁡v1\exp v_12.718282ev1v˙1=2.718282e^{v_1}\dot v_1 = 2.718282
v5v_5v3+v4v_3 + v_43.5597534.100055

손으로 미분한 f′(1)=sin⁡1+cos⁡1+e=4.100055f'(1) = \sin1 + \cos1 + e = 4.100055과 같다. 계산 비용은 원래 계산의 몇 배(상수)일 뿐이고, 오차는 반올림뿐이다.

SIMULATOR

이중수 전진 모드 AD: 값과 도함수를 한 줄씩

단계연산값 v도함수 v̇ (규칙)
AD f′(x)—
손 공식 f′(x)—
중앙 차분 (h = 10⁻⁵) 오차—
해볼 것: ① '다음 연산'을 눌러 표가 채워질 때마다 위 그래프에 그 중간값 vₖ(x)가 곡선으로 그려지고, 현재 x에서 접선이 표시됩니다. ② x 슬라이더를 움직이면 표 전체가 다시 계산됩니다. AD 값과 손 공식이 모든 자리에서 같습니다(차이는 기껏 마지막 자리). ③ 중앙 차분과의 차이는 10⁻¹⁰ 근처입니다. 모델: 각 연산은 (값, 도함수) 쌍 위의 규칙, 사칙연산·sin·cos·exp·√·제곱만 사용.

후진 모드와 역전파

입력이 nn개, 출력이 하나인 함수 f:Rn→Rf: \mathbb{R}^n \to \mathbb{R}(신경망의 손실 함수가 그렇습니다)의 기울기를 전진 모드로 구하면 입력마다 한 번, nn번 돌려야 합니다. 후진 모드는 반대로 갑니다. 먼저 값을 앞으로 계산해 그래프에 저장하고(전진 패스), 출력에서 시작해 각 중간값 vv에 대한 수반 변수(adjoint) vˉ=∂f/∂v\bar v = \partial f/\partial v를 연쇄 법칙으로 거꾸로 전파합니다(후진 패스). vv가 여러 곳에 쓰였으면 각 경로의 기여를 더합니다: vˉ=∑w : v→wwˉ ∂w/∂v\bar v = \sum_{w\,:\,v \to w}\bar w\,\partial w/\partial v.

정리 9.8 (자동 미분의 비용) 기본 연산 NN개로 이루어진 f:Rn→Rmf: \mathbb{R}^n \to \mathbb{R}^m에 대해, 전진 모드 한 번은 야코비 행렬의 한 열(방향 도함수 Jx˙J\dot{\mathbf x})을, 후진 모드 한 번은 한 행(yˉTJ\bar{\mathbf y}^{\mathsf T}J)을 원래 계산의 작은 상수배 비용으로 준다. 따라서 m=1m = 1인 기울기 ∇f\nabla f는 후진 모드 한 번, 곧 입력 개수 nn에 무관하게 함수 계산 몇 번 분의 비용으로 얻는다. 대가는 전진 패스의 중간값을 모두 저장할 메모리다.
예제 9.5 (후진 모드 손 계산) f(x1,x2)=ln⁡x1+x1x2−sin⁡x2f(x_1, x_2) = \ln x_1 + x_1x_2 - \sin x_2, (x1,x2)=(2,5)(x_1, x_2) = (2, 5).
  1. 전진 패스: v1=ln⁡2=0.693147v_1 = \ln 2 = 0.693147, v2=x1x2=10v_2 = x_1x_2 = 10, v3=sin⁡5=−0.958924v_3 = \sin 5 = -0.958924, v4=v1+v2=10.693147v_4 = v_1 + v_2 = 10.693147, f=v4−v3=11.652071f = v_4 - v_3 = 11.652071.
  2. 후진 패스: fˉ=1\bar f = 1. vˉ4=1\bar v_4 = 1, vˉ3=−1\bar v_3 = -1. vˉ1=vˉ4=1\bar v_1 = \bar v_4 = 1, vˉ2=vˉ4=1\bar v_2 = \bar v_4 = 1.
  3. 입력으로: x1x_1은 v1v_1과 v2v_2 두 곳에 쓰였으므로 xˉ1=vˉ1⋅1x1+vˉ2⋅x2=0.5+5=5.5\bar x_1 = \bar v_1\cdot\frac{1}{x_1} + \bar v_2\cdot x_2 = 0.5 + 5 = 5.5. x2x_2도 두 곳: xˉ2=vˉ2⋅x1+vˉ3cos⁡x2=2−0.283662=1.716338\bar x_2 = \bar v_2\cdot x_1 + \bar v_3\cos x_2 = 2 - 0.283662 = 1.716338.
  4. 확인: ∂f/∂x1=1/x1+x2=5.5\partial f/\partial x_1 = 1/x_1 + x_2 = 5.5, ∂f/∂x2=x1−cos⁡x2=1.716338\partial f/\partial x_2 = x_1 - \cos x_2 = 1.716338. 한 번의 후진 패스로 두 편도함수를 모두 얻었다.
SIMULATOR

후진 모드(역전파): 계산 그래프를 앞으로, 그리고 거꾸로

f(x₁, x₂)—
∂f/∂x₁ (후진 결과)—
∂f/∂x₂ (후진 결과)—
손 공식 (1/x₁ + x₂, x₁ − cos x₂)—
해볼 것: ① '다음 단계'를 눌러 전진 패스(노드 안의 값, 위에서 아래로)를 끝까지 보고, 이어서 후진 패스(노드 아래의 수반 변수 v̄, 출력에서 입력으로)를 보세요. ② x₁ 노드에 화살표 두 개가 모이는 순간 두 기여가 더해집니다(다변수 연쇄 법칙). ③ 입력이 백만 개여도 후진 패스는 한 번입니다. 전진 모드라면 백만 번입니다. 신경망 학습이 후진 모드를 쓰는 이유입니다. 모델: 예제 9.5의 그래프.
방법정확도∇f\nabla f(입력 nn개) 비용필요한 것
전진 차분∼ε\sim\sqrt\varepsilon (8자리)n+1n + 1번 계산ff만
중앙 차분∼ε2/3\sim\varepsilon^{2/3} (10자리)2n2n번ff만
복소 스텝기계 정밀도복소 계산 nn번복소수로 도는 코드
전진 모드 AD기계 정밀도약 nn배연산자 오버로딩 또는 코드 변환
후진 모드 AD기계 정밀도상수배(nn에 무관)중간값 저장 메모리

이 도구가 쓰이는 곳

세 가지 대표 상황에서 고르는 도구가 다릅니다. 속도 추정(엔코더, GPS, 영상 추적)은 잡음 데이터의 미분이라 평활화와 필터가 핵심입니다. 민감도 해석(설계 변수에 대한 출력의 도함수, 불확실성 전파)은 함수가 비싼 시뮬레이션이라 계산 횟수가 중요하고, 변수가 적으면 중앙 차분이나 복소 스텝, 많으면 수반(adjoint) 방법이나 후진 모드 AD를 씁니다. 신경망 학습은 입력(가중치)이 수십억 개, 출력(손실)이 하나인 극단적인 경우라 후진 모드 AD, 곧 역전파 외에는 선택지가 없습니다.

핵심 정리

  1. 전진·후진 차분의 절단 오차는 h2f′′\frac h2 f''(1차), 중앙 차분은 h26f′′′\frac{h^2}{6}f'''(2차)이다. 대칭 배치가 홀수 차 항을 지운다.
  2. 함숫값의 반올림 오차는 차분에서 ε∣f∣/h\varepsilon|f|/h로 커진다. 절단과 반올림의 합이 최소인 h∗≈εh^* \approx \sqrt\varepsilon(1차), ε3\sqrt[3]\varepsilon(2차)에서 각각 약 8자리, 10자리가 한계다. 오차–간격 로그 그래프는 V자다.
  3. 오프셋 sjs_j의 스텐실 계수는 ∑cjsjk=k! δkd\sum c_js_j^k = k!\,\delta_{kd}(반데르몽드 계)로 정해지고, 첫 0이 아닌 모멘트가 차수와 오차 상수를 준다.
  4. 리처드슨 외삽 (2pA(h/2)−A(h))/(2p−1)(2^pA(h/2) - A(h))/(2^p - 1)은 오차 전개의 주항을 지운다. 중앙 차분에서는 열마다 두 차수씩 오르고, 큰 h를 쓰므로 반올림에도 강하다.
  5. 잡음 σ\sigma인 데이터의 차분은 잡음을 σ/h\sigma/h로 키운다. 간격을 넓히거나 창 안의 점에 다항식을 최소제곱으로 맞춰(사비츠키–골레이) 잡음과 해상도를 바꾼다.
  6. 복소 스텝 Im⁡f(x+ih)/h\operatorname{Im}f(x + ih)/h는 뺄셈이 없어 h=10−20h = 10^{-20}에서도 반올림이 커지지 않는다. 해석적인 복소 구현이 필요하다.
  7. 자동 미분은 계산 그래프에 연쇄 법칙을 적용해 기계 정밀도의 도함수를 준다. 전진 모드(이중수)는 입력 하나당 한 번, 후진 모드(역전파)는 출력 하나당 한 번으로 기울기 전체를 준다.

확인 퀴즈

Q1. 어떤 매끄러운 함수의 중앙 차분 오차가 h=0.02h = 0.02에서 8×10−58\times10^{-5}이었다. h=0.01h = 0.01이면 오차는 대략?

중앙 차분의 절단 오차는 h26f′′′\frac{h^2}{6}f''', 2차다. h를 반으로 줄이면 오차는 4분의 1, 2×10−52\times10^{-5}. 반올림 바닥(h ≈ 10⁻⁵ 근처)보다 훨씬 큰 h라 절단 오차가 지배한다.

Q2. 배정밀도(ε≈2.2×10−16\varepsilon \approx 2.2\times10^{-16})에서 f(x)=exf(x) = e^x의 x=1x = 1에서 전진 차분으로 얻을 수 있는 가장 작은 오차의 크기는 대략?

최소 오차 E∗=2ε∣f∣M2=2ε e≈5.7×10−8E^* = \sqrt{2\varepsilon|f|M_2} = \sqrt{2\varepsilon}\,e \approx 5.7\times10^{-8}, h∗≈2×10−8h^* \approx 2\times10^{-8}에서다. 10−1110^{-11}은 중앙 차분(ε2/3\varepsilon^{2/3})의 한계에 가깝다.

Q3. 오프셋 {0,1,2}\{0, 1, 2\}로 만든 f′(x)f'(x)의 3점 공식은?

∑cj=0\sum c_j = 0, ∑cjsj=1\sum c_js_j = 1, ∑cjsj2=0\sum c_js_j^2 = 0을 풀면 (c0,c1,c2)=(−3/2,2,−1/2)(c_0, c_1, c_2) = (-3/2, 2, -1/2). 오차는 −h23f′′′-\frac{h^2}{3}f'''로 2차다. 첫 보기는 간격 2h의 전진 차분(1차), 세 번째는 2계 도함수 차분에 h를 곱한 꼴이다.

Q4. 중앙 차분으로 D(0.1)=2.7228146D(0.1) = 2.7228146, D(0.05)=2.7194146D(0.05) = 2.7194146을 얻었다. 한 번의 리처드슨 외삽값은?

중앙 차분의 주항은 h2h^2이므로 (4D(0.05)−D(0.1))/3=(10.8776584−2.7228146)/3=2.7182813(4D(0.05) - D(0.1))/3 = (10.8776584 - 2.7228146)/3 = 2.7182813. 참값 e=2.7182818e = 2.7182818과 6×10−76\times10^{-7} 차이다. 첫 보기는 2D(h/2)−D(h)2D(h/2) - D(h)(1차 가정)로 잘못 섞은 값이다.

Q5. 잡음 표준편차 σ\sigma인 위치 측정을 간격 Δt\Delta t로 얻어 이웃 점 중앙 차분 (yi+1−yi−1)/(2Δt)(y_{i+1} - y_{i-1})/(2\Delta t)로 속도를 구한다. 측정 간격을 절반으로 줄이면 속도 추정의 잡음은?

잡음 부분의 표준편차는 2σ/(2Δt)\sqrt2\sigma/(2\Delta t)로 1/Δt1/\Delta t에 비례한다. 더 촘촘히 재면 차분이 잡음을 더 키운다. 처방은 차분 간격을 넓히거나 여러 점에 맞춤을 하는 것이다.

Q6. 복소 스텝 미분에서 h=10−20h = 10^{-20}을 써도 되는 이유는?

Im⁡f(x+ih)=hf′(x)−h36f′′′+⋯\operatorname{Im}f(x + ih) = hf'(x) - \frac{h^3}{6}f''' + \cdots를 h로 나누기만 하므로 상쇄가 없다. 절단 오차는 h26f′′′\frac{h^2}{6}f'''로 0이 아니지만 h = 10⁻²⁰이면 10⁻⁴⁰ 수준이라 보이지 않는다.

Q7. 이중수 a+bϵa + b\epsilon(ϵ2=0\epsilon^2 = 0)에서 (3+2ϵ)(1+4ϵ)(3 + 2\epsilon)(1 + 4\epsilon)은?

3⋅1+(3⋅4+2⋅1)ϵ+8ϵ2=3+14ϵ3\cdot1 + (3\cdot4 + 2\cdot1)\epsilon + 8\epsilon^2 = 3 + 14\epsilon. 곱의 미분 법칙 (uv)′=u′v+uv′(uv)' = u'v + uv'이 이중수의 곱셈에 그대로 들어 있다. 세 번째 보기는 ϵ2=1\epsilon^2 = 1로 잘못 본 것이다.

Q8. 가중치 10810^8개를 가진 신경망의 손실 함수(스칼라) 기울기를 구할 때 후진 모드 AD를 쓰는 가장 큰 이유는?

전진·후진 모드 모두 기계 정밀도이고 h도 없다. 차이는 비용이다. 전진 모드는 입력마다 한 번(10⁸번), 후진 모드는 출력마다 한 번(1번) 필요하다. 대신 후진 모드는 전진 패스의 중간값을 저장해야 해서 메모리를 더 쓴다.