Тема машинного обучения становится все более популярной в последние годы. Это способность использовать нейронные сети, которые позволяют нашему программному обеспечению «учиться» само и автоматически выполнять задачи за нас, как это сделал бы человек. Например, машинное обучение было использовано для разработки программы, которая смогла обыграть лучшего игрока в го в мире.

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

Установка

Поскольку я в первую очередь разработчик JavaScript, я решил использовать популярную библиотеку JavaScript для создания нейронных сетей под названием Brain.JS. Хотя есть альтернативы, Brain.JS имеет простой API, который позволяет вам приступить к созданию нейронных сетей за считанные минуты.

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

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

Как упоминалось ранее, начать работу с нейронной сетью в Brain.JS довольно легко. Brain.JS уже предлагает вам на выбор множество готовых обычных нейронных сетей. Например, они предлагают:

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

Основная идея здесь заключается в том, что каждый алгоритм передает данные через узлы сети по-разному, поэтому каждый алгоритм имеет свой рабочий процесс и разные результаты. У каждого алгоритма есть свои варианты использования. Например, API для сети Feedforward при работе с Brain.JS позволяет вводить только числа, а мы хотим работать со строками.

Для работы со строками нам нужно использовать сети RNN, LSTM или GRU. После некоторых исследований и некоторых проб и ошибок сеть LSTM доказала, что лучше всего работает с моими данными.

Вот как настроить сеть LSTM (Long Short Term Memory).

Brain.JS делает это легко.

Обучение сети

Чтобы получить прогнозы от сети для любого заданного названия события, нам сначала нужно обучить сеть. Мы делаем это, предоставляя данные для обучения сети в форме на входе и выходе. Например, входом может быть «21-й день рождения», а на выходе - «день рождения». Основываясь на данных обучения, сеть попытается определить наиболее вероятный результат для любых новых вводимых данных.

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

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

Мы можем передать эти данные в нейронную сеть, импортировав их и вызвав в сети метод «train».

Также можно передать параметры обучения, такие как итерации, которые я указал как 2000. Чем больше итераций над обучающими данными выполняется, тем точнее оценки, которые сеть сможет сделать. Однако, поскольку обучение нейронной сети LSTM с длинными строками может занять очень много времени, я ограничил это, чтобы увеличить скорость (по умолчанию 20000).

Запуск сети

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

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

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

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

Я был разочарован тем, что сеть не могла понять, что на вечеринках по случаю дня рождения обычно есть числа, такие как «21-й день рождения», «40-й день рождения» и т. Д.

Улучшение результатов

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

Для следующего тестового прогона я увеличиваю количество итераций до 3000 и добавляю следующие дополнительные записи к обучающим данным.

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

Последние мысли

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

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

Я считаю, что в реализации LSTM должны быть некоторые ошибки из-за иногда получения странных выходных данных, таких как «rtystop-inputstart-outputbirthday», который относится к тому, как входные данные сериализуются во время обучения.

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

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

Если вы хотите увидеть мой исходный код для этого эксперимента полностью, вы можете найти его на GitHub: https://github.com/blake-simpson/nn-event-classification