자동 미분

편집 역사 토론
수치해석 소프트웨어 시뮬레이션 마지막 수정: 2026-07-18 04:17:58

1. 개요[편집]

자동 미분(Automatic Differentiation, AD)은 컴퓨터 프로그램으로 표현된 함수의 도함수를, 연쇄법칙을 프로그램의 각 연산에 기계적으로 적용해 기계 정밀도로 정확하게 계산하는 기법이다. 알고리즘적 미분(algorithmic differentiation)이라고도 한다. 핵심은 “정확한데 자동”이라는 두 마리 토끼를 동시에 잡는다는 것. 손으로 미분식을 유도하지도 않고, 유한차분처럼 오차에 시달리지도 않는다.

이 지점을 오해하기 쉬운데, AD는 수치미분(유한차분)도 아니고 기호미분(symbolic differentiation)도 아닌 제3의 길이다. 유한차분은 hh 를 얼마로 잡든 오차가 남고, 기호미분은 수식이 조금만 복잡해도 도함수 표현이 폭발적으로 커진다(expression swell). AD는 이 둘의 약점을 동시에 피해간다. 오늘날 물리 정보 신경망과 딥러닝 전체를 떠받치는 기반 기술이자, 민감도 해석수반법을 코드 수준에서 자동으로 실현하는 도구다.1

2. 세 가지 미분법 비교[편집]

도함수를 얻는 길은 크게 셋이고, AD의 정체성은 나머지 둘과의 대비에서 선명해진다.

  • 기호미분 — 수식을 대수적으로 미분해 닫힌 형태의 도함수 식을 얻는다. 정확하지만 함수가 복잡해지면 표현이 기하급수적으로 커지고, 분기·반복문이 있는 코드에는 아예 적용이 안 된다.
  • 수치미분(유한차분)[f(x+h)f(x)]/h[f(x+h) - f(x)]/h 로 근사한다. 구현은 쉽지만 hh 가 크면 절단오차, 작으면 부동소수점 연산의 소거오차에 죽는다. 유효숫자의 절반쯤은 늘 날아간다.
  • 자동 미분 — 프로그램을 곱셈·덧셈·sin\sin·exp\exp 같은 기본 연산의 합성으로 보고, 각 기본 연산의 도함수는 이미 아는 것이니 연쇄법칙으로 조립한다. 근사가 아니므로 기계 정밀도로 정확하고, 분기·반복문이 있어도 실행 경로를 따라가며 미분한다.

정리하면 정확도는 기호미분·AD가, 코드 일반성은 수치미분·AD가 갖는다. 두 장점의 교집합에 AD가 있다.

3. 계산 그래프와 연쇄법칙[편집]

AD의 이론적 뼈대는 함수를 **계산 그래프(computational graph)**로 보는 관점이다. 어떤 프로그램이든 결국 입력 노드에서 시작해 기본 연산 노드들을 거쳐 출력에 이르는 방향성 그래프로 분해된다. 각 간선에는 국소 도함수(local partial derivative)가 붙는다.

연쇄법칙은 이 그래프 위의 경로를 따라 국소 도함수를 곱하고, 여러 경로는 더하는 규칙일 뿐이다. 예컨대 y=f(g(x))y = f(g(x))

dydx=dydgdgdx\frac{dy}{dx} = \frac{dy}{dg} \cdot \frac{dg}{dx}

그래프의 간선 곱셈으로 표현된다. 이 곱셈들을 어느 방향으로 누적하느냐에 따라 AD가 두 갈래로 갈린다. 이게 forward와 reverse의 유일하지만 결정적인 차이다.

4. 전방 모드와 역방향 모드[편집]

**전방 모드(forward mode)**는 입력에서 출력 방향으로 도함수를 함께 전파한다. 입력 하나에 대한 방향도함수를 원래 함수값과 나란히 계산하며, 우아한 구현이 **이중수(dual number)**다. 실수를 a+bϵa + b\epsilon 로 확장하고 ϵ2=0\epsilon^2 = 0 으로 정의하면, 어떤 함수든 f(a+bϵ)=f(a)+f(a)bϵf(a + b\epsilon) = f(a) + f'(a)\,b\,\epsilon 이 되어 ϵ\epsilon 계수에 도함수가 저절로 담긴다.2 입력 차원 nn, 출력 차원 mm 일 때 전방 모드는 자코비안 행렬을 얻는 데 O(n)O(n) 번의 스윕이 필요하다. 입력이 적고 출력이 많을 때 유리하다.

