Практические руководства

Внимание и модели трансформаторов

Сложный алгоритм, просто объясненный

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

Базовая архитектура

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

Что не так ясно видно на рисунке, так это то, что Transformer фактически объединяет несколько кодировщиков и декодеров (что обозначено на изображении как Nx, поэтому кодеры и декодеры складываются n раз). Это означает, что выход одного кодера используется как вход для следующего кодировщика, а выход одного декодера - как вход для следующего декодера.

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

Что нового в Transformer, так это не его архитектура кодера-декодера, а то, что он устраняет традиционно используемые повторяющиеся слои. Вместо этого он полностью полагается на самовнимание.

Так что же такое самовнимание? Короче говоря, это способ модели осмыслить получаемые данные.

Одна из проблем рекуррентных моделей состоит в том, что зависимости на больших расстояниях (внутри последовательности или между несколькими последовательностями) часто теряются. То есть, если слово в начале последовательности имеет значение для слова в конце последовательности, модель могла забыть первое слово, когда достигла последнего слова. Не такие уж и умные эти RNN, не так ли? ;-) Модели-трансформеры используют другую стратегию, чтобы как-то запомнить всю последовательность: самовнимание!

В слое самовнимания вход x (представленный как вектор) превращается в вектор z через три репрезентативных вектора входа: q (ueries), k (eys) и v (alues). Они используются для расчета оценки, которая показывает, сколько внимания этот конкретный ввод должен уделять другим элементам в данной последовательности.

То, что я только что неопределенно выразил словами, гораздо точнее можно определить следующей формулой:

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

Допустим, мы хотим вычислить самовнимание для слова «пушистый» в последовательности «пушистые блины». Сначала мы берем входной вектор x1 (представляющий «пушистый») и умножаем его на три разные весовые матрицы Wq, Wk и Wv, чтобы получить три разных вектора: q1, k1 и v1. То же самое делается для входного вектора x2 (представляющего «блины»). Обратите внимание, что во время тренировки эти три матрицы веса постоянно обновляются. Затем мы вычисляем две оценки, умножая q1 на k1 и k2 соответственно. Эти оценки говорят нам, сколько внимания следует уделять словам «пушистый» и «блины», когда модель Transformer получает входные данные для слова «пушистый». Затем оценки делятся на квадратный корень из dk, размерности ключевого вектора. Затем мы применяем softmax к оценкам, что означает, что они нормализованы и все в сумме дают 1. Умножая оценки на соответствующий вектор значений, мы получаем какой-то вектор взвешенных значений для каждого слова. Эти два вектора теперь суммируются. вверх, и мы получаем наш последний вектор z1 - результат слоя самовнимания для первого входа, слово «пушистый».

Возможно, вы заметили, что это называется многоголовым самовниманием. Это связано с тем, что описанный выше процесс выполняется несколько раз с разными матрицами весов, что означает, что мы получаем несколько векторов (называемых головами в формулах ниже). Затем эти головы объединяются и умножаются на весовую матрицу Wo. Это означает, что каждая голова изучает различную информацию о данной последовательности, а затем эти знания объединяются.

Пока что не упомянул самое главное: все эти вычисления можно распараллелить. Почему это так важно? Давайте сначала посмотрим на RNN. Им нужно обрабатывать последовательные данные по порядку, то есть им нужно увидеть начало предложения, прежде чем они увидят его конец. Однако модели трансформаторов могут обрабатывать все входные данные одновременно. И это делает их невероятно быстрыми, именно так модель Transformer позволила тренироваться с огромными объемами данных. Теперь вы задаетесь вопросом, как Трансформатор знает правильный порядок предложения, если он получает все сразу? Я объясню это в разделе о позиционных кодировках ниже.

Как мы видели на самом первом рисунке, показывающем архитектуру Transformer, уровни самовнимания интегрированы как в кодировщик, так и в декодер. В кодировщике каждый выходной вектор z - после прохождения через полностью подключенную сеть прямой связи - передается следующему кодировщику в качестве входа. Только самый нижний кодировщик получает фактические вложения слов. Однако декодер имеет два разных типа слоев самовнимания:

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

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

Прямые сети

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

Каждая сеть с прямой связью состоит из двух линейных слоев с функцией ReLU между ними. Веса и смещения W1, W2, b1 и b2 одинаковы для разных позиций в последовательности, но разные для каждого кодера и декодера.

Позиционные кодировки

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

Для более подробного объяснения того, как именно работают позиционные кодировки, я рекомендую эту статью здесь.

Нормализация слоя

Один небольшой, но важный аспект моделей Transformer - это нормализация уровня, которая выполняется после каждого подуровня в каждом кодере и декодере.

Сначала суммируются вход и выход соответствующего уровня кодера или декодера. Это означает, что в самом нижнем слое суммируются входной вектор X и выходной вектор Z1; во втором слое - входной вектор Z1 и выходной вектор Z2, и так далее. Суммированный вектор затем нормализуется со средним значением нуля и единичной дисперсией. Это предотвращает слишком большие колебания диапазона значений в данном слое и, таким образом, позволяет модели быстрее сходиться.

Для более подробного объяснения нормализации слоев я рекомендую эту статью здесь.

Конечный линейный слой и Softmax

Наконец, чтобы получить предсказания на выходе, нам нужно каким-то образом преобразовать выходной вектор последнего декодера в слова. Итак, мы сначала подаем выходной вектор в полностью связанный линейный слой и получаем логитовый вектор размера словаря. Затем мы применяем функцию softmax к этому вектору, чтобы получить оценку вероятности для каждого слова в словаре. Затем мы выбрали слово с максимальной вероятностью в качестве нашего предсказания.

Резюме

Модель Transformer - это новый тип модели кодировщика-декодера, который использует самовнимание для понимания языковых последовательностей. Это позволяет выполнять параллельную обработку и, таким образом, делает ее намного быстрее, чем любая другая модель с такой же производительностью. Таким образом, они проложили путь для современных языковых моделей (таких как BERT и GPT), а в последнее время и для моделей генерации изображений.

Ссылки

[1] A. Vaswani, N. Shazeer, N. Parmar, J. Uszkoreit, L. Jones, AN Gomez, L. Kaiser и I. Polosukhin, Attention is All You Need (2017), NIPS'17: Proceedings 31-й Международной конференции по системам обработки нейронной информации
[2] А. Каземнеджад, Архитектура трансформатора: позиционное кодирование (2019), Блог Амирхосейна Каземнеджада
[3] Л. Мао, Нормализация слоев Разъяснение (2019), Журнал учета Лэй Мао

Кредиты

Особая благодарность Филиппу Попьену за предложения и исправления к этой статье.