Почему GEMM лежит в основе глубокого обучения

компьютерное зрение

Предисловие:

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

Я трачу большую часть своего времени на размышления о том, как сделать глубокое обучение с помощью нейронных сетей более быстрым и эффективным. На практике это означает сосредоточение внимания на функции под названием GEMM. Это часть библиотеки BLAS (Basic Linear Algebra Subroutines), впервые созданной в 1979 году, и я никогда не слышал о ней, пока не начал пытаться оптимизировать нейронные сети. Чтобы объяснить, почему это так важно, вот диаграмма из статьи моего друга Ян Цинцзя.

Все слои, начинающиеся с fc (fullconnected) или свертки, реализованы с помощью GEMM и почти все время (95% версии GPU, 89% CPU) тратится на эти слои.

Так что же такое ГЕММ? Это означает глобальное умножение матрицы на матрицу, и, по сути, он делает именно то, что написано на жестяных банках, умножая две входные матрицы вместе, чтобы получить выходную матрицу. Разница между ним и типом манипулирования матрицами, который я использую в мире 3D-графики, заключается в том, что матрицы, с которыми он работает, обычно очень большие.

Например, одному слою в типичной сети может потребоваться умножить матрицу из 256 строк и 1152 столбцов на матрицу из 1152 строк и 192 столбцов, чтобы получить результат из 256 строк и 192 столбцов. Наивно, для этого требуется 57 миллионов слоев (256x1152x192) операций с плавающей запятой, в современных архитектурах таких слоев могут быть десятки, поэтому я часто вижу, как сетям требуются миллиарды FLOP для вычисления кадра. Ниже приведена диаграмма, которую я нарисовал, чтобы наглядно представить, как это работает:

Обратите внимание, чтобы получить больше контента компьютерного зрения вовремя

Полностью связанные слои

Полносвязные слои — это классические нейронные сети, которые существуют уже несколько десятилетий, и проще всего начать с того, как использовать GEMM. Каждое выходное значение слоя FC просматривает каждое значение входного слоя, умножает их все на соответствующий вес для этого входного индекса и складывает результаты для получения выходных данных. Согласно описанию на приведенном выше рисунке, конкретная ситуация выглядит следующим образом:

Есть «k» входных значений, а также есть «n» нейронов, каждый со своим собственным набором изученных весов. Есть «n» выходных значений, каждый нейрон имеет выходное значение, вычисляемое путем скалярного произведения его весов и входного значения.

Сверточный слой

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

Операция свертки производит свой вывод, взяв веса некоторого «ядра». и применить их к изображению. Вот как выглядит входное изображение и отдельное ядро:

Каждое ядро ​​представляет собой трехмерный массив с той же глубиной, что и входное изображение, но с гораздо меньшей шириной и высотой, обычно что-то вроде 7×7. Чтобы получить результат, ядро ​​свертки будет применено к сетке точек на входном изображении. В каждой точке, где он применяется, все соответствующие входные значения и веса умножаются, а затем добавляются в этой точке для получения единого выходного значения. Вот визуальные эффекты:

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

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

Вы, возможно, заметили, что я не совсем понимаю, какой тип меша использует ядро. Его ключевым управляющим фактором является параметр под названием «шаг», который определяет расстояние между приложениями ядра. Например, при шаге 1256×256 входное изображение будет иметь одно ядро, примененное к каждому пикселю, а выходное изображение будет той же ширины и высоты, что и входное изображение. Пока выполняются 4 шага, одно и то же входное изображение будет применять ядро ​​​​только через каждые четыре пикселя, поэтому на выходе будет только 64x64. Типичные значения шага меньше размера ядра, а это значит, что на графиках, визуализирующих приложения ядра, многие из этих значений будут фактически перекрываться по краям.

Как GEMM обрабатывает сверточные решения

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

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

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

Теперь, когда у вас есть входное изображение в матричной форме, вы можете сделать то же самое с весами для каждого ядра, сериализуя 3D-куб в строки как вторую матрицу для умножения. Вот как будет выглядеть окончательный GEMM:

