Park, Geon (re-st)

연구 소개: 연속적인 값 (Continuous Computation)의 정확성

저는 프로그램과 계산의 수학적인 성질에 관심이 많습니다. 특히 프로그램이 수학적으로 정확한지 (Correctness), 그리고 효율적인지, 이론적 한계는 무엇인지 등을 연구합니다.

제가 주로 다루는 프로그램은 여기 계신 많은 분들과 달리, 연속적인 (continuous) 값을 다룹니다. (예: 2.8, 3/7, $\sqrt{5}$) 이런 값들에 더하기, 곱하기, $\sin$ 등의 연산을 적용하는 계산이죠.

이러한 연속적인 계산은 머신러닝, 최적화, 컴퓨터 그래픽스, 과학 컴퓨팅 등 사실상 CS 전반에서 엄청나게 많이 사용되고 있습니다.


연속적인 계산의 시작: 앨런 튜링

앨런 튜링 (Alan Turing) 은 1936년 논문 “On Computable Numbers“을 발표합니다.


이론과 실제의 간극 (Gap)

오늘날에는 다양한 수치해석 라이브러리가 있습니다. NumPy, SciPy, TensorFlow, PyTorch, Intel Math Library 등.. 각각의 목적 (함수값 계산, 샘플링, 미분, 적분, 근사.. )에 맞게 존재합니다.

하지만 저는 이 라이브러리들이 “수학적으로 정확한가?” 라는 질문을 던집니다.

이론과 실제 사이에 이런 간극이 존재하고, 구현체 자체가 복잡한 상황에서 이 라이브러리들은 과연 정확할까요?


핵심 질문: 함수(e.g., sin)는 어떻게 계산되는가?

64비트 (DOUBLE precision) $x$의 $\sin(x)$ 값은 어떻게 계산할까요?

1. 범위 축소 (Argument Reduction)

2. 테일러 급수? 아직 아니다

$r’$의 값을 테일러 급수 (Taylor series)로 계산할 수 있지만, 부동 소수점 환경에서는 항이 많아질수록 에러가 쌓여 오히려 부정확해질 수 있습니다. 그래서 범위를 더 줄입니다.

3. 테이블 참조와 덧셈 정리

(0 ~ $\pi/2$) 구간을 $N$개의 작은 구간으로 쪼갭니다.

4. 테일러 급수 적용

이제 남은 것은 $\sin(r’’)$과 $\cos(r’’)$ 뿐입니다. $r’’$의 범위는 $0$ ~ $\pi/(2N)$로 매우 작아졌기 때문에, 이제서야 테일러 급수를 사용합니다. 매우 작은 차수만으로도 정확한 값을 얻을 수 있습니다.

(정리) $\sin(x)$의 계산은 1. 범위 축소 $\to$ 2. 테이블 조회 (Look-up) $\to$ 3. 다항식 근사 (테일러 급수) $\to$ 4. 재조합의 과정을 거칩니다. (이 정도는 CS 교양 지식으로 알아두면 좋습니다.)


구현의 복잡성과 정확성 (Correctness) 문제

이론은 깔끔하지만, 이걸 플로팅 포인트로 구현하는 것은 지옥입니다. (CR-LibM 라이브러리의 sin_fast.c 예시)

이렇게 복잡한데, 과연 이 코드는 정확할까요?


정확성의 기준과 현실의 버그

정확성 (Correctness)의 척도로는 ULP (Unit in the Last Place) 에러를 씁니다. (0.5 ULP가 가장 정확함)

라이브러리 개발자들은 정확성을 보장한다고 주장하지만, 현실은 다릅니다.

이 분야의 대가가 만들어도 버그가 나옵니다. 그만큼 이 문제는 어렵습니다.


새로운 방향: 정확성을 보장하는 라이브러리 설계

기존 라이브러리는 너무 복잡해서 검증이 어렵습니다. (제가 박사 때 Intel $\sin$ 함수를 검증하려 64코어로 2주를 돌린 적도 있습니다.)

그래서 저는 “아예 처음부터 정확성 (correctness)을 염두에 두고” 새로운 라이브러리를 만들자는 방향을 생각하고 있습니다.

  1. DSL (Domain-Specific Language) 개발: low-level 트릭 (정수 연산 등)을 잘 감싸고 (abstraction), high-level 구조 (범위 축소, 다항식 근사 등)를 명확히 드러내는 작은 언어를 만듭니다.

  2. 검증 기술 개발: 이 DSL에 최적화된 검증 도구를 만듭니다.

  3. 라이브러리 생성: 이 DSL로 라이브러리를 작성하고 검증합니다.

  4. 자동 최적화: DSL이 high-level 구조를 가지므로, 컴파일러 최적화나 자동 프로그램 탐색을 통해 “정확성이 보장되면서 가장 효율적인” 코드를 자동으로 생성할 수 있습니다.

5~10년 안에는 가능하지 않을까 생각합니다.

결론

수치 라이브러리와 연속적인 계산은 100년 가까이 연구되었지만, 엄밀한 정확성 보장 (rigorous correctness guarantee)은 아직도 부족합니다.

프로그래밍 언어 (PL) 기술을 현명하게 이용하면 이 문제들을 풀어낼 수 있을 것이라 생각합니다.


Q&A

참고 강연

(강연 요약) What Does Automatic Differentiation Compute for Non-Differentiable Functions - 이원열 교수님 (포항공대) - 여기서는 미분불가능점 회피 이야기!

#Info