Проект: 🤖 Interactive Machine Learning Experiments  Публичный пост
6 мая 2020  1466
🤖 Interactive Machine Learning Experiments
https://github.com/trekhleb/machine-learning-experiments

Вкратце

Я создал новый проект 🤖 Интерактивные эксперименты с машинным обучением на GitHub. Каждый эксперимент состоит из 🏋️ Jupyter/Colab ноутбука, показывающего как модель тренировалась, и 🎨 Демо странички, показывающей модель в действии прямо в вашем браузере.

Несмотря на то, что машинные модели в репозитории могут быть немного "туповатенькими" (помните, это всего-лишь эксперименты, а не вылизанный код, готовый к "заливке на продакшн" и дальнейшему управлению новыми Tesla), они будут стараться как могут чтобы:

  • 🖌 Распознать цифры и прочие эскизы, которые вы нарисуете в браузере
  • 📸 Определить и распознать объекты на видео из вашей камеры
  • 🌅 Классифицировать изображения, загруженные вами
  • 📝 Написать с вами поэму в стиле Шекспира
  • ✊🖐✌️ И даже поиграть с вами в камень-ножницы-бумагу
  • и пр.

Я тренировал модели на Python с использованием TensorFlow 2 с поддержкой Keras. Для демо-приложения я использовал React и JavaScript версию Tensorflow.

Интерактивные эксперименты с машинным обучением
Интерактивные эксперименты с машинным обучением

Производительность моделей

⚠️ Для начала, давайте определимся с нашими ожиданиями.️ Репозиторий содержит эксперименты с машинным обучением, а не готовые к "заливке на продакшн", оптимизированные и тонко настроенные модели. Этот проект скорее похож на песочницу, в которой можно учиться и тренироваться работе с алгоритмами машинного обучения и разными наборами данных. Обученные модели могут быть недостаточно точными (например, иметь 60% точности вместо ожидаемых, пускай, 97%), а также могу быть переученными и недоученными (overfitting vs underfitting).

Поэтому иногда вы можете увидеть что-то вроде:

Тупенькая машинная модель
Тупенькая машинная модель

Но будьте терпеливы, иногда эта же модель может выдавать что-то более "умное" 🤓:

Более умная машинная модель
Более умная машинная модель

Предыстория

Я инженер-программист и последние несколько лет занимаюсь в основном full-stack программированием (веб-проекты). В свободное от работы время, в качестве хобби, я решил углубиться в тему машинного обучения, чтобы в первую очередь для себя-же сделать эту тему менее магической и более математической.

  1. 🗓 Поскольку Python мог быть хорошим выбором для того, чтобы начать экспериментировать с машинным обучением я решил изучить его базовый синтаксис. В результате появился проект 🐍 Playground and Cheatsheet for Learning Python. Он был создан с одной стороны для того, чтобы практиковаться в написании кода на Python, а также в качестве "шпаргалки" с базовым синтаксисом, чтобы в нужный момент можно было быстро подсмотреть вещи наподобие dict_via_comprehension = {x: x**2 for x in (2, 4, 6)}.

  2. 🗓 После ознакомления с Python-ом я хотел чуть больше углубиться в математическую часть машинного обучения. В итоге после прохождения замечательного курса от Andrew Ng на Coursera я создал проект 🤖 Homemade Machine Learning. Это была очередная "шпаргалка для себя-же" с базовыми алгоритмами машинного обучения, такими как линейная регрессия, логистическая регрессия, алгоритм k-средних, многослойный перцептрон (или персептрон? 🤔) и прочие.

  3. 🗓 Моей следующей попыткой "поиграться в машинное обучение" стал 🤖 NanoNeuron. Это были 7 простых JavaScript функций, которые должны были дать понимание читателю о том, как же машина все-таки может "учиться".

  4. 🗓 После окончания очередного прекрасного курса по Deep Learning от все того-же Andrew Ng на Coursera я решил больше попрактиковаться с многослойными перцептронами (multilayer perceptrons), сверточными и рекуррентными нейронными сетями (convolutional and recurrent neural networks). На этот раз, вместо того, чтобы реализовывать их с нуля я решил воспользоваться уже готовым фреймворком. В итоге я начал с TensorFlow 2 с поддержкой Keras. Я так же не хотел фокусироваться на математике (позволив фреймворку сделать свое дело), вместо этого хотелось написать что-то более практичное и интерактивное, что-то, что можно было бы протестировать прямо в браузере телефона. В результате появился новый проект 🤖 Interactive Machine Learning Experiments, на котором я и хочу остановиться более детально в этой статье.