Здесь «k» — это количество значений в каждом патче и ядре, поэтому это «ширина ядра * высота ядра», глубина. Результирующая матрица — это высота столбца «количество патчей», рассчитанная по «количеству ядер». ширина строки.Эта матрица фактически обрабатывается как трехмерный массив последующими операциями, с размером ядра в качестве глубины, патчи затем снова сегментируются на строки и столбцы на основе их исходных позиций во входном изображении.

Почему GEMM работает для свертки

Надеюсь, теперь вы видите, как сверточный слой представлен как матричное умножение, но все еще не ясно, зачем вам это нужно. Вкратце, ответ заключается в том, что мир форматирования научных программистов потратил десятилетия на оптимизацию кода для выполнения больших умножений матриц на матрицы, и преимущества очень регулярных шаблонов доступа к памяти перевешивают потраченные впустую затраты на хранение. Этот документ от Nvidia (скачать в конце) является хорошим введением в некоторые из различных методов, но они также описывают, почему они выбрали модифицированную версию GEMM в качестве своего любимого метода. В то же время, пакетная обработка большого количества входных изображений с одним и тем же ядром дает много преимуществ.В этой статье «Caffe control» (метод загрузки в конце статьи) используются очень хорошие результаты. Основной конкурент метода GEMM работает в частотном пространстве с использованием преобразования Фурье, но использование пошаговой свертки затрудняет его эффективность.

Хорошей новостью является то, что наличие единого хорошо понятного алгоритма (т.е. GEMM), который занимает большую часть нашего времени, обеспечивает очень четкий путь к оптимизации использования скорости и мощности, будь то с помощью лучшего программного обеспечения или хорошо запускаемой операции с пользовательскими настройками. аппаратное обеспечение. Поскольку глубокие сети оказались полезными для большого количества приложений, связанных с речью, НЛП и компьютерным зрением, я ожидаю увидеть огромные улучшения в ближайшие годы, такие как широкий спрос на 3D-игры, вызывая революцию в операциях обработки вершин и пикселей. революция графических процессоров.

Бумага: cuDNN: эффективные примитивы для глубокого обучения

адрес:АР Вест V.org/PDF/1410.07…

Документ: Caffe con Troll: Мелкие идеи для ускорения глубокого обучения

адрес:АР Вест V.org/PDF/1504.04…

Как получить: Вы можете получить его, ответив на «0002» в официальном аккаунте.

Оригинальная ссылка:

Пит warden.com/2015/04/20/…

Эта статья взята из серии публикаций в Техническом руководстве CV для общедоступных аккаунтов.

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

Ответьте на ключевое слово «Техническое резюме» в официальном аккаунте, чтобы получить резюме следующих статей в формате pdf.

Другие статьи

Почему 8 бит достаточно для использования глубоких нейронных сетей?

Классическая серия документов | Обнаружение целей - CornerNet и также известные как дефекты якорных ящиков

Как просмотреть пузырь искусственного интеллекта

Четкое обнаружение границ с использованием Dice loss

PVT — многофункциональная основа для плотного прогнозирования без свертки

CVPR2021 | Обнаружение объектов в открытом мире

Siamese networkСводка

Визуальное обнаружение и распознавание объектов Прошлое, настоящее и возможное

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

Краткое изложение терминологии компьютерного зрения (1) Создание системы знаний для компьютерного зрения

Краткое изложение методов недообучения и переобучения

Резюме методов нормализации

Краткое изложение общих идей бумажных инноваций

Резюме методов эффективного чтения англоязычной литературы по направлению CV

Обзор непродолжительного обучения компьютерному зрению

Краткий обзор дистилляции знаний

Оптимизировать скорость чтения видео OpenCV

Сводка NMS

Краткое изложение методов функции потерь

Техническое резюме механизма внимания

Краткое изложение технологии пирамиды функций

Краткое изложение технологии объединения

Краткое изложение методов увеличения данных

Резюме эволюции структуры CNN (1) Классическая модель

Резюме эволюции структуры CNN (2) Облегченная модель

Резюме эволюции структуры CNN (3) Принципы проектирования

Как увидеть будущее направление компьютерного зрения

Краткое изложение технологии визуализации CNN (1) Визуализация карты объектов

Краткое описание технологии визуализации CNN (2) Визуализация ядра свертки

Краткое изложение технологии визуализации CNN (три) визуализации

Краткое описание технологии визуализации CNN (4) инструменты и проекты визуализации