Неожиданное задание

Однажды, когда я получал первое высшее образование, у нас был предмет про искусственный интеллект и нейронные сети. Тогда я не стал делать выбор в сторону полноценного Data Science, а пошёл в backend разработку, где дошёл до уровня архитектора (Юду) и руководителя онлайн курсов (ОТУС). Но тема с ИИ меня явно зацепила и время от времени я слушал аудиокниги Айзека Азимова про роботов и искусственный интеллект, читал статьи, смотрел записи лекций американских университетов и даже проходил курсы, но применить эти знания на практике всё никак не получалось.

И тут неожиданно на работе для нового функционала появляется необходимость понимать положительный отзыв заказчик исполнителю написал или отрицательный. В YouDo, как и во многих крупных компаниях, есть специальный отдел датасаентистов, чьи нейронные сети определяют рекомендованную цену для задания, подбирают наиболее подходящих исполнителей, и так далее. Поэтому я начинаю прекрасно понимать, что если не потороплюсь, то задача уйдёт к ним! Начинаю экстренно разбираться как это реализовать на C#. Выяснил, что pandas, numpy, scikit и прочие популярные библиотеки, которые я использовал на питоне, уже имеют аналоги для шарпа. Но, что больше всего поразило, в экосистеме дотнета есть свой собственный инструмент, который является настоящим сокровищем!

Да это просто Волшебный Инструмент!

Оказывается, в Майкрософт долгое время разрабатывали библиотеку для быстрого обучения нейронных сетей, а три года назад, под названием ML.NET, они открыли её для всех желающих. С её помощью очень быстро создаю программу, которая обучает нейронную сеть и понимаю, что это Любовь. Всего 4 строчки потребовалось, чтобы с нуля создать нейронную сеть и ещё 3 строчки, чтобы прогнать тестовый отзыв через нейронную сеть и вывести на экран результат!

MLContext mlContext = new MLContext();
IDataView data = mlContext.Data.LoadFromTextFile<Review>("d:\\Reviews.tsv");
var pipeline = mlContext.Transforms.Text
	.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(Review.Text))
	.Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression());
ITransformer model = pipeline.Fit(data);

var predictionEngine = mlContext.Model.CreatePredictionEngine<Review, Prediction>(model);
var testReview = new Review { Text = "Всё было отлично!" };
predictionEngine.Predict(testReview).Dump();

После этого я ещё долго не мог прийти в себя. А как же изучение особенностей работы Word2Vec, примеры с King-Queen-Man-Woman, функции обратного распространения ошибки, расчёты количества скрытых слоёв и количества нейронов в этих слоях? С ML.NET это всё становится необязательным. Безусловно, в таком подходе есть и свои минусы, всё же полезно понимать внутреннюю реализацию, но теперь стало возможным создавать нейронные сети и не изучая всего этого. Не нужны также ни сверхкомпьютеры, ни расчёты на видеокартах, всё считается на обычном ЦПУ и работает очень быстро.

А не такой уж он и волшебный...

Звучит слишком хорошо, чтобы оказаться правдой, да? Так и вышло, нейронка, которую я таким образом натренировал, вышла не очень качественной и из 10 отзывов правильно распознавала только 6-7. Но это уже был отличный результат, чтобы с чего-то начать. Дальше я начал разбираться в том, почему могло так произойти и наткнулся на некоторые сложности. Во-первых, информации об использовании ML.NET для работы с текстами на русском языке не нашлось вообще. Во-вторых, часть даже англоязычной документации библиотеки была просто сгенерированной автоматически и не содержала никаких описаний и примеров использования, приходилось разбираться с помощью IntelliSense, исходного кода и метода научного тыка.

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

Выход из тупика

В этот момент на глаза случайно попалась фраза "sh*t in, sh*t out" и я понял, что возможно, слишком сильно доверял своим исходным данным. Стал их проверять и впрямь, нашлись очень любопытные примеры. Например, некоторые пользователи могли поставить за качество работы исполнителя и все остальные пункты одни пятёрки, а текстом написать настолько разгромный комментарий, что даже мне было стыдно его читать, не говоря уже об исполнителе, которому посчастливилось так не угодить заказчику. Также находились и совсем некорректные, например, состоящие из одних восклицательных знаков.