**역방향 모드(reverse mode)**는 반대다. 먼저 함수값을 계산하며 계산 그래프를 기록(순전파)한 뒤, 출력에서 입력 방향으로 도함수를 역전파한다. 딥러닝의 역전파(backpropagation)가 바로 이 역방향 모드의 특수한 경우다. 출력 하나에 대한 전체 기울기를 단 한 번의 역방향 스윕으로 얻으므로, 출력 mm 에 대해 O(m)O(m) 번이면 된다. 입력이 수백만 개(신경망 가중치)이고 출력이 스칼라(손실 함수) 하나일 때 압도적으로 유리하다.

이 비대칭이 민감도 해석의 수반법과 정확히 같은 논리다. 설계 변수가 수만 개고 목적함수가 하나면 역방향(수반)이 이기고, 반대면 전방(직접법)이 이긴다. 역방향 모드 = 수반법의 자동화 버전이라 이해하면 두 분야가 한눈에 연결된다. 대가로 역방향 모드는 순전파의 중간값을 전부 저장해야 해서 메모리를 많이 먹는다(체크포인팅으로 완화한다).

5. 구현 방식과 생태계[편집]

AD를 코드에 심는 방법은 크게 둘이다.

  • 연산자 오버로딩(operator overloading) — 미분 정보를 담은 새 수치 타입을 정의하고 ++, ×\times, sin\sin 등을 오버로딩한다. 코드를 거의 안 고쳐도 되지만 런타임 오버헤드가 있다. PyTorch의 autograd, JAX, C++의 Adept 등이 이 계열이다.
  • 소스 변환(source transformation) — 원본 소스를 파싱해 도함수 계산 코드를 생성하는 컴파일러를 돌린다. 최적화 여지가 커 성능이 좋지만 도구 구축이 어렵다. Fortran의 Tapenade, ADIFOR가 대표적이며, 전산유체역학 솔버의 이산 수반을 자동 생성하는 데 쓰인다.

오늘날 머신러닝 프레임워크(PyTorch, TensorFlow, JAX)는 전부 역방향 AD 엔진이 심장이다. 여기에 forward·reverse를 자유롭게 조합하고 미분을 여러 번 중첩(고차 미분)하는 미분가능 프로그래밍(differentiable programming)이라는 더 큰 패러다임으로 확장되고 있다. 미분가능 물리 시뮬레이터로 유한요소법 해석 전체를 미분해 형상을 최적화하는 연구가 그 최전선이다.3

6. 현업에서의 현실[편집]

  • AD를 “마법의 정확한 미분”으로 믿다가 배신당하는 지점이 몇 군데 있다. abs, max, ReLU 같은 미분 불가능점에서 AD는 한쪽 미분값을 그냥 뱉는데, 그게 물리적으로 틀린 방향일 수 있다.
  • 반복 솔버 내부를 통째로 AD로 미분하면 수렴 전 중간 반복까지 다 미분해 메모리가 터지거나 부정확해진다. 수렴한 해에 대해 음함수 정리(implicit function theorem)로 미분하는 게 정석이다.
  • 새 AD 도구를 붙였으면 첫 검증은 무조건 유한차분·복소수 스텝과의 비교다. 이건 민감도 해석 문서의 교훈과 완전히 같다.
  • 레거시 포트란 코드에 소스 변환 AD를 적용하는 일은 여전히 고행이다. 포인터 별칭, 전역 변수, I/O가 도구를 헷갈리게 한다. 그래도 손으로 수반 코드를 짜는 것보단 백배 낫다.

7. 관련 문서[편집]

8. Footnotes[편집]

  1. “딥러닝이 잘 되는 진짜 이유의 절반은 역전파(=역방향 AD)가 공짜로 정확한 기울기를 준 덕분”이라는 말이 있다. 프레임워크가 미분을 대신 해주는 게 당연해 보이지만, 그게 없던 시절엔 층마다 손으로 기울기 식을 유도하고 검증하는 게 연구의 태반이었다.

  2. 이중수는 복소수와 형제 관계다. 복소수는 i2=1i^2 = -1, 이중수는 ϵ2=0\epsilon^2 = 0. 그래서 민감도 해석의 복소수 스텝 미분과 전방 모드 AD가 사촌처럼 닮았다. 복소수 스텝은 이중수의 근사판, AD는 정확판이라 보면 얼추 맞다.

  3. 미분가능 프로그래밍의 야심은 “세상의 모든 시뮬레이터를 미분 가능하게 만들어 기울기 기반 최적화·학습에 통째로 밀어 넣자”는 것이다. 물리 엔진, 렌더러, 심지어 정렬 알고리즘까지 미분 가능하게 만든 연구들이 있다. 미분이 되면 최적화가 되고, 최적화가 되면 학습이 된다.