В настоящее время существует два основных направления исследований в области глубокого обучения: поиск лучших архитектур или поиск лучших потерь для их обучения. Начиная с AlexNet (Kriwhevsky et al.), сверточная нейронная сеть является основной архитектурой, используемой в компьютерном зрении. Благодаря сверткам, с предшествующим эффективным патчем, были разблокированы многие визуальные задачи.

Было изобретено множество вариантов AlexNet, но если бы мы назвали только один, это был бы ResNet (Он и др.) И его остаточный ярлык.

Главный недостаток сверток - отсутствие глобального охвата. Проблема, относительно похожая на сложность рекуррентных нейронных сетей (например, RNN, LSTM, GRU) для моделирования длинных серий токенов. Сообщество НЛП увидело свой образный момент, когда была представлена ​​архитектура Transformer (Vaswani et al.). Сначала он был разработан с использованием довольно сложного кодировщика-декодера, а затем был усовершенствован в серии идентичных блоков в модели BERT (Devlin et al.). Используя трансферное обучение, большинство (все?) Задач НЛП были атакованы через архитектуру, подобную BERT.

Два вопроса:

- Что такое трансформаторы?

- А можно (нужно?) Применить их к компьютерному зрению?

1. Что такое трансформеры?

Я могу только порекомендовать отличный пост в блоге Джея Аламмара Иллюстрированный трансформатор, который очень хорошо объясняет эту архитектуру. Но вот краткий обзор, трансформатор в основном это:

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

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

1.1. Жетоны

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

На этом изображении четыре токена входят в блок и четыре токена выходят из блока. Следовательно, в конце N блоков у нас все еще будет четыре токена, но только один из них будет полезен! Первый токен, обозначенный здесь буквой «C», представляет собой специальный токен, называемый токеном класса. Он не принадлежит ни одному слову предложения, но на самом деле является вектором, который изучается во время градиентного спуска. Как только этот токен класса пройдет через N блоков, он будет передан классификатору, который предскажет, для чего вы тренируетесь.

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

1.2. Многогранное самовнимание

Это основная часть трансформатора. Во-первых, давайте сконцентрируемся на «самовнимании».

Начнем с матрицы X формы T x D, содержащей все T токенов. Эта матрица будет линейно преобразована (также известна как умножение матриц, или переход на полностью связанный слой) три раза параллельно:

Они представляют, соответственно, Q uery, K ey и V.

Мы вычисляем внимание A, квадратную матрицу формы T x T:

Как следует из названия, это внимание будет определять, насколько один токен соответствует другому. Обратите внимание, что форма матрицы внимания A равна T x T. Для каждой строки i значение столбца j - это сила связи между словом i и слово j.

Затем мы умножаем эту матрицу внимания на матрицу значений, чтобы выбрать данные:

Где Z - матрица исходной формы T x D.

Однако матрица внимания довольно ограничена: если вес внимания между токенами i и j велик, то из-за softmax он будет низким между токенами i и u. Чтобы смоделировать несколько видов внимания, мы используем несколько голов.

Допустим, у нас есть две головы, затем мы выполняем предыдущее самовнимание, но с разными линейными преобразованиями:

Но тогда у нас есть матрица Z ’, которая представляет собой конкатенацию Z₁ и Z₂ и, следовательно, больше, чем ожидалось. Мы просто снова используем линейное преобразование Wₒ формы 2D x D:

Вот упрощенная версия в PyTorch:

Обратите внимание, что на практике, чтобы размер Q / K / V не зависел от количества головок, мы обычно фиксируем максимальный размер встраивания и делим его поровну между головками на некотором пространстве.

1.3. Layer Norm и MLP

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

2. ViT: Vision Transformer

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

Некоторые включили часть самовнимания, как Axial-DeepLab (Wang et al.). Но никто, насколько мне известно, не использовал всю архитектуру трансформатора на изображениях до ViT (Досовицкий и др.). Почему? Что ж, в случае с изображениями количество жетонов огромно. Изображение 224 x 224 имеет 50 176 пикселей / токенов. Это слишком велико для графического процессора.

Ключевая идея, возможно, вдохновленная BagNet (Brendel et al.), Состоит в том, чтобы рассматривать группу пикселей как патч. Вместо тысяч токенов изображение разбивается на 14 x 14 = 196 токенов / патчей, каждый из которых состоит из 16 x 16 пикселей.

