Практический подход к задачам машинного обучения
Начинающие в области машинного обучения часто задают мне такой вопрос: “Мы уже изучили множество различных методов, моделей и подходов. Допустим, приходит реальная задача. Как к ней подойти? Какие методы и как применять?”. В этой статье я попробую ответить на этот вопрос, описать практическую методологию работы над задачей в области машинного обучения.
Итак, есть задача, которая предполагает использование машинного обучения. Как к ней подступиться?
1. Начните с решения без машинного обучения
Вам в любом случае понадобится базовая реализация для сравнения. Использовать машинное обучение имеет смысл только в тех случаях, когда оно работает лучше других методов. Это очевидно! Но как узнать, что машинное обучение – лучший выбор в вашем случае? Начните с применения других методов, которые подходят для вашей задачи.
Ваша задача связана с классификацией текстов? Начните с использования ключевых слов. Используйте шаблоны. Используйте другие эвристики. Существует множество NLP-инструментов, которые позволяют использовать правила и другие методы для решения таких задач.
Ваша задача предполагает распознавание образов на изображениях? Используйте классические алгоритмы из OpenCV: детекторы контуров и контурный анализ, распознавание по ключевым точкам (SIFT, детектор Хариса, HOG) и т.д.
Распознавание событий во временных рядах? Начните с простых эвристик…
Суть одна. Найдите классические алгоритмы/методы для решения похожих задач и начните с них решение вашей задачи. Возможно, применение простых эвристик уже позволит решить вашу задачу на 99.9%. Останется ли тогда смысл инвестировать в более сложное решение на машинном обучении? А если классические методы будут работать не очень хорошо или очень плохо для вашей задачи, тогда у вас появится отличный базис для сравнения эффективности ваших моделей машинного обучения.
Часто при помощи машинного обучения улучшают уже существующие системы, которые работают на эвристиках и правилах. Если это ваш случай, изучите существующую реализацию. Это даст вам лучшее понимание задачи и данных.
2. Попробуйте линейные модели машинного обучения и деревья
Если эвристики и правила не работают для вашей задачи (или работают не достаточно хорошо), переходите для начала к простым линейным моделям машинного обучения.
Ваша задача связана с классификацией текстов? Попробуйте трансформировать тексты в Bag-of-Words и применить логистическую регрессию или SVM. Bag-of-Words работает плохо для вашей задачи? Используйте TF-IDF.
У вас задача по распознаванию образов на изображениях? Используйте детекторы признаков и логистическую регрессию или SVM.
Предиктивная модель продаж? Используйте линейную регрессию.
Теггинг слов в последовательности? Попробуйте CRF…
Попробуйте простую линейную модель. Возможно при помощии нее вы уже решите задачу. Линейная модель работает плохо? Проанализируйте, какие ошибки совершает ваша модель. Возможно ее можно улучшить, спроектировав лучшие признаки.
У вас текстовые данные? Попробуйте в качестве признаков n-граммы, суффиксы, регулярные выражения, знаки препинания и т.д. У вас табличные данные? Попробуйте различные комбинации признаков, степени, логарифмы и т.д. (которые имеют смысл для ваших данных).
Также, если у вас табличные данные, попробуйте модели на основе деревьев. Деревья решений, случайные леса, градиентный бустинг.
Линейные модели и деревья не дают необходимого результата, а проектирование признаков не выглядит реалистичным занятием? Тогда переходите к глубоким нейронным сетям.
3. Попробуйте стандартные модели глубоких нейронных сетей
Классификация объектов на изображениях? Начните с тюнинга на своих данных стандартных моделей глубоких нейронных сетей (VGG, Inception, ResNet и т.д.), обученных на ImageNet.
Классификация текстов? Используйте обученные векторные представления слов и сверточную нейронную сеть поверх.
Теггинг слов? Используйте векторные представления слов и рекуррентную нейронную сеть.
Возьмите стандартную известную архитектуру нейронной сети и примените ее для своей задачи самым общепринятым способом. Скорее всего, для вашей задачи она не будет работать так же хорошо, как для изначального набора данных, для которого она проектировалась. Однако, это будет отправной точкой вашего решения.
4. Проанализируйте вашу модель
Проанализируйте метрики модели на тренировочных и валидационных данных. Ваша модель недообучается или переобучается?
Проанализируйте как шел процесс обучения модели. Как выглядят кривые изменения значения функции ошибки?
Сделайте рандомизированную выборку данных, для которых модель работает не верно. Например, сто примеров, в которых модель не правильно распознает объекты на изображениях или не правильно классифицирует тексты. Изучите данную выборку, выделите типовые случаи, в которых модель ошибается. Например, ваша нейронная сеть ошибается, когда объект на изображении очень маленький, или при определенном фоне, или когда размыта какая-то часть объекта, или когда в тексте встречаются определенные слова, или когда тексты очень длинные и т.д. Определите, какие признаки повлияли на неверное решение модели. Для этого можно использовать различные инструменты.
Переходите к следующему разделу.
5. Улучшите вашу модель
На основе анализа из предыдущего раздела и ваших возможностей примите решение, какие методы улучшения точности модели рационально использовать, и попробуйте применить данные методы. Приведу основные типы доступных методов:
1) Используйте больше данных
Если у вас есть такая возможность, используйте ее. Глубокие нейронные сети работают очень хорошо на больших объемах данных. Большее количество данных может работать как регуляризация модели. Если ваша нейронная сеть хорошо выучивает тренировочные данные, попробуйте добавить больше, это может сработать.
2) Сгенерируйте больше данных
Расширьте свой набор данных синтетическими данными. Это особенно хорошо работает для изображений. Используйте случайные трансформации и сдвиги. Подумайте, какие трансформации имеют реальный смысл для ваших данных. Этот метод можно применять и для табличных данных. Можно использовать генеративные модели для создания синтетических данных. Расширение набора данных – популярная техника.
3) Используйте спроектированные признаки
Если вы используете глубокое обучение, это не значит, что вы обязаны использовать исключительно сырые данные. Если существует понятный признак, который легко определить простым алгоритмом, и наличие которого коррелирует с результатом, то почему бы этим не воспользоваться? Особенно, если ваша модель часто ошибается на тех примерах, где этот признак присутствует и может быть использован.
4) Используйте Transfer Learning
Вы не можете достать больше данных для своей задачи? Примените творческий подход. Найдите близкую задачу, для которой доступно огромное количество данных. Обучите вашу нейронную сеть этой задаче на этом огромном количестве данных. Затем используйте часть обученной модели в качестве детекторов признаков для вашей задачи. Или используйте тюнинг обученной модели для вашей задачи.
5) Используйте Multitask Learning
Обучите вашу нейронную сети выполнять дополнительные задачи, кроме исходной. Например, распознавать дополнительные свойства. Это может сработать как регуляризация модели.
6) Разбейте задачу на подзадачи
Возможно ваша задача слишком сложна для создания end-to-end learning модели. Разбейте ее на подзадачи, обучите модель машинного обучения для каждой подзадачи. Объедините модели машинного обучения в систему. Очевидно, что разбивать задачу на подзадачи необходимо таким образом, чтобы для подзадач существовали данные для машинного обучения.
7) Используйте методы регуляризации
Попробуйте L1- и L2-регуляризации и дропаут. Если ваша модель сильно переобучается и вы получаете огромные веса, эти простые техники могут сработать.
8) Используйте больше нейронов/фильтров
Если ваша модель недообучается, попробуйте увеличить емкость модели, добавляя больше нейронов/фильтров.
9) Используйте больше слоев
Добавление нейронов увеличивает емкость сети, но приводит к худшей генерализации? Попробуйте использовать больше слоев.
10) Используйте Residual-соединения
Добавление большего количества слоев становится проблематичным? Используйте Residual-соединения.
11) Оптимизируйте архитектуру нейронной сети
Подберите оптимальные размеры слоев, количества фильтров, типы нейронов, функции активации и т.д. Создать архитектуру нейронную сети, оптимальную для конкретной задачи, достаточно сложно, требует глубокого анализа обученных моделей, исcледования данных и множества экспериментов. Оптимально спроектированная архитектура может обучаться гораздо лучше, чем стандартная.
12) Оптимизируйте параметры алгоритма оптимизации
Значение функции ошибки достигает плато? Обучение сходится в локальном минимуме? Используйте момент, момент Нестерова, адаптивные версии градиентного спуска и т.д. Оптимизируйте параметры алгоритма оптимизации.
13) Используйте ансамбли моделей
Не получается создать одну универсальную модель? Разные версии модели делают различные типы ошибок? Используйте ансамбли моделей. Обучите несколько моделей. Используйте их результаты как входные данные для линейной модели машинного обучения или просто вычисляйте среднее.
14) Используйте экспериментальные методы
Если вы исчерпали почти все подходы, но у вас есть огромные ресурсы, вы можете начать исследовать новые типы нейронов и слоев, исследовать что-то принципиально новое и написать об этом научную статью :)
У меня получился не исчерпывающий и упрощенный список. Но, я думаю, основные направления понятны. После улучшения модели, переходите обратно к разделу 4. Улучшение модели – это итеративный процесс.
Заключение
Надеюсь, что мне удалось ответить на вопрос “как подойти к задаче в области машинного обучения?” и объяснить как происходит последовательная работа над решением. А что вы думаете по этому вопросу?