Сатья Кришнан Суреш, Шунмугаприя П.

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

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

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

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

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

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

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

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

Самостоятельное внимание кодирует контекст, используя три тензора — Запрос, Ключ и Значение — и некоторые математические операции, относящиеся к этим тензорам. Тензоры генерируются с использованием обучаемой линейной проекции вложений, переданных слою. Смысл этих тензоров можно понять на простом примере. Когда вы ищете «Война бесконечности» в Google, текст поиска, который вы вводите, называется запросом. Серверы Google будут иметь хеш-ключи для похожих запросов, и эти ключи сопоставляются с запросом, чтобы найти оценки сходства. Эти хэш-ключи являются ключами в обсуждении. Наконец, содержимое, возвращаемое пользователю, является ценностью.

В стандартном механизме внимания запрос исходит от декодера, а пара «ключ-значение» предоставляется кодировщиком. Но в механизме внутреннего внимания запрос также исходит от кодировщика. Умножение матрицы между тензорами запроса и ключа дает оценку сходства токена (слова) со всеми другими токенами (словами). Поскольку значения, полученные в результате умножения матриц, могут быть большими, softmax применяется к матрице оценок и, наконец, умножается на матрицу значений для создания выходных данных этого слоя. Ниже приведен код слоя внимания в PyTorch.

Multi-Head Attention:
По сути, Multi-Head Attention состоит из нескольких единиц внутреннего внимания. Это потому, что каждая голова внимания будет фокусироваться на определенной особенности текста. Одна голова может сосредоточиться на отношениях между подлежащим и глаголом, а другая может сосредоточиться на времени текста и так далее. Это похоже на использование нескольких фильтров в одном сверточном слое, и, как мы знаем из ансамбля, несколько моделей чаще всего приводят к хорошим результатам.

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

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

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

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

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

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

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