🤖 Глубокое обучение

MLP Mixer - это все, что вам нужно?

Понимание MLP-Mixers от начала до конца, с кодом TF Keras

Ранее в мае этого года группа исследователей из Google выпустила статью « MLP-Mixer: полностью-MLP-архитектура для Vision », в которой была представлена ​​их MLP-Mixer ( Mixer, для краткости) модель для решения задач компьютерного зрения. Исследование предполагает, что MLP-Mixer достигает конкурентоспособных результатов в тестах классификации изображений, таких как ImageNet.

Одна вещь, которая бросится в глаза каждому разработчику машинного обучения, - это то, что они не использовали свертки в своей архитектуре. Свертки господствовали в компьютерном зрении с тех пор, пока они эффективно извлекают пространственную информацию из изображений и видео. В последнее время Трансформеры, которые изначально использовались для задач НЛП, показали замечательные результаты и в задачах компьютерного зрения. В исследовательской статье для MLP-Mixer предлагается:

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

Были некоторые разногласия относительно того, являются ли MLP-микшеры «свободными от конвенций» или нет. Изучите этот блог на сайте Weights and Biases, чтобы узнать больше,



Мы поговорим об архитектуре MLP-Mixer и основных используемых технологиях. Наконец, мы предоставляем реализацию кода для MLP-Mixer с использованием TensorFlow Keras.

Также этот блог был размещен в Библиотеке разработчиков Google.

Теперь вы можете найти предварительно обученные модели MLP-Mixer на TensorFlow Hub, https://tfhub.dev/sayakpaul/collections/mlp-mixer/1

Я также использовал MLP-Mixers для классификации текста,



📃 Содержание

  1. 👉 Доминирование сверток, появление трансформеров
  2. 👉 Многослойный персептрон (MLP) и функция активации GELU
  3. 👉 Компоненты архитектуры MLP-Mixer
  4. 👉 Конец игры
  5. 👉 Еще проекты / блоги / ресурсы от автора

👼 Доминирование сверток, появление трансформеров

Использование сверток в задачах компьютерного зрения было популяризировано Янном ЛеКуном, и с тех пор свертки служат основой для задач компьютерного зрения. Каждый фильтр свертывается по входному объему для вычисления карты активации, состоящей из нейронов, как показано ниже.

Каждый нейрон в выходной карте связан с определенной частью входного объема, что хорошо видно на рис. 1. Затем выходная карта передается в функцию активации (например, ReLU). Для уменьшения размерности выходных карт используется операция Pooling. Свертки используются для изучения локальных особенностей изображения, что является целью проблем компьютерного зрения. Почти все архитектуры, такие как MobileNets, Inception, ResNet, DenseNet и т. Д., Используют сверточные слои (свертка + активация) для изучения функций изображения.

Трансформеры были созданы для задач НЛП, но показали значительные результаты в классификации изображений. Я оставлю здесь некоторые ресурсы для Трансформаторов видения (ViTs),







🤠 Многослойный персептрон (MLP) и функция активации GELU

Многослойный персептрон (MLP)

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

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

В нашем случае в исследовательской статье предлагается MLP с 2-мя полносвязными (плотными) слоями с функцией активации GeLU (подробнее об этом мы поговорим в следующих разделах),

Каждый уровень микшера будет состоять из двух MLP, один для микширования токенов, а другой для микширования каналов. Подробнее о смешивании токенов и микшировании каналов мы поговорим в следующих разделах статьи. Вот код, который мы будем использовать для объединения двух Dense слоев (с активацией GELU), тем самым добавив MLP к существующим слоям (x),

Примечание: выпадения не будет видно на рисунке 3. Мы добавляем его, чтобы упорядочить нашу модель. Вы также можете заметить их на этом примере Keras.

Обратите внимание: большинство из нас может подумать, что Dense слои принимают входные данные формы ( batch_size , input_dims ) и выводят тензоры формы ( batch_size, output_dims ). Но в нашем случае эти Dense слои получат входные формы трех измерений, то есть формы ( batch_size , num_patches , channels ) или ее транспонирования ( batch_size , channels , num_patches ).

Мы узнаем больше о num_channels и num_patches в следующих разделах статьи.

Активация GELU (гауссова погрешность линейной единицы)

Современная, но не очень популярная функция активации

Единицы измерения погрешности по Гауссу - это функция активации, которая взвешивает входные данные с использованием стандартной Кумулятивной функции распределения по Гауссу. В случае ReLU (выпрямленные линейные единицы) входы взвешиваются по их знаку.

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

Причина выбора Нормального распределения заключается в том, что при использовании слоя Пакетная нормализация выходы нейронов подчиняются нормальному распределению. Активация GELU широко используется в моделях Transformer для решения задач NLP.

Как показано в фрагменте 1, мы будем использовать tf.nn.gelu, чтобы добавить активацию GELU в MLP. Если вам нужен слой Keras, в пакете TensorFlow Addons есть слой tfa.layers.GELU.

Вот хороший блог, объясняющий различные функции активации (включая GELU),



🔧 Компоненты архитектуры MLP-Mixer

