Особливості побудови та навчання моделі рекурентної нейронної мережі для рерайту речень

Особливості побудови та навчання моделі рекурентної нейронної мережі для рерайту речень

Технічну реалізацію рерайту речень можна здійснити за допомогою бібліотеки seq2seq, котра входить до складу бібліотеки TensorFlow – програмного забезпечення, розробленого компанією Google для вирішення здач побудови і тренування нейронних мереж.

Процес розв’язання будь-якої задачі з області обробки природних мов можна розбити на три етапи:

  1. Підготовка даних для навчання.
  2. Навчання нейронної мережі (створення моделі).
  3. Тестування одержаної моделі.

Розглянемо ці етапи більш докладно. Для навчання будь-якої нейронної мережі потрібно мати суттєвий об’єм даних (екземплярів) для навчання. Як правило для навчання мереж, що розв’язують задачі з області обробки природних мов використовують корпуси – філологічно-компетентні масиви мовних даних.

Для розв’язання поставленої задачі скористаємось корпусом Гутенберга, який містить близько 54000 безкоштовних електронних книг різних авторів. Послідовність підготовки потрібних даних:

  1. Виймання речень з “сирого” тексту, що міститься у корпусі Гутенберга. Для цього було створено спеціальний парсер на основі Beautiful Soup.
  2. Унікалізація одержаних речень за допомогою теорії множин.
  3. Випадкове перемішування речень та зберігання їх в окремому текстовому файлі.
  4. Отримання тегів з одержаних речень. При цьому на ту позицію, яку займає слово в реченні, ставиться Spacy-тег з символом “_” перед ним, який відповідає частині мови, до якої відноситься слово (таблиця 1). Замість розділових знаків ставиться тег _PUNCT.
    Таблиця 1 – Частини мови та відповідні їм теги шаблонів

    Частина мови Тег
    Іменник (Noun) _NOUN
    Прикметник (Adjective) _ADJ
    Дієслово (Verb) _VERB
    Прислівник (Adverb) _ADV
    Займенник (Pronoun) _PRON

     

  5. Фільтрація прикметників у шаблонах за наступним принципом: декілька тегів _ADJ, що йдуть один за одним у шаблоні, замінюються одним тегом _ADJ. Одержані шаблони, що мають абсолютну частоту повторень від 10 і більше зберігаються в окремому текстовому файлі. Bash-скрипт для виконання представлених п’яти пунктів
    #! /bin/bash
    # Extract sentences from raw text.
    echo “Extracting sentences in progres.”
    python extractor.py –gutenberg ./gutenberg/A

    echo ‘\n’

    # Uniqualization of the received sentences.

    python uniqueizer.py sentences.txt

    echo “Sentences uniqalization in progres.”

    # Shuffle lines in file.

    shuf output_uniq.txt > output_shuf.txt

    echo “Extracting tags in progres.”

    # Extract all tags from sentences.

    python tags_extractor.py < output_shuf.txt > output_tags.txt

    total_lines=$(wc -l < output_shuf.txt)

    echo “Total lines ${total_lines}.”

    # Filtering ADJ. Multi-ADJ is equal to one ADJ. Counting frequencies. Minimum frequency is 10.

    python templates.py 10 ${total_lines} < output_tags.txt

    echo ‘\n’

    echo ‘All done!\n’

  6. Фільтрація шаблонів за довжиною (кількістю тегів). Найбільш вживані шаблони мають довжину від 5 до 16 тегів. Результати роботи скрипта для зібрання статистики:
    There are 16236 templates 9 tags.There are 15804 templates 8 tags.

    There are 13019 templates 10 tags.

    There are 11207 templates 7 tags.

    There are 8305 templates 11 tags.

    There are 5611 templates 6 tags.

    There are 4576 templates 12 tags.

    There are 2024 templates 13 tags.

    There are 1861 templates 5 tags.

    There are 786 templates 14 tags.

    There are 244 templates 15 tags.

    There are 60 templates 16 tags.

  7. Відбір речень, що відповідають відфільтрованим шаблонам та збереження їх у окремому текстовому файлі. Оскільки при цьому потрібно обробляти великі об’єми даних, то ця задача вирішується у декілька потоків.
  8. Одержаний у пункті 7 файл уособлює бажані вихідні послідовності нейронної мережі (коректно побудовані англомовні речення). Вхідна послідовність готується у відповідності до вибраної стратегії на основі речень та відповідних їм шаблонів.При цьому власні імена замінюються тегами _NAME1, _NAME2, _NAME3, … як у вхідній, так і у вихідній послідовності.Фразеологічні дієслова як у вхідній, так і у вихідній послідовностях розглядаються як одне ціле, частини котрого поєднуються символом “_”. Наприклад, дієслову give_up відповідатиме один тег – _VERB.Найбільш ефективною виявилася змішана стратегія з наявністю ймовірної складової:

    синонімізація прикметників (тег _ADJ) у вхідній послідовності (за допомогою WordNet), інші слова (не прикметники) замінюються їх лемма-формами з вірогідністю 0,5 (в іншому випадку залишається відповідний тег);

    синонімізація прикметників (тег _ADJ) у вхідній послідовності (за допомогою WordNet), інші слова (не прикметники) замінюються їх лемма-формами з вірогідністю 0,4 (в іншому випадку залишається відповідний тег);

    прикметники додаються до вхідної послідовності у вигляді лемма-форм (без синонімізації), а всі інші слова (не прикметники) замінюються їх лемма-формами з вірогідністю 0,5 (в іншому випадку залишається відповідний тег);

    слова, що відносяться до найбільш “впливових” частин мови додаються до вхідної послідовності у вигляді їх лемма-форм (_NOUN, _ADJ, _VERB, _PRON), інші ж слова або розділові знаки у вхідній послідовності представляються у вигляді відповідних їм тегів;

    лемма-форми та теги у вхідній послідовності представлені з однаковою вірогідністю – 0,5;

    теги власних імен (NAME1, _NAME2, _NAME3, …) додаються із стовідсотковою вірогідністю, а інші слова замінюються своїми лема-формами з вірогідністю 0,5 (в іншому випадку залишається відповідний тег).

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

  9. Виконується розподілення даних: 80% одержаних даних, як для вхідної, так і для вихідної послідовностей відводяться на тренування (навчання) моделі, а 20% – на її тестування, котре виконується безпосередньо у процесі навчання.Після завершення етапу підготовки даних можна безпосередньо займатись навчанням моделі:python main.pyМодель будується на основі архітектури нейронної мережі, що використовується при машинному перекладі. Як компроміс для побудування окремих моделей для кожної з можливих пар довжин вхідної та вихідної послідовностей при цьому застосовуються “ковші” (англ. buckets), що задаються наступним чином:

    buckets = [(7, 7), (10, 10), (13, 13), (16, 16)]

    Оскільки вхідна та вихідна послідовності мають однакову довжину, то перше та друге значення у ковші співпадають. Наприклад, вхідна послідовність має довжину 5. У відповідності до розробленої стратегії вихідна послідовність матиме також довжину 5, а в цілому така пара буде віднесена до ковша (7, 7) після доповнення двома pad-символами.

    Як вхідна, так і вихідна послідовності кодуються кожна на власному словнику з найбільш вживаних 100000 слів. Застосовується просте кодування, при якому словник розглядається як список і код слова – це його позиція у списку. Для невідомих слів як у вхідному, так і у вихідному словнику є спеціальний тег – _UNK.

    В процесі навчання відображається поточне значення розгубленості (англ. perplexity) мережі. Навчання можна зупиняти коли воно досягає значення близького до 1 (як правило, на практиці perplexity навченої моделі становить значення від 1,05 до 1,3 – в залежності від якості даних).

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

    python main.py –decode

