Проблемы применения машинного обучения для решения реальных задач


Deep learning
Машинное обучение (ML), Искусственный Интеллект (AI), нейронные сети (NN) — эти термины в последнее время время не сходят с новостных заголовков и этот шум даже не думает умолкать.
Большие данные, вычислительные мощности графических карт (GPU) и огромное количество научных исследований — позволили глубокому обучению стать технологией меняющей мир.

Доступность фреймворков машинного обучения в виде открытого программного обеспечения, от ведущих исследовательских групп (от крупных компаний: TensorFlow от Google, PyTorch от Facebook, CNTK от Microsoft) позволяют сейчас быстро начать самостоятельно экспериментировать с глубокими нейронными сетями.

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


1. Ценность данных и предварительной подготовки
2. Неравномерность распределения классов в реальных задачах
3. Интерпретация модели

1. Ценность данных и предварительной подготовки

В области машинного обучения, около 80% времени уходит на подготовку данных.
Если в научных статьях берётся готовый набор данных (dataset), на котором демонстрируется, что ваш новый алгоритм работает на 1% лучше, по сравнению со старым методом, то в жизни, обычно, речь идёт о создании надёжной системы, которая с достаточной точностью решает поставленную задачу.
Это означает, что для любой системы машинного обучения, потребуется подготовка и маркировка обучающей выборки, на которой алгоритмы смогут обучаться.
При этом, нужно учитывать, что для многих реальных задач, сам процесс получения и подготовки данных — может обходиться весьма дорого.

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

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

Например, очень часто берут предобученную сеть на таком наборе данных, как ImageNet, с выходом на 1000 классов.

from keras.applications import VGG16

model = VGG16(include_top=False, weights='imagenet')

Затем — настраивают выход сети на нужное количество классов и проводят переобучение сети на целевых данных задачи.
Это работает, так как такие наборы данных, как ImageNet позволяют использовать предварительно обученную нейронную сеть, для извлечения признаков (feature extractor), которые затем можно использовать для решения какой-либо другой проблемы компьютерного зрения.

Источники данных для предварительного обучения:
1. Предобученные модели — так называемый Зоопарк Моделей (Model Zoos). Например, для keras — deep-learning-models.

2. Открытые наборы данных (Public datasets). Множество самых разных наборов данных доступны в интернете. Поэтому, прежде чем тратить свой время на сбор данных самостоятельно — лучше предварительно поискать готовые наборы данных, которые могут помочь решить проблему, над которой вы работаете.
Начать можно с этих ресурсов:
CV Datasets on the web
awesome-public-datasets
Center for Machine Learning and Intelligent Systems: Data Sets
Kaggle Datasets
Datasets for Data Mining and Data Science
AWS Public Datasets
Deep Learning Datasets

3. Сбор данных с сайтов (Web Scraping). Можно реализовать свой парсер сайта (или сайтов), который автоматически соберёт с них нужные данные, что позволит вам создать свой новый набор данных.

В задаче написания своего парсера сайта, может помочь статья: Web Scraping с помощью python.
И всего две библиотеки:

import requests
import bs4

Пример можно посмотреть в статье:
Учим робота готовить пиццу. Часть 1: Получаем данные

4. Слабо размеченные данные. Для предварительного обучения модели, можно использовать, так называемые, слабо размеченные данные. Под этим понимаются данные, метки которых не всегда правильные (90% меток могут быть правильными, а 10% — ошибочными). Преимущество состоит в том, что такие данные могут быть получены автоматическим способом — без участия человека в разметке.

2. Неравномерность распределения классов в реальных задачах

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

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

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

Решения проблемы неравномерного распеделения классов:
1. Получить больше данных. Попытаться собрать больше данных из редких классов. Делать это нужно с осторожностью, так как увеличив количество редких классов в своём обучающем наборе, мы получим модель которая может чаще предсказывать редкие классы.

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

3. Отбор данных. Если нет возможностей получить больше данных или изменить классы — значит, нужно работать с исходными данными. Чтобы обучить модель работе на редких классах, можно изменить способ, которым алгоритм получает примеры для обучения.
Возможны следующие варианты:
Игнорирование — выборочно игнорировать более часто встречающиеся классы (самый простой метод).
Это позволяет выровнять количество образцов из каждого класса.

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

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

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

3. Интерпретация модели

В отличие от научных статей, в которых ваша модель должна продемонстрировать лучший результат работы, чем текущее state-of-the-art решение, при решении реальных задач, к модели предъявляются дополнительные требования:
* понимание почему и как модель может давать неправильные прогнозы,
* понимание почему модель работает лучше, чем предыдущее решение,
* уверенность, что модель не может быть обманута.

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

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

Деревья принятия решений (Decision trees) — можно отследить путь принятия решения по ветвям дерева, чтобы понять, как было принято решение. Как правило, верхние узлы охватывают самые важные параметры. Разумеется, всё становится сложнее, когда речь идет о случайных лесах принятия решений (Random forest).

К сожалению, понять как принимает решение нейронная сеть — гораздо сложнее. Они нелинейны и могут иметь миллионы параметров.

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

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

Статьи:
Explaining and Harnessing Adversarial Examples
Deep Neural Networks are Easily Fooled: High Confidence Predictions for Unrecognizable Images

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

1. Частичное перекрытие (Partial occlusion) — часть изображения скрывается и проверяется как изменяется отклик классификатора.
2. Карта полезности (Saliency map) — вычисляются производные входного изображения относительно предсказаний класса.

Статьи:
Visualizing and Understanding Convolutional Networks
Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps

Похоже, скоро нам всем придётся смириться с идеей ИИ, как «чёрного ящика».
Особенно, когда применение ИИ демонстрирует измеримые результаты, которые бизнес может выразить в денежной прибыли.
И вместо вопроса о том «Как ИИ приняло это решение?» — начать задавать другие вопросы.
Например: «Как можно обеспечить безопасность решений ИИ?»

Заключение

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

Мы пока далеки от Сильного ИИ (AGI — Artificial general intelligence) и поэтому текущие разработки ИИ следует воспринимать, как исполнительного рабочего, которого как и любого сотрудника следует обучать, контролировать и проверять. В некоторых областях, где есть достаточное количество хорошо подготовленных данных — ИИ может достичь хороших результатов, работая быстрее и точнее, человека.
К преимуществам ИИ, следует отнести исключение пресловутого человеческого фактора и способность находить скрытые корреляции в большом количестве признаков.

Ссылки
Applying deep learning to real-world problems
What do process manufacturers think about AI today?
Comparing Top Deep Learning Frameworks: Deeplearning4j, PyTorch, TensorFlow, Caffe, Keras, MxNet, Gluon & CNTK
Transfer Learning
Стилизация изображений с помощью нейронных сетей: никакой мистики, просто матан
Learning Deep Learning with Keras

По теме
Что не так со свёрточными нейронными сетями?
Будущее глубокого обучения

Нейронная сеть
Нейронная сеть — введение
Принцип обучения многослойной нейронной сети с помощью алгоритма обратного распространения
Пример работы самоорганизующейся инкрементной нейронной сети SOINN

Автор: Vladimir (noonv), 2017

Эксклюзивно для robocraft.ru
копирование на другие ресурсы и публикация
без разрешения автора запрещены.


Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение