Изменения

Перейти к: навигация, поиск

Трансформер

573 байта добавлено, 19:11, 4 сентября 2022
м
rollbackEdits.php mass rollback
==Архитектура трансформера==
[[Файл:TransformerSimpleArchitecture.png|350px400px|thumb|right|Архитектура трансформера<ref>https://jalammar.github.io/illustrated-transformer/</ref>]]
Устройство трансформера состоит из кодирующего и декодирующего компонентов. На вход принимается некая последовательность, создается ее [[:Векторное_представление_слов|векторное представление]] (англ. ''embedding''), прибавляется вектор позиционного кодирования, после чего набор элементов без учета порядка в последовательности поступает в кодирующий компонент (параллельная обработка), а затем декодирующий компонент получает на вход часть этой последовательности и выход кодирующего. В результате получается новая выходная последовательность.
В основе лежит архитектура похожая на базовую архитектуру Seq2seq<ref>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D1%8F&mobileaction=toggle_view_desktop#.D0.91.D0.B0.D0.B7.D0.BE.D0.B2.D0.B0.D1.8F_.D0.B0.D1.80.D1.85.D0.B8.D1.82.D0.B5.D0.BA.D1.82.D1.83.D1.80.D0Внутри кодирующего и декодирующего компонента нет рекуррентности.B0_Seq2seq</ref>: кодирующий Кодирующий компонент {{---}} это стек состоит из кодировщиков (англ. ''encoders''), а которые повторяются несколько раз, аналогично устроен декодирующий компонент . Трансформер {{---}} это стек декодировщиков (англпоставленные друг за другом модели внимания, которые позволяют исходную последовательность векторов перевести в новую последовательность векторов, которые кодируют информацию о контексте каждого элемента. ''decoders'')Трансформер-кодировщик переводит исходные векторы в скрытые, которые правильно сохраняют в себе информацию о контексте каждого элемента. Каждый кодировщики последовательно передает Далее трансформер-декодировщик декодирует результат своей работы следующему кодировщику на входкодировщика в новую последовательность, которая состоит из эмбедингов элементов выходного языка. Декодировщики последовательно передают друг другу на вход результат работы вместе После по эмбедингам генерируются сами итоговые элементы с результатом кодирующего компонентапомощью вероятностной языковой модели.
Ниже рассмотрим архитектуру кодировщика и декодировщика подробнее.
7. Повторим пункт 5 еще раз: добавим сквозную связь и нормализацию слоя: <math>z_i = \mathrm{LN}(h'''_i + h''_i; \mu_2, \sigma_2)</math>
После, в кодирующем компоненте пункты кодировщика 3--7 повторяются еще несколько раз, преобразовывая друг за другом из контекста контекст. Тем самым мы обогащаем модель и увеличиваем в ней количество параметров.
===Позиционное кодирование===
[[Файл:PositionalEncodingPositionalEncodingNew.png|400px|thumb|right|Визуализация работы позиционного кодирования<ref>httphttps://wwwkazemnejad.machinelearning.ru/wiki/imagescom/eblog/e6transformer_architecture_positional_encoding/Voron-ML-TopicModeling-slides.pdf</ref>]]Так как в архитектуре трансформер обработка последовательности заменяется на обработку множества мы теряем порядок информацию о порядке элементов последовательности. Чтобы отобразить информацию о позиции элемента в исходной последовательности мы используем позиционное кодирование.
Позиционное кодирование (англ. ''positional encoding'') {{---}} позволяет модели получить информацию о порядке элементов в последовательности путем прибавления специальных меток к вектору входных элементов. Позиции элементов <math>i</math> кодируются векторами <math>p_i</math>, <math>i = 1, 2, ..., n</math>, так, что чем больше <math>|i - j|</math>, тем больше <math>||p_i - p_j||</math>, и <math>n</math> не ограничено. Пример такого кодирования: <math> p_{(i, s)} = \begin{cases} \sin \left(i \cdot 10000^{\frac{-2s2k}{d_{model}}}\right)</math>,<math>p_{(i, s + & \quad \fractext{d}{2})если } s= 2k\\ \cos \left(i \cdot 10000^{\frac{-2s2k}{d_{model}}}\right) & \quad \text{если } s=2k+1 \end{cases}</math>
===Self-attention===
5. В самом конце мы хотим получить вероятностную порождающую модель для элементов. Результат (индекс слова с наибольшей вероятностью): <math>\mathrm{SoftArgMax}(W_y y_t + b_y) </math>, где <math> W_y </math>, <math> b_y </math> {{---}} обучаемые параметры линейного преобразования. Для каждой позиции <math>t</math> выходной последовательности мы строим вероятностную модель языка, то есть все элементы из выходного словаря получают значение вероятности. Эти значения как раз получаются из векторов <math>y_t</math> из предыдущего пункта, которые мы берем с последнего блока трансформера-декодировщика.
Последний этап выполняется только после того, когда повторились пункты 1--4 для всех декодировщиков. На выходе получаем вероятности классов, по факту для каждой позиции решаем задачу многоклассовой классификации, для того, чтобы понять какие элементы лучше поставить на каждые позиции.
==Источники информации==
1632
правки

Навигация