미분은 극한 limh→0(f(x+h)−f(x))/h입니다. 컴퓨터는 극한을 계산할 수 없으니 작은 h 하나를 골라 몫을 계산합니다. 그런데 h를 작게 할수록 좋아지는 것은 처음 몇 자리뿐이고, 어느 순간부터 결과가 나빠집니다. 이 장은 그 이유를 테일러 전개(절단 오차)와 부동소수점(반올림 오차)의 줄다리기로 설명하고, 최적의 h를 계산합니다. 그다음 차수를 올리는 세 가지 길, 곧 점을 더 쓰는 스텐실, 서로 다른 h의 결과를 섞는 리처드슨 외삽, 뺄셈 자체를 없애는 복소 스텝을 보고, 잡음 섞인 측정 데이터를 미분할 때의 함정을 다룹니다. 마지막으로 차분 없이 기계 정밀도의 도함수를 주는 자동 미분, 곧 신경망 학습의 역전파를 만납니다.
전진·후진·중앙 차분을 테일러 전개로 유도하고 각각의 절단 오차 차수 O(h), O(h2)를 보인다.
복소 스텝 미분과 자동 미분(전진 모드의 이중수, 후진 모드의 역전파)의 원리와 비용을 설명한다.
이 수식이 없었다면신경망 학습과 설계 민감도 해석
자동차의 바퀴 속도 센서는 일정한 간격으로 회전 각도를 세고, 제어기는 그 차이를 시간으로 나눠 속도와 가속도를 얻습니다. 항공기 날개 설계 프로그램은 날개 단면의 매개변수 수백 개를 조금씩 바꿀 때 양력이 얼마나 변하는지, 곧 도함수를 알아야 최적화를 할 수 있습니다. 수억 개의 가중치를 가진 신경망은 손실 함수의 기울기를 매 걸음 계산해야 학습됩니다. 함수가 공식이 아니라 프로그램이나 측정값으로만 주어질 때 도함수를 얻는 일이 수치 미분입니다.
차분 몫의 생각은 미적분 이전부터 있었지만, 그 오차를 정량적으로 다루는 일은 컴퓨터와 함께 중요해졌습니다. 1967년 라이니스(J. N. Lyness)와 몰러(C. B. Moler)가 복소수를 써서 도함수를 구하는 방법을 발표했고, 1998년 스콰이어(William Squire)와 트랩(George Trapp)이 이를 한 줄짜리 복소 스텝 공식으로 정리해 널리 알렸습니다. 같은 시기 발전한 자동 미분의 후진 모드는 오늘날 딥러닝 프레임워크의 핵심인 역전파와 같은 알고리즘입니다.
f(x)만 계산할 수 있다→차분 몫의 오차 분석→h* ≈ √ε, 외삽, 복소 스텝, 자동 미분→속도 추정·민감도·역전파
차분 몫: 할선의 기울기로 접선을 어림하기
함수를 프로그램으로만 받았을 때
유체 해석 프로그램이 받음각 α를 넣으면 양력 계수 CL(α)를 돌려줍니다. 한 번 실행에 몇 분이 걸리고, 공식은 없습니다. 설계자는 dCL/dα를 알고 싶습니다. 할 수 있는 일은 α를 조금 바꿔 다시 실행하는 것뿐입니다. 얼마나 조금 바꿔야 할까요? 그리고 몇 번 실행해야 몇 자리를 믿을 수 있을까요?
도함수의 정의(CalculusBook 3장)에서 극한을 떼어 내면 가장 간단한 근사가 나옵니다. 오른쪽 점을 쓰면 전진, 왼쪽 점을 쓰면 후진, 양쪽을 대칭으로 쓰면 중앙 차분입니다.
h를 반으로 줄이면 전진·후진의 오차는 약 반(0.141→0.0691), 중앙의 오차는 약 4분의 1(4.53×10−3→1.13×10−3)이 된다. 전진과 후진의 오차는 부호가 반대이고 크기가 비슷하다. 그림 9-1의 상쇄가 숫자로 보인다.
아래 시뮬레이터에서 점을 곡선 위로 끌고 h를 줄여 보세요. 할선이 접선으로 돌아 들어가는 속도가 방법마다 다릅니다.
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장: 나머지 항)에서 바로 나옵니다. f가 충분히 매끄러우면
첫 식에서 f(x)를 빼고 h로 나누면 D+f=f′+2hf′′+O(h2)입니다. 두 식을 빼면 짝수 차 항이 모두 지워져 f(x+h)−f(x−h)=2hf′+3h3f′′′+O(h5), 곧 D0f=f′+6h2f′′′+O(h4)입니다. 대칭으로 놓은 점이 h의 홀수 거듭제곱 항을 지운 것이 중앙 차분의 비밀입니다.
정리 9.2 (차분 몫의 절단 오차)f가 [x−h,x+h]에서 필요한 만큼 연속 미분 가능하면, 어떤 ξ, η가 그 구간에 있어
즉 전진·후진 차분은 1차, 중앙 차분은 2차 정확도를 가진다. 이렇게 방법이 버린 항에서 생기는 오차를 절단 오차(truncation error)라 한다.
증명의 핵심. 라그랑주 나머지로 f(x+h)=f(x)+hf′(x)+2h2f′′(ξ)를 쓰면 첫 식이다. 중앙 차분은 f(x±h)를 3차 나머지까지 써서 빼면 6h3(f′′′(η+)+f′′′(η−))이 남고, 중간값 정리로 두 값의 평균을 한 점 η의 f′′′로 바꾼다. ∎
예제 9.1로 확인해 봅시다. h=0.01에서 전진 오차 예측은 20.01eξ≈0.005×2.73=0.0136이고 실제 0.01364입니다. 중앙 오차 예측은 610−4e≈4.53×10−5, 실제와 세 자리가 맞습니다. 오차의 상수까지 예측된다는 점이 중요합니다. 다음 절의 최적 간격 계산과 리처드슨 외삽이 모두 이 상수를 이용합니다.
홀짝의 효과 중앙 차분의 오차 전개에는 h2,h4,h6,…처럼 짝수 거듭제곱만 나타납니다. 그래서 h를 반으로 줄인 결과와 섞으면 한 번에 두 차수씩 오릅니다(리처드슨 외삽 절). 전진 차분은 h,h2,h3,…이 모두 있어 한 차수씩만 오릅니다.
절단 오차 대 반올림 오차: 최적의 h
h = 10⁻¹²이면 더 정확할까
정리 9.2만 보면 h는 작을수록 좋습니다. 그래서 ex의 x=1에서 전진 차분을 h=10−12로 계산하면 2.71871…, 오차가 4.3×10−4입니다. h=10−3일 때의 오차 1.4×10−3과 별 차이가 없고, h=10−8일 때의 6.6×10−9보다는 5만 배 나쁩니다. h=10−16이면 답이 0입니다. 무엇이 잘못된 걸까요?
범인은 1장의 자릿수 상쇄입니다. f(x+h)와 f(x)는 각각 상대 오차 u=ε/2≈1.1×10−16 정도로 저장됩니다. h가 작으면 두 값이 거의 같아서 뺄셈의 결과에는 믿을 수 있는 자리가 몇 개 남지 않고, 그 작은 차이를 다시 작은 h로 나누면 남은 오차가 1/h배로 커집니다. f를 계산하는 프로그램 자체의 오차가 δ라면 그 효과는 더 큽니다.
정리 9.3 (최적 간격) 계산된 함숫값이 f^(x)=f(x)(1+δx), ∣δx∣≤u를 만족한다고 하자(u=ε/2, ε은 기계 엡실론). M2=∣f′′∣, M3=∣f′′′∣를 x 근처의 상한이라 하면 계산된 차분 몫의 전체 오차는
증명의 핵심. 분자의 두 함숫값 오차는 각각 u∣f∣ 이하라 차이의 오차가 2u∣f∣=ε∣f∣ 이하이고, 이를 h(중앙은 2h)로 나눈다. Ah+B/h는 h=B/A에서 최소 2AB, Ah2+B/h는 h3=B/(2A)에서 최소다. ∎
f=ex, x=1이면 ∣f∣=M2=M3=e라서 h+∗=2ε=2.1×10−8, E+∗≈5.7×10−8, h0∗=(1.5ε)1/3=6.9×10−6, E0∗≈6.5×10−11입니다. 경험칙으로 기억하면 1차 공식은 h≈ε≈10−8에서 유효 숫자 약 8자리, 2차 공식은 h≈3ε≈6×10−6에서 약 10~11자리를 얻습니다(x와 f의 크기에 맞춰 h를 εmax(1,∣x∣)처럼 비례시킵니다). 배정밀도 16자리를 다 얻지는 못한다는 것이 차분 몫의 본질적 한계입니다. 2계 도함수 (f(x+h)−2f(x)+f(x−h))/h2은 반올림 오차가 1/h2로 커지므로 h∗∼ε1/4≈10−4이고 8자리 정도가 한계입니다.
h를 이진수로 고르기x+h도 부동소수점 수라서 실제로 더해지는 간격은 h가 아니라 (x+h)−x를 반올림한 값입니다. 실무 코드는 temp = x + h; h = temp - x로 실제 간격을 다시 계산하거나, h를 2의 거듭제곱으로 고릅니다. 그러면 x+h가 정확히 표현되어 오차 하나가 사라집니다.
아래 그래프의 가로축은 h, 세로축은 오차, 둘 다 로그 눈금입니다. 오른쪽에서는 절단 오차가 기울기 1(또는 2)로 줄고, 왼쪽에서는 반올림 오차가 기울기 −1로 커집니다. 둘이 만나는 바닥이 최적 h입니다.
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=0의 열유속 −kT′(0)을 알고 싶습니다. 온도는 격자점 x=0,h,2h,…에서만 압니다. 왼쪽에는 점이 없으니 중앙 차분을 쓸 수 없고, 전진 차분은 1차뿐입니다. 한쪽 점만 써서 2차 정확도를 얻을 수 있을까요? 일반적으로, 주어진 점들로 k계 도함수를 가장 정확하게 근사하는 계수는 어떻게 구할까요?
점의 배치를 x+sjh(sj는 정수 또는 실수 오프셋)라 하고 f(d)(x)≈h−d∑jcjf(x+sjh)를 찾습니다. 각 f(x+sjh)를 테일러 전개해 hkf(k)의 계수를 모으면 ∑jcjsjk/k!입니다. k=d일 때 1, 나머지 k일 때 0이 되게 하면 됩니다.
정리 9.4 (미정 계수법) 서로 다른 오프셋 s1,…,sm과 d<m에 대해 연립방정식
j=1∑mcjsjk=k!δkd,k=0,1,…,m−1
은 (반데르몽드 행렬이므로) 해가 유일하고, 그 cj로 만든 차분 스텐실(finite-difference stencil)h−d∑cjf(x+sjh)의 오차는 q!hq−d(∑jcjsjq)f(q)(x)+⋯이다. 여기서 q≥m은 ∑cjsjq=0인 첫 지수이고, 정확도 차수는 p=q−d≥m−d다. 오프셋이 0에 대해 대칭이면 한 차수를 덤으로 얻는 경우가 많다.
이 연립방정식은 5장의 보간과 같은 이야기입니다. 점들을 지나는 보간 다항식을 만들어 그것을 d번 미분한 것이 바로 이 스텐실입니다. 그래서 점을 m개 쓰면 m−1차 다항식까지 정확히 미분합니다.
이다. 이를 되풀이한 리처드슨 외삽(Richardson extrapolation) 표에서 Ti,0=A(h/2i), Ti,j=2pj−12pjTi,j−1−Ti−1,j−1이다. 중앙 차분은 pj=2j(짝수만)이라 열마다 두 차수씩, 전진 차분은 pj=j라 한 차수씩 오른다.
이 생각은 영국의 기상학자 리처드슨(Lewis Fry Richardson)이 20세기 초 미분방정식의 차분 해를 개선하려고 쓴 것으로 알려져 있고, 다음 장의 롬베르크 적분, 11장의 외삽 적분법이 모두 같은 구조입니다. 외삽값과 원래 값의 차이 ∣A(1)(h)−A(h/2)∣는 A(h/2)의 오차 추정으로도 쓰입니다.
예를 들어 T1,1=(4×2.7364400−2.7913515)/3=2.7181362. 함숫값 8개(h=0.4,0.2,0.1,0.05의 양쪽)만으로 오차 1.2×10−12을 얻었다. 같은 함숫값 개수에서 h=0.05의 중앙 차분은 10−3이고, 최적 h의 중앙 차분도 6.5×10−11이 한계였다. 큰 h를 쓰므로 반올림 오차가 거의 증폭되지 않는다는 것이 외삽의 숨은 장점이다.
SIMULATOR
리처드슨 외삽 표: 한 행씩 쌓으며 대각선이 수렴하는 속도
기본 근사
함숫값 계산 횟수—
마지막 대각 원소 오차—
같은 계산의 기본 근사 오차—
해볼 것: ① '다음 행'을 눌러 6행까지 쌓으며 그래프의 각 열(색)이 서로 다른 기울기로 떨어지는 것을 보세요. 중앙 차분은 2, 4, 6, 8입니다. ② 기본 근사를 전진 차분으로 바꾸면 열마다 기울기가 1씩만 오릅니다. ③ '√x, x = 0.05'에서 h₀ = 0.04로 두면 x − h가 0에 가까워 전개가 처음 몇 항에서 잘 맞지 않으므로 외삽이 오히려 나빠지는 칸이 생깁니다. 외삽은 전개의 가정이 맞을 때만 효과가 있습니다. 모델: 표의 칸 색이 진할수록 그 열에서 오차가 작음.
잡음 데이터의 미분: 차분은 잡음을 키운다
엔코더 위치로 속도 구하기
모터 축의 각도를 1 kHz(Δt=1 ms)로 재는 엔코더가 있습니다. 측정마다 σ=10−3 rad 정도의 잡음이 섞입니다. 이웃한 두 측정의 차이를 Δt로 나눠 각속도를 구하면 잡음의 크기는 얼마일까요? 더 빨리(Δt를 줄여) 재면 좋아질까요, 나빠질까요?
측정값이 yi=f(ti)+ei, ei가 서로 독립이고 표준편차 σ인 잡음이라 합시다. 중앙 차분 (yi+1−yi−1)/(2Δt)에서 잡음 부분의 표준편차는 2σ/(2Δt)=0.707σ/Δt입니다. 위 문제의 값을 넣으면 0.707 rad/s, 각속도가 1 rad/s 정도라면 70%의 잡음입니다. 측정을 더 촘촘히 하면 오히려 1/Δt로 나빠집니다. 정리 9.3의 반올림 오차가 ε에서 σ로 커진 판입니다. 미분은 나쁜 조건의 문제입니다(2장). 진폭 σ인 고주파 잡음 σsin(ωt)는 미분하면 진폭 σω가 되기 때문입니다.
처방은 두 가지입니다. 첫째, 차분 간격을 측정 간격보다 넓게 잡습니다. 간격 H=mΔt의 중앙 차분은 잡음 σ/(2H), 절단 H2∣f′′′∣/6이라 정리 9.3과 같은 계산으로 H∗=(3σ/(2M3))1/3 근처가 최적입니다. 둘째, 두 점만 쓰지 않고 창 안의 모든 점에 다항식을 최소제곱으로 맞춘 뒤(7장) 그 다항식을 미분합니다. 이를 사비츠키–골레이 필터(Savitzky–Golay filter)라 부릅니다.
정리 9.6 (국소 직선 맞춤의 기울기) 등간격 점 ti+kΔt, k=−m,…,m에 직선을 최소제곱으로 맞추면 그 기울기는
m=10(21점)이면 ∑k2=770이라 잡음이 σ/(27.7Δt)=0.036σ/Δt, 2점 중앙 차분의 약 20분의 1입니다. 대신 ∑k4/(6∑k2)=50666/4620=11.0이라 Δt=0.01에서 절단 오차가 1.1×10−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장)이나 다항식을 맞춘 뒤 미분하거나, 칼만 필터처럼 위치·속도를 모형으로 함께 추정합니다.
복소 스텝 미분: 뺄셈 없는 차분
상쇄를 아예 없앨 수는 없을까
최적 h의 중앙 차분도 유효 숫자 10자리 근처가 한계였습니다. 원인은 거의 같은 두 수의 뺄셈입니다. 그런데 f를 계산하는 프로그램이 복소수도 받을 수 있다면, h를 허수 방향으로 주어 뺄셈을 피할 수 있습니다.
이 복소 스텝 미분(complex-step derivative)은 2차 정확도이고, 식에 뺄셈이 없으므로 반올림 오차가 h에 따라 커지지 않는다. 따라서 h=10−20처럼 아주 작은 h를 써서 절단 오차를 반올림 수준 아래로 내리면 기계 정밀도의 도함수를 얻는다.
f=ex, x=1이면 Ime1+ih/h=esinh/h이고, h=0.1에서 2.7137536(오차 −4.5×10−3, 중앙 차분과 크기가 같고 부호가 반대), h=10−8 이하에서는 2.718281828459045, 배정밀도의 e와 마지막 자리까지 같습니다. 스콰이어와 트랩의 시험 함수 f(x)=ex/sin3x+cos3x의 x=1.5에서도 h=10−20의 복소 스텝은 4.05342789389862로 참값과 일치하고, 중앙 차분은 최적 h에서도 상대 오차 10−10 근처에 머뭅니다.
조건과 함정 ① f의 프로그램 전체가 복소수로 돌아가야 합니다. abs, max, 조건문처럼 해석적이지 않은 연산은 실수부만 보고 처리하도록 다시 정의해야 합니다. ② 복소 제곱근 같은 함수도 상쇄 없이 구현되어 있어야 합니다. a+ib의 허수부를 (∣z∣−a)/2로 계산하면 b가 아주 작을 때 ∣z∣−a에서 상쇄가 일어나 허수부가 0이 되고, 복소 스텝이 통째로 틀립니다(이 장의 시뮬레이터는 b/(2(∣z∣+a)/2)로 계산합니다). ③ 비용은 복소 계산 한 번으로, 실수 계산의 대략 2~4배입니다. 변수가 많으면 변수마다 한 번씩 필요합니다.
SIMULATOR
복소 스텝 vs 차분: 바닥이 사라지는 오차 그래프
전진 D₊중앙 D₀복소 스텝
참 f′(x)—
D₀ (상대 오차)—
복소 스텝 (상대 오차)—
해볼 것: ① k를 키워 가며 중앙 차분은 k ≈ 5에서 바닥을 찍고 다시 나빠지지만 복소 스텝은 k ≥ 8에서 10⁻¹⁶ 아래(그래프 바닥선)에 붙어 있는 것을 보세요. ② 체크박스로 상쇄가 있는 복소 제곱근을 쓰면 첫 번째 함수에서 복소 스텝이 엉뚱한 값으로 떨어집니다. 구현이 해석적 연장을 정확히 계산해야 한다는 뜻입니다. ③ 1/(1 + x²)는 제곱근이 없어 체크박스와 상관없습니다. 모델: 복소 연산은 이 장 스크립트의 직접 구현, 오차 0은 바닥선(10⁻¹⁷)에 표시.
자동 미분: 연쇄 법칙을 기계적으로
근사가 아니라 정확한 도함수를, 프로그램에서
함수가 수천 줄의 프로그램이라도 결국은 덧셈, 곱셈, sin, exp 같은 기본 연산의 연쇄입니다. 각 기본 연산의 도함수는 압니다. 그렇다면 프로그램이 값을 계산하는 바로 그 순서대로 도함수도 함께 계산하면, h도 근사도 없이 정확한(반올림 수준의) 도함수를 얻을 수 있지 않을까요? 기호 미분처럼 식이 폭발하지도 않고요.
자동 미분(automatic differentiation, AD)은 기호 미분도 수치 미분도 아닙니다. 프로그램의 실행 기록(계산 그래프)에 연쇄 법칙(CalculusBook 4장)을 한 연산씩 적용합니다. 방향이 두 가지입니다.
전진 모드와 이중수
모든 중간값 v에 그 도함수 v˙=dv/dx를 짝지어 (v,v˙)로 들고 다닙니다. 덧셈은 (a,a˙)+(b,b˙)=(a+b,a˙+b˙), 곱셈은 (ab,a˙b+ab˙), 함수는 g(a,a˙)=(g(a),g′(a)a˙)입니다. 이 규칙은 ϵ2=0인 새 수 ϵ을 도입해 a+a˙ϵ으로 쓰면 저절로 나옵니다. (a+a˙ϵ)(b+b˙ϵ)=ab+(a˙b+ab˙)ϵ. 이런 수를 이중수(dual number)라 합니다. 복소 스텝에서 i2=−1 때문에 남던 h2 항이, ϵ2=0에서는 완전히 사라진다고 보면 됩니다.
손으로 미분한 f′(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·√·제곱만 사용.
후진 모드와 역전파
입력이 n개, 출력이 하나인 함수 f:Rn→R(신경망의 손실 함수가 그렇습니다)의 기울기를 전진 모드로 구하면 입력마다 한 번, n번 돌려야 합니다. 후진 모드는 반대로 갑니다. 먼저 값을 앞으로 계산해 그래프에 저장하고(전진 패스), 출력에서 시작해 각 중간값 v에 대한 수반 변수(adjoint)vˉ=∂f/∂v를 연쇄 법칙으로 거꾸로 전파합니다(후진 패스). v가 여러 곳에 쓰였으면 각 경로의 기여를 더합니다: vˉ=∑w:v→wwˉ∂w/∂v.
정리 9.8 (자동 미분의 비용) 기본 연산 N개로 이루어진 f:Rn→Rm에 대해, 전진 모드 한 번은 야코비 행렬의 한 열(방향 도함수 Jx˙)을, 후진 모드 한 번은 한 행(yˉTJ)을 원래 계산의 작은 상수배 비용으로 준다. 따라서 m=1인 기울기 ∇f는 후진 모드 한 번, 곧 입력 개수 n에 무관하게 함수 계산 몇 번 분의 비용으로 얻는다. 대가는 전진 패스의 중간값을 모두 저장할 메모리다.
예제 9.5 (후진 모드 손 계산)f(x1,x2)=lnx1+x1x2−sinx2, (x1,x2)=(2,5).
입력으로: x1은 v1과 v2 두 곳에 쓰였으므로 xˉ1=vˉ1⋅x11+vˉ2⋅x2=0.5+5=5.5. x2도 두 곳: xˉ2=vˉ2⋅x1+vˉ3cosx2=2−0.283662=1.716338.
확인: ∂f/∂x1=1/x1+x2=5.5, ∂f/∂x2=x1−cosx2=1.716338. 한 번의 후진 패스로 두 편도함수를 모두 얻었다.
SIMULATOR
후진 모드(역전파): 계산 그래프를 앞으로, 그리고 거꾸로
f(x₁, x₂)—
∂f/∂x₁ (후진 결과)—
∂f/∂x₂ (후진 결과)—
손 공식 (1/x₁ + x₂, x₁ − cos x₂)—
해볼 것: ① '다음 단계'를 눌러 전진 패스(노드 안의 값, 위에서 아래로)를 끝까지 보고, 이어서 후진 패스(노드 아래의 수반 변수 v̄, 출력에서 입력으로)를 보세요. ② x₁ 노드에 화살표 두 개가 모이는 순간 두 기여가 더해집니다(다변수 연쇄 법칙). ③ 입력이 백만 개여도 후진 패스는 한 번입니다. 전진 모드라면 백만 번입니다. 신경망 학습이 후진 모드를 쓰는 이유입니다. 모델: 예제 9.5의 그래프.
방법
정확도
∇f(입력 n개) 비용
필요한 것
전진 차분
∼ε (8자리)
n+1번 계산
f만
중앙 차분
∼ε2/3 (10자리)
2n번
f만
복소 스텝
기계 정밀도
복소 계산 n번
복소수로 도는 코드
전진 모드 AD
기계 정밀도
약 n배
연산자 오버로딩 또는 코드 변환
후진 모드 AD
기계 정밀도
상수배(n에 무관)
중간값 저장 메모리
이 도구가 쓰이는 곳
세 가지 대표 상황에서 고르는 도구가 다릅니다. 속도 추정(엔코더, GPS, 영상 추적)은 잡음 데이터의 미분이라 평활화와 필터가 핵심입니다. 민감도 해석(설계 변수에 대한 출력의 도함수, 불확실성 전파)은 함수가 비싼 시뮬레이션이라 계산 횟수가 중요하고, 변수가 적으면 중앙 차분이나 복소 스텝, 많으면 수반(adjoint) 방법이나 후진 모드 AD를 씁니다. 신경망 학습은 입력(가중치)이 수십억 개, 출력(손실)이 하나인 극단적인 경우라 후진 모드 AD, 곧 역전파 외에는 선택지가 없습니다.