부동 소수 Floating point numbers
부동 소수는 실수를 표현하는 방법 중 하나입니다. 고정 소수와 달리 소숫점 자리가 움직인다고 부동 소수라고 부릅니다.
- 고정 소수: 123.45
- 부동 소수:
,
, 등
부동 소수는 라고 쓸 수 있는데 각 부분의 명칭은 다음과 같습니다.
: 부호 sign
- m: 가수 significand
- n: 기수 base=2 (항상 2)
- e: 지수 exponent
정밀도 Precision
부동 소수는 숫자를 표현(저장)하기 위해 사용하는 비트 수에 따라 반정도, 단정도, 배정도 자료형 등으로 나눌 수 있습니다(IEEE754 표준). 비트 수를 많이 사용할수록 정밀도가 높죠.
- 반정도 FP16, half-precision: 16 비트 = 2 바이트
- 단정도 FP32, single-precision: 32 비트 = 4 바이트
- 배정도 FP64, double-precision: 64 비트 = 8 바이트
표준에는 더 많은 비트를 사용한 부동 소수도 있는데 보통 위의 세 가지 자료형을 많이 사용합니다.
| 정밀도 | 부호 비트 | 지수 비트 | 가수 비트 | 최소 양수 (근사치) | 최대 양수 (근사치) |
| 반정도 | 1 | 5 | 10 | ||
| 단정도 | 1 | 8 | 23 | ||
| 배정도 | 1 | 11 | 52 |
위 표를 보면 기수(base) 저장에는 비트를 사용하지 않는 것을 알 수 있습니다. 항상 2이기 때문에 저장할 필요가 없죠. 지수 비트를 더 많이 사용할수록 더 넓은 범위를 표현할 수 있고, 가수 비트를 더 많이 사용할수록 소숫점 아래 더 많은 자리까지 정밀한 값을 표현할 수 있습니다. 많은 비트를 사용할수록 더 정확하지만 메모리를 많이 차지하고 계산 속도가 느려지게 됩니다.
자료형 변환
자료형 사이에는 변환이 가능합니다. 낮은 비트의 자료형에서 높은 비트의 자료형으로 변환할 때는 저장된 숫자의 정밀도에 변함이 없지만, 높은 비트의 자료형에서 낮은 비트의 자료형으로 변환하면 저장된 숫자의 정밀도를 일부 희생하게 됩니다.
양자화 Quantization
딥러닝에서는 신경망 매개변수(가중치) 저장에 기본적으로 단정도 부동 소수를 사용합니다. 거대 언어 모델과 같이 큰 모델의 경우 수많은 매개변수(보통 수십억 개가 넘어갑니다)가 존재하기 때문에 메모리와 계산량 부담을 줄이기 위해 반정도나 더 낮은 정밀도(8비트 정수)의 자료형으로 변환을 하는 경우가 많습니다. 이를 양자화(Quantization)라고 합니다.
양자화에는 신경망 훈련 중 양자화, 훈련을 마친 후 양자화, 동적 양자화, 정적 양자화 등 다양한 기법이 존재합니다.