Смешанная точность для обучения нейронных сетей может сократить время обучения и требования к памяти, не влияя на производительность модели.

По мере развития методологий глубокого обучения все соглашались, что увеличение размера нейронной сети улучшает производительность. Однако это наносит ущерб требованиям к памяти и вычислениям, которые также необходимо увеличить для обучения модели.

Это можно увидеть, сравнив производительность предварительно обученной языковой модели Google, BERT, при разных размерах архитектуры. В оригинальной статье исследователи Google сообщили о среднем показателе GLUE 79,6 для BERT-Base и 82,1 для BERT-Large. Это небольшое увеличение на 2,5 привело к дополнительным параметрам 230M (110M против 340M)!

В качестве грубого расчета, если каждый параметр хранится с одинарной точностью (более подробно ниже), что составляет 32 бита информации, то 230M параметров эквивалентны 0,92 ГБ в памяти. Само по себе это может показаться небольшим, но учтите, что во время каждой итерации обучения каждый из этих параметров проходит через серию арифметических операций с матрицами, каждый с дополнительными связанными значениями, такими как градиенты. Все эти дополнительные значения могут быстро стать неуправляемыми.

В 2017 году группа исследователей из NVIDIA выпустила документ, в котором подробно описывается, как уменьшить требования к памяти при обучении нейронных сетей с помощью методики под названием Mixed Precision Training:

Мы представляем методику обучения глубоких нейронных сетей с использованием чисел с плавающей запятой половинной точности без потери точности модели или необходимости изменения гиперпараметров. Это почти вдвое снижает требования к памяти и ускоряет арифметические операции на последних графических процессорах.

В этой статье мы рассмотрим обучение со смешанной точностью, чтобы понять, как оно вписывается в стандартную алгоритмическую структуру глубокого обучения, и как оно может снизить вычислительную нагрузку, не влияя на производительность модели.

Точность с плавающей запятой

Технический стандарт, используемый для представления чисел с плавающей запятой в двоичных форматах, - IEEE 754, установленный в 1985 году Институтом электротехники и электроники.

Как указано в IEEE 754, существуют различные уровни точности с плавающей запятой, от двоичного16 (половинная точность) до двоичного256 (восьмеричная точность), где число после «двоичного» равно количеству битов, доступных для представления числа с плавающей запятой. -балльная стоимость.

В отличие от целочисленных значений, где биты просто представляют двоичную форму числа, возможно, с одним битом, зарезервированным для знака, значения с плавающей запятой также должны учитывать экспоненту. Следовательно, представление этих чисел в двоичной форме более тонко и может существенно повлиять на точность.

Исторически сложилось так, что глубокое обучение использовало одинарную точность (binary32 или FP32) для представления параметров. В этом формате один бит зарезервирован для знака, 8 битов для экспоненты (от -126 до +127) и 23 бита для цифр. С другой стороны, половинная точность или FP16 резервирует один бит для знака, 5 бит для экспоненты (от -14 до +14) и 10 для цифр.

Однако за это приходится платить. Наименьшие и наибольшие положительные нормальные значения для каждого следующие:

Кроме того, могут быть представлены меньшие денормализованные числа, где все биты экспоненты установлены в ноль. Для FP16 абсолютный предел равен 2 ^ (- 24). Однако по мере уменьшения денормализованных чисел точность уменьшается.

Мы не будем углубляться здесь, чтобы понять количественные ограничения различной точности с плавающей запятой в этой статье, но IEEE предоставляет исчерпывающую документацию для дальнейшего исследования.

Смешанная высокоточная тренировка

Во время стандартного обучения нейронных сетей FP32 для представления параметров модели за счет увеличения требований к памяти. В обучении со смешанной точностью FP16 используется вместо этого для хранения весов, активаций и градиентов во время итераций обучения.

Однако, как мы видели выше, это создает проблему, поскольку диапазон значений, которые могут быть сохранены FP16, меньше, чем FP32, и точность уменьшается по мере того, как число становится очень маленьким. Результатом этого будет снижение точности модели в соответствии с точностью вычисленных значений с плавающей запятой.

