Oleg Sb
Пока читал только оригинальную статью, насколько я понял там трансформер решает задачу машинного перевода. Пусть фраза длиной input_length переводится как фраза на другом языке длиной target_length.
Декодер состоит из 6 блоков, каждый блок использует в качестве входных данных два массива:
1. массив размера (512, target_length), пришедший из предыдущего слоя декодера, для первого слоя - из эмбеддингов target'а
2. массив размера (512, input_length), пришедший из последнего блока энкодера
И выдает один массив размера (512, target_length)
Значит весь декодер выдает массив слов размером target_length, то есть столько же слов, сколько получил на вход.
Пусть наша задача - машинный перевод. Делая первый шаг в режиме инференса, мы знаем только первое слово - <init>, значит target_length == 1, и мы получим на выходе одно слово - начало фразы, назовем его word1. Теперь мы уже знаем 2 слова: <init> и word1, значит мы можем подать на вход декодеру оба слова, и target_length == 2. Поскольку декодер выдает столько же слов, сколько получил на вход, то он выдаст уже не одно, а два слова, в которых первое скорее всего совпадет с word1, а следующее назовем word2 - это продолжение фразы. На следующем шаге декодер получит и выдаст 3 слова и так далее. Или все не так работает?
Декодер трансформера (например, gpt) действительно работает примерно так. Но там ещё накладываются ограничения на атеншн: он смотрит только справа налево. Поэтому даже если ты подашь на вход init, w1, w2, w3, нейроны на третьей позиции будут видеть только init и w1, как будто w2 и w3 нету. Поэтому дописывание слов справа не меняет то, что выдает трансформер слева.
А выдаёт он, кстати, на каждом шаге не слова, а распределение над всеми возможными словами. А дальше ты уже сам тем или иным методом выбираешь из этого распределения - и фиксируешь свой выбор.