Подготовка: очистка данных и визуализация

Как видите, наши данные представляют собой текстовый файл, который содержит по одному образцу полиномиальной функции в каждой строке. Эта функция отделена знаком равенства «=», который отделяет ее от расширенной версии, которая является нашим желаемым результатом.

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

Википедия определяет метод последовательности для последовательности следующим образом:

«Seq2seq превращает одну последовательность в другую (преобразование последовательности). Это достигается с помощью использования рекуррентной нейронной сети (RNN) или чаще LSTMили GRU, чтобы избежать проблемы исчезающего градиента. Контекст для каждого элемента является результатом предыдущего шага. Основными компонентами являются один кодировщик и один декодер сети.

Кодировщик превращает каждый элемент в соответствующий скрытый вектор, содержащий элемент и его контекст. Декодер меняет процесс, превращая вектор в элемент вывода, используя предыдущий вывод в качестве входного контекста».

"Источник"

Проанализируйте наши образцы и цели

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

Предварительная обработка данных

Следующее, что мы хотим сделать, это начать стандартизировать наши данные. Лучшие практики для аккуратного набора данных:

  • все входные образцы имеют одинаковую форму и тип
  • нет посторонних символов, которые могли бы засорить машину
  • мы знаем максимальную выходную длину нашей модели

В этом случае также полезно знать словарь, с которым вы работаете, так как это задача изучения текста НЛП. Чтобы векторизовать каждую последовательность, нам нужно сначала узнать, какие отдельные символы составляют каждый образец. Это важно для процесса кодирования и декодирования Seq2Sec.

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

Определите наши функции кодировщика и декодера

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

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

TL;DR: мы присваиваем номер каждому символу в нашем словаре и используем эту систему для преобразования текстовых последовательностей в векторную форму и обратно.

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

Векторизация текста и разделение данных

И мы можем векторизовать наши образцы, введя их в нашу функцию кодирования. Мы делаем это как для наших образцов, так и для целей (X, y).

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

Построение модели

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

Слой LSTM

Хотя я не буду вдаваться в подробности того, как именно работает этот слой, вот суть RNN и LSTM от GeeksForGeeks:

«Рекуррентные нейронные сети — это те сети, которые имеют дело с последовательными данными. Они предсказывают результаты, используя не только текущие входы, но и принимая во внимание те, которые произошли до этого. Другими словами, текущий выход зависит от текущего выхода, а также от элемента памяти (который учитывает прошлые входы).

Для обучения таких сетей мы используем старое доброе обратное распространение, но с небольшой изюминкой. Мы не обучаем систему самостоятельно в определенное время «t». Мы тренируем его в определенное время «t», а также все, что произошло до времени «t», например, t-1, t-2, t-3».

Источники: Обратное распространение во времени — RNN, Понимание сетей LSTM.

За ним следует слой RepeatVector. Для моделей кодер-декодер входные данные сжимаются в один вектор признаков, поскольку мы хотим, чтобы выходные данные восстанавливали то же измерение, что и исходный ввод, мы «искусственно» преобразовываем этот тензор признаков из 1D в N-D, реплицируя его с помощью RepeatVector. слой.

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

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

Сводная информация о модели TF Keras

Обучение модели

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

Это позволяет нам визуализировать в режиме реального времени, как наша модель изучает математику! К сожалению, это только я и мой слабенький ноутбук, так что мой тренировочный цикл занимает целую вечность, чтобы запустить что-либо. Но уже через пару часов у меня были результаты.

Итерация 1: точность: 89 %, потери: 29 %. Правильные предсказания: 0/10

Итерация 9: точность: 97 %, потери: 5 %. Правильные предсказания: 6/10

Заключение

Этот процесс был бы более быстрым и точным, если бы у меня была вычислительная мощность, однако результаты хорошие, и если вы сможете воспроизвести это на более качественном компьютере, возможно, запустив TF на графическом процессоре, вы обязательно добьетесь лучших результатов. Кроме того, стоит поэкспериментировать с большим количеством слоев, чтобы сравнить точность эпохи с течением времени между количеством слоев LSTM. Опять же, в настоящее время у меня нет вычислительных ресурсов для этого.

Имейте в виду, что этот процесс можно выполнить практически с любым набором данных последовательности. Это можно использовать для перевода предложений с одного языка на другой, для вычисления любых математических уравнений. Распространены в задачах НЛП, таких как машинный перевод, ответы на вопросы, создание чат-ботов, суммирование текста и т. д.

Оставьте лайк или комментарий, если вам было интересно. Я надеюсь, что это было полезно, и спасибо за чтение!