Affine Quantization의 수학적 원리
양자화의 핵심 수식은 다음과 같습니다.
$$ x_q = \text{round}(\frac{x}{s}) + z $$
여기서:
- $ x $: 원본 FP32 값 (실수)
- 양자화된 INT8 값 (정수)
- $ s $: 스케일(scale) - 실수
- $ z $: 제로 포인트(zero-point) - 정수
- $ round(\frac{x}{s}) $: 반올림 함수
이 수식이 전부입니다. 하지만 단순해 보이는 이 한 줄에 양자화의 모든 비밀이 담겨 있습니다.
왜 이런 형태인가?
양자화는 선형 변환(linear transformation)입니다. 실수 공간의 값을 정수 공간으로 일대일 대응시키는 것이죠.
핵심 아이디어
실수 범위 [x_min, x_max] → 정수 범위 [q_min, q_max]로 선형 매핑
이 선형 매핑을 수학적으로 표현하면:
- 스케일링: 실수 범위를 정수 범위 크기에 맞춤 → $ x/s $
- 반올림: 연속값을 이산값으로 → $ \text{round}() $
- 이동: 0점을 조정 → $ +z $
scale ($ s $): 범위를 맞추는 비율
Scale은 "실수 1단위가 정수 몇 단위에 해당하는가"를 나타냅니다. 실수 범위가 [-10, 10]이고, 정수 범위가 [-128, 127]이라면
- 실수 범위 크기: 20
- 정수 범위 크기: 255
- $ s = 20/255 ≈ 0.0784 $
이제 실수 값 5를 변환한다면
$$ x_q = \text{round}(5/0.0784) = \text{round}(63.8) = 64 $$
반대로, 정수 64를 실수로 복원(dequantization)하면
$$ x ≈ 64 × 0.0784 = 5.02 $$
거의 원래 값(5)에 가깝습니다.
scale의 역할:
- 작은 s: 실수 1단위 → 정수 여러 단위 (정밀함, 하지만 표현 범위 좁음)
- 큰 s: 실수 1단위 → 정수 작은 단위 (범위 넓음, 하지만 정밀도 낮음)
이것은 해상도(resolution)와 범위(range)의 트레이드오프입니다.
Zero-point($ z $): 0을 어디에 둘 것인가?
Zero-point는 "실수 0이 정수 몇에 대응되는가"를 나타냅니다. Scale만으로는 충분하지 않습니다. 예를 들어:
경우 1: 실수 범위가 대칭적 [-5, 5]
실수 0 → 정수 0으로 매핑하면 자연스러움
z = 0
경우 2: 실수 범위가 비대칭적 [0, 10]
실수 0 → 정수 0으로 매핑하면?
→ 정수 범위 [-128, 127]의 절반을 낭비!
→ 실수 0을 정수 -128로 매핑하는 것이 효율적
z = -128
수학적 정의
실수 0을 양자화하면
$$ 0 = \text{round}(0/s) + z = z $$
즉, $ z $는 실수 0이 매핑되는 정수 값입니다.
Zero-point의 역할:
- $ z = 0 $: Symmetric quantization (대칭 양자화)
- 실수 범위가 0을 중심으로 대칭적일 때 사용
- 예: [-5, 5], [-2.3, 2.3]
- $ z ≠ 0 $: Asymmetric quantization (비대칭 양자화)
- 실수 범위가 비대칭적일 때 사용
- 예: [0, 10], [-1, 8]
- 정수 범위를 최대한 효율적으로 활용
Quantization과 Dequantization
Forward (Quantization): 실수 → 정수
$$ x_q = \text{round}(\frac{x}{s}) + z $$
Backward (Dequantization): 정수 → 실수
$$ \hat{x} = (x_q - z) × s $$
주목할 점: dequantization에서 $ \text{round}() $가 없습니다. 왜냐하면 $x_q$는 이미 정수이기 때문입니다.
완벽한 복원은 불가능:
원본: $ x = 5.67 $
- Quantization: $ x_q = \text{round}(5.67/0.1) + 0 = 57 $
- Dequantization: $ \hat{x} = 57 \times 0.1 = 5.7 $
오차: $ |5.67 - 5.7| = 0.03 $
이 오차가 바로 양자화 오차입니다. $ \text{round}() $ 연산에서 발생하는 불가피한 손실이죠.
왜 "Affine" Quantization인가?
수학에서 Affine 변환은 다음 형태입니다.
$$ y=ax+b $$
우리의 양자화 수식을 다시 보면
$$ x_q = \text{round}\left(\frac{x}{s}\right) + z = \text{round}\left(\frac{1}{s} \cdot x\right) + z $$
$ \text{round}() $를 무시하면
$$ x_q = \approx \frac{1}{s} \cdot x + z $$
정확히 affine 변환입니다!
- $ a = 1/s $ (scale factor)
- $ b = z $ (offset)
반대 방향(dequantization)도 affine입니다.
$$ \hat{x} = s \cdot x_q - s \cdot z = s \cdot (x_q - z) $$
"Affine"의 의미:
- 선형 변환 + 평행 이동
- Scale로 늘리고/줄이고 (선형)
- Zero-point로 이동 (평행 이동)
이것이 "Linear Quantization" 또는 "Affine Quantization"이라고 불리는 이유입니다.
핵심 통찰: 두 개의 파라미터로 모든 것이 결정됨
놀라운 점은, 단 두 개의 숫자 $ s $와 $ z $만으로 전체 양자화 과정이 완전히 결정된다는 것입니다. $ s $와 $ z $를 알면
- 어떤 실수든 정수로 변환 가능
- 어떤 정수든 실수로 복원 가능
- 양자화 오차 예측 가능
예시
$ s = 0.1, z = 0\text{이라면} $
$ x = 2.34 → x_q = \text{round}(2.34/0.1) + 0 = 23 $
$ x = -5.67 → x_q = \text{round}(-5.67/0.1) + 0 = -57 $
$ x = 0.05 → x_q = \text{round}(0.05/0.1) + 0 = 1 $
$ x_q = 23 → \hat{x}= (23-0) × 0.1 = 2.3 $
$ x_q = -57 → \hat{x}= (-57-0) × 0.1 = -5.7 $
$ x_q = 1 → \hat{x}= (1-0) × 0.1 = 0.1 $
모든 변환이 $ s $와 $ z $에 의해 기계적으로 결정됩니다.
정리: Affine Quantization의 핵심
- 수식: $ x_q = \text{round}(x/s) + z $
- scale $ s $: 실수-정수 범위의 크기 비율, 정밀도 결정
- zero-point $ z $: 실수 0이 매핑되는 정수 위치, 범위 활용 효율성 결정
- Affine 변환: 선형 스케일링 + 평행 이동
- 완벽한 복원 불가: $ \text{round}() $에서 불가피한 오차 발생
- 두 파라미터의 힘: $ s $와 $ z $만 알면 모든 변환 가능
이제 원리는 명확합니다. 하지만 여전히 한 가지 핵심 질문이 남았습니다.
"그렇다면 $ s $와 $ z $를 실제로 어떻게 계산하는가?"
이것이 다음 글 "Scale과 Zero-point의 비밀"에서 다룰 내용입니다. 실제 데이터가 주어졌을 때, 최적의 $ s $와 $ z $를 찾는 구체적인 방법과 여러 값들을 직접 손으로 계산해보면서 완전히 이해해보겠습니다.
'Model Lightening > Model Compression' 카테고리의 다른 글
| AI 모델 양자화 기초 [5] - 실전: Convolutional Layer (0) | 2026.02.16 |
|---|---|
| AI 모델 양자화 기초 [4] - Scale과 Zero-point의 비밀 (0) | 2026.02.16 |
| AI 모델 양자화 기초 [2] - 양자화란 무엇인가? (0) | 2026.02.15 |
| AI 모델 양자화 기초 [1] - 왜 양자화가 필요한가 (0) | 2026.02.15 |
| 모델 압축과 모델 경량화 (0) | 2025.09.23 |