Код

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

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

Данные:

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

Так что на самом деле усилия генератора текста RNN двояки: ему нужно изучить семантику и контекст математических слов, которые появляются, а также язык LaTex. Чтобы свести к минимуму путаницу, которую мы можем внести в нашу модель, я решил потренироваться на файлах .tex о геометрии/топологии (некоторые термины в математике встречаются в нескольких местах и ​​иногда имеют совершенно разные значения). К сожалению, большинство текстов по математике размещены в формате pdf (пост-компиляция) и не зря. Поэтому я ограничил свои учебные наборы двумя наборами конспектов: Годовой курс алгебры Саната Девалапуркара и какой-то курс геометрической физики (ссылка на который ускользает от меня). Итак, с этими файлами мы можем приступить к обучению!

RNN

Следуя рекомендациям некоторых других людей в Интернете, я использовал два слоя LSTM со 128 ячейками в каждом, за которыми следовал полносвязный слой. Файлы tex были прочитаны и преобразованы в перекрывающиеся строки длиной 100. Стоит отметить, что меньший размер строки приводит к гораздо более быстрому обучению с риском более высоких потерь, а большее/меньшее количество ячеек в слое LSTM приводит к потери тоже выше. Во всяком случае, это то, что мы использовали.

Создание текста

После каждой эпохи обучения я печатал и компилировал сгенерированный текст из случайного начального числа длины 50. Были сгенерированы 3 разные строки, соответствующие температурам 0,2, 0,5, 1,0. В начале мы видим, что текст не очень связный, не говоря уже о математике:

Мы видим несколько хороших символов, но много мусора. Примерно в 7-й эпохе мы получаем кое-что намного лучше: модель, похоже, выучила пробелы и немного латекса.

Затем примерно в 11-й эпохе мы получаем некоторое подобие математики!

Мы получаем некоторые математические слова, которые иногда встречаются рядом друг с другом, такие как $pi_n$ и $H_n$, а также класс Тома и Эйлера. Здорово! Мы продолжаем тренироваться около 30 эпох, но обратите внимание, что плато потерь составляет около 15 эпох.

В конце концов, то, что мы здесь видим, — это фальшивая математика. Вот несколько сгенерированных фрагментов (отредактированных мной для компиляции).

В любом случае, код здесь!