Изменения

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

Трансформер

1110 байт добавлено, 00:46, 12 июня 2022
м
добавлены уточнения
Устройство трансформера состоит из кодирующего и декодирующего компонентов. На вход принимается некая последовательность, создается ее [[:Векторное_представление_слов|векторное представление]] (англ. ''embedding''), векторизованная последовательность поступает в кодирующий компонент, а затем декодирующий компонент получает на вход часть этой последовательности и выход кодирующего. В результате получается новая выходная последовательность.
Кодирующий компонент {{---}} это стек кодировщиков (англ. ''encoders''), а декодирующий компонент {{---}} это стек декодировщиков (англ. ''decoders''). Каждый кодировщики последовательно передает результат своей работы следующему кодировщику на вход. Декодировщики последовательно передают друг другу на вход результат работы вместе с результатом кодирующего компонента.
Ниже рассмотрим архитектуру кодировщика и декодировщика подробнее.
3. Полученный вектор <math>h_i</math> подается на вход в блок многомерного самовнимания (англ. ''multi-headed self-attention'').
<math>h^j_i = \mathrm{Attn}(WQ^j_q j h_i, WK^j_k j H, WV^j_v j H)</math>, где <math>W</math> {{---}} обучаемые матрицы, : <math>W_qQ</math> для запроса, <math>W_kK</math> для ключа, <math>W_vV</math> для значения. Подробное объяснения работы механизма self-attention будет разобрано ниже.
4. Затем необходима конкатенация, чтобы вернуться в исходную размерность: <math> h'_i = M H_j (h^j_i) = [h^1_i...h^J_i] </math>
===Self-attention===
'''Self-Attention''' {{---}} разновидность [[:Механизм_внимания|механизма внимания]], задачей которой является выявление закономерности между входными данными.
Будем для каждого элемента <math>x_i</math> обучать получать обучаемым преобразованием три вектора:
* Запрос (''query'') <math>q_i = W_Q Q x_i</math>* Ключ (''key'') <math>k_i = W_K K x_i</math>* Значение (''value'') <math>v_i = W_V V x_i</math>
Векторы <math>q_i</math> и <math>k_i</math> будем использовать, что посчитать важность элемента <math>x_j</math> для элемента <math>x_i</math>. Чтобы понять, насколько для пересчета вектора элемента <math>x_i</math> важен элемент <math>x_j</math> мы берем <math>k_j</math> (вектор ключа элемента <math>x_j</math>) и умножаем на <math>q_i</math> (вектор запроса элемента <math>x_i</math>). Так мы скалярно перемножаем вектор запроса на все векторы ключей, тем самым понимаем, насколько каждый входной элемент нам нужен, чтобы пересчитать вектор элемента <math>x_i</math>.
где <math>d</math> {{---}} размерность векторов <math>q_i</math> и <math>k_j</math>, а <math>n</math> {{---}} число элементов во входной последовательности.
Таким образом, новое представление элемента <math>x_i</math> считаем как взвешенную сумму векторов значения: <math>z_i = \mathrm{Attn}(W_q Q x_i, W_k K X, W_v V X) = \sum_{p=1}^n w_{p i} v_p</math>, где <math>X = (x_1, x_2, ..., x_n)</math> {{---}} входные векторы. По итогу мы факту ''self-attention'' {{---}} это ''soft-arg-max'' с температурой <math>\mathrm{sqrt}(d)</math>. Мы перемешиваем все входные векторы, чтобы получить новые векторы всех элементов, где каждый элемент зависит от всех входных элементов.
===Multi-headed self-attention===
То есть параллельно независимо несколько раз делаем attention. Потом результат каждого attention по элементам конкатенируем, затем сжимаем получившуюся матрицу и получаем для каждого элемента свой вектор той же размерности.
<math>с^j = \mathrm{Attn}(WQ^j_q j q, WK^j_k j X, WV^j_v j X)</math>, где <math>j = 1...J</math>, <math>J</math> {{---}} число разных моделей внимания, <math>X = (x_1, x_2, ..., x_n)</math> {{---}} входные векторы, а <math>W</math> {{---}} обучаемые матрицы.
2. Далее идет этап многомерного самовнимания: линейная нормализация и multi-headed self-attention. Особенность в том, что в attention ключи и значения применяются не ко всем векторам, а только к тем, значения которых уже синтезировали (<math>H_t</math>):
<math> h'_t = \mathrm{LN} \circ M H_j \circ \mathrm{Attn}(WQ^j_q j h_t, WK^j_k j H_t, WV^j_v j H_t) </math>
3. На следующем этапе мы делаем многомерное внимание на кодировку <math>Z</math>, результат работы компонента кодировщика:
<math> h''_t = \mathrm{LN} \circ M H_j \circ \mathrm{Attn}(WQ^j_q j h_t, WK^j_k j Z, WV^j_v j Z) </math>
4. Линейная полносвязная сеть (по аналогии, как и в кодировщике):
5. Линейный предсказывающий слой:
<math> p(\tilde w|t) = \mathrm{SoftMax}_{\tilde w}(W_y y_t + b_y) </math>, <math> W_y </math>, <math> b_y </math> {{---}} обучаемая матрица весовых коэффицентовобучаемые параметры линейного преобразования. Для каждой позиции <math>t</math> выходной последовательности мы строим вероятностную модель языка, то есть все элементы из выходного словаря получают значение вероятности. Эти значения как раз получаются из векторов <math> b_y y_t</math> {{--из предыдущего пункта, которые мы берем с последнего блока трансформера-}} обучаемый вектор смещениядекодировщика.
Последний этап выполняется только после того, когда повторились пункты 1-4 для всех декодировщиков. На выходе получаем вероятности классов, по факту решаем для каждого класса задачу многоклассовой классификации, для того, чтобы понять какие элементы лучше поставить на каждые позиции.  В самом конце происходит генерация мы имеем вероятностную порождающую модель для элементов и остается только породить эти элементы. Для простоты мы будем считать, что для каждой позиции просто выбирается самый вероятный элемент. Генерация самих элементов: <math> {\tilde w}_t = \mathrm{arg max}_{\tilde w} p(\tilde w|t) </math>, пока не сгенерируется слово обозначающее конец последовательности. По сути мы свели задачу обработки последовательности (''seq'') к множеству (''set'').
==Источники информации==
23
правки

Навигация