Нейронные сети, на основе которых строятся современные системы глубинного машинного самообучения и искусственного интеллекта, в большинстве случаев используют стандартный 32-разрядный формат чисел с плавающей запятой IEEE FP32.
Это обеспечивает высокую точность вычислений и конечного результата, но требует использования больших объемов памяти и высокопроизводительных процессоров, потребляющих значительное количество энергии. В системах же с высокими требованиями к быстродействию и с ограниченными вычислительными ресурсами используются 8-разрядные целые числа со знаком INT8. Это позволяет получить высокую производительность систем искусственного интеллекта, принеся в жертву точность вычислений и конечного результата.
Для решения проблемы, связанной с компромиссом между производительностью систем искусственного интеллекта и разрядностью используемых чисел, специалисты Google Brain в свое время разработали специальный формат чисел с плавающей запятой, оптимизированный для глубинного самообучения и позволяющий получать результат с минимально возможными потерями точности. Этот формат, BF16 (BFloat16, Brain Float 16) уже нашел широкое применение в специальных аппаратных ускорителях, разработанных компаниями Google, Intel, ARM и др.
В чем же разница между форматами FP32 и BF16? Число с плавающей запятой в стандартном формате FP32 состоит из 1 знакового бита, определяющего знак числа (+ или -), после него следует 8-битная экспонента (степень числа), после которой идет 23-битная мантисса (само число). И в сумме набираются полные 32 разряда.
Для формата BF16 специалисты Google Brain предложили усечь мантиссу до 7 бит. Такой выбор был сделан далеко не случайно, проведенные эксперименты показали, что качество работы нейронных сетей намного более чувствительно к размеру экспоненты, нежели мантиссы. И вариант BF16 является самым приемлемым компромиссом.
Таким образом, число в BF16 состоит из одного знакового бита, 8-битной экспоненты и 7-битной мантиссы, что в сумме составляет полные 16 бит. Для проведения тензорных операций с числами в формате BF16 требуются гораздо меньшие вычислительные мощности, объемы памяти и энергетические затраты. Напомним нашим читателям, что тензор — это трехмерная матрица чисел, а умножение тензоров — это ключевая операция, на которой стоят все вычисления в системах искусственного интеллекта.
Можно задать вопрос, а почему бы не использовать в системах искусственного интеллекта стандартный усеченный формат чисел с плавающей запятой IEEE FP16? Ведь этот формат достаточно успешно используется во многих приложениях, связанных с компьютерной графикой и компьютерными играми. Число в формате FP16 выглядит следующим образом — один знаковый бит, 5-битная экспонента и 10-битная мантисса, что в сумме составляет полные 16 бит.
Сразу можно отметить, что усеченная экспонента определяет гораздо меньший динамический диапазон чисел, чем диапазон формата BF16, который почти равен диапазону FP32. Во-вторых, для преобразования числа FP32 в формат FP16 требуется достаточно сложная процедура, чем простейшая операция по усечению разрядности мантиссы, необходимая для преобразования FP32 в BF16. И, в-третьих, усеченная мантисса формата BF16 позволяет сделать шину блоков аппаратных умножителей меньше, чем необходимо для формата FP16. В результате этого сами блоки умножителей для формата BF16 в восемь раз меньше по занимаемой на кристалле чипа площади, чем умножители для FP32, и в два раза меньше, чем умножители для FP16.
В заключение следует заметить, что формат BF16 является не единственным форматом, разработанным для систем искусственного интеллекта. В 2017 году компания Nervana предложила формат под названием Flexpoint, который должен был объединить все преимущества целых чисел с числами с плавающей запятой.
По сути, этот формат представляет собой модификацию чисел с фиксированной запятой, которые состоят из двух целых чисел. Первое число представляет собой целую часть числа до запятой, второе — дробную часть числа (после запятой). Специалисты компании Nervana дополнили формат числа с фиксированной запятой еще и экспонентой, однако, для ускорения операций экспонента была одна для всех чисел, из которых состоит тензор. При таком подходе умножение тензоров могло быть произведено при помощи математики на основе очень быстрых целочисленных операций.