Перейти к основному содержимому

Декодировщик трансформера

Декодировщик модели трансформера (transformer) [1] принимает на вход MM эмбеддингов элементов уже сгенерированной последовательности и выдаёт вероятностное распределение следующего предсказываемого элемента последовательности.

Будем, как и в оригинальной статье [1], рассматривать задачу машинного перевода текста с одного языка на другой, в которой:

  • входная последовательность - текст на исходном языке;

  • выходная последовательность - текст на целевом языке.

Каждая последовательность состоит из токенов, которыми выступают слова текста.

Декодировщик состоит из NN последовательных применений блоков декодировщика, каждый раз - со своими параметрами. В оригинальной статье [1] бралось N=6N=6.

Задача каждого блока - уточнить эмбеддинги сгенерированных токенов с учётом их контекста из других сгенерированных токенов.

Последний блок выдаёт окончательные эмбеддинги, к каждому из которых независимо применяется линейный слой (с одинаковыми параметрами) и SoftMax-преобразование. Итоговый вектор выходов интерпретируется как вероятность токенов на каждой позиции выходной последовательности. Нас интересует только токен на позиции tt, который выбирается максимально вероятным. После этого декодировщик перезапускается для предсказания токенов в позициях t+1,t+2,...t+1,t+2,... пока не будет сгенерирован токен [EOS] (end of sequence), означающий конец генерации.

Блок декодировщика

Схема блока декодировщика в модели трансформера [1] показана на рисунке справа внизу [2]:

Блок декодировщика показан в контексте двух блоков кодировщика и ещё одного блока декодировщика и последующих преобразований, хотя в оригинальной работе использовалось 6 блоков.

Как видим, блок декодировщика состоит из тех же преобразований, что и блок кодировщика. Преобразования применяются к каждому токену независимо.

Отличия декодировщика от кодировщика

Для декодировщика входными токенами является уже не входная, а выходная последовательность, сдвинутая на один шаг вперёд спец. токеном [BOS] (beginning of sequence), как описывалось ранее.

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

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

Блок самовнимания

Блок самовнимания (self-attention) в декодировщике применяется точно так же, как и в случае кодировщика, с тем лишь отличием, что степени внимания маскируются таким образом, чтобы из позиции tt нельзя было смотреть в будущие позиции t+1,t+2,...t+1,t+2,..., которые ещё не сгенерированы (masked attention). Реализуется это прибавлением -\infty к скалярным произведениям запроса q\mathbf{q} и каждого ключа k\mathbf{k} в запрещённой (будущей) позиции, что после применения SoftMax-преобразования, делает степень внимания к этим позициям нулевой, и декодировщик в будущее не заглядывает.

Блок кросс-внимания

Также в декодировщике используется блок кросс-внимания (cross-attention, encoder-decoder attention), уточняющий эмбеддинги кодировщика, учитывая информацию о входной последовательности. Ведь чтобы осуществить перевод на другой язык, нам нужно прочитать текст на исходном языке! Он устроен точно так же, как и блок самовнимания в кодировщике, но внимание в нём направлено от токенов выходной последовательности к итоговым токенам входной последовательности, полученных с выходов последнего блока кодировщика. Это реализуется тем, что:

  • запросы (queries) генерируются по уже сгенерированным токенам выходной последовательности;
  • ключи (keys) и значения (values) генерируются по эмбеддингам входной последовательности.

Этот вид внимания визуализирован на схеме выше линиями с мелким пунктиром.

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

Таким образом, в модели трансформера использовались три типа внимания:

  • самовнимание в кодировщике, когда входной токен мог смотреть на любой другой входной токен;

  • маскированное внимание в декодировщике, когда текущий выходной токен мог смотреть только на себя и на предыдущие;

  • кросс-внимание, когда выходной токен мог смотреть на любые входные токены.

Эти типы внимания проиллюстрированы ниже [3]:

Литература

  1. Vaswani A. Attention is all you need //Advances in Neural Information Processing Systems. – 2017.
  2. https://medium.com/analytics-vidhya/attention-is-all-you-need-demystifying-the-transformer-revolution-in-nlp-68a2a5fbd95b
  3. https://velog.io/@kimjunsu97/MetaCodeDeep-Learning-NLP-Attention-Transformer