Архитектура трансформатора точно такая же, как в НЛП. Единственная разница в том, как встраивать токены. В данном случае это просто свертка, применяемая патчем на патч (называемая на изображении «линейной проекцией»). Помимо позиционного кодирования используется позиционное кодирование на основе положения патча на изображении.

Производительность ViT очень впечатляет. Но главный недостаток в том, что эта архитектура практически не имеет приоритета для изображений. Поэтому, хотя он потенциально может достичь лучших результатов при бесконечно большом объеме данных, его очень сложно обучить с несколькими изображениями. Авторы ViT, все из Google, используют большой частный набор данных JFT-300M для предварительного обучения своей модели перед передачей знаний в ImageNet- {21 / 1k}.

3. DeiT: более эффективное обучение

DeiT (Touvron et al.) - это расширение ViT с двумя основными вкладами: более эффективное обучение и преобразование знаний.

Благодаря тоннам регуляризации авторам удается обучить DeiT с нуля в ImageNet с хорошей производительностью. Две важные регуляризации - это случайное стирание пикселей изображения и стохастическая глубина (Хуанг и др.). Последнее представляет собой своего рода выпадение, но когда весь блок трансформатора отбрасывается, а используется только остаток.

Второй вклад DeiT - это предложение улучшить обучение трансформатора с помощью модели учителя. Стратегия учитель / ученик часто встречается там, где большая модель подготовленного учителя ставит перед учеником новые цели посредством извлечения знаний (Hinton et al.). По сути, ученика учат предсказывать надписи на изображении, а также имитировать вероятности учителя.

Первый интересный вывод: лучше использовать большой CNN (RegNet (Радосавович и др.)) В качестве учителя, чем большой преобразователь зрения. Интуитивно мы можем предположить, что это связано с тем, что учитель, основанный на свертке, усвоил разные знания и, таким образом, может лучше разнообразить прогнозы ученика.

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

3. ConViT: сделайте Prior снова великим

Для обучения ViT требуется 300-мегабайтный набор данных. DeiT только требуется набор данных размером 1,2 млн (ImageNet) для обучения. Но разве мы не можем учиться с помощью нескольких тысяч изображений, как старый добрый resNet?

Вам нужно предварительно изучить несколько точек данных.

Это сообщение ConViT (Д’Асколи и др.). Они превращают обычное самовнимание (СА) в закрытое позиционное самовнимание (GPSA):

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

Фактор силы местности α может модулировать, насколько большим должно быть это ядро:

Авторы обнаруживают, что в конце обучения ранние блоки-преобразователи (2–7) в основном используют позиционный априор, в то время как первый и последний блоки (8–10) используют глобальный охват самовнимания.

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

4. CaiT: Дальнейшие усовершенствования DeiT

Позднее авторы DeiT выпустили CaiT (Touvron et al.), Доработку DeiT.

Первый вклад - LayerScale, схема взвешивания для основной ветви в остаточной архитектуре. Что касается ResNet, каждый блок имеет две ветви: идентификационную ветвь, которая часто ничего не делает, и ветвь с обучаемыми параметрами. В случае трансформаторов этими параметрами являются либо MLP, либо Multi-Head Self-Attention.

Предыдущие работы (ReZero Bachlenchner et al., SkipInit De et al. И FixUp Zhang et al.) Задавались вопросом, можем ли мы обучить очень глубокую ResNet без пакетной нормализации. Все они обнаружили, с небольшими вариациями, что это было возможно, если бы основная ветвь блока ResNet была взвешена с помощью изученного скаляра. LayerScale предлагает более или менее то же самое, но с одной шкалой для каждого измерения, инициализированной небольшим значением ε:

Второй вклад CaiT очень похож на вклад ConViT (авторы частично те же): CaiT также вводит токен класса после нескольких блоков. Последние несколько блоков с токенами класса реализуют Внимание класса.

В отличие от Самовнимания, внимание этого класса замораживает токены патча:

Проще говоря, жетоны патчей больше не обновляются после каждого блока Class Attention. Более того, внимание больше не уделяется между всеми маркерами патчей Xp формы (T-1) x D (с квадратичной стоимостью T²), а только с маркером класса Xc формы 1xD (с линейной стоимостью T):

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

5. Будущее трансформеров видения

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

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

Но это при условии, что трансформатор действительно является правильным решением. Внимание - это все, что нам нужно? Недавнее исследование MLP (да, вы правильно прочитали) показывает, что, возможно, внимание - это лишь частный случай более общей структуры.

Мы расскажем об этом позже!