28.38 텐서 연산의 수치적 안정성과 부동소수점 정밀도 문제

28.38 텐서 연산의 수치적 안정성과 부동소수점 정밀도 문제

1. 수치적 안정성의 의의

텐서 연산은 수학적으로는 실수체 위에서 정의되지만, 컴퓨터에서의 실제 수행은 유한한 비트 폭으로 표현되는 부동소수점 수(Floating-Point Number) 위에서 이루어진다. 따라서 모든 연산은 표현 오차(Representation Error)와 반올림 오차(Rounding Error)를 동반하며, 동일한 수학적 식이라 하더라도 연산의 순서나 알고리즘 형태에 따라 누적 오차의 크기와 결과의 신뢰성이 결정적으로 달라질 수 있다. 수치적 안정성(Numerical Stability)은 입력의 작은 섭동이나 유한 정밀도 산술이 결과에 얼마나 큰 영향을 주는지를 다루는 학문적 개념이며, 와일킨슨(J. H. Wilkinson)과 하이엄(N. J. Higham)의 고전적 저작에서 체계적으로 정립되었다. 현대 딥러닝의 학습은 수십억 개의 매개변수에 대한 수많은 산술 연산의 누적으로 구성되므로, 수치적 안정성의 확보는 이론적 관심사가 아니라 학습 가능성 자체를 결정하는 실질적 요건이다.

2. IEEE 754 부동소수점 표준

2.1 표현 형식

현대 컴퓨터 하드웨어는 IEEE 754 표준에 따라 부동소수점 수를 표현한다. 한 부동소수점 수는 부호 비트, 지수부(Exponent), 가수부(Mantissa 또는 Significand)의 세 영역으로 분해되며, 표현되는 값은 다음과 같다.

x = (-1)^s \cdot (1.f) \cdot 2^{e - \text{bias}}

여기서 s는 부호 비트, f는 가수부의 분수 부분, e는 지수부의 정수 표현, \text{bias}는 지수의 편향이다.

2.2 주요 정밀도

딥러닝에서 사용되는 주요 부동소수점 형식과 그 특성은 다음 표와 같다.

형식전체 비트지수부 비트가수부 비트머신 엡실론 (근사)동적 범위 (근사)
FP64 (double)6411522.22 \times 10^{-16}10^{-308} \sim 10^{308}
FP32 (single)328231.19 \times 10^{-7}10^{-38} \sim 10^{38}
FP16 (half)165109.77 \times 10^{-4}10^{-5} \sim 10^{5}
BF16 (bfloat16)16877.81 \times 10^{-3}10^{-38} \sim 10^{38}
FP8 (E4M3)8431.25 \times 10^{-1}10^{-3} \sim 10^{2}
FP8 (E5M2)8522.50 \times 10^{-1}10^{-5} \sim 10^{4}

여기서 머신 엡실론(Machine Epsilon)은 1에 더했을 때 1과 다른 결과를 내는 가장 작은 양수의 근삿값으로, 형식의 상대 정밀도를 나타낸다. 동적 범위는 표현 가능한 정상값(Normal Number)의 절댓값 범위를 의미한다.

이 표는 두 가지 본질적 사실을 보여 준다. 첫째, 정밀도가 낮아질수록 머신 엡실론이 급격히 커지므로 작은 차이를 표현할 수 없다. 둘째, FP16과 BF16은 동일한 16비트이지만 BF16은 지수부를 FP32와 동일하게 유지함으로써 동적 범위가 매우 넓고, FP16은 가수부를 더 많이 할당하여 상대 정밀도가 더 높지만 동적 범위가 좁다. 이러한 절충은 형식 선택이 응용에 따라 달라져야 함을 의미한다.

3. 부동소수점 연산의 오차

3.1 반올림 오차

임의의 두 부동소수점 수의 합, 차, 곱, 나눗셈은 일반적으로 표현 가능한 부동소수점 수가 아니므로, 가장 가까운 표현 가능한 값으로 반올림된다. 그 결과 각 산술 연산은 대략 머신 엡실론 정도의 상대 오차를 도입하며, 다음 부등식이 성립한다.

\mathrm{fl}(x \star y) = (x \star y)(1 + \delta), \quad \vert \delta \vert \le \varepsilon_{\text{mach}}

여기서 \mathrm{fl}(\cdot)은 부동소수점 결과, \star \in \{+, -, \times, /\}는 산술 연산, \varepsilon_{\text{mach}}는 머신 엡실론이다.

3.2 비결합성

부동소수점 덧셈은 결합 법칙(Associativity)을 만족하지 않는다. 즉, 일반적으로

\mathrm{fl}\big(\mathrm{fl}(a + b) + c\big) \neq \mathrm{fl}\big(a + \mathrm{fl}(b + c)\big)

