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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Блок самовнимания (self-attention) в кодировщике применяется точно так же, как и в случае кодировщика с тем лишь отличием, что степени внимания маскируются таким образом, чтобы из позиции tt нельзя было смотреть в будущие позиции t+1,t+2,...t+1,t+2,..., которые ещё не сгенерированы (masked attention). Реализуется это прибавлением -\infty к скалярным произведением запроса qq и каждого ключа kk в запрещённой (будущей) позиции, что, после применения 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