FP16·bfloat16 비트 패턴 시각화 도구

반정밀도 부동소수점(FP16, IEEE 754 binary16)과 bfloat16의 비트 패턴을 시각화하는 무료 도구입니다. 10진수→비트, 비트→10진수 상호 변환이 가능하며 부호·지수부·가수부를 색상으로 구분해 표시합니다. 머신러닝의 양자화·추론 고속화 학습에 유용합니다.

FP16과 bfloat16의 구조 비교

둘 다 합계 16비트이지만 지수부와 가수부의 비트 배분이 달라, 표현 가능한 값의 범위와 정밀도가 크게 다릅니다.

항목 FP16 (IEEE 754 半精度) bfloat16
총 비트 수 16 16
지수부 비트 수 5 8
가수부 비트 수 10 7
표현 가능한 값의 범위 약 ±6.1×10⁻⁵ 〜 ±65504(범위는 좁지만 가수부가 많아 정밀도가 높음) 약 ±1.2×10⁻³⁸ 〜 ±3.4×10³⁸(float32와 같은 넓은 범위이지만 정밀도는 낮음)
주요 용도 이미지 처리·그래픽스, 추론 시 메모리 절약(반정밀도 학습) 딥러닝 학습(TPU·최신 GPU). float32에서 변환 시 지수부 오버플로를 신경 쓸 필요가 없음

bfloat16은 지수부가 float32(단정밀도)와 동일한 8비트·같은 바이어스(127)이므로, float32의 가수부를 단순히 잘라내기만 해도 변환할 수 있다는 구현상의 이점이 있습니다.

사용 팁

  • 같은 0.1이라는 값이라도 FP16과 bfloat16은 반올림 오차가 전혀 다르게 나타납니다. 형식을 전환하여 가수부의 비트 열을 비교해 보세요.
  • bfloat16은 float32와 지수부 비트 폭·바이어스가 같아, 65504를 넘는 큰 값에서도 오버플로가 잘 발생하지 않습니다. 반대로 FP16은 65504를 넘으면 바로 무한대가 됩니다.
  • "70000"을 FP16으로 변환하면 오버플로되어 무한대가 되지만, bfloat16에서는(정밀도는 떨어지지만)정상적으로 표현됩니다.
  • PyTorch·TensorFlow 같은 머신러닝 프레임워크에서 모델을 양자화할 때, bfloat16은 float32에서 변환이 쉬운 반면 FP16은 표현 범위가 좁아 사전 스케일링이 필요한 경우가 있습니다.
  • 비트 패턴에서 역변환할 때는 `0x` 접두사가 붙은 4자리 16진수, 또는 16자리 2진수(`0b` 접두사는 선택)로 입력해야 합니다.

자주 묻는 질문

둘 다 합계 16비트이지만, FP16(IEEE 754 반정밀도)은 지수부 5비트·가수부 10비트, bfloat16은 지수부 8비트·가수부 7비트로 배분이 다릅니다. FP16은 가수부가 많아 정밀도가 높지만 표현 범위가 좁고, bfloat16은 float32와 같은 넓은 범위를 표현할 수 있는 대신 정밀도가 낮습니다.

딥러닝 학습에서는 그래디언트나 파라미터가 매우 크거나 매우 작은 값이 될 수 있으므로, float32와 같은 넓은 표현 범위(오버플로·언더플로가 잘 발생하지 않음)를 유지하면서 메모리와 연산량을 절반으로 줄일 수 있는 bfloat16이 선호됩니다. FP16은 표현 범위가 좁아 오버플로가 발생하기 쉬워, 학습 시 추가적인 스케일링(loss scaling)이 필요한 경우가 있습니다.

약 65504입니다. 이를 초과하는 값을 FP16으로 변환하려 하면 오버플로로 인해 무한대(Infinity)가 됩니다. 반면 bfloat16은 float32와 지수부 폭이 같아 약 3.4×10³⁸까지 표현할 수 있습니다.

지수부가 모두 0인 비트 패턴 중 가수부가 0이 아닌 것을 말합니다. 일반적인(정규화된) 부동소수점 수는 가수 앞에 암묵적 1이 붙지만, 비정규화수는 이를 생략함으로써 일반적으로 표현 가능한 최솟값보다 더 0에 가까운 값을 표현합니다(유효 자릿수는 희생됩니다).

bfloat16은 float32와 지수부 비트 폭(8비트)·바이어스(127)가 완전히 일치하므로, float32 비트 패턴의 가수부 상위 7비트만 남기고 잘라내는(반올림하는) 것만으로 변환할 수 있습니다. 지수부 재계산이나 범위 확인이 필요 없어 구현이 단순해집니다.
ツールくん

여담 ― 머신러닝이 "정밀도를 낮춘" 수치 표현을 원했던 이유

2018년경 Google은 자사의 TPU(Tensor Processing Unit)를 위해 bfloat16이라는 새로운 16비트 부동소수점 형식을 고안했습니다. 그 이전부터 존재했던 FP16(IEEE 754 반정밀도)은 이미지 처리·그래픽스 분야에서 이미 실용화되어 있었지만, 지수부가 겨우 5비트뿐이어서 표현 가능한 값의 범위가 좁아, 딥러닝 학습 시 그래디언트가 매우 작아지거나 커지는 현상(그래디언트 소실·폭발)에 충분히 대응하지 못한다는 과제가 있었습니다.

bfloat16의 설계 사상은 명확합니다. 가수부의 정밀도를 희생하는 대신, 지수부의 비트 폭을 float32(단정밀도)와 완전히 동일한 8비트로 유지함으로써 학습 중 빈번히 발생하는 극단적으로 크거나 작은 값을 안전하게 다룰 수 있게 한 것입니다. "Brain Floating Point"라는 이름은 Google의 머신러닝 연구 부문인 "Google Brain"에서 유래했습니다.

일반적인 컴퓨터 과학에서는 부동소수점 수의 정밀도를 낮추는 것이 "버그의 온상"으로 여겨져 기피되어 왔습니다. 그러나 딥러닝 모델은 다소의 수치 오차가 있어도 최종 예측 정밀도에는 거의 영향을 주지 않는다는 특수한 성질을 가지고 있습니다. 이 "다소 부정확해도 전체적으로는 작동한다"는 성질을 역으로 활용하여 메모리 사용량과 연산 비용을 절반으로 줄일 수 있는 16비트 표현이 널리 보급된 점은, 전통적인 컴퓨터 과학의 상식과는 다른, 머신러닝 분야만의 최적화라고 할 수 있습니다.