가 성립한다. 이로 인해 동일한 합산을 서로 다른 순서로 수행하면 결과가 미세하게 달라질 수 있으며, 병렬 축소(Parallel Reduction)와 같이 합산 순서가 실행 환경에 따라 변하는 경우 동일한 코드가 환경별로 약간씩 다른 결과를 산출할 수 있다. 이러한 비재현성(Non-reproducibility)은 디버깅을 어렵게 만들지만, 일반적으로 학습의 정확성에 본질적 영향을 주지는 않는다.

3.3 상쇄와 정밀도 손실

가장 위험한 오차 원천은 거의 같은 두 수의 차에서 발생하는 재앙적 상쇄(Catastrophic Cancellation)이다. ab가 매우 가까울 때 a - b를 계산하면, 두 수의 상위 유효 자릿수가 서로 소거되어 결과의 상대 오차가 입력의 상대 오차에 비해 폭발적으로 증가한다. 이 현상은 분산 계산식 \mathrm{Var}(X) = \mathbb{E}[X^2] - (\mathbb{E}[X])^2의 단순 적용에서 자주 관찰되며, 이를 회피하기 위하여 통계학에서는 웰포드(B. P. Welford)의 온라인 알고리즘과 같은 수치적으로 안정한 형태가 권장된다.

4. 딥러닝 텐서 연산의 대표적 안정성 문제

4.1 소프트맥스의 지수 폭발

소프트맥스 함수는 다음과 같이 정의된다.

\mathrm{softmax}(\mathbf{x})_i = \frac{e^{x_i}}{\sum_{j} e^{x_j}}

만약 입력 x_i의 절댓값이 크면 e^{x_i}는 표현 가능한 최댓값을 초과하여 무한대(Overflow)가 되거나, 음의 큰 값에서는 0(Underflow)이 된다. 이를 회피하는 표준 기법은 입력에서 최댓값을 빼는 것이다. 즉, m = \max_{j} x_j로 정의하면 다음 항등식이 성립한다.

\mathrm{softmax}(\mathbf{x})_i = \frac{e^{x_i - m}}{\sum_{j} e^{x_j - m}}

이 변환은 결과를 변화시키지 않지만, 모든 지수의 인수가 0 이하가 되어 오버플로가 발생하지 않으며, 분모의 최소 한 항이 1이므로 0으로 나누는 문제도 발생하지 않는다. 이것이 사실상 모든 딥러닝 프레임워크에서 채택되는 안정한 소프트맥스 구현이다.

4.2 로그-합-지수 함수

손실 함수에서 자주 등장하는 로그-합-지수(Log-Sum-Exp) 함수

\mathrm{LSE}(\mathbf{x}) = \log \sum_{i} e^{x_i}

도 동일한 이유로 직접 계산하면 위험하며, 다음의 안정한 형식으로 평가된다.

\mathrm{LSE}(\mathbf{x}) = m + \log \sum_{i} e^{x_i - m}, \quad m = \max_{i} x_i

교차 엔트로피 손실, 가능도, 분포의 정규화 상수 계산 등 여러 핵심 연산이 이 형식을 내부적으로 사용한다.

4.3 활성 함수의 안정한 구현

시그모이드 함수 \sigma(x) = 1 / (1 + e^{-x})의 직접 평가는 큰 음수 입력에 대해 e^{-x}가 오버플로될 수 있다. 표준적인 해결책은 입력의 부호에 따라 다음의 두 등가 형식 가운데 하나를 선택하는 것이다.

\sigma(x) = \begin{cases} \dfrac{1}{1 + e^{-x}}, & x \ge 0 \\[6pt] \dfrac{e^{x}}{1 + e^{x}}, & x < 0 \end{cases}

마찬가지로 소프트플러스 \mathrm{softplus}(x) = \log(1 + e^x)는 큰 양수에서 오버플로를 피하기 위해

\mathrm{softplus}(x) = \max(x, 0) + \log\big(1 + e^{-\vert x \vert}\big)

의 형태로 구현된다.

4.4 정규화 계층의 분산 계산

배치 정규화, 계층 정규화, RMS 정규화는 모두 표본 분산 또는 제곱 평균을 계산하는 단계를 포함한다. 분산 계산에서 재앙적 상쇄를 피하기 위해, 단순한 \mathbb{E}[X^2] - (\mathbb{E}[X])^2 공식 대신 평균을 먼저 빼고 제곱의 평균을 취하는 형태가 사용된다. 또한 분산이 0에 매우 가까울 때 분모에 작은 상수 \varepsilon을 더하는 것도 표준적인 안정화 기법이다.

4.5 합성 손실 함수의 안정화

