Попытка понять трансформеры

Архитектура Трансформеры была представлена ​​в статье Внимание - это все, что вам нужно. Подобно CNN для компьютерного зрения, трансформеры предназначены для NLP. Простой вариант повседневного использования, который можно создать с помощью трансформаторов, - это чат-бот для разговора.

Я не буду вдаваться в историю таких моделей, как LSTM, RNN и GRU, которые использовались для аналогичных вариантов использования, но нужно иметь в виду одну вещь: эти модели не могли улавливать зависимости дальнего действия по мере того, как отрывок или текст становились длиннее. и дольше.

Архитектура преобразователя состоит из кодировщика и декодирующей сети. На изображении ниже блок с левой стороны - это кодировщик (с одним вниманием с несколькими головками), а блок с правой стороны - это декодер (с вниманием с двумя несколькими головами).

Сначала я объясню блок кодера, то есть от создания встраивания ввода до генерации закодированного вывода, а затем блок декодера, начиная с передачи ввода стороны декодера до вероятностей вывода с использованием функции softmax.

Блок кодировщика

Преобразование слов в встраивание слов

Создание позиционного кодирования

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

Добавление позиционного кодирования и встраивания ввода

Модуль внимания с несколькими головами

Создание векторов запросов, ключей и значений

На последнем этапе мы сгенерировали встраивание позиционного ввода. Используя это вложение, мы создаем набор векторов запросов, ключей и значений, используя линейные слои. Для ясности: для каждого слова у нас есть векторы Q, K и V.

Лучшая аналогия наблюдается в переполнении стека для Q, K и V с поиском Youtube, где текстовый поиск видео является запросом, а слова в запросе сопоставляются с ключами в базе данных youtube и который, в свою очередь, выявляет значения то есть видео.

Внимание, одна голова изнутри

Многоголовое внимание использует особый механизм внимания, называемый самовниманием. Цель самовнимания - связать каждое слово со всеми остальными словами в последовательности.

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

Точечное произведение между Q и V

Уменьшение матрицы оценок

  • Матрица оценок создается после выполнения скалярного произведения между запросами и ключами.
  • Чтобы стабилизировать градиенты от взрыва градиента, мы масштабируем матрицу оценок, разделяя ее с помощью √d_k, d_k - размер ключей и запросов.
  • После уменьшения матрицы оценок мы выполняем softmax поверх масштабированной матрицы оценок, чтобы получить оценку вероятностей. Эта матрица с оценкой вероятности называется весом внимания.

  • И после этого мы выполняем скалярное произведение между ценностями и весами внимания.
  • Это помогает в посещении определенных слов и опускать другие слова с более низкой оценкой вероятности.

Заглушение неуместных слов с помощью весов внимания

Нейронная сеть с прямой связью

На выходе кодировщика мы видели один кодировщик или один блок внимания. Далее мы увидим, что здесь означает «мультиголовка».

Теперь все шаги, которые мы видели в блоке кодировщика, представляют собой просто одну головку с многоголовым вниманием, чтобы сделать его многоголовым, мы копируем векторы Q, K и V через разные N головок. Операции после создания векторов Q, K и V называются модулем самовнимания.

Вывод внимания с несколькими головами

Выход энкодера

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

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

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

Блок декодера

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

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

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

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

Создание векторов ценности

Первый шаг - создание векторов значений с использованием входных данных декодера и генерация весов внимания.

Masked Multi-Head Attention слово за словом генерирует последовательность, которую мы должны обусловить, чтобы предотвратить просмотр будущих токенов.

Маскированный счет

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

Например, при вычислении оценки внимания для входного слова I модель не должна иметь доступа к будущему слову am. Потому что это будущее слово, которое генерируется после. Каждое слово может соответствовать всем другим предыдущим словам. Чтобы модель не видела будущие входные данные, мы создаем опережающую маску.

Маскирование добавляется перед вычислением softmax и после масштабирования оценок.

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

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

Вывод внимания с несколькими головками декодера

  • Многоголовое внимание сопоставляет вывод кодера с выводом декодера (маскированный вывод), позволяя декодеру решить, какой вывод кодера является релевантным и на котором нужно сосредоточиться.
  • Затем вывод из второго внимания с несколькими головами пропускается точечно через FFNN для дальнейшей обработки.
  • Вывод FFNN через линейный слой, который действует как уровень классификатора
  • Каждое слово словаря имеет оценку вероятности после прохождения функции softmax.
  • Макс. вероятность - это наше предсказанное слово. Это слово снова отправляется обратно в списки входов декодера.
  • Этот процесс продолжается до тех пор, пока декодер не сгенерирует токен ‹END›.
  • Я не упомянул остаточную сеть, нарисованную в архитектуре. Это похоже на то, что мы видели в кодировщике. Он служит той же цели.

Вышеупомянутый процесс снова расширяется с помощью N головок с копиями Q, K и V, образующими разные головки. Каждая голова узнает разное соотношение между выходом кодера и входом декодера.

Спасибо за прочтение. Если вам понравилось читать мои статьи, ищите больше статей здесь.

Свяжитесь со мной в LinkedIn и Twitter 🐅 ✋