Cracking Attentions - создание основы для понимания последних моделей SOTA NLP.

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

Если вы новичок в этой модели, скорее всего, вы не найдете ее самой простой для понимания. Если это так, я надеюсь, что эта статья может вам помочь.

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

Сеть кодировщика-декодера для нейронного машинного перевода

На изображении слева показана архитектура кодировщика-декодера, в которой оба компонента состоят из повторяющихся слоев.

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

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

Эта архитектура предпочтительнее более простой RNN последовательность-последовательность, поскольку вектор контекста из кодировщика обеспечивает более прямое доступ к предложению input в целом. Следовательно, декодер может просмотреть все предложение через вектор контекста перед выводом единственного перевода, в то время как обычная RNN «последовательность-последовательность» имеет доступ только к словам, расположенным до текущего временного шага.

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

Внимание

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

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

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

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

Say that we have only one input sentence X = [x1, x2, ..., xn] in our batch, it has N words and each is represented by its embedding vector of length M. The input sentence is then a sequence with a shape of N x M.
The encoder is used to output a good summary of the input sentence by transforming X into its encodings Z = [z1, z2, ..., zn], with zi being the encoding of the word in the i-th position.
The dimension of each encoding vector z is determined by the number of neurons from the encoder's the last layer.
A set of attention weights ⍺ = [⍺1, ⍺2, ..., ⍺n], at a given time step t, is a N-dimensional vector. Each element multiples one word encoding from Z, outputting a weighted sum, ∑⍺i x zi.

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

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

But why attentions are determined using the previous hidden state, and why is this similarity important?
Say that we are using this model to translate a sentence from one language to another and we’ve just finished translating one word and we’re working on the next output.
The hidden state of the decoder from the previous step contains information regarding the last output. Since the model is trained to predict the next word, this hidden state can be seen as something related to what the model wants to predict as the next word. It’s then logical to search for information similar to the hidden state from the encoder sequence to produce the next translation.

Внимание к себе

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

Этот образ образно иллюстрирует самовнимание. Соответствие каждого слова слову ‘it’ выражается силой соединяющей их линии.

В этом случае не все слова имеют одинаковое отношение к слову 'it', разные слова из предложения имеют разный уровень важности. к этому слову, включая само "оно".

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

Уравнение, используемое для самовнимания, такое же, как показано выше, за исключением того, что теперь вместо использования скрытого состояния h используется предложение само как запрос, а значение внутри softmax масштабируется, чтобы softmax не имел пренебрежимо малого градиенты.

Под капотом внимание - это просто инструмент, с помощью которого модель выполняет поиск, сопоставляя запрос с набором пары "ключ-значение" выход. Компонент из Value извлекается только в том случае, если его соответствующий ключ совпадает с запросом.

В раннем случае Q было скрытым состоянием h, и оба K и V были выходными данными кодировщика S. S и h используются для поиска внимания весов ⍺ , а затем они используются для получения соответствующих компонентов из S путем выполнения ⍺ ⋅ S.

Из-за последовательного характера повторяющихся слоев мы не можем упаковать все скрытые состояния в матрицу и найти все веса внимания за один раз. Вес внимания определялся на каждом временном шаге.

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

А теперь давайте посмотрим на архитектуру Transformer, здесь еще многое предстоит сделать.

Трансформатор и внимание нескольких головок

Модель снова состоит из структуры кодер-декодер, и каждый, в свою очередь, состоит из N (= 6) блоков кодера / декодера, наложенных друг на друга.

Каждый блок кодировщика / декодера передает свой вывод в следующий, а вывод из последнего блока кодирования передается в каждый из N блоков декодирования.

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

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

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

По сути, модуль Multi-Head Attention - это просто набор масштабируемых скалярных вниманий, работающих параллельно. Для каждого внимания вводятся Q, K и V сначала проецируются в разные подпространства с использованием разных весовых матриц Wq, Wk и Wv. Таким образом, каждое внимание обрабатывает разные аспекты входных данных. Затем их выходы комбинируются линейно.

Его поведение в кодировщике довольно простое, он выполняет самовнимание с помощью Q, K и V - это одно и то же слово в предложении input. Каждый блок кодера передает свой вывод следующему, а последний вывод передается всем блокам декодера.

Для декодера замаскированное внимание нескольких голов применяется к целевым предложениям (во время обучения) с помощью будущего слова замаскированы вне, что предотвращает сравнение любого слова со следующими после него. Во время вывода декодер имеет доступ только к своему последнему выходу, поэтому маскирование не требуется. Выходы этого модуля передаются как Q в верхний уровень Multi-Head Attention, который получает кодировки от кодировщика и использует их как K и V. Его выходные данные повторно комбинируются с выходными данными модуля «Маскированное внимание» и передаются для дальнейшей обработки.

Наконец, выходные данные декодера передаются на плотный слой, а softmax в конце выводит свой перевод для текущего шага.

Заключительные слова

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

PS: У Альфредо есть бесплатный курс по глубокому обучению. Сходи, посмотри, если тебе интересно, и скажи мне, насколько это плохо!