РЕКУРЕНТНІ НЕЙРОННІ МЕРЕЖІ ТА КОНЦЕПЦІЯ SEQUENCE-TO-SEQUENCE

Традиційні нейронні мережі не мають можливості приймати поточні рішення на основі своїх попередніх суджень. Велика кількість задач, що вирішуються при машинній обробці природніх мов потребує поетапного аналізу даних з врахуванням попередніх результатів. Нейронна мережа повинна “читати” речення слово за словом, “осмислюючи” його значення виходячи з контексту.

Рекурентні нейронні мережі (англ. Recurrent Neural Networks, RNN) – це мережі, що містять зворотні зв’язки і дозволяють зберігати інформацію (рис. 1).

Рис. 1. Рекурентна мережа у розгортці

На схемі вище фрагмент нейронної мережі A приймає вхідний значення xt і повертає значення ht. Наявність зворотного зв’язку дозволяє передавати інформацію від одного кроку навчання мережі до іншого.

Одним з різновидів RNN є LSTM-мережі. LSTM (англ. Long Short Term Memory) – це RNN здатні до навчання довготривалими залежностями. LSTM-мережі складаються з повторюваних елементів. Кожен такий елемент містить чотири шари і відрізняється тим, що має комірку довгої коротко-тривалої пам’яті.

Ідея, покладена в основу концепції Sequence-to-sequence полягає в тому, щоб використовувати одну LSTM-мережу для читання вхідної послідовності крок за кроком, щоб отримати векторний простір даних фіксованої розмірності, а потім використовувати іншу LSTM-мережу для формування вихідної послідовності з цього вектора (рис. 2). Можливість LSTM-мереж успішно вивчати дані з довготривалими залежностями робить їх природним вибором для розв’язання задач, у котрих як вхідна, так і вихідна інформація представляються у вигляді послідовностей деяких елементів (наприклад, літер, слів, речень).

Рис. 2. Модель, що читає вхідну послідовність “ABC” та генерує вихідну “WXYZ”

Концепція Sequence-to-sequence, реалізована за допомогою LSTM-мереж є основою для розв’язання задач машинного переводу, перевірки помилок у тексті та рерайту.

 

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

https://habrahabr.ru/company/wunderfund/blog/330194/

https://habrahabr.ru/company/wunderfund/blog/331310/

http://www.bioinf.jku.at/publications/older/2604.pdf

https://arxiv.org/pdf/1409.3215.pdf

https://www.gutenberg.org/