Перевод с английского на маратхи на уровне слов с использованием Bidirectional-LSTM с механизмом внимания.

Введение:-

В этой статье мы собираемся обсудить очень интересную тему обработки естественного языка (NLP), нейронного машинного перевода (NMT) с использованием модели внимания. Машинный перевод - это не что иное, как автоматический перевод текста с одного языка на другой.

Здесь мы узнаем, как использовать последовательность для архитектуры последовательности (seq2seq) с механизмом внимания Bahdanau для NMT.

Предпосылка: -

В этой статье предполагается, что вы понимаете следующее: -

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

Двунаправленный: -

Если вы понимаете LSTM, то двунаправленный режим довольно прост. В двунаправленной сети вы можете использовать простую RNN (рекуррентную нейронную сеть), GRU (закрытый рекуррентный блок) или LSTM (долговременную краткосрочную память). В этой статье я собираюсь использовать LSTM.

  • Прямой слой - это наш обычный уровень LSTM, но обратный LSTM - это уровень, поток которого идет в обратном направлении.
  • На каждом временном шаге ввод передается как в прямом, так и в обратном уровнях.
  • Выходные данные на каждом временном шаге представляют собой комбинацию выходных данных обеих ячеек (прямого и обратного слоя). Следовательно, для модели прогнозирования будут также известны следующие слова.

Зачем нам нужна двунаправленная связь?

  • В предложениях любого языка следующее слово будет иметь влияние на предыдущие слова. Пример- (1) «Гарри любит яблоко, потому что он работает их». и (2) «Гарри любит яблоко, и оно здорово».
  • В первом предложении «яблоко» означает компанию, а во втором «яблоко» означает фрукты. Мы можем сказать это, потому что знаем следующие слова. Во-первых, «яблоко» зависит от «работы», а во-вторых, от «здоровья». Теперь в RNN / LSTM у нас есть только прямой уровень, поэтому у них не будет информации о следующих словах последовательности, поэтому без надлежащего контекста модель предложения может не предсказывать правильные слова.
  • В случае Bidirectional у нас есть прямой и обратный слой, и эта модель может иметь информацию как о предыдущих, так и о следующих словах, поэтому с правильным контекстом модель предложения будет лучше предсказывать.

Внимание Богданова: -

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

Теперь зачем использовать внимание?

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

Вот как работает внимание: -

  • После получения вывода Z (в изображении внимания), который представляет собой конкатенацию прямого и обратного скрытых состояний [h, h`], первым шагом является вычисление весов внимания (α).

  • Для расчета α нам нужен балл (e), который рассчитывается по приведенной выше формуле. Оценка основана на скрытом состоянии декодера (LSTM) (до прогнозирования y) и выходных данных кодировщика Z.
  • Затем вектор контекста (Ct) вычисляется как взвешенная сумма весов внимания (α) и выходных данных кодировщика (Z).
  • Выход y генерируется декодером с использованием вектора контекста (Ct) в качестве входа.

Набор данных: -

Скачать набор данных для перевода с manythings.org

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

Предварительная обработка: -

Для начала нужно понять, что нам нужно для перевода.

  • Нам нужны предложения на одном языке и соответствующие предложения на другом языке.
  • Это могут быть некоторые сокращения английских слов, которые могут сбить с толку нашу модель: такие слова, как «не могу» и «не могу» будут восприниматься по-разному, поэтому мы расширим все сокращения.
  • Такие символы, как запятая, точка и цифры, бесполезны при переводе, поэтому мы отбросим их все.

Теперь в следующем коде мы выполним весь процесс очистки и сохраним данные.

Примечание: - Для работы функции сокращения вам понадобится словарь сокращений-расширений, который вы можете скачать здесь, этот файл содержит 125+ сокращений.

Подготовить данные для модели: -

  • Добавьте токены SOS (начало строки) и EOS (конец строки) в предложения на целевом языке. Благодаря этим токенам у нас может быть длина целевых предложений и входных предложений, отличных друг от друга. И это также помогает декодеру запускать и останавливать прогнозирование.
  • Примечание: - длина вводимых данных (например, предложения на английском языке) должна быть одинаковой, а длина цели (например, маратхи) должна быть одинаковой, но они могут отличаться друг от друга.
  • Токенизация: - нейронные сети не принимают текст в качестве входных данных, поэтому нам придется преобразовать их в числа. Для этого мы будем использовать Tokenizer Tensorflow.
  • Этот токенизатор очень полезен, с помощью которого мы можем получить частоту слов, словари слов для индексации и индексации по слову. Что будет использоваться для преобразования слов в числа (для обучения) и чисел в слова (для предсказания)
  • Заполнение: - Нейронные сети также нуждаются в вводе (т. е. предложениях) одинаковой длины. Поэтому мы дополняем предложения на английском языке и языке маратхи с «0», чтобы получить длину предложений как максимальную длину предложения соответствующего языка.

Модель сборки: -

Сначала мы создадим кодировщик, а затем декодер со слоем внимания.

Примечание: - Я экспериментировал с разными параметрами, следующие из них были лучшими для меня, вы можете попробовать другие параметры. Попробуйте изменить встраиваемый выходной размер, единицы LSTM или даже добавить больше слоев LSTM. В конце концов, машинное обучение - это эксперимент.

Кодировщик: -

  • Как мы обсуждали ранее, мы будем использовать двунаправленный LSTM в кодировщике.
  • Которая будет изучать шаблоны на языке ввода (например, английском)
  • Мы будем использовать как выходы кодировщика, так и его состояния (вектор контекста [h, c]). Принятие состояний в двунаправленном режиме немного отличается, потому что он имеет прямое и обратное состояния, поэтому нам придется учитывать оба состояния (т.е. мы объединим их).

Декодер: -

  • В декодере мы используем только LSTM.
  • Уровень внимания: - Я позаимствовал код для внимания из [здесь]. Вы можете поместить его в файл BahdanauAttention.py или просто скачать файл отсюда. Мы используем внимание Бахданова как слой внимания.

Вот наш модельный график -

Обучение:-

Теперь перейдем к обучению нашей модели внимания.

Здесь я получил точность 95,04% на проверочном наборе с потерей 0,32.

Модель вывода: -

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

Здесь мы не можем просто применить model.predict () как другие модели ML и DL, потому что в нашем случае модель кодировщика изучает функции во входных предложениях, а декодер просто принимает состояния кодировщиков и предсказывает слово за словом, используя входные данные декодера. Итак, для предсказания мы должны проделать тот же процесс.

Прогноз:-

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

Результаты:-

Наконец, давайте переведем наши предложения с английского на маратхи.

Вот некоторые из моих результатов: -

ВАУ !!!!!Мы получили УДИВИТЕЛЬНЫЕ результаты.

Конец Примечание: -

  • Полный код доступен на GitHub.
  • Если вы еще не использовали модель кодировщика-декодера без внимания, то можете почитать мою статью.


Ссылки: -

Исследовательская статья Внимание Богданова здесь.