В этом видео мы изучим архитектуру кодера-декодера.
Примером популярной модели кодера-декодера является T5. Для того чтобы понять, как работает кодер-декодер
мы рекомендуем вам ознакомиться с видео о кодерах и декодерах как самостоятельных моделях.
Понимание того, как они ведут себя по отдельности, поможет понять, как ведет себя кодер-декодер.
Давайте начнем с того, что мы видели о кодере. Кодер принимает слова в качестве входа,
прогоняет их через кодер и извлекает числовое представление
для каждого пропущенного через него слова. Теперь мы знаем, что числовое представление содержит информацию
о смысле последовательности. Давайте отложим это в сторону и добавим к диаграмме декодер.
В этом сценарии мы используем декодер таким образом, которого раньше не видели.
Мы передаем выходы кодера непосредственно на него! Дополнительно к выходам кодера,
мы также передаем декодеру последовательность. При запросе декодера на вывод без
начальной последовательности, мы можем передать ему значение, указывающее на начало последовательности.
И именно здесь происходит волшебство кодера-декодера. Кодер принимает на вход последовательность.
Он вычисляет прогноз и выдает числовое представление. Затем он посылает
его декодеру. Он, в некотором смысле, закодировал последовательность. А декодер, в свою очередь,
используя этот вход наряду с обычной входной последовательностью, попытается декодировать последовательность.
Декодер декодирует последовательность и выводит слово. На данный момент нам не нужно понимать
смысл этого слова, но мы можем понять, что декодер по сути декодирует то, что вывел кодер.
Слово "Start of sequence word" указывает на то, что он должен начать декодирование последовательности.
Теперь, когда у нас есть и вектор признаков, и начальное сгенерированное слово, нам больше не нужен
кодер. Как мы уже видели на примере декодера, он может действовать в авторегрессивной манере;
слово, которое он только что вывел, теперь может быть использовано в качестве входа. Это, в сочетании с
числовым представлением, выводимым кодером, может быть использовано для генерации второго слова.
Обратите внимание, что первое слово все еще здесь, поскольку модель все еще выводит его. Однако оно выделено серым цветом,
поскольку оно нам больше не нужно. Мы можем продолжать и продолжать, например, пока декодер
не выдаст значение, которое мы считаем "stopping value", например, точку, означающую конец последовательности.
Здесь мы увидели весь механизм трансформера кодер-декодер: давайте пройдемся по нему
еще раз. У нас есть начальная последовательность, которая отправляется на кодер. Затем выходной сигнал кодера
передается декодеру для декодирования. Если кодер мы теперь можем выбросить после одного использования,
то декодер будет использоваться несколько раз: пока мы не сгенерируем все слова, которые нам нужны.
Рассмотрим конкретный случай; на примере Translation Language Modeling; также называемого трансдукцией;
акт перевода последовательности. Здесь мы хотим перевести английскую последовательность "Welcome"
"to NYC" на французский язык. Мы используем модель трансформера, которая обучена для этой задачи в явном виде.
Мы используем кодер для создания представления английского предложения. Мы передаем это
декодеру и, используя слово "start of sequence", просим его вывести первое слово.
Он выводит "Bienvenue", что означает "Welcome".
Затем мы используем "Bienvenue" в качестве входной последовательности для декодера. Это, наряду с вектором признаков,
позволяет декодеру предсказать второе слово, "à", которое в английском языке означает "to".
Наконец, мы просим декодер предсказать третье слово; он предсказывает "NYC",
что снова является правильным. Мы перевели предложение! Где кодер-декодер действительно
блистает, так это в том, что у нас есть кодер и декодер, которые часто не имеют общих весов.
Таким образом, у нас есть целый блок (кодер), который можно обучить понимать последовательность
и извлекать релевантную информацию. Например, для сценария перевода, который мы рассматривали ранее,
это означает разбор и понимание того, что было сказано на английском языке; извлечение
информации из этого языка и помещение всего этого в вектор, насыщенный информацией.
С другой стороны, у нас есть декодер, единственной целью которого является декодирование признака, выводимого
кодером. Этот декодер может быть специализирован для совершенно другого языка или даже модальности,
например, изображения или речи. Кодеры-декодеры являются особенными по нескольким причинам. Во-первых,
они способны справляться с задачами преобразования последовательности в последовательность, такими как перевод, который мы только что видели.
Во-вторых, веса между частями кодера и декодера не обязательно являются общими. Давайте
возьмем другой пример перевода. Здесь мы переводим "Transformers are powerful" на французский язык.
Во-первых, это означает, что из последовательности из трех слов мы можем сгенерировать
последовательность из четырех слов. Кто-то может возразить, что с этим можно справиться с помощью декодера,
который будет генерировать перевод авторегрессивным способом, и он будет прав!
Другим примером того, где трансформеры последовательности в последовательность проявляют себя с лучшей стороны, является суммаризация.
Здесь у нас есть очень длинная последовательность, как правило, полный текст,
и мы хотим обобщить его. Поскольку кодер и декодер разделены,
мы можем иметь разные длины контекста (например, очень длинный контекст для кодера, который
обрабатывает текст, и меньший контекст для декодера, который обрабатывает обобщенный текст).
Существует множество моделей преобразования последовательности в последовательность.
Здесь приведено несколько примеров популярных моделей кодеров-декодеров, доступных в библиотеке трансформеров.
Кроме того, вы можете загрузить кодер и декодер внутри модели кодера-декодера!
Поэтому, в зависимости от конкретной задачи, которую вы ставите перед собой,
вы можете использовать конкретные кодеры и декодеры, которые зарекомендовали себя с лучшей стороны
в этих конкретных задачах. На этом мы завершаем разговор о кодерах-декодерах. Спасибо за просмотр!