Мы подробно обсудим каждый компонент, а затем объединим их все в один фрагмент кода.

⚙️Смешивание слоев

Слои микшера являются строительными блоками архитектуры MLP-Mixer. Каждый слой микшера содержит два MLP, один для микширования токенов, а другой для микширования каналов. Наряду с MLP вы заметите нормализацию уровня, пропуски соединений и букву «T», написанную над стрелкой. Он относится к транспонированию * тензора, сохраняя размер пакета неизменным.

транспонирование *: мы будем использовать слой tf.keras.layers.Permute для выполнения транспонирования, задав dims=[ 2 , 1 ] в аргументах этого слоя. Мы не будем подробно обсуждать это в следующих разделах.

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

  1. Что такое патчи (входы слоя микшера)
  2. MLP смешивания токенов
  3. MLP микширования каналов
  4. Нормализация слоя

🧽 Что такое патчи?

И как нам создать их, используя изображение RGB (которые являются типичными входами вашей модели MLP-Mixer)?

Слой Mixer принимает тензор формы ( batch_size , num_patches , num_channels ), а также выводит на выходе ту же форму. Вы можете задаться вопросом, как мы можем создать такой тензор из изображения RGB (которое является фактическим входом модели MLP-Mixer)? См. Диаграмму ниже,

Предположим, нам дано изображение RGB размером 4 * 4. Мы создаем участки, которые не перекрываются *, используя двухмерную свертку. Допустим, нам нужны квадратные участки размером 2 * 2. Как видно на рис. 9, мы можем создать 4 неперекрывающихся патча из входного изображения 4 * 4 (патч заштрихован для вас на схеме). Кроме того, используя фильтры C, мы преобразуем входное изображение размером image_dims * image_dims * 3 в тензор формы num_patches * num_patches * C, где num_patches = image_dims / patch_size. Обратите внимание, мы предполагаем, что image_dims полностью делится на patch_size. Рассматривая наш пример *, num_patches = ( 4 * 4 ) / ( 2 * 2 ) = 4.

В приведенном выше примере у нас есть num_patches=2.

наши примеры *: Особая благодарность нашему читателю Dr. Абдер-Рахман Али за указание на ошибку в расчете num_patches. Мы очень ценим его усилия по улучшению этой истории.

неперекрывающиеся *: чтобы создать неперекрывающиеся патчи, мы устанавливаем kernel_size=patch_size и strides=patch_size в слое Conv2D Кераса.

Наконец, мы изменяем размер участков формы num_patches * num_patches * C на num_patches^2 * C.

🧱 MLP смешивания токенов

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

Он [MLP-Mixer] принимает в качестве входных данных последовательность линейно проецируемых фрагментов изображения (также называемых маркерами) в форме таблицы «фрагменты * каналы» и поддерживает эту размерность.

Вот код для MLP смешивания токенов (роль LayerNormalization и Permute можно увидеть на рис. 8).

Как следует из названия, он смешивает токены или, другими словами, разрешает обмен данными между разными патчами в одном и том же канале. Как видно на рис. 11, количество каналов C не изменяется, и только P, т. Е. Количество патчи расширяются до некоторого размера (token_mixing_mlp_dims) и возвращаются к P.

🧱 MLP микширования каналов

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

Как видно на рис. 12, количество исправлений P не изменяется, а только C, т. Е. Количество каналы расширяются до некоторого размера (channel_mixing_mlp_dims) и возвращаются к C.

⚖️ Нормализация слоя

что отличается от пакетной нормализации

Нормализация партии использует среднее значение и дисперсию всей партии для нормализации активаций. В случае нормализации уровня (особенно для RNN) для выполнения нормализации используются среднее значение и дисперсия всех суммированных входов нейрона. Как упоминалось в статье,

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

Команда TF-Keras предоставляет tf.keras.layers.LayerNormalization слой для выполнения этой операции. Вот несколько ресурсов для понимания нормализации уровня,







Теперь, зная о слоях Mixer, мы можем приступить к реализации нашей модели MLP-Mixer для классификации. Эта модель будет принимать входное изображение RGB и вероятности выходного класса.

⚔️ Конец игры

Мы рассмотрим этот фрагмент кода построчно.

  1. Сначала создайте входной слой, который принимает изображения RGB желаемого размера.
  2. Реализуйте Conv2D, который создает патчи (помните, мы обсуждали это несколько десятилетий назад). Кроме того, добавьте слой Reshape, чтобы изменить форму токенов и преобразовать их в трехмерные тензоры.
  3. Добавьте num_mixer_layers слоев Mixer в модель.
  4. Наконец, слой LayerNormalization вместе со слоем GlobalAveragePooling1D.
  5. Наконец, Dense слой с нашей любимой активацией softmax.

Вот результат tf.keras.utils.plot_model, изображающий один слой микшера,

Выход model.summary(),

Вот и все, мы только что реализовали модель MLP-Mixer в TensorFlow!

💪🏼 Еще проекты / блоги / ресурсы от автора

Спасибо

Надеюсь, вам понравился рассказ! Не стесняйтесь обращаться ко мне по адресу [email protected]. Спасибо и хорошего дня впереди!