Для борьбы с этим мастер-копия весов хранится в FP32. Он преобразуется в FP16 во время части каждой итерации обучения (один прямой проход, обратное распространение и обновление веса). В конце итерации градиенты веса используются для обновления основных весов на этапе оптимизатора.

Здесь мы видим преимущество сохранения копии весов FP32. Поскольку скорость обучения часто мала, при умножении на градиенты веса они часто могут быть крошечными значениями. Для FP16 любое число с величиной меньше 2 ^ (- 24) будет приравнено к нулю, поскольку оно не может быть представлено (это денормализованный предел для FP16). Следовательно, выполнив обновления в FP32, эти значения обновления могут быть сохранены.

Использование как FP16, так и FP32 является причиной того, что этот метод называется смешанным -прецизионным обучением.

Масштаб потерь

Хотя обучение со смешанной точностью решало, по большей части, проблему сохранения точности, эксперименты показали, что были случаи, когда возникали небольшие значения градиента, даже до того, как они умножались на скорость обучения.

Команда NVIDIA показала, что, хотя значения ниже 2 ^ -27 в основном не имели отношения к обучению, были значения в диапазоне [2 ^ -27, 2 ^ -24), которые важно было сохранить, но за пределами FP16, приравнивая их к нулю во время обучающей итерации. Эта проблема, когда градиенты приравниваются к нулю из-за ограничений точности, известна как потеря значимости.

Поэтому они предлагают масштабирование потерь, процесс, при котором значение потерь умножается на коэффициент масштабирования после завершения прямого прохода и перед обратным распространением. Цепное правило диктует, что все градиенты впоследствии масштабируются с тем же коэффициентом, который переместил их в пределах диапазона FP16.

После расчета градиентов их можно разделить на один и тот же масштабный коэффициент, прежде чем использовать для обновления основных весов в FP32, как описано в предыдущем разделе.

В документации NVIDIA Deep Learning Performance обсуждается выбор коэффициента масштабирования. Теоретически нет недостатка в выборе большого коэффициента масштабирования, если только он не является достаточно большим, чтобы привести к переполнению.

Переполнение происходит, когда градиенты, умноженные на коэффициент масштабирования, превышают максимальный предел для FP16. Когда это происходит, градиент становится бесконечным и устанавливается на NaN. На ранних этапах обучения нейронных сетей довольно часто можно увидеть следующее сообщение:

Gradient overflow. Skipping step, loss scaler 0 reducing loss scale to…

В этом случае шаг пропускается, поскольку обновление веса не может быть вычислено с использованием бесконечного градиента, а масштаб потерь уменьшается для будущих итераций.

Автоматическая смешанная точность

В 2018 году NVIDIA выпустила расширение для PyTorch под названием Apex, которое содержало возможность AMP (Automatic Mixed Precision). Это обеспечило оптимизированное решение для использования обучения со смешанной точностью в PyTorch.

Всего в нескольких строках кода обучение можно было перенести с FP32 на GPU со смешанной точностью. Это имело два ключевых преимущества:

  • Сокращенное время обучения - время обучения сократилось примерно в 1,5–5,5 раза без значительного снижения производительности модели.
  • Пониженные требования к памяти - это освободило память для увеличения других элементов модели, таких как размер архитектуры, размер пакета и размер входных данных.

Начиная с PyTorch 1.6, NVIDIA и Facebook (создатели PyTorch) переместили эту функциональность в основной код PyTorch как torch.cuda.amp. Это устранило несколько проблем, связанных с пакетом Apex, таких как совместимость версий и трудности при создании расширения.

Хотя в этой статье мы не будем углубляться в реализацию кода AMP, примеры можно увидеть в документации PyTorch.

Вывод

Хотя точность с плавающей запятой часто упускается из виду, она играет ключевую роль в обучении моделей глубокого обучения, где небольшие градиенты и скорость обучения умножаются для создания обновлений градиентов, требующих точного представления большего количества битов.

Однако по мере того, как современные модели глубокого обучения раздвигают границы с точки зрения производительности задач, архитектуры растут, и точность должна быть сбалансирована со временем обучения, требованиями к памяти и доступными вычислениями.

Следовательно, возможность обучения со смешанной точностью для поддержания производительности при существенном сокращении использования памяти вдвое является значительным достижением в глубоком обучении!