Quantization

정의

컴퓨터는 0과 1로 이루어진 유한한 메모리와 처리 능력만을 가지고 있다. 즉, $0.5372199981\dots$ 처럼 끝없이 이어지는 무한한 정밀도의 실수를 그대로 저장하거나 계산할 수 없다. 이를 해결하기 위해 정해진 ‘눈금(Resolution)’을 만들어두고, 실제 값이 어느 눈금에 가장 가까운지 찾아 그 눈금의 값으로 대체하는 과정이다.

  • 연속적인 데이터를 제한된 단계의 값으로 근사한다.
  • 컴퓨터는 연속값을 그대로 저장이 불가능함으로 연속값을 이산적인 값으로 변환
  • 딥러닝 하드웨어 관점의 정의: 파라미터의 ‘개수’를 삭제하는 것이 아니라, 데이터를 담는 ‘그릇의 크기(데이터 타입, 예: 32칸 $\rightarrow$ 8칸)’를 줄여 물리적 메모리 점유율을 낮추고 하드웨어 연산 속도를 극대화하는 최적화 기술이다

동작 원리 및 핵심 메커니즘

수식적 동작 원리 (구간 매핑)

  • 입력 범위를 일정한 구간으로 분할하고, 각 구간의 대표값을 정수 인덱스(번호표)로 매핑한다.
  • 양자화 간격 ($Step Size$, $\Delta$):$\Delta = \frac{V_{max} - V_{min}}{2^B}$ 표현 가능한 최대/최소 범위를 비트 수($B$)에 따라 정해진 간격으로 나눈다.
  • 양자화 함수 (Quantization Function):$Q(x) = \text{round}\left(\frac{x}{\Delta}\right)$ 입력값 $x$를 간격 $\Delta$로 나누어 반올림하여 ‘정수 번호표(Integer Index)’로 변환한다.

딥러닝 모델 추론(Inference) 가속 원리

양자화된 모델이 원본 모델보다 비약적으로 빠른 이유는 단순히 용량이 작아져서가 아니라, 하드웨어의 병목 현상을 해결했기 때문이다.

  • 메모리 장벽(Memory Wall) 극복: 컴퓨터 연산의 가장 큰 병목은 RAM에서 연산 장치로 데이터를 가져오는 속도다. 파라미터 규격을 32-bit 실수(FP32)에서 8-bit 정수(INT8)로 변경하면 크기가 정확히 1/4로 줄어들어, 연산 장치에 한 번에 4배 더 많은 데이터를 공급할 수 있다.
  • 순수 정수 연산 (Integer-only Arithmetic): 딥러닝의 수억 번의 행렬 곱셈을 무거운 실수 연산이 아닌, 매핑된 ‘정수 번호표’끼리의 곱셈으로 처리한다. 기계가 가장 빠르게 처리할 수 있는 정수 연산을 통해 전력 소모를 줄이고 속도를 극대화한다.
  • 최종 스케일 복원: 수많은 정수 연산이 끝난 최종 결과값에 마지막으로 딱 한 번 간격($\Delta$, $Scale$)을 곱해 원래의 실수 범위로 복원($x_q = Q(x) \cdot \Delta$)한다.

실전 수식 적용 예제 (Numerical Example)

[상황 설정]

  • 입력 범위 ($V_{min} \sim V_{max}$): $-1.0 \sim 1.0$
  • 사용할 비트 수 ($B$): 3-bit (표현 가능한 단계: $2^3 = 8$단계)
  • 실제 들어온 입력값 ($x$): 0.37

Step 1: 양자화 간격 ($\Delta$) 구하기

먼저 전체 범위를 8개의 계단으로 쪼갤 때, 계단 한 칸의 높이(Step Size)가 얼마인지 계산한다.

  • $\Delta = \frac{1.0 - (-1.0)}{2^3}$
  • $’ \Delta = \frac{2.0}{8} = \mathbf{0.25}$결과: 양자화 계단의 한 칸 높이는 0.25 (즉, 가능한 값은 …, 0, 0.25, 0.50, 0.75, 1.0… 형태가 된다.)

Step 2: 입력값을 가장 가까운 레벨로 변환 (양자화 함수 적용)

이제 실제 입력값 0.37이 어느 계단에 가장 가까운지 찾아 정수 번호표로 매핑하고 복원한다.

  1. 나누기 & 반올림 (정수 인덱스 추출): $\text{round}\left(\frac{0.37}{0.25}\right) = \text{round}(1.48) = \mathbf{1}$(1번째 정수 번호표 부여)
  2. 간격 곱하기 (실수 복원): $0.25 \cdot 1 = \mathbf{0.25}$결과: 0.37은 0.50보다 0.25에 더 가깝기 때문에 최종 양자화된 값($x_q$)은 0.25가 된다.

Step 3: 양자화 오차 ($e$) 계산

이 과정에서 발생한 정보의 손실량(노이즈)을 계산한다.

  • $e = x_q - x$
  • $e = 0.25 - 0.37 = \mathbf{-0.12}$결과: 원본 데이터 0.37을 0.25로 저장하면서 -0.12만큼의 오차가 발생했다. 만약 3-bit가 아니라 8-bit($2^8=256$단계)를 썼다면 간격($\Delta$)이 훨씬 좁아져서 이 오차는 0에 가깝게 줄어들었을 것이다.

실무와 연구에서의 양자화 응용

이미지 및 비디오 처리 (디지털 포렌식): 현실의 아날로그적인 빛의 세기를 0부터 255까지의 256단계(8-bit)로 양자화하여 픽셀 값으로 저장한다. 특히 JPEG 같은 이미지 압축 과정에서는 주파수 변환 후 특정 계수들을 강하게 양자화하여 용량을 줄인다. 이때 발생하는 미세한 양자화 흔적(Artifact)은 원본 이미지가 조작되거나 위조되었는지 판별하는 디지털 포렌식(Image Forensics)의 중요한 단서로 활용된다.

딥러닝 경량화 및 엣지 컴퓨팅 (Edge Computing): 학습이 끝난 AI 모델의 파라미터는 보통 고정밀도의 32비트 실수(FP32)로 이루어져 있다. 이를 8비트 정수(INT8)로 양자화하면, 메모리 공간을 32칸에서 8칸으로 옮겨 담게 되어 약간의 정확도를 잃는 대신 모델의 물리적 크기를 1/4로 줄일 수 있다. 특히 Raspberry Pi나 Coral Edge TPU 같은 자원이 제한적인 엣지 디바이스 환경에서 고속 인퍼런스(Inference)를 가능하게 하는 핵심 기술이다.

Leave a comment