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

Вообще говоря, большинство алгоритмов машинного обучения можно разделить на две категории: линейные модели или нелинейные модели. Линейные модели легко интерпретировать, быстрее обучать и развертывать и не требуют чрезмерных вычислительных ресурсов. Линейная модель изучает и производит взвешенную сумму входных данных плюс член смещения (пересечения), так что она сопоставляет один входной объект X с одной целью f (X).

Линейный против нелинейного

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

Большинство алгоритмов, особенно нейронных сетей и их вариантов, предназначены для моделирования основного распределения набора данных, на котором они обучаются. Эти алгоритмы имеют миллионы обучаемых параметров, которые после изучения будут определять закономерности и тенденции в наборе обучающих данных. Сам набор обучающих данных, каким бы большим он ни был, по-прежнему является лишь подмножеством всех возможных примеров - генеральной совокупностью. По мере увеличения сложности генеральной совокупности и / или сложности алгоритмов нам требуется все больше и больше точек данных для надежной оценки основного распределения. Рассмотрим два примера: 1. Модель обучается различать цветные коробки, скажем, красные, зеленые и синие коробки, на производственной сборочной линии, и 2. Модель обучается различать ткани в человеческом теле, чтобы помочь в хирургии. Мы можем сделать обоснованное предположение, что во втором случае потребуется гораздо больше точек данных для надежной оценки основного распределения по сравнению со случаем 1 просто из-за возможных вариаций и флуктуаций данных. Небольшой набор данных может вводить в заблуждение или нерепрезентативно относительно основной тенденции.

Размер набора данных

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

Вы можете задать себе этот вопрос по множеству причин:

  1. Сбор данных: возможно, вы еще не собрали данные, и вам нужно знать цену и время, необходимые для сбора достаточного количества данных для обучения высокопроизводительной модели машинного обучения.
  2. Увеличение данных: возможно, вы собрали некоторые данные и вам нужно знать, сколько вам нужно, чтобы расширить свой набор данных.
  3. Исторические данные: возможно, у вас уже есть большой набор данных, и вам необходимо знать оптимальный размер набора данных, чтобы снизить затраты на вычисления и хранение.
  4. Трансферное обучение: у вас может быть обученная модель, и вы хотите применить ее к «аналогичной» проблеме с минимальным возможным повторным обучением.

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

График кривой обучения

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

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

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

Графики кривой обучения, часть 2: эксперимент

В части 1 мы обсудили проклятие требований к данным для нелинейных моделей машинного обучения. Мы увидели, что можем использовать графики кривой обучения для оценки размера набора данных для достижения целевой производительности. Во второй части мы спроектируем этот эксперимент с использованием набора данных теста: Fashion-MNIST. Набор данных Fashion-MNIST содержит 60 000 обучающих изображений (и 10 000 тестовых изображений) предметов моды и одежды, взятых из 10 классов. Каждое изображение стандартизировано в оттенках серого и имеет размер 28 × 28 пикселей (всего 784 пикселя). Это более сложная проблема классификации, чем цифры MNIST, и лучшие результаты достигаются за счет сверточных нейронных сетей с глубоким обучением с точностью классификации примерно от 90% до 95% на тестовом наборе данных. Каждому примеру обучения и тестирования присвоен один из следующих ярлыков:

На рисунке ниже показаны некоторые примеры точек данных Fashion-MNIST, которые мы будем использовать в нашем эксперименте.

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

Погружение в эксперимент

Мы будем использовать Google Colab (python 3) для разработки нашего эксперимента и API keras для доступа к набору данных Fashion-MNIST и определения нашей архитектуры CNN. Во-первых, давайте посмотрим, какой импорт нам понадобится для этого эксперимента.

Мы используем библиотеку matplotlib для наших потребностей отображения и keras как для доступа к набору данных Fashion MNIST, так и для создания нашей архитектуры CNN. Затем давайте определим 3 вызова функций, чтобы сделать наш код модульным и упростить нашу жизнь.

  1. Подготовьте набор данных для обучения и оценки:

Сначала мы изменяем форму точек данных так, чтобы они имели один цветовой канал, а затем преобразовываем метки в горячую кодировку для обучения. Наконец, каждый пиксель в наборе данных имеет значения от 0 до 255. Нам нужно преобразовать их из unsigned int в float32 и нормализовать значения до 0–1.

2 . Создайте архитектуру CNN:

Мы будем использовать очень простую последовательную модель для этого эксперимента. Эта модель будет иметь 32 сверточных фильтра 3x3 с активациями RELU. За слоем свертки следует слой maxpooling 2x2, выходные данные которого будут сглажены, чтобы предоставить функции для классификатора. Затем мы будем использовать плотный слой со 100 узлами для интерпретации функций. Наконец, мы будем использовать еще один плотный слой с 10 узлами, представляющими 10 классов с активацией softmax, в качестве классификатора.

Все слои будут использовать схему инициализации веса HE для заполнения весов. Мы будем использовать стохастический градиентный спуск с консервативной скоростью обучения 0,01 и импульсом 0,9 в качестве оптимизатора и категориальной кроссэнтропией в качестве функции потерь. Помните, что все эти параметры можно настраивать, и они должны быть настроены для начала, чтобы иметь хорошую модель. Более сложные задачи, такие как автономное вождение и распознавание речи, потребуют очень сложных моделей, но поскольку наша постановка задачи относительно проста, мы используем относительно простую сеть.

3. Обучите и оцените модель:

Наша последняя функция обучит и оценит модель. Этот шаг - самая важная часть пути, но его легче всего понять. Сначала мы используем определение модели для создания нашей архитектуры CNN, затем обучаем ее с помощью model.fit и, наконец, оцениваем обученную модель с помощью model.evaluate. В этом эксперименте мы выбрали размер пакета 32 и обучили модель 10 эпохам.

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

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

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

В наших прогонах мы наблюдаем, что на выполнение каждой эпохи уходит около 34 секунд. Это означает, что наше общее время обучения этой модели на 60 000 изображений составляет около 340 секунд. Это обучение дает точность классификации около 91% на тестовом наборе из 10 000 изображений. Не так уж и плохо, правда? Теперь давайте посмотрим, сколько данных мы можем удалить, чтобы достичь сопоставимой производительности. Давайте начнем с 5000 обучающих изображений и увеличим каждую итерацию еще на 5000. Хотя есть гораздо более элегантные способы справиться с этим, для простоты мы будем изменять размер обучающего набора данных вручную для каждой итерации, как показано ниже.

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

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

Мы наблюдаем точность классификации 86% при времени обучения примерно 30 секунд - снижение точности на 5% при сокращении времени обучения в 11 раз. В любой день это было бы отличным компромиссом, однако наша цель здесь - увидеть, насколько близко мы можем подойти к максимальной производительности нашей модели с уменьшенными данными обучения. Таблица и соответствующий график ниже показывают соответствие между обучающими примерами, временем обучения и производительностью модели.

Из приведенной выше таблицы мы можем сказать, что 35 000 обучающих изображений - хороший компромисс в отношении ценности. Это обеспечивает сокращение требований к обучающим данным примерно на 42% и сокращение времени обучения на 41% при потере точности 0,91%. Правильный компромисс для вашего варианта использования является субъективным и должен основываться на целях управления проектом.

Это все замечательно, но что, если у нас нет 60 000 изображений для начала? Можем ли мы оценить соответствие между размером набора данных и производительностью? Да! Вот здесь-то и появляется экстраполяция. Допустим, у вас было всего 30 000 изображений, и вы хотели увидеть, какой теоретический компромисс будет заключаться в том, чтобы узнать, сколько еще данных необходимо собрать или дополнить. Это означает, что у вас есть данные только для первых 6 записей в таблице выше (вы всегда можете получить более подробную информацию, чтобы лучше заполнить алгоритм интерполяции). Экстраполяция графика кривой обучения из существующих значений даст достойную оценку производительности модели по мере увеличения количества выборок. Таким образом, мы можем приблизительно оценить требования к размеру набора данных для достижения целевой производительности. В приведенном ниже примере, используя библиотеку интерполяции scipy, мы можем оценить производительность модели в ближайшем будущем с приличной точностью (90,16% расчетное против 90,23% фактическое).

Так в чем же обратная сторона? Что ж, существует множество методов экстраполяции. Мы предполагаем, что график кривой обучения следует квадратичной кривой, но мы можем смотреть на снимок в увеличенном масштабе. Кроме того, чем дальше вы хотите оценить, тем менее точными будут ваши прогнозы; экстраполяция - это просто оценка, которая может дать вам приблизительную оценку, но не может гарантировать 100% точность.

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