자연수에서 복소수까지의 확장 패턴을 따라, ε²=0인 무한소를 도입한 듀얼 수 a + bε를 정의하고, 사칙연산과 역수, 그리고 F(a+ε) 평가만으로 정확한 수치 미분을 얻는 방법(자동미분)을 직관적으로 설명한다.
Abstract Heresies: 듀얼 수
===============
컴퓨터 과학과 프로그래밍에 대한 비정통적 의견.
숫자를 좀 만들어 보자. 우리는 크기(magnitude)의 개념을 포착하는 자연수에서 시작한다. 덧셈은 간단하다. 수직선에서 오른쪽으로 일정하게 이동하는 것이다. 하지만 왼쪽으로 이동하려면 어떻게 할까? 이를 처리하려면 방향을 추적하는 별도의 플래그와 그 조작 규칙을 만들어낼 수도 있다. 혹은 더 영리하게 숫자 자체를 확장할 수도 있다. "부호"를 도입하여 양수와 음수를 만들면 방향의 개념을 수 체계에 직접 구워 넣게 되고, 그 논리를 산술 규칙 속에 내장하게 된다.
이러한 확장의 패턴은 수직선에서 수평면으로 이동하면서도 이어진다. 단순한 평행 이동을 넘어, 회전의 개념을 도입하고 싶어진다. 다시 말해 회전을 외부 속성으로 추적할 수도 있지만, 더 통합적인 해법은 복소수에서 나타난다. 실수에 소위 "허수" 단위 i를 덧붙여 a + bi 형태의 수를 만든다. b가 0이면 보통의 부호가 있는 수다. b가 0이 아니면 그 수는 평면에서의 회전을 나타낸다. 반시계 방향 90도 회전은 i로, 시계 방향은 -i로 표현된다. 주목할 점은 90도 회전을 두 번 하면 180도 회전, 즉 부호를 뒤집는 것과 같다는 것이다. 이 기하학적 사실은 i² = -1이라는 대수적 규칙으로 포착된다. 다시 한번 우리는 새로운 속성을 따로 추적하지 않고 숫자 자체의 구조 속에 엮어 넣는다.
이제 미적분과 미분의 세계로 눈을 돌려 보자. 어떤 함수를 분석할 때 우리는 종종 특정 지점에서의 함수값과 기울기에 관심이 있다. 지금까지의 패턴을 따르면, 기울기를 별도의 정보로 추적하며 친숙한 도함수 규칙으로 계산할 수도 있다. 또는 한 번 더 영리해져서, 이번에는 숫자 자체가 기울기를 내장하도록 확장할 수 있다. 이것이 바로 듀얼 수의 혁신이다.
이를 위해 ε(엡실론)이라는 새로운 존재를 도입하고, a + bε 꼴의 수를 만든다. 여기서 a는 값(value)을, b는 해당 값에 딸린 기울기 혹은 "무한소" 부분을 나타낸다. ε의 특징은 특이하다. ε가 0보다 크되 임의의 양의 실수보다 작다고 주장하는 것이다. 이로써 ε는 무한소가 된다. 따라서 무한소의 제곱인 ε²는 너무나 미미하여 0으로 정의해 버린다. 이 한 가지 규칙, ε² = 0이면 충분하다. 산술 규칙은 매끄럽게 적응한다. 듀얼 수의 덧셈은 실수부와 ε부를 따로 더하면 된다: (a + bε) + (c + dε) = (a + c) + (b + d)ε. 곱셈도 마찬가지로 간단하다. 항을 분배하고 새 규칙을 적용한다:
(a + bε)(c + dε) = ac + adε + bcε + bdε² = ac + (ad + bc)ε ε² 항이 말끔히 사라지는 것에 주목하라.
산술을 나눗셈까지 확장하려면 듀얼 수의 역수를 구하는 방법이 필요하다. 복소수에서 쓰는 기법과 비슷하게 켤레로 분자와 분모를 곱하는 방식을 응용할 수 있다. a + bε의 켤레는 a - bε이다. a + bε의 역수를 구하려면 1 / (a + bε)을 계산한다:
1 / (a + bε) = (1 / (a + bε)) * ((a - bε) / (a - bε)) = (a - bε) / (a² - abε + abε - b²ε²) = (a - bε) / (a² - b²ε²) 정의인 ε² = 0을 쓰면 분모는 a²로 단순화된다. 식은 다음과 같다:
(a - bε) / a² = 1/a - (b/a²)ε
따라서 a ≠ 0인 한, 역수는 1/a - (b/a²)ε이다. 이것으로 두 듀얼 수의 나눗셈도, 두 번째 수의 역수를 곱하는 방식으로 완성된다.
그렇다면 어디에 쓸모가 있을까? 테일러 급수나 선형 근사의 원리에 따르면, 아주 작은 변화 bε에 대해 미분가능한 함수는 다음과 같이 거동한다:
F(a + bε) = F(a) + F'(a)bε
결과는 또 다른 듀얼 수다. 그 "실수부"는 F(a), 즉 a에서의 함수값이고, "무한소부"는 F'(a)b로, a에서의 도함수를 담고 있다. b=1로 두고 F(a + ε)만 평가하면 결과의 ε 성분이 정확히 도함수 F'(a)가 된다. 이를 개념적으로 코딩하면 다음과 같다:
(defun (derivative f) (lambda (x) (infinitesimal-part (f (+ x ε)))))
이 방법은 전통적인 수치 미분의 대안을 제공한다. 예를 들어 (F(x+h) - F(x))/h 같은 표준 유한차분법은 h의 선택을 어렵게 만든다. h가 크면 근사로 인한 절단 오차가 커지고, h가 너무 작으면 거의 같은 두 부동소수값을 빼는 과정에서 반올림 오차가 커질 수 있다. 듀얼 수는 이 문제를 통째로 피해 간다. 과정은 근사가 아니라 대수적이다. 도함수는 수치적으로 계산되지만 정확하며, 절단 오차가 없고, 극도로 작은 h를 다루는 불안정성도 없다.
무한소 성분을 포함하도록 수 체계를 확장함으로써, 우리는 미분의 논리 — 특히 연쇄법칙 — 를 산술 규칙 속에 내장했다. 더 이상 도함수를 구하려고 별도의 기호적 규칙 집합이 필요 없다. 단지 함수에 듀얼 수를 입력으로 넣어 실행하기만 하면, 그 대수의 자연스러운 귀결로서 도함수가 자동으로 계산된다. 부호가 방향을, i가 회전을 담듯, ε는 도함수의 본질을 담는다.
듀얼 수와 복소수를 결합하고 싶다면 두 가지 선택지가 있다. 표준부와 무한소부가 모두 복소수인 듀얼 수를 쓰거나, 실수부와 허수부가 듀얼 수인 복소수를 쓰거나. 구현 관점에서는 전자가 더 쉽다. 이미 복소수가 지원되기 때문이다.
작성자 Joe Marshall, 작성 시각 오전 9:53![]()
![]()
이메일로 공유BlogThis!X에 공유Facebook에 공유Pinterest에 공유
레이블: Common Lisp, 수학

익명 님이 말하길... 좋네요! 그런데 좀 더 실용적으로, 예를 들어 sqrt(x)의 미분을 어떻게 얻을 수 있나요? sqrt(x+epsilon)을 어떻게 전개하죠?
Joe Marshall 님이 말하길... sqrt (a + b epsilon) = sqrt(a) + (b epsilon)/(2 sqrt (a))
물론 부동소수(float)를 쓰면 반올림 오차가 생기지만, 정확한 실수 산술을 쓰면 미분의 실수값을 정확히 계산합니다.
구독: 게시물 댓글(Atom)
Blogger 제공 Blogger.