Тензорная квантование не рассказанная история
Тензорная квантование не рассказанная история
Подробный обзор деталей реализации квантования в фреймворках машинного обучения
Совместно с Нарешем Сингхом.
Содержание
- Введение
- Что означают термины “масштаб” и “нулевая точка” в квантовании?
- Типы схем квантования
- Примеры масштаба и нулевой точки для квантования
- Квантование и нормализация активации
- Заключение
- Ссылки
Введение
На протяжении остальной части этой статьи мы постараемся ответить на следующие вопросы с помощью конкретных примеров.
- Что означают термины “масштаб” и “нулевая точка” в квантовании?
- Какие существуют различные типы схем квантования?
- Как вычислять масштаб и нулевую точку для различных схем квантования?
- Почему нулевая точка важна для квантования?
- Какие техники нормализации пользуются преимуществами квантования?
Что означают термины “масштаб” и “нулевая точка” в квантовании?
Масштаб: При квантовании диапазона чисел с плавающей запятой обычно представляют диапазон чисел с плавающей запятой [Fmin..Fmax] в квантованном диапазоне [Qmin..Qmax]. В этом случае масштаб – это отношение диапазона чисел с плавающей запятой к квантованному диапазону.
- Как на самом деле работает Устойчивая диффузия? Интуитивное объяснение
- Лучшие практики и шаблоны проектирования для построения рабочих процессов машинного обучения с использованием конвейеров Amazon SageMaker
- BYOL — Альтернатива контрастному самообучению с учителем
Пример вычисления масштаба будет показан позже.
Нулевая точка: Нулевая точка в квантовании представляет собой представление числа с плавающей запятой 0.0 в квантованном диапазоне. Конкретно, нулевая точка – это квантованное значение, и оно представляет число с плавающей запятой 0.0 для всех практических целей. Мы рассмотрим, как она вычисляется с примерами позже, а также почему такое представление является практически интересным для нас.
Теперь давайте рассмотрим основные схемы квантования, используемые на практике, и ознакомимся с тем, в чем их сходства и различия.
Типы схем квантования
При рассмотрении типов квантования, доступных для использования при сжатии модели, существует 2 основных типа, из которых можно выбрать
- Симметричное квантование: В этом случае нулевая точка равна нулю – т.е. 0,0 диапазона чисел с плавающей запятой равно 0 в квантованном диапазоне. Обычно это более эффективно вычислять во время выполнения, но может привести к снижению точности, если диапазон чисел с плавающей запятой неравномерно распределен вокруг числа с плавающей запятой 0.0.
- Афинное (или асимметричное) квантование: В этом случае нулевая точка имеет ненулевое значение.
Но прежде чем мы углубимся в детали, давайте попытаемся определить, что означает нулевая точка.
Примеры масштаба и нулевой точки для квантования
Начнем с очень простого примера и постепенно разберем его.
Пример 1: Симметричное квантование uint8
Допустим, мы хотим отобразить диапазон чисел с плавающей запятой [0,0..1000,0] в квантованный диапазон [0..255]. Диапазон [0..255] – это набор значений, которые могут поместиться в беззнаковое 8-битное целое число.
Для выполнения этого преобразования мы хотим пересчитать диапазон чисел с плавающей запятой так, чтобы выполнялось следующее:
Число с плавающей запятой 0,0 = Квантованное 0
Число с плавающей запятой 1000,0 = Квантованное 255
Это называется симметричным квантованием, потому что число с плавающей запятой 0,0 квантовано 0.
Таким образом, мы определяем масштаб, который равен
Где,
В данном случае, масштаб = 3.9215
Для преобразования из числа с плавающей точкой в квантованное значение, мы можем просто разделить число с плавающей точкой на масштаб. Например, число с плавающей точкой 500.0 соответствует квантованному значению
В этом простом примере, 0.0 из диапазона чисел с плавающей точкой соответствует точно 0 в квантованном диапазоне. Это называется симметричной квантовкой. Давайте посмотрим, что произойдет, если это не так.
Пример 2: Аффинная квантовка uint8
Предположим, мы хотим отобразить диапазон чисел с плавающей точкой [-20.0 .. 1000.0] в квантованный диапазон [0 .. 255].
В этом случае у нас есть другой коэффициент масштабирования, так как наше xmin отличается.
Давайте посмотрим, какое число с плавающей точкой 0.0 представлено в квантованном диапазоне, если мы применим коэффициент масштабирования к 0.0
Ну, это не совсем верно, потому что, согласно диаграмме выше, мы ожидали, что число с плавающей точкой -20.0 будет соответствовать квантованному значению 0.
Здесь вводится понятие нулевой точки. Нулевая точка действует как смещение для смещения отмасштабированного значения числа с плавающей точкой и соответствует значению в квантованном диапазоне, которое представляет число с плавающей точкой 0.0. В нашем случае нулевая точка является отрицанием отмасштабированного представления числа с плавающей точкой -20.0, то есть -(-5) = 5. Нулевая точка всегда отрицание представления минимального числа с плавающей точкой, так как минимум всегда будет отрицательным или нулем. Мы узнаем больше о том, почему это так в разделе, который объясняет пример 4.
Всякий раз, когда мы квантуем значение, мы всегда добавляем нулевую точку к этому отмасштабированному значению, чтобы получить фактическое квантованное значение в допустимом диапазоне квантования. Если мы хотим квантовать значение -20.0, мы вычисляем его как отмасштабированное значение -20.0 плюс нулевую точку, то есть -5 + 5 = 0. Таким образом, квантованное(-20.0, масштаб=4, нулевая_точка=5) = 0.
Пример 3: Аффинная квантовка int8
Что произойдет, если наш квантованный диапазон является знаковым 8-битным целым числом, а не беззнаковым 8-битным целым числом? Теперь диапазон составляет [-128 .. 127].
В этом случае, -20.0 в диапазоне с плавающей точкой соответствует -128 в квантованном диапазоне, а 1000.0 в диапазоне с плавающей точкой соответствует 127 в квантованном диапазоне.
Способ вычисления нулевой точки состоит в том, что мы вычисляем ее, как если бы квантованный диапазон был [0 .. 255], а затем смещаем его на -128, так что нулевая точка в новом диапазоне равна
Следовательно, нулевая точка для нового диапазона равна -123.
До сих пор мы рассмотрели примеры, где диапазон с плавающей точкой включает значение 0.0. В следующем наборе примеров мы рассмотрим, что происходит, когда диапазон с плавающей точкой не включает значение 0.0.
Важность значения 0.0
Почему важно, чтобы значение с плавающей точкой 0.0 было представлено в диапазоне с плавающей точкой?
При использовании свертки с заполнением, мы ожидаем, что граничные пиксели будут заполнены значением 0.0 в наиболее распространенном случае. Поэтому важно, чтобы 0.0 было представлено в диапазоне с плавающей точкой. Аналогично, если значение X будет использоваться для заполнения в вашей сети, вам необходимо убедиться, что значение X представлено в диапазоне с плавающей точкой и что квантование об этом знает.
Пример 4: Неизвестная история – смещенный диапазон с плавающей точкой
Теперь давайте посмотрим, что происходит, если 0.0 не является частью диапазона с плавающей точкой.
В этом примере мы пытаемся квантовать диапазон с плавающей точкой [40.0 .. 1000.0] в квантованный диапазон [0 .. 255].
Поскольку мы не можем представить значение 0.0 в диапазоне с плавающей точкой, нам нужно расширить нижний предел диапазона до 0.0.
Мы видим, что некоторая часть квантованного диапазона теряется. Чтобы определить, сколько, давайте вычислим квантованное значение, к которому отображается значение с плавающей точкой 40.0.
Таким образом, мы тратим диапазон [0 .. 9] в квантованном диапазоне, что составляет около 3,92% от диапазона. Это может значительно повлиять на точность модели после квантования.
Это смещение необходимо, если мы хотим убедиться, что значение 0.0 в диапазоне с плавающей точкой может быть представлено в квантованном диапазоне.
Еще одна причина включения значения 0.0 в диапазон с плавающей точкой заключается в том, что эффективное сравнение квантованного значения для проверки, является ли оно 0.0 в диапазоне с плавающей точкой, очень ценно. Подумайте об операторах, таких как ReLU, который обрезает все значения ниже 0.0 в диапазоне с плавающей точкой до 0.0.
Важно, чтобы мы могли представить нулевую точку с использованием того же типа данных (знакового или беззнакового int8) как квантованные значения. Это позволяет нам выполнять эти сравнения быстро и эффективно.
Далее давайте посмотрим, как нормализация активации помогает с квантованием модели. Мы сосредоточимся на том, как стандартизация значений активации позволяет нам эффективно использовать весь квантованный диапазон.
Квантование и нормализация активации
Нормализация пакета/слоя изменяет тензор активации таким образом, чтобы у него было нулевое среднее и единичная дисперсия на канал или слой.
Предположим, у нас есть входной тензор с диапазоном с плавающей точкой [2000.0 .. 4000.0]. Вот как будет выглядеть квантованный диапазон.
Мы наблюдаем, что половина квантованного диапазона [-127 .. -1] не используется. Это проблематично, поскольку мы квантуем весь диапазон с плавающей точкой, используя только 7 из доступных 8 бит. Это неизбежно приведет к большей ошибке квантования и снижению точности модели. Чтобы решить эту проблему, давайте применим нормализацию слоя к тензору активации.
После применения нормализации слоя к тензору активации, тензор активации будет иметь диапазон с плавающей точкой [-2.0 .. 2.0]. Это можно представить в диапазоне знаковых целых чисел int8 [-128 .. 127]. Чтобы обеспечить симметрию распределения, мы ограничиваем диапазон квантования [-127 .. 127].
Таким образом, нормализация предотвращает появление пустых или неиспользуемых частей в диапазоне квантования.
Заключение
Мы рассмотрели, что такое аффинная (асимметричная) и симметричная квантование и в чем их различия. Мы также узнали о том, что такое масштаб и нулевая точка и как их рассчитывать для обоих типов схем квантования.
Затем мы увидели необходимость включения значения 0.0 в диапазон с плавающей точкой и почему и как это делается на практике. Это имеет недостаток, а именно, незаполненное пространство в диапазоне квантования.
Наконец, мы увидели, как нормализация помогает квантованию, приводя активации в фиксированный диапазон и избегая незаполненного пространства в диапазоне квантования. Фактически, нормализация на основе нулевого среднего может помочь преобразовать аффинное квантование в симметричное квантование, что может ускорить процесс вывода.
Все изображения в этой статье созданы автором(ами).
Ссылки
- Efficient Deep Learning Book, Глава 2: Введение в техники сжатия
- Hugging Face: Квантование
- TensorRT: Квантование
- Neural Network Distiller: Квантование
- Lei Mao: Квантование
- Квантование чисел с плавающей точкой