크로스 엔트로피 손실의 직관적 구현은 소프트맥스를 먼저 적용한 뒤 그 결과에 로그를 취하는 형태이지만, 이는 소프트맥스의 매우 작은 출력에 대해 \log(0)이 발생할 수 있으므로 위험하다. 표준 구현은 소프트맥스와 로그를 융합한 log_softmax를 사용하여, 다음과 같이 LSE 형식의 안정한 표현을 직접 계산한다.

\log \mathrm{softmax}(\mathbf{x})_i = x_i - \mathrm{LSE}(\mathbf{x})

이를 통해 어떠한 중간 값도 표현 한계를 벗어나지 않게 된다.

5. 학습 과정에서의 안정성 문제

5.1 경사 소실과 경사 폭주

깊은 신경망의 학습에서 경사도가 층을 거치며 지수적으로 감소하거나(경사 소실, Vanishing Gradient) 지수적으로 증가하는(경사 폭주, Exploding Gradient) 현상은, 본질적으로 가중치 행렬과 활성 함수 도함수의 곱이 누적될 때 발생하는 수치적 문제이다. 이 현상은 호크라이터(S. Hochreiter)의 1991년 학위논문에서 처음으로 형식적으로 분석되었으며, 이후 적절한 가중치 초기화(Glorot, He 초기화), 잔차 연결(Residual Connection), 정규화 계층, 경사 절단(Gradient Clipping) 등의 표준적 대응책이 정립되었다.

5.2 혼합 정밀도 학습과 손실 척도화

반정밀도(FP16) 또는 그 변형을 사용하는 혼합 정밀도 학습은 처리량과 메모리 사용량 측면에서 큰 이득을 주지만, FP16의 좁은 동적 범위로 인해 작은 경사도가 언더플로되어 0이 되는 문제가 발생한다. 이를 회피하기 위해 도입된 표준 기법이 손실 척도화(Loss Scaling)이다. 손실 함수에 큰 상수를 곱한 뒤 역전파를 수행하여 모든 경사도를 동일한 비율만큼 확대한 후, 최적화 단계에서 다시 동일한 비율로 나누어 원래의 척도로 되돌린다. 마이클리시브(P. Micikevicius) 등의 2018년 논문 “Mixed Precision Training“은 이 기법의 형식적 분석과 실용적 권고를 제시하였으며, 동적 손실 척도화(Dynamic Loss Scaling)는 학습 도중 발생하는 무한대나 NaN을 감지하여 척도 인수를 자동으로 조정한다.

5.3 BF16의 채택

BF16은 가수부의 정밀도가 FP16보다 낮지만 지수부가 FP32와 동일하므로 언더플로와 오버플로가 거의 발생하지 않으며, 손실 척도화 없이도 비교적 안정적으로 학습이 가능하다는 장점을 가진다. 이러한 특성 때문에 구글 TPU와 NVIDIA의 암페어 이후 GPU는 BF16을 표준 혼합 정밀도 형식으로 채택하고 있으며, 대규모 언어 모델의 사전 학습에서 BF16이 사실상의 표준으로 자리잡았다.

6. 행렬 곱셈의 누적 정밀도

GPU의 텐서 코어는 입력을 FP16 또는 BF16으로 받아도 부분합의 누적을 FP32로 수행한다. 이는 대규모 행렬 곱셈에서 수많은 부분곱이 누적될 때 발생하는 반올림 오차를 효과적으로 억제하는 표준적 방식이다. 누적 정밀도의 선택은 결과의 상대 오차에 결정적 영향을 주며, 행렬의 크기 k가 커질수록 누적 오차가 \mathcal{O}(k \varepsilon_{\text{mach}}) 정도로 증가한다는 고전적 결과가 알려져 있다. 따라서 거대한 행렬 곱셈에서는 입력 정밀도보다 누적 정밀도가 결과 품질에 훨씬 더 큰 영향을 준다.

7. 결론

부동소수점 산술의 본질적 한계는 텐서 연산의 어디에서든 잠재적 오차의 원천을 형성하며, 깊은 신경망의 학습은 이러한 오차의 누적에 매우 민감할 수 있다. 따라서 딥러닝의 안정적 학습은 단순히 알고리즘의 수학적 형태에 의해 결정되는 것이 아니라, 소프트맥스의 입력 평행이동, 로그-합-지수의 안정한 형식, 분산 계산의 수치적 안정화, 손실 척도화, 혼합 정밀도 누적, 그리고 가중치 초기화와 정규화의 적절한 결합과 같은 일련의 정밀한 수치적 처방에 의해 가능해진다. 이러한 처방들은 학문적 호기심이 아니라, 실제로 학습 가능한 모델과 학습 불가능한 모델의 경계를 결정짓는 실용적 요건이며, 텐서 연산의 수학적 정의와 그 부동소수점 구현 사이의 간극을 메우기 위한 학술적 성과의 집합이다.