Что, черт возьми, такое Encoder & Decoder в модели seq2seq?

Этот блог дает на высоком уровне интуитивное представление о модели Seq2Seq, поэтому вам не нужно быть «специалистом по глубокому обучению», чтобы все это понять, для понимания этого блога будет достаточно базовых знаний о нейронных сетях.

Исследовательская статья Последовательное обучение с помощью нейронной сети считается прорывом в области обработки естественного языка после того, как Google опубликовал статью на Конференции по системам обработки нейронной информации (NIPS) . Разобравшись с Seq2Seq, можно приступить к чтению о трансформерах, концепциях внимания и других последних достижениях в области НЛП.

Начиная с самого начала, ранее уже были следующие RNN:

  1. Вектор в вектор (Vec2Vec) RNN

Эта модель принимает один вектор в качестве входных данных и производит один вектор в качестве выходных данных.

Примером может быть дословный перевод.

2. Последовательность в вектор (Seq2Vec) RNN

Модель RNN, в которой мы вводим последовательность на выходе, оказывается одним вектором.
Примером этого может быть предиктор языка,

我 爱 计算机 科学 (входная последовательность) дает китайский (выходной вектор)

3. Вектор в последовательность (Vec2Sec) RNN

Модель RNN, где входом является один вектор, а на выходе - последовательность.

4. Последовательность в последовательность (Seq2Seq) RNN

Да! Раньше у нас также была модель «Последовательность в последовательность», которая принимает входные данные как последовательность и обеспечивает последовательный вывод.
Примечание: она полностью отличается от архитектуры кодировщика-декодера, представленной в документе, которая объясняется немного позже в этот блог

Несмотря на наличие этой традиционной модели seq2seq RNN. Как эта статья могла стать прорывом?
Здесь, на рисунке выше, мы видим, что длина выходной последовательности такая же, как и у входной. Модель языкового перевода в том же случае. Если мы пытаемся преобразовать английский язык в язык хинди, это не обязательно означает, что длина последовательности на английском языке такая же, как и у последовательности на хинди. Вот где пригодятся кодировщик и декодер.

Кодировщик и декодер

Выше показана та же архитектура, предложенная в исследовательской статье Seq2Seq - кодировщик-декодер. Он состоит из двух основных компонентов:
1. Кодировщик
2. Декодер
Ниже показано хорошо различимое схематическое представление кодировщика и декодера. Основное преимущество использования модели кодировщика-декодера заключается в том, что длина входных данных и длина выходных данных могут быть разными.

  • Каждая ячейка в этой архитектуре представляет собой сеть RNN (может быть либо сетью LSTM, либо сетью GRU).
  • Кодировщик получает входные данные (A, B, C, ‹eos›), и каждая ячейка получает обратную связь из скрытого состояния (связи между каждой ячейкой).
  • W - вектор контекста.
  • Декодер - это часть, в которой создается вывод (X, Y, Z, ‹eos›).

Давайте попробуем подробно разобраться в каждом компоненте, чтобы мы могли понять все функции кодера, декодера и то, как информация передается от кодера к декодеру.

Кодировщик

Кодировщик - это повторяющаяся сеть RNN в каждой ячейке. Каждая ячейка получает один вектор, за которым следует маркер конца оператора ‹EOS›, который отмечает конец входной последовательности и генерирует вектор контекста W.

Он отвечает за ввод и передачу информации в следующую ячейку. Эта передаваемая информация известна как обратная связь (скрытое состояние) и отображается через ссылки между последовательными ячейками.

Упомянутая здесь формула используется для вычисления значения обратной связи скрытого состояния, которое содержит всю информацию до ввода последней ячейки. Здесь Wʰʰ - это вес, присвоенный предыдущему скрытому состоянию на отметке времени (t-1), а Wʰˣ - вес, присвоенный текущему ввод с отметкой времени t.

Вектор контекста - связь между кодировщиком и декодером

Вектор контекста содержит всю информацию из всех скрытых состояний внутри кодировщика и играет роль только ввода для части декодера.

Декодер

Декодер отвечает за генерацию вывода. Каждая ячейка получает выходные данные, сгенерированные из предыдущей ячейки с меткой времени (t-1), как входные данные текущей ячейки с меткой времени t.
W,
вектор контекста, сгенерированный последней ячейкой кодера, действует как начальный ввод для ячеек RNN в декодере.

Ключевым моментом, на который следует обратить внимание, является то, что выходные данные, генерируемые ячейкой с отметкой времени t, используются в качестве входных данных для ячейки с отметкой времени t + 1.

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

Это все основы, которые нужно знать о работе кодировщика и декодера. Эта статья стала прорывом в исследовательской и прикладной области обработки естественного языка (NLP), поскольку теперь длина последовательности вывода может отличаться от длины ввода, что делает ее надежной и очень полезной в случай машинного перевода, системы вопросов и ответов, моделей генерации диалогов и многих других областей.