인지야공

인지야공/수학·공학 노트/2번째 글

부동소수점 — fp32·fp16·bf16의 범위와 정밀도

실행: python 딥러닝/mathnotes/M5_float.py 혼합정밀도 편·양자화 편의 바탕이다.


1. 부동소수점의 구조

컴퓨터는 실수를 부호 · 지수 · 가수(유효숫자) 세 조각으로 담는다.

x=(−1)부호×1.가수×2지수x = (-1)^{\text{부호}} \times 1.\text{가수} \times 2^{\text{지수}}
  • 지수 비트가 많을수록 범위가 넓다(아주 크거나 작은 수를 담는다).
  • 가수 비트가 많을수록 정밀도가 높다(가까운 두 수를 구분한다).

같은 16비트라도 이 둘을 어떻게 나누느냐가 fp16과 bf16을 가른다.


2. 직접 재 보기

부동소수점 포맷

포맷최대값1 근처 간격(정밀도)
fp323.4e381.2e-07
fp166.55e4 (좁음)9.8e-04 (정밀)
bf163.4e38 (fp32급)7.8e-03 (덜 정밀)

실제로 넣어 보면 차이가 분명하다.

값fp16bf16
70,000inf (넘침)70,144
1e-80 (사라짐)1e-8

fp16은 정밀하지만 범위가 좁아 큰 값은 넘치고(65,504 초과) 작은 값은 0이 된다. bf16은 fp32와 같은 범위를 가져 넘침·사라짐이 없지만 정밀도가 낮다.


3. 딥러닝에서의 의미

  • fp16 학습: 작은 그라디언트가 0으로 사라진다 → 손실 스케일링(손실을 ×1024 해서 범위 안으로 옮긴 뒤 되돌림)이 필요하다(혼합정밀도 편).
  • bf16 학습: 범위가 넓어 손실 스케일링 없이도 안정적이라, 요즘 대형 학습의 기본이 됐다(정밀도 손실은 신경망이 잘 견딘다).
  • 양자화(양자화 편): 더 극단적으로 정수 4~8비트로 담는다. 여기서도 범위를 정하는 스케일이 핵심이다.

4. 한 줄 요약

부동소수점은 지수와 가수, 곧 범위와 정밀도의 나눠 갖기다. fp16은 좁고 정밀(65,504에서 넘침, 1e-8은 0), bf16은 넓고 덜 정밀(fp32급 범위). 그래서 fp16 학습엔 손실 스케일링이 필요하고, bf16은 그대로 안정적이다.


연결

표시는 이 브라우저에만 남는다. 서버로 가는 것은 없다.