Перевод с английского на испанский с помощью Transformer
В этом разделе мы рассмотрим пример использования трансформатора для перевода с английского на испанский, исходный код создан Автором: Франсуа Шолле (ссылка: https://keras.io/examples/nlp/neural_machine_translation_with_transformer /).
Для начала загружаем необходимые для этого приложения пакеты
Затем давайте получим данные и предварительно обработаем их. Данные, используемые в этом коде, предоставлены веб-сайтом Anki (https://www.manythings.org/anki/).
Для предварительной обработки данных мы сначала открываем файл данных, а затем идентифицируем английские предложения и соответствующие им испанские предложения, разделяя их на «\t», после чего мы добавляем «[начало]» и «[конец]» к начало и конец испанских предложений, затем мы записываем каждое английское предложение и соответствующее ему испанское предложение в виде текстовых пар.
Теперь, если мы посмотрим на наши данные и увидим, как они выглядят, они должны быть парами, как показано ниже:
Теперь мы можем разделить наши данные на обучающие, проверочные и тестовые наборы данных. Для этого сначала определим размер проверочного набора данных как 15% от всего набора данных. Затем мы устанавливаем размер тестового набора данных таким же, как у набора данных проверки, а оставшиеся (от 0 до 83726) — набором обучающих данных.
До этого момента мы выполнили все основные этапы обработки данных, теперь давайте погрузимся в этапы сборки трансформатора! (включая векторизацию данных и собственно построение модели)
Векторизация данных важна для использования преобразователя для перевода языков, поскольку компьютеры не могут понимать человеческие языки, поэтому символы лучше преобразовывать в числа.
Чтобы векторизовать данные, нам нужно будет настроить стандартизацию слоя TextVectorization в соответствии с используемым языком, здесь мы используем испанский язык, поэтому мы должны добавить символ «¿» в список пунктуации (обычно знаки препинания в строковом пакете содержать только «'!»#$%&'()*+, -./:;‹=›?@[\]^_`{|}~'»). Затем мы удаляем «[» из string.punctuation, потому что мы не хотим удалять его из испанских предложений на более позднем этапе векторизации, и аналогичным образом удаляем «]».
Затем мы можем отформатировать наш набор данных и сделать его в формате TensorFlow (для достижения этой цели мы используем функцию tf.data.Dataset.from_tensor_slices()). Затем мы пакетируем, перемешиваем, предварительно выбираем и кэшируем наш набор данных. Обратите внимание, что преобразователь использует структуру, называемую структурой «кодировщик-декодер», поэтому, когда мы форматируем наш набор данных, на выходе должен быть кортеж пар кодер-декодер (наш вход), а затем цель (наш выход), поэтому мы также должны сопоставить наш набор данных с функцией format_dataset.
Теперь, если мы посмотрим на наш набор данных, он должен быть в такой форме:
Теперь давайте построим модель! Наша модель содержит TransformerEncoder и TransformerDecoder. И обратите внимание, что нам также потребуется создать слой PositionalEmbedding, так как он может помочь нам определить положение каждого слова и порядок слов в предложениях.
Обратите внимание, что уровни TransformerEncoder и TransformerDecoder используют слой MultiHeadAttention, поскольку ключевая идея трансформатора заключается в его механизме внимания, о котором мы говорили ранее.
Также обратите внимание, что исходная последовательность будет передана в TransformerEncoder
, что создаст ее новое представление. Затем это новое представление будет передано в TransformerDecoder
вместе с целевой последовательностью (целевые слова от 0 до N). Затем TransformerDecoder
попытается предсказать следующие слова в целевой последовательности (N+1 и далее). (от ‘fchollet’) Для достижения этой цели мы используем causal_masking, чтобы он не мог видеть токены после N.
Затем собираем сквозную модель:
Наконец-то мы можем обучить нашу модель! (обратите внимание, что это занимает довольно много времени)
Через 30 эпох мы можем протестировать нашу модель. Чтобы сделать это, мы должны передать в модель векторизованное английское предложение и целевой токен «[start]» (причина, по которой мы это делаем, заключается в том, что наша модель может предсказывать только слово после N, а здесь N-е слово — jus). начало]"). Затем мы позволяем модели продолжать генерировать следующий токен, пока он не столкнется с токеном «[конец]».
И если вы обучили модель до 30 эпох, вы должны получить результат, как показано ниже: