Почему был введен трансформатор?

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

Теперь трансформатор преодолел долговременную зависимость, минуя все предложение, а не слово за словом (последовательно). Который имел прямой доступ ко всем остальным словам и вводил механизм самоконтроля, не допускающий потери информации. Несколько новых моделей NLP, которые вносят большие изменения в индустрию ИИ, особенно в NLP, такие как BERT, GPT-3 и T5, основаны на архитектуре преобразователя. Преобразователь был успешным, потому что они использовали особый тип механизма внимания, называемый самовниманием. Мы подробно рассмотрим механизм внутреннего внимания.

Архитектура трансформатора

Transformer в NLP — это новая архитектура, которая направлена ​​на решение задач от последовательности к последовательности, с легкостью обрабатывая долгосрочные зависимости. Трансформатор был предложен в статье Внимание — это все, что вам нужно. На приведенном ниже рисунке показана архитектура Transformer. Мы собираемся разбить архитектуру Transformer на части, чтобы лучше понять ее.

Разбор архитектуры Transformer в этой статье выглядит следующим образом:

1 . Архитектура кодировщик-декодер

2. Архитектура кодировщика

2.1 Внедрение входных данных и позиционное кодирование

2.2 Механизм внутреннего внимания

2.3 Механизм внимания с несколькими головками

2.4 Сеть прямой связи

2.5 добавить и нормализовать компонент

3 . Архитектура декодера

3.1 Многоголовое внимание в маске

3.2 Многоголовое внимание

3.3 Сеть прямой связи

3.4 добавить и нормализовать компонент

4. Слои Linear и softmax

5. Объединение кодировщика и декодера

1. Архитектура кодера-декодера:

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

Например, если мы создаем модель машинного перевода с английского на немецкий. Предположим, что данное входное предложение кодировщику — «Как дела?» и на выходе декодера должно быть «Wei geht’s?». См. рис. 2 ниже.

Итак, необработанные входные данные «Как дела» передаются кодировщику, который фиксирует семантическое значение предложения в векторах, говоря 100-мерный вектор для каждого слова. Таким образом, представление может быть в виде матрицы (3100), где 3 — количество слов, а 100 — размер каждого вектора слов. Это векторное представление от кодировщика передается декодеру, который создает модель машинного перевода, преобразующую векторное представление в выходные данные в удобочитаемой форме.

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

Например, если мы создаем модель машинного перевода с английского на немецкий. Предположим, что данное входное предложение кодировщику — «Как дела?» и на выходе декодера должно быть «Wei geht’s?». См. рис. 2 ниже.

Итак, необработанные входные данные «Как дела» передаются кодировщику, который фиксирует семантическое значение предложения в векторах, скажем, в 100-мерном векторе для каждого слова. Таким образом, представление может быть в виде матрицы (3100), где 3 — количество слов, а 100 — размер каждого вектора слов. Это векторное представление от кодировщика передается декодеру, который создает модель машинного перевода, преобразующую векторное представление в выходные данные в удобочитаемой форме.

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

Например, если мы создаем модель машинного перевода с английского на немецкий. Предположим, что данное входное предложение кодировщику — «Как дела?» и на выходе декодера должно быть «Wei geht’s?». См. рис. 2 ниже.

Итак, необработанные входные данные «Как дела» передаются кодировщику, который фиксирует семантическое значение предложения в векторах, скажем, в 100-мерном векторе для каждого слова. Таким образом, представление может быть в виде матрицы (3100), где 3 — количество слов, а 100 — размер каждого вектора слов. Это векторное представление от кодировщика передается декодеру, который создает модель машинного перевода, преобразующую векторное представление в выходные данные в удобочитаемой форме.

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

2. Архитектура кодировщика:

Трансформатор состоит не только из одного энкодера, как на рис. 2. Он состоит из нескольких энкодеров, расположенных друг над другом. Выход кодировщика 1 отправляется в качестве входных данных в кодировщик 2, а кодировщик 2 отправляется в качестве входных данных в кодировщик 3 и так далее, пока кодировщик n и кодировщик n не вернут представление предложения «Как дела?» на декодер в качестве входа. Как показано на рисунке 3 ниже.

Каждый блок состоит из 2 подуровней Multi-head Attention и Feed Forward Network, как показано на рисунке 4 выше. Это то же самое в каждом блоке кодировщика, все блоки кодировщика будут иметь эти 2 подуровня. Прежде чем погрузиться в Multi-head Attention 1-й подуровень, мы сначала увидим, что такое механизм внимания к себе.

