FP16 (Separuh Ketepatan): Dalam FP16, nombor titik terapung diwakili menggunakan 16 bit. Ia terdiri daripada 1 bit tanda, 5 bit untuk eksponen, dan 10 bit untuk pecahan (mantissa). Format ini memberikan ketepatan yang lebih tinggi untuk mewakili nilai pecahan dalam julatnya.
BF16 (BFloat16): BF16 juga menggunakan 16 bit, tetapi dengan pengedaran yang berbeza. Ia mempunyai 1 bit tanda, 8 bit untuk eksponen, dan 7 bit untuk mantissa. Format ini mengorbankan beberapa ketepatan dalam bahagian pecahan untuk menampung julat eksponen yang lebih luas.
FP16 mempunyai julat yang lebih kecil tetapi ketepatan yang lebih tinggi dalam julat itu disebabkan oleh mantissa 10-bitnya.
BF16 mempunyai julat yang lebih luas tetapi ketepatan yang lebih rendah untuk nilai pecahan disebabkan oleh eksponen 8-bit dan mantissa 7-bit.
Mari kita gunakan contoh untuk menggambarkan perbezaan antara FP16 dan BF16 dengan 3 contoh kes. TensorFlow digunakan untuk membuat ujian dan kod dikongsi di bahagian bawah:
Nilai asal: 0.0001 — Kedua-dua kaedah boleh mewakili
FP16: 0.00010001659393 (Perduaan: 0|00001|101000110, 8 Hextis: 10, 8 HexEon: 10, 8 HexEonsa 🎜>
BF16: 0.00010013580322 (Perduaan: 0|01110001|1010010, Hex: 38D2) — 7 mantissa dan 8 eksponen
Tetapi kita dapat melihat bahawa FP16 mewakilinya dengan lebih tepat dengan nilai yang lebih dekat.
Nilai asal: 1e-08 (0.00000001)FP16: 0.00000000000000 (Perduaan: 0|00000|000000000, 0.0000000000000,00000000000000, 0.00000000000000000000000000,00000000000000000000000000000000000000000000000000000000000000000 01172 (Perduaan: 0|01100100| 0101100, Hex: 322C)
Ini adalah kes yang sangat menarik.
dan menjadikan keputusan 0 tetapi BF16 mampu mewakilinya dengan pemformatan khas.
Nilai asal: 100000.00001FP16: inf (Perduaan: 0|11111|0000000000, Hex: 7C00)BF16: 000000.00000 01111|1000011, Hex: 47C3 )
Dalam kes di atas,
kerana semua bit eksponen menjadi penuh dan tidak mencukupi untuk mewakili nilai. Walau bagaimanapun BF16 berfungsi
Kes Penggunaan:BF16 menjadi popular dalam seni bina perkakasan yang direka untuk tugasan pembelajaran mesin yang mendapat manfaat daripada julat nilai yang boleh diwakili yang lebih luas, walaupun dengan kos ketepatan tertentu dalam bahagian pecahan. Ia amat berguna apabila menangani kecerunan yang besar atau apabila kestabilan berangka merentas julat yang luas adalah lebih penting daripada ketepatan nilai yang kecil.
RingkasnyaKod Digunakan Untuk Menjana Contoh Di Atas
import tensorflow as tf import struct def float_to_binary(f): return ''.join(f'{b:08b}' for b in struct.pack('>f', f)) def display_fp16(value): fp16 = tf.cast(tf.constant(value, dtype=tf.float32), tf.float16) fp32 = tf.cast(fp16, tf.float32) binary = format(int.from_bytes(fp16.numpy().tobytes(), 'big'), '016b') sign = binary[0] exponent = binary[1:6] fraction = binary[6:] return f"FP16: {fp32.numpy():14.14f} (Binary: {sign}|{exponent}|{fraction}, Hex: {fp16.numpy().view('uint16'):04X})" def display_bf16(value): bf16 = tf.cast(tf.constant(value, dtype=tf.float32), tf.bfloat16) bf32 = tf.cast(bf16, tf.float32) binary = format(int.from_bytes(bf16.numpy().tobytes(), 'big'), '016b') sign = binary[0] exponent = binary[1:9] fraction = binary[9:] return f"BF16: {bf32.numpy():14.14f} (Binary: {sign}|{exponent}|{fraction}, Hex: {bf16.numpy().view('uint16'):04X})" values = [0.0001, 0.00000001, 100000.00001] for value in values: print(f"\nOriginal value: {value}") print(display_fp16(value)) print(display_bf16(value))
Atas ialah kandungan terperinci Apakah perbezaan antara FP dan BF Berikut penjelasan yang baik untuk anda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!