bfloat16
bfloat16 (BF16, Brain Floating Point) to 16-bitowy format zmiennoprzecinkowy: jeden bit znaku, osiem bitów wykładnika i siedem bitów części ułamkowej. Wykładnik daje zakres rzędów wielkości zbliżony do FP32; krótka część ułamkowa oznacza rzadszą siatkę liczb.
Autorzy Cloud TPU opisują podział bitów w „Bfloat16 semantics”. Dla porównania:
| Format | Bity znaku | Bity wykładnika | Bity części ułamkowej |
|---|---|---|---|
| FP16 | 1 | 5 | 10 |
| bfloat16 | 1 | 8 | 7 |
| FP32 | 1 | 8 | 23 |
Dla liczb normalnych dochodzi wiodąca jedynka niewpisywana do tych pól. Siedem zapisanych bitów daje więc osiem bitów precyzji znaczącej.

Zasięg nie jest dokładnością
Własny eksperyment: liczba mieści się dokładnie w FP16, lecz w BF16 zaokrągla się do 1. Najbliższa większa od 1 liczba BF16 to . Za to przepełnia FP16, a BF16 zapisuje ją dokładnie. Mała znika w FP16 do zera, lecz jest normalną liczbą BF16.
Dwie wartości mogą zatem zajmować po dwa bajty, a zachowywać się inaczej. BF16 nie jest „dokładniejszym FP16”. Oszczędność dotyczy reprezentowanych tensorów, nie automatycznie całej pamięci treningu.
W Mixed Precision Training różne operacje mogą korzystać z różnych formatów. Cloud TPU mnoży wartości BF16, lecz sumuje iloczyny w FP32. Dokumentacja opisuje również konwersję: zaokrąglanie do najbliższej wartości, przy remisie do parzystej; na TPU wartości subnormalne BF16 są zerowane. Tego zachowania sprzętu nie należy utożsamiać ze wszystkimi implementacjami formatu.
Szeroki zakres zmniejsza potrzebę Loss Scaling znanego z FP16. Nie odzyskuje jednak szczegółu utraconego przez zaokrąglenie przy liczbie 1. Wybór formatu nadal wymaga sprawdzenia zachowania konkretnego modelu i operacji.
Wykorzystuję treści generowane przez AI jako część mojego codziennego procesu nauki.