2.1. Внедрение входных данных и позиционное кодирование

Внедрение входных данных:

Входные вложения — это просто встраивание слоев. Слой внедрения берет последовательность слов и изучает векторное представление для каждого слова. Это векторное представление

Позиционное кодирование:

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

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

мы создаем датчик положения с помощью функций sin и cos:

Взяв часть греха из формулы. Предположим, что в предложении 5 слов. Где d=5 , (p0,p1,p2,p3,p4) будет позиция каждого слова. Сохранение I,d статичными и меняющимися положениями. У нас есть,

Если мы построим кривую синусоиды и изменим «pos» (по оси x), вы получите разные значения положения по оси y. Следовательно, слова с разными позициями будут иметь разные значения вложений позиций.

Однако есть проблема. Поскольку кривая «sin» повторяется с интервалами, вы можете видеть на рисунке выше, что P0 и P6 имеют одинаковые значения встраивания позиции, несмотря на то, что они находятся в двух очень разных позициях. Здесь вступает в игру часть «i» в уравнении.

Если вы измените «i» в приведенном выше уравнении, вы получите набор кривых с разными частотами. Чтение значений встраивания положения на разных частотах дает разные значения при разных размерах вложения для P0 и P6.

2.2. Механизм самоконтроля

Механизм внутреннего внимания гарантирует, что каждое слово в предложении имеет некоторые знания о словах контекста. Например, мы используем эти известные предложения «Животное не перешло улицу, потому что оно было слишком длинным» и «Животное не перешло улицу, потому что слишком устало» в этих предложениях «это» относится к «улице», а не к «животному» в предложении 1, а «это» относится к «животному», а не к «улице» в предложении 2.

Так что «это» полностью зависит от слов «долго» и «устало». Слово «длинный» зависит от «улица», а «усталый» зависит от «животное». Как сделать так, чтобы модель это поняла!? Вот где мы используем механизм само-внимания. Механизм внутреннего внимания гарантирует, что каждое слово связано со всеми словами.

Давайте снова возьмем предложение «Как дела», и вложение каждого слова будет иметь 100 измерений. Тогда размерность входной матрицы будет X[3,100], где 3 — количество слов, а 100 — размерность каждого слова.

Механизм самообучения обучается с помощью матриц Запроса(Q), Ключа(K) и Значения(V) . Эти матрицы запроса, ключа и значения создаются путем умножения входной матрицы X на матрицы весов WQ, WK, WV. Матрицы весов WQ, WK, WV инициализируются случайным образом, и их оптимальные значения будут изучены в процессе обучения.

Вот как мы вычисляем матрицы запроса, ключа и значения. Мы увидим, как Q, K и V используются в механизме внутреннего внимания. Механизм само-внимания включает четыре шага.

Шаг 1:

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

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

Шаг 2:

2-й шаг механизма внутреннего внимания состоит в делении матрицы Q.KT на квадратный корень из размерности Ключевого вектора. Мы делаем это, чтобы получить стабильный градиент.

Q.KT / √dk

Шаг 3:

Мы преобразуем ненормализованную форму Q.KT / √dk в нормализованную форму, применяя функцию softmax, которая помогает привести оценку к диапазону от 0 до 1 и сумме оценок, равной 1.

Матрица оценок = softmax (Q.KT / √dk)

Шаг 4:

Мы вычисляем матрицу внимания z, умножая матрицу баллов на матрицу ценности.

Таким образом, значение ZHow будет содержать 98% значения из вектора значений (How), 1% значения из вектора значений (вы), 1% значения из вектора значений (делает). См. рис. 9 выше.

Аналогично, в примере «Животное не перешло улицу, потому что она была слишком длинной» значение Zit можно вычислить с помощью 4 шагов, упомянутых выше. Тогда Zit будет:

Значение собственного внимания слова «это» содержит 81% значения из вектора значений V6 (улица). Это помогает модели, что слово «это» на самом деле относится к «улице», а не к «животному» из приведенного выше предложения. Таким образом, мы можем понять, как слово связано со всеми другими словами в предложении, используя механизм внутреннего внимания.

2.3. Многоголовый механизм внимания

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

Итак, для фразы «Как дела» мы вычислим первую одиночную матрицу внимания, создав матрицы Запроса (Q1), Ключа (K1) и Ценности (V1). Он вычисляется путем умножения входной матрицы (X) на взвешенные матрицы WQ, WK и WV. Тогда наша первая матрица внимания будет такой:

Z1 = Softmax(Q1.K1T / √dk1)

Затем мы вычислим вторую матрицу внимания, создав матрицы запроса (Q2), ключа (K2) и значения (V2) путем умножения входной матрицы (X) на взвешенную матрицу WQ, WK и WV. Тогда наша вторая матрица внимания будет такой:

Z2 = Softmax(Q2.K12T / √dk2)

Аналогичным образом мы вычислим n матриц внимания (z1, z2, z3,….zn), а затем объединим все матрицы внимания. Таким образом, наши многоголовые матрицы внимания:

Внимание с несколькими головками = Concatenate(Z1,Z2,….Zn)*W0

Где W0 — весовая матрица.

2.4. Сеть прямой связи

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

2.5. Добавить и нормализовать компонент

Компонент add и Norm в основном представляет собой остаточное соединение, за которым следует нормализация слоя. Он соединяет вход и выход подслоев.

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

3. Архитектура декодера

Это стек блоков декодера, каждый блок принимает представление кодировщиков в качестве входных данных с предыдущим декодером. Таким образом, каждый декодер получает два входа. При этом каждый предсказывает выход на временном шаге t.

Из GIF выше из блога jalammar’s.

Декодер принимает ввод ‹sos› как первый токен. На временном шаге t=2 декодер получает два входа: один из предыдущего вывода из предыдущего предсказания декодера, а другой - представление кодера с тем, что он предсказывает «am». На временном шаге t=3 декодер получает выходные данные из предыдущего вывода и из представления кодера с тем, что он предсказывает «а». Точно так же он предсказывает, пока не достигнет конечной лексемы ‹eos›.

3.1. Многоголовое внимание в маске

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

X = встраивание вывода + позиционное кодирование

X будет передан в качестве входных данных для первого декодера. Теперь мы создаем матрицы Query(Q), Key(K) и Value(V) путем умножения весовых матриц WQ, WK и WV на X, когда мы делал в энкодерах.

Затем мы вычисляем Qi.KiT / √dki, который равен приведенной ниже матрице.

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

Выход этого замаскированного блока внимания добавляется и нормализуется путем применения softmax к замаскированной матрице Qi.KiT / √dki перед передачей в другой блок внимания.

3.2. Многоголовое внимание

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

Давайте представим представление кодировщика как R, а матрицу внимания, полученную в результате подуровня маскированного множественного внимания, как M. Поскольку у нас есть взаимодействие между кодером и декодером, этот уровень называется слоем внимания кодировщик-декодер. сильный>.

Матрица запроса по существу содержит целевое предложение. Поскольку он получен из M, а матрицы Key и Value содержат представление исходного предложения. Поскольку он получен от Р.

Затем мы вычисляем матрицу баллов, как мы это делали в кодировщиках. Но на этот раз мы получили матрицы Q, K и V из двух разных матриц.

Z1 = Softmax(Q1.K1T / √dk1), Z2 = Softmax(Q2.K12T / √dk2)…

Затем мы вычисляем многоголовое внимание, используя z1, z2, z3,….zn сверху.

Многоголовное внимание = Concatenate(Z1,Z2,….Zn)*W0

3.3 Нейронная сеть с прямой связью и добавление и нормирование

Это работает так же, как кодировщики.

4. Линейный слой и слой Softmax

Декодер изучает представление целевого предложения/целевого класса/зависит от проблемы. Мы передаем это представление самого верхнего декодера слоям Linear и Softmax.

Линейный слой генерирует логиты, размер которых равен размеру словаря. Предположим, в нашем лексиконе всего 3 слова «Как дела». Тогда логиты, возвращаемые линейным слоем, будут иметь размер 3. Затем мы конвертируем логиты в вероятность с помощью функции softmax, декодер выдает слово, индекс которого имеет более высокое значение вероятности.

5. Соединяем кодировщик-декодер

Ссылка:

1. Вдохновленный книгой Начало работы с Google Bert г-на Судхарсана Равичандиран.

2. Блог модели Визуализация нейронного машинного перевода от Jay Alammar.

3. Блог Иллюстрированное руководство по трансформеру.

4. Блог Позиционное кодирование.

5. StackExchange Thread — позиционное кодирование в преобразователе. Лучшее объяснение позиционного кодирования

6. Блог Колы.