НЛП від нульового перекладу з послідовністю до послідовної мережі та уваги - Підручники з PyTorch 1

Це третій і останній підручник з виконання “NLP From Scratch”, де ми пишемо власні класи та функції для попередньої обробки даних для виконання наших завдань моделювання NLP. Ми сподіваємося, що після того, як ви пройдете цей підручник, ви дізнаєтесь, як torchtext може обробляти більшу частину цієї попередньої обробки для вас, у трьох підручниках, що слідують за цим.

У цьому проекті ми навчатимемо нейронну мережу для перекладу з французької на англійську.

з різним ступенем успіху.

Це стало можливим завдяки простій, але потужній ідеї послідовності до послідовності мережі, в якій дві повторювані нейронні мережі працюють разом, перетворюючи одну послідовність в іншу. Мережа кодера конденсує вхідну послідовність у вектор, і мережа декодера розгортає цей вектор у нову послідовність.

перекладу

Для вдосконалення цієї моделі ми використаємо механізм уваги, який дозволяє декодеру навчитися фокусуватись на певному діапазоні вхідної послідовності.

Рекомендована література:

Я припускаю, що ви принаймні встановили PyTorch, знаєте Python і розумієте тензори:

  • https://pytorch.org/ Інструкції щодо встановлення
  • Глибоке навчання з PyTorch: 60-хвилинний бліц, щоб розпочати роботу з PyTorch загалом
  • Вивчення PyTorch на прикладах для широкого та глибокого огляду
  • PyTorch для колишніх користувачів Torch, якщо ви колишній користувач Lua Torch

Також було б корисно знати про мережі від послідовності до послідовності та як вони працюють:

Ви також знайдете попередні підручники з NLP From Scratch: Класифікація імен за допомогою рівня символів RNN та NLP From Scratch: Генерування імен за символом рівня RNN корисними, оскільки ці концепції дуже схожі на моделі кодера та декодера відповідно.

Більше про це читайте у статтях, що представляли ці теми:

Вимоги

Завантаження файлів даних¶

Даними для цього проекту є набір з багатьох тисяч пар перекладів з англійської на французьку.

Це запитання щодо Open Data Stack Exchange підказало мені відкритий веб-сайт перекладу https://tatoeba.org/, який має завантаження, доступні за адресою https://tatoeba.org/eng/downloads - і ще краще, хтось зробив додаткову роботу з розділення мовні пари в окремі текстові файли тут: https://www.manythings.org/anki/

Пари з англійської на французьку занадто великі, щоб їх можна було включити у репо, тож завантажте до data/eng-fra.txt, перш ніж продовжувати. Файл являє собою розділений табуляцією список пар перекладів:

Завантажте дані звідси та витягніть їх до поточного каталогу.

Подібно до кодування символів, що використовується в підручниках RNN на рівні символів, ми будемо представляти кожне слово в мові як один гарячий вектор або гігантський вектор нулів, за винятком одного (в індексі слова). Порівняно з десятками символів, які можуть існувати в мові, набагато більше слів, тому вектор кодування набагато більший. Однак ми трохи обдуримо та обріжемо дані, використовуючи лише кілька тисяч слів на мову.

Нам знадобиться унікальний індекс на слово, щоб пізніше використовувати його як вхідні дані та цілі мереж. Щоб відстежувати все це, ми будемо використовувати допоміжний клас під назвою Lang, який має словники → → index (word2index) та index → ​​word (index2word), а також підрахунок кожного слова word2count для подальшої заміни рідкісних слів.

Усі файли знаходяться в Unicode, для спрощення ми перетворимо символи Unicode на ASCII, зробимо все малим та обріжемо більшість знаків пунктуації.

Щоб прочитати файл даних, ми розділимо файл на рядки, а потім розділимо рядки на пари. Усі файли - англійська → інша мова, тому, якщо ми хочемо перекласти з іншої мови → англійська, я додав зворотний прапор, щоб змінити пари.

Оскільки прикладів речень багато, і ми хочемо щось навчити швидко, ми обріжемо набір даних лише на відносно короткі та прості речення. Тут максимальна довжина - 10 слів (що включає в себе закінчувальні знаки пунктуації), і ми проводимо фільтрування до речень, що перекладаються у форму „Я є” або „Він є” тощо (з урахуванням апострофів, замінених раніше).

Повний процес підготовки даних:

  • Прочитайте текстовий файл і розділіть його на рядки, розділіть рядки на пари
  • Нормалізуйте текст, відфільтруйте за довжиною та змістом
  • Складіть списки слів із речень парами

Модель Seq2Seq¶

Нейронна мережа, що повторюється, або RNN - це мережа, яка працює на послідовності і використовує власний вихід як вхід для подальших кроків.

Мережа Sequence to Sequence, або мережа seq2seq, або мережа Encoder Decoder - це модель, що складається з двох RNN, які називаються кодером і декодером. Кодер зчитує вхідну послідовність і виводить один вектор, а декодер зчитує цей вектор для отримання вихідної послідовності.

На відміну від передбачення послідовності з одним RNN, де кожен вхід відповідає виходу, модель seq2seq звільняє нас від довжини та порядку послідовності, що робить її ідеальною для перекладу між двома мовами.

Розгляньте речення “Je ne suis pas le chat noir” → “Я не чорна кішка”. Більшість слів у вхідному реченні мають прямий переклад у вихідному реченні, але мають дещо інші порядки, напр. “Чат нуар” і “чорний кіт”. Через конструкцію “ne/pas” у вхідному реченні є ще одне слово. Важко було б зробити правильний переклад безпосередньо з послідовності введених слів.