Transformer — документ, опубликованный Google Brain в конце 2017 года.attention is all you needМодель seq2seq, предложенная в . Теперь он имеет широкий спектр приложений и расширений, а BERT представляет собой предварительно обученную языковую модель, полученную из Transformer.
Эта статья разделена на следующие разделы
- Интуитивное понимание трансформатора
- Positional Encoding
- Self Attention Mechanism
- Остаточные соединения и нормализация слоев
- Общая структура энкодера трансформатора
- Общая структура декодера трансформатора
- Суммировать
- Справочная статья
0. Интуитивное понимание трансформатора
Самая большая разница между Transformer и LSTM заключается в том, что обучение LSTM является итеративным и последовательным, и он должен дождаться обработки текущего слова, прежде чем можно будет обработать следующее слово. А обучение Трансформера идет параллельно, то есть всеХарактеробучаются одновременно, что значительно увеличивает эффективность вычислений. Transformer использует позиционное кодирование, чтобы понять порядок языка, механизм самоконтроля (механизм самоконтроля) и полносвязный слой для вычислений, который будет обсуждаться позже.
Модель Transformer в основном разделена на две части, а именноEncoderиDecoder.EncoderОтвечает за введение ввода (языковой последовательности) вскрытый слой(часть, представленная сеткой из девяти квадратов на шаге 2 на рисунке ниже), а затем декодер сопоставляет скрытый слой с последовательностью естественного языка. Например, пример машинного перевода на рисунке ниже (при выводе Декодера через N-слойный Слой Декодера выводится токен, а не через Слой Декодера выводится токен)
Большая часть этой статьи посвящена объяснениюEncoderчасть, т.е.Процесс преобразования последовательностей естественного языка в математические представления скрытых слоев.. После понимания структуры кодировщика очень просто понять декодер.
На приведенном выше рисунке показана структурная схема блока кодировщика трансформатора.Примечание: Следующие номера заголовков соответствуют порядковым номерам блоков 1, 2, 3 и 4 на рисунке соответственно.
1. Positional Encoding
Из-за модели TransformerнетИтеративная работа рекуррентной нейронной сети, поэтому мы должны предоставить информацию о положении каждого слова преобразователю, чтобы он мог распознавать отношения порядка в языке.
Теперь определитепозиционное вложениеКонцепция , то есть позиционного кодирования, размерность позиционного встраивания[max_sequence_length, embedding_dimension]
, размерность встраивания позиции такая же, как размерность вектора слова, какembedding_dimension
.max_sequence_length
Он относится к гиперпараметру, который относится к пределу количества слов, из которых состоит каждое предложение.
Обратите внимание, что мы обычно используемХарактерТренируйте модель Трансформера для юнитов. Сначала инициализируйте размер кодировки слова как[vocab_size, embedding_dimension]
,vocab_size
количество всех слов в библиотеке шрифтов,embedding_dimension
Это размер вектора слов, соответствующий PyTorch, который на самом делеnn.Embedding(vocab_size, embedding_dimension)
В статье используется линейное преобразование функций sin и cos для предоставления информации о позиции модели:
В приведенной выше формулеОтносится к положению слова в предложении, диапазон значений,Он относится к размерному числу вектора слов, а диапазон значений равен,Относится к значению embedding_dimension
ЕстьиНабор формул, то есть набор нечетных и четных измерений порядкового номера, соответствующих размерности embedding_dimension, таких как набор 0, 1, набор 2, 3, соответственно, используют вышеуказанноеиФункция обрабатывается для создания различных периодических изменений, а положение встраивается в измерение embedding_dimension.По мере увеличения числа измерений периодическое изменение будет становиться все медленнее и медленнее, и, наконец, будет сгенерирована текстура, содержащая информацию о положении, как и оригинал текст статьи Как упоминалось на стр. 6, период функции позиционного вложения начинается сприбытьизменяется, и каждая позиция получит свой период в измерении embedding_dimensionиКомбинация значений функции генерирует уникальную информацию о положении текстуры и, наконец, позволяет модели изучать зависимости между положениями и временными характеристиками естественного языка.
Если вы не понимаете, почему он разработан таким образом, вы можете прочитать эту статьюПозиционное кодирование в Transformer
Нарисуйте вложение положения ниже и наблюдайте его в продольном направлении.Можно увидеть, что по мере увеличения числа embedding_dimensionпериодическое изменение функции встраивания положения становится более плавным и плавным.
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import math
def get_positional_encoding(max_seq_len, embed_dim):
# 初始化一个positional encoding
# embed_dim: 字嵌入的维度
# max_seq_len: 最大的序列长度
positional_encoding = np.array([
[pos / np.power(10000, 2 * i / embed_dim) for i in range(embed_dim)]
if pos != 0 else np.zeros(embed_dim) for pos in range(max_seq_len)])
positional_encoding[1:, 0::2] = np.sin(positional_encoding[1:, 0::2]) # dim 2i 偶数
positional_encoding[1:, 1::2] = np.cos(positional_encoding[1:, 1::2]) # dim 2i+1 奇数
return positional_encoding
positional_encoding = get_positional_encoding(max_seq_len=100, embed_dim=16)
plt.figure(figsize=(10,10))
sns.heatmap(positional_encoding)
plt.title("Sinusoidal Function")
plt.xlabel("hidden dimension")
plt.ylabel("sequence length")
plt.figure(figsize=(8, 5))
plt.plot(positional_encoding[1:, 1], label="dimension 1")
plt.plot(positional_encoding[1:, 2], label="dimension 2")
plt.plot(positional_encoding[1:, 3], label="dimension 3")
plt.legend()
plt.xlabel("Sequence length")
plt.ylabel("Period of Positional Encoding")
2. Self Attention Mechanism
для входного предложения, вектор слов каждого слова в предложении получается с помощью WordEmbedding, а вектор положения всех слов получается с помощью позиционного кодирования, и они складываются (размеры одинаковы и могут быть добавлены напрямую) для получения истинного векторного представления слова. первоевекторное обозначение слова
Затем определим три матрицы, используйте эти три матрицы для выполнения трех линейных преобразований для всех векторов слов, чтобы все векторы слов производили три новых вектора. мы все будемВекторы собираются в большую матрицу, обозначаемую какматрица запросов, поставить всеВекторы собираются в большую матрицу, обозначаемую какматрица облигаций, поставить всеВекторы собираются в большую матрицу, обозначаемую какматрица значений(Увидеть ниже)
Чтобы получить вес внимания первого слова, нам нужно использовать первое слововектор запросаумножить наключевая матрица K(Увидеть ниже)
[0, 4, 2]
[1, 0, 2] x [1, 4, 3] = [2, 4, 4]
[1, 0, 1]
После этого полученные значения нужно софтмаксизировать, чтобы их сумма была равна 1 (см. рисунок ниже)
softmax([2, 4, 4]) = [0.0, 0.5, 0.5]
Получив вес, умножьте вес на значение соответствующего слова.вектор значения(Увидеть ниже)
0.0 * [1, 2, 3] = [0.0, 0.0, 0.0]
0.5 * [2, 8, 0] = [1.0, 4.0, 0.0]
0.5 * [2, 6, 3] = [1.0, 3.0, 1.5]
наконец поставил этисумма взвешенных векторов значений, чтобы получить вывод первого слова (см. изображение ниже)
[0.0, 0.0, 0.0]
+ [1.0, 4.0, 0.0]
+ [1.0, 3.0, 1.5]
-----------------
= [2.0, 7.0, 1.5]
Выполните ту же операцию с другими входными векторами, чтобы получить все выходные данные после самоконтроля.
Матричный расчет
Описанный выше метод требует цикла для перебора всех слов., мы можем преобразовать приведенный выше векторный расчет в форму матрицы, чтобы вычислять выход в любое время в одно и то же время.
Первый шаг - не рассчитывать момент, но вычисляет все моменты сразуи. Процесс расчета показан на рисунке ниже, где входными данными является матрица, сначала матрицаповедениевекторное представление слов
Далее будетиУмножить, а затем разделить на(Это трюк, упомянутый в статье), после умножения softmax наполучить вывод
Multi-Head Attention
В этой статье также предлагается концепция многоголового внимания. На самом деле это очень просто, набор ранее определенныхСлово может быть присоединено к родственным словам, и мы можем определить несколько групп, пусть они сосредоточатся на разных контекстах. рассчитатьПроцесс тот же, за исключением того, что линейное преобразование матрицы из наборастала мультигруппой,,…Как показано ниже
для входной матрицы, каждая группа,иможно получить выходную матрицу. Как показано ниже
Padding Mask
В приведенном выше процессе вычисления Самовнимания мы обычно используем мини-пакет для вычисления, то есть для вычисления нескольких предложений за раз, то естьРазмерность[batch_size, sequence_length]
,sequence_lengthэто длина предложения, а мини-пакет состоит из нескольких предложений разной длины. Нам нужно заполнить оставшиеся предложения в соответствии с наибольшей длиной предложения в этом мини-пакете, обычно с 0 для заполнения, Этот процесс называется дополнением
Но в это время softmax вызовет проблемы. Просмотрите функцию softmax,Если это значение равно 1. В этом случае в операции будет участвовать заполняющая часть softmax, что эквивалентно участию в операции недопустимой части, что может привести к большим скрытым опасностям. Поэтому необходимо выполнить операцию маскирования, чтобы эти недопустимые области не участвовали в операции.Как правило, к недопустимой области добавляется большое отрицательное смещение, т. е.
3. Остаточные соединения и нормализация слоев
остаточное соединение
Мы получили результат после взвешивания собственного внимания на предыдущем шаге, то есть, а затем сложите их, чтобы сделать остаточные соединения
Layer Normalization
Функция нормализации слоев состоит в том, чтобы нормализовать скрытые слои в нейронной сети до стандартного нормального распределения, то естьНезависимое и идентичное распределение для увеличения скорости обучения и ускорения сходимости.
Приведенная выше формула находит среднее значение в единицах измерения столбца матрицы;
Приведенная выше формула находит дисперсию в единицах столбцов матрицы
затем используйтекаждый столбецизкаждый элементминуссреднее значение этого столбца, затем разделите настандартное отклонение этого столбца, чтобы получить нормализованное значение, добавьтечтобы знаменатель не был равен 0
На следующем изображении показаны более подробные сведения.После того, как уровень само-внимания становится, то с вводомВыполняется остаточное соединение, и после LayerNorm оно выводится на полносвязный слой. Полносвязный слой также имеет остаточное соединение и LayerNorm, которые, наконец, выводятся на следующий кодировщик (веса слоя FeedForward в каждом блоке кодировщика являются общими).
4. Общая структура энкодера трансформатора
После вышеуказанных 3 шагов мы в основном понялиEncoderОсновные компоненты , давайте воспользуемся формулой, чтобы разобраться в процессе расчета блока кодировщика:
1).Векторное слово и кодирование положения
2) Механизм внутреннего внимания.
3) Остаточное соединение с самостоятельным вниманием и нормализация уровня.
4) Ниже представлена блок-схема энкодера.Часть 4, то есть FeedForward, который фактически является двухслойной линейной картой и активируется функцией активации, например
5) Остаточное соединение FeedForward и нормализация уровня
в
5. Общая структура трансформаторного декодера
Давайте сначала рассмотрим структуру Decoder с точки зрения HighLevel, снизу вверх:
- Masked Multi-Head Self-Attention
- Multi-Head Encoder-Decoder Attention
- FeedForward Network
Как и кодировщик, каждая из трех вышеперечисленных частей имеет остаточное соединение, за которым следуетLayer Normalization. Средние части Декодера не сложны, большинство из них были представлены в предыдущем Энкодере, но из-за его специальных функций Декодер потребует некоторых деталей во время обучения.
Masked Self-Attention
В частности, декодер в традиционном Seq2Seq использует модель RNN, поэтому ввод в процессе обученияслова моментов, модель все равно не может видеть слова будущих моментов, потому что RNN управляются временем, только когдаТолько когда время операции закончилось, вы можете увидетьслово момента. Декодер-трансформер отказался от RNN и изменил его на Само-внимание, что вызвало проблему.В процессе обучения вся основная правда раскрывается в Декодере, что явно неправильно.Нам нужно выполнить некоторую обработку на входе Декодера ., процесс называется Маска
Например, основная истина Декодера — «
После повторного выполнения softmax можно изменить -inf на 0, а полученная матрица — это вес между каждым словом
Multi-Head Self-Attention — это не что иное, как параллельное выполнение вышеуказанных шагов несколько раз Кодировщик также был представлен ранее, поэтому я не буду здесь вдаваться в подробности.
Masked Encoder-Decoder Attention
На самом деле, процесс вычисления этой части очень похож на предыдущую «Самовнимание в маске», и структура точно такая же, с той лишь разницей, что здесьявляется выходом кодировщика,Это результат маскированного собственного внимания в декодере.
6. Резюме
На данный момент представлено 95% содержимого Transformer, и мы используем картинку, чтобы показать его полную структуру. Я должен сказать, что дизайн Трансформера очень изобретателен.
Ниже приведены несколько вопросов, которые я нашел в Интернете.Я чувствую, что после прочтения смогу лучше понять Transformer.
Почему Transformer нуждается в многоголовом внимании?
В исходной статье причина многоголового внимания заключается в том, чтобы разделить модель на несколько головок для формирования нескольких подпространств, что позволяет модели обращать внимание на разные аспекты информации и, наконец, интегрировать информацию со всех сторон. На самом деле, интуитивно понятно, что если вы спроектируете такую модель самостоятельно, вы будете заниматься не только одним вниманием, результат синтеза множественного внимания может, по крайней мере, сыграть роль в улучшении модели, а также может быть использован по аналогии с CNN в то же время.Несколько ядер сверткиРоль, интуитивно, внимания быковПомогает сети захватывать более богатые функции/информацию
Каковы преимущества Transformer по сравнению с RNN/LSTM? Зачем?
- Модели серии RNN не могут быть рассчитаны параллельно, потому что расчет в момент времени T зависит от результата расчета скрытого слоя в момент времени T-1, а расчет в момент времени T-1 зависит от результата расчета скрытого слоя в момент времени T -2
- Возможность извлечения признаков трансформатора лучше, чем у моделей серии RNN.
Почему говорят, что Transformer заменяет seq2seq?
Использовать это слово несколько неуместно. Хотя seq2seq устарела, она все еще имеет свое место. Самая большая проблема seq2seq заключается в том, чтоСожмите всю информацию на стороне кодировщика в вектор фиксированной длины., и используйте его в качестве входных данных первого скрытого состояния на стороне декодера, чтобы предсказать скрытое состояние первого слова (лексемы) на стороне декодера. Когда входная последовательность относительно длинная, это, очевидно, приведет к потере большого количества информации на стороне кодировщика, и таким образом фиксированный вектор отправляется на сторону декодера.Сторона декодера не может обращать внимание на информацию, на которую она хочет обратить внимание.. Transformer не только существенно устраняет два недостатка модели seq2seq (модуль интерактивного внимания с несколькими головками), но также вводит модуль самоконтроля, который позволяет исходной последовательности и целевой последовательности сначала «самоассоциироваться». исходная последовательность Представление внедрения самой целевой последовательности содержит больше информации, а последующий уровень FFN также повышает выразительную способность модели, а возможности параллельных вычислений Transformer намного превосходят возможности серии моделей seq2seq.