Технологический стек

Тренировка моделей

  • 🏋🏻‍ Для тренировки моделей я использовал Keras, как часть TensorFlow 2. Поскольку до этого у меня не было опыта с фреймворками для машинного обучения мне нужно было с какого-то из них начать. Один из ключевых факторов, который мне понравился в TensorFlow было наличие сразу двух его версий: версии на Python и версии на JavaScript, у которых был схожий API. В итоге я использовал Python версия для тренировки, а JavaScript версию библиотека для демо-приложения.

  • 🏋🏻‍ Я тренировал модели на Python внутри Jupyter ноутбуков локально. Иногда использовал Colab, чтобы воспользоваться GPU и тем самым ускорить тренировку.

  • 💻 Большинство моделей были натренированы на CPU старого доброго MacBook Pro (2,9 GHz Dual-Core Intel Core i5).

  • 🔢 И конечно же было никак не обойтись без NumPy для матричных (тензорных) операций.

Демонстрация моделей

  • 🏋🏻‍ Я использовал TensorFlow.js для того, чтобы воспользоваться в браузере заранее натренированными на предыдущем шаге (в Jupyter ноутбуке) моделями.

  • ♻️ Для конвертирования моделей из формата HDF5 в формат TensorFlow.js Layers я использовал TensorFlow.js converter. Это конечно же может быть неэффективно загружать всю модель в браузер целиком (речь ведь идет о мегабайтах данных) вместо того, чтобы делать предсказания вызывая модель удаленно через HTTP запросы, но, снова-таки, вспомним, что речь идет об экспериментах, а не о зрелой и оптимизированной архитектуре, которую можно брать и сразу же использовать для "продакшна". С точки зрения простоты подхода я также хотел избежать развертывания отдельного сервера с HTTP API для предсказаний моделей.

  • 👨🏻‍🎨 Демонстрационное приложение было создано на React с использованием create-react-app стартера с поддержкой Flow по умолчания для проверки типов.

  • 💅🏻 Для стайлинга я воспользовался библиотекой Material UI. Я хотел, как говориться, "убить двух зайцев сразу" и заодно попробовать новый для себя фреймворк для пользовательских интерфейсов (прости, Bootstrap 🤷🏻‍).

Эксперименты

Демо-страничка с экспериментами, а также Jupyter ноутбуки с деталями тренировки доступны по следующим ссылкам:

Эксперименты с многослойным перцептроном (Multilayer Perceptron, MLP)

Распознавание цифр

Вы рисуете цифру, а модель пытается ее распознать.

Handwritten Digits Recognition
Handwritten Digits Recognition

Распознавание эскизов

Вы рисуете эскиз, а модель пытается его распознать.

Handwritten Sketch Recognition
Handwritten Sketch Recognition

Эксперименты со сверточными нейронными сетями (Convolutional Neural Network, CNN)

Распознавание цифр (CNN)

Вы рисуете цифру, а модель пытается ее распознать. Этот эксперимент похож на предыдущий из раздела MLP, но на этот раз модель использует CNN.

Handwritten Digits Recognition (CNN)
Handwritten Digits Recognition (CNN)

Распознавание эскизов (CNN)

Вы рисуете эскиз, а модель пытается его распознать. Этот эксперимент похож на предыдущий из раздела MLP, но на этот раз модель использует CNN.

Handwritten Sketch Recognition (CNN)
Handwritten Sketch Recognition (CNN)

Камень-Ножницы-Бумага (CNN)

Вы играете в камень-ножницы-бумагу с моделью. Этот эксперимент использует CNN, натренированную с нуля.

Rock Paper Scissors (CNN)
Rock Paper Scissors (CNN)

Rock Paper Scissors (MobilenetV2)

Вы играете в камень-ножницы-бумагу с моделью. Эта модель использует трансферное обучение, основанное на сети MobilenetV2.

Rock Paper Scissors (MobilenetV2)
Rock Paper Scissors (MobilenetV2)

Распознавание объектов (MobileNetV2)

Вы показываете модели ваше окружение (используя камеру ноутбука или телефона), а модель пытается определить предметы на видео и распознать их. Эта модель использует сеть MobilenetV2.

Objects Detection (MobileNetV2)
Objects Detection (MobileNetV2)

Классификация изображений (MobileNetV2)

Вы загружаете изображение, а модель пытается его классифицировать в зависимости от того, что она "видит" на картинке. Модель использует сеть MobilenetV2.

Image Classification (MobileNetV2)
Image Classification (MobileNetV2)

Эксперименты с рекуррентными нейронными сетями (Recurrent Neural Networks, RNN)

Суммирование чисел

Вы набираете выражение (например, 17+38) и модель предсказывает результат (например 55). Интересность этой модели заключается в том, что она воспринимает выражение на входе, как последовательность символов (как текст). Модель учится "переводить" последовательность 11717+17+317+38 на входе в другую текстовую последовательность 55 на выходе. Считайте, что модель скорее делает перевод испанского Hola в английское Hello, чем оперирует математическими сущностями.

Numbers Summation
Numbers Summation

Генерация текста в стиле Шекспира

Вы начинаете поэму как Шекспир, а модель пытается ее продолжить как Шекспир. Ключевое слово "пытается" 😀.

Shakespeare Text Generation
Shakespeare Text Generation

Генерация текста в стиле Wikipedia

Вы начинаете печатать Wiki статью, а модель продолжает.

Wikipedia Text Generation
Wikipedia Text Generation

Планы

Как я упомянул выше, главная задача репозитория - быть тренировочной площадкой, песочницей для обучения машинному обучению (привет, каламбур 🙌🏻). Поэтому в планах - продолжать учиться и экспериментировать с различными задачами в области Deep Learning. Такими интересным задачами могут быть:

  • Определение эмоций
  • Перенос стиля
  • Машинный перевод
  • Генерация изображения (например тех-же написанных цифр)
  • и пр.

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

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

Успешного обучения! 🤖

UPD

Добавил новый эксперимент - 🥑 Генератор рецептов. Генератор предложил мне приготовить "Крем-соду с луком", "Салат с двойным медом" и "Салат из лимонадного фарша с перцем" 🤷

Recipe generator demo
Recipe generator demo

8 комментариев 👇
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

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

Спасибо большое, думаю большинству, как и мне, это будет актуально :)

  Развернуть 1 комментарий

Спасибо, Александр, рад, что проект оказался полезным!

  Развернуть 1 комментарий
Oleksii Trekhleb Software Engineer автор 27 мая 2020

Добавил эксперимент с генерацией шмоток из шума. Качество картинок плохое (всего 28х28 пикселей), но интересно было попробовать, как в принципе работают GANs (Generative Adversarial Network):

Generative Adversarial Network Demo
Generative Adversarial Network Demo

  Развернуть 1 комментарий
metya Applied Deep Learning Researcher 15 мая 2020

в суммировании чисел смешно, конечно, вышло)

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

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

вот одна из последних интересных работ https://arxiv.org/abs/2001.05016
(за историей написания которой стоит своя интересная драма)

  Развернуть 1 комментарий

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

В контексте RNN я добавил чуть более продвинутый (с точки зрения оправданности количества тренируемых параметров) эксперимент, в котором RNN генерирует рецепты (название, ингредиенты и способ приготовления). Эксперимент все так-же игрушечный, но уже более забавный для залипания (например RNN предложила приготовить мне "Крем-Соду с луком" и "Салат с двойным медом").

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб