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

Сколько данных вам действительно нужно?

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

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

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

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

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

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

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

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

Можете ли вы решить это?

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

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

Увеличение и синтез данных

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

Некоторые библиотеки Python, которые легко увеличивают размер вашего набора и с которыми очень легко начать работу, — это tf.image от Tensorflow и torchvision.transforms от PyTorch. [3]

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

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

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

Другим широко используемым методом синтеза данных является метод передискретизации синтетического меньшинства (SMOTE) [5], который может быть особенно полезен, когда ваш набор несбалансирован. Этот метод предлагает сочетание недостаточной выборки класса большинства и избыточной выборки класса меньшинства для повышения производительности вашей модели. Обратите внимание, что исходная работа, представляющая SMOTE, описывает производительность в пространстве ROC, а не просто с точки зрения точности, что было бы очень обманчивым в этом несбалансированном сценарии. Проще говоря, этот алгоритм случайным образом выбирает точку данных для класса меньшинства, затем находит для нее k ближайших соседей, и снова случайным образом выбирается один из этих k. Вновь созданная точка данных будет случайным образом синтезирована на прямой линии между двумя выбранными точками [6].

Какой метод выбрать, будет сильно зависеть от вашей проблемы. Конечно, использование GAN для создания изображений довольно сложнее, чем чередование с доступной библиотекой Python. Также учитывайте ваши временные ограничения, использование GAN для синтеза новых данных потребует обучения не одной, а двух моделей, и, возможно, у вас просто нет на это времени.

Опять же, необходимо учитывать характеристики вашего сценария. Вы работаете с картинками или с табличными данными? К сожалению, вы не найдете много простых способов увеличить размер набора при работе с таблицами. Были подходы к использованию GAN для генерации синтетических данных [7], но, честно говоря, реальные приложения ограничены, и сообщество часто не одобряет этот метод для этого конкретного случая использования. Однако, если вы решите попробовать, необходимо принять во внимание некоторые соображения. Будьте осторожны с данными временных рядов, так как генеративно-состязательная модель может не уловить тенденции. В целом SMOTE считается более эффективным вариантом для синтеза табличных данных. Кроме того, хотя новое синтезированное или дополненное изображение не представляет сложности для понимания нашим мозгом, это не обязательно применимо к табличным данным. Я бы посоветовал не использовать примеры, которые не может понять даже эксперт в предметной области, поскольку ваша модель, скорее всего, уже будет лишена объяснимости.

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

Трансферное обучение

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

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

Конечно, есть много способов реализовать трансферное обучение на практике. Если вы хотите, чтобы это было просто, и вы используете Keras, это так же просто, как использование обучаемого атрибута. Установка значения false заморозит слой и не обновит его во время обучения. Вы также можете найти очень хороший и полный список доступных моделей на Keras Applications, чтобы вы могли выбрать то, что лучше всего соответствует вашим потребностям.

Сбор данных

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

Что касается коллекции, подумайте также об использовании библиотек с открытым исходным кодом, если ваш вариант использования позволяет это сделать. Некоторые из лучших общедоступных наборов данных можно найти в Kaggle, Google Dataset Search, ImageNet, Amazon Reviews или UCI Machine Learning Repository; в зависимости от типа данных, которые вы ищете (изображения, табличные данные, текст и т. д.). Также стоит взглянуть на доступные данные, предоставляемые некоторыми крупными облачными провайдерами, такими как GCP или AWS.

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

Вывод

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

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

использованная литература

[1] Джейсон Браунли, Сколько обучающих данных требуется для машинного обучения? https://machinelearningmastery.com/much-training-data-required-machine-learning/

[2] Рохит Двиведи, Как увеличение данных влияет на производительность классификации изображений с помощью кодов https://analyticsindiamag.com/image-data-augmentation-impacts-performance-of-image-classification-with -коды/

[3] OpenGenus, Методы увеличения данных https://iq.opengenus.org/data-augmentation/

[4] Агнешка Миколайчик, Михал Гроховски, Увеличение данных для улучшения глубокого обучения в задаче классификации изображений https://www.researchgate.net/publication/325920702_Data_augmentation_for_improving_deep_learning_in_image_classification_problem

[5] Бенджамин Биринг, Начало работы с ИИ: сколько данных вам нужно? https://2021.ai/getting-started-ai-how-much-data-needed/

[6] Нитеш В. Чавла и др., SMOTE: Метод избыточной выборки синтетического меньшинства https://arxiv.org/pdf/1106.1813.pdf

[7] Lei Xu, Kalyan Veeramachaneni, Синтез табличных данных
с использованием генеративно-состязательных сетей
https://arxiv.org/abs/1811.11264