Обратите внимание на цифры справа, 0 - негативный отзыв, 1 - позитивный отзыв. Не говоря уже о том, что отзыв из одних символов неадекватен, так ещё и в одном случае человек поставил хорошие оценки, а в другом - плохие. К такому ни одна статья и ни один курс меня не готовили. Что поделать, это реальные отзывы и люди порой пишут очень странные вещи. Написал отдельную программу для чистки данных, в очередной раз обучил сеть и наконец-то результаты распознавания стали 8-9/10! Затем убрал из обучающих данных все отзывы от исполнителей (по условиям задачи нужны только отзывы заказчиков) и точность распознавания стала 9-10/10!

Вероятность

Отзыв

99.9999%

Массaж отличный! Анжeлика - мастер своего дела! Рекомендую????

99.7523%

Убрaлись отлично.Много писать не буду.Мега исполнительные.????

97.9455%

Евгений, браво! Профессионал! Мне кажется он с закрытыми глазами разберёт и собeрёт iPhone до последнего болтика! Ровно полчаса, как и обещал! Рекомендую!!!

99.9930%

Удивительный мaстер своего дела!За час навела красоту на голове дочери!Спасибо! Рекомендую всем, кто хочет крaсивую причёску!

99.9736%

Все супер! Ребёнок с удовольствием занимается с Алексaндром и делает домашку, хорошо усваивает материал и ждёт ещё занятий по математике:)

99.8528%

Рада знакомству с Натальей! После пилингa поддерживает, отслеживаем вместе процесс. Теперь знаю, что хочу чуть позже сделать из процедур! Советую!!

99.9724%

Валентин выполнил свою рaботу на отлично! Установил нам столешницу,варочную панель и мойку+подвесил все кухонные шкафы!

99.9791%

Просто на отлично и дaже больше! Ребята! Всем кто хочет чип-тюнинг или кaк-то прокачать свою тачку, то смело к Александру!!!

99.9804%

Сильный и опытный адвокaт, который понимает ситуацию сразу. Очень важно было получить консультацию без воды и по делу. Спасибо.

99.9090%

Заказывал диaгностику бу автомобиля перед покупкой. Хорошо, что не купил) Работа супер!

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

"Алексей - прекрасный специалист, отлично выполнил свою работу!" - так примерно выглядел бы обычный отзыв на такую работу. Но у нас тут другой случай, расскажу по-подробнее: {{длинный текст}}

В заключение

Итого, всё вышеописанное я сделал меньше чем за две недели, в свободное от трёх детей, основной работы в Юду и преподавания в ОТУСе время. Понимаю, что здесь также не обошлось без всех мои знаний и навыков из прошлого, но всё равно ML.NET показал себя инструментом из разряда quick wins. То есть он позволяет потратить те самые 20% усилий, чтобы получить 80% результата. И не обязательно разбираться в высшей математике и куче формул, годами бесплодно изучать DataScience (как это было со мной), достаточно лишь базового владения C# и понимания принципов работы Machine Learning, чтобы создавать полноценные нейронные сети для решения промышленных задач. И, так как за два года работы в ОТУСе мне удалось создать с нуля три успешных курса по C# и ASP.NET, я решил попробовать поделиться своими знаниями в рамках небольшого курса.

Исходный код "на попробовать"

По обратной связи от коллеги сделал для желающих запускаемый пример, чтобы можно было руками пощупать: https://github.com/Aleksei-Iagur/ml.net-example.git.


Если тоже хотите уметь быстро писать нейронные сети, приглашаю вас на 4-недельный экспресс-курс «Введение в Нейронные Сети на C#». Уже 14 сентября, на первом занятии, вы узнаете, как создавать нейронные сети с нуля, а начиная со второго, будете сами их обучать на практическом занятии.

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

Комментарии (18)