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

Ссылку GitHub на пример кода в этой статье можно найти здесь.

Активное изучение

Первое, о чем следует спросить себя, изучая что-то новое, — зачем. «Почему мы должны узнать об активном обучении?» Если ответ кажется интересным, можно перейти к вопросам, что это такое? И как это работает?

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

Зачем активное обучение?

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

Активное обучение является альтернативой «обычному» способу обучения моделей обучения с учителем.

К преимуществам активного обучения относятся:

  • Приоритизация маркировки образцов, из которых модель многому учится
  • Экономия времени и денег за счет сокращения времени, затрачиваемого на маркировку образцов

Что такое активное обучение?

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

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

На рисунке 2 мы видим, как модель обучается с помощью активного обучения. В отличие от стандартного подхода (рис. 1), мы видим, что теперь мы добавили новый шаг: «Алгоритм выбора данных». Вместо того, чтобы маркировать весь набор данных перед началом обучения, теперь это делается итеративно в процессе обучения.

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

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

В следующем разделе мы поиграем с набором данных MNIST[1] и проведем эксперимент, который, мы надеемся, покажет, почему активное обучение разумно!

Как работает активное обучение?

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

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

МНИСТ

В нашем эксперименте мы будем использовать набор данных MNIST. Это предварительно размеченный набор данных, состоящий из 70 000 изображений рукописных цифр размером 28x28 пикселей. Мы притворимся, что изображения еще не были помечены, и вместо этого используем код для «симуляции» процесса пометки.

Визуализация PCA и t-SNE

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

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

На рисунке выше мы видим диаграмму рассеяния набора данных MNIST после использования PCA и t-SNE. На рисунке каждая «точка» соответствует образцу, и мы видим, что набор данных был разделен примерно на десять отдельных кластеров. Это хорошо соответствует нашим ожиданиям, учитывая, что набор данных состоит из 10 классов, по одному классу для каждого из чисел от 0 до 9.

С методом визуализации наших данных мы, наконец, можем погрузиться в наш реальный эксперимент!

Активное обучение

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

На рисунке выше мы видим, как исходный набор данных MNIST сначала делится на обучающий набор и проверочный набор с распределением 70/30. Затем мы видим, как мы итеративно извлекаем 2000 образцов из тренировочного набора, маркируем их и добавляем в тренировочный «пул». Это делается для имитации «активной» части активного обучения. Наша модель машинного обучения будет обучаться на последнем обновлении тренировочного пула в любое время.

Пример кода

Начнем с создания двух пустых наборов, X_pool и y_pool (Обучающий пул на рис. 5). В них будут храниться данные и метки, которые мы используем для обучения наших моделей. Сначала мы заполняем их 1000 случайных выборок из X_train (обучающий набор на рис. 5).

(Примечание: как создаются X_train и y_train, будет объяснено в конце статьи)

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

Следующим шагом является добавление дополнительных данных в X_pool и y_pool, готовых к следующему запуску. В приведенном выше фрагменте кода мы видим, что это делается двумя разными способами, в зависимости от того, установлен ли флаг active_learning в значение True или False. Либо данные извлекаются с помощью функции pick_n_least_confident_images, либо они выбираются случайным образом.

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

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

Показатель неопределенности

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

Примеры различных показателей неопределенности:

  • Наименьшая уверенность Неопределенность
  • Наименьшая маржинальная неопределенность
  • Наибольшая неопределенность маржи
  • Снижение энтропии

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

Наименьшая достоверность Неопределенность

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

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

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

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

В приведенном выше фрагменте кода мы реализовали очень простую версию наименее достоверной неопределенности. Шаги в алгоритме следующие:

  1. Сделайте прогноз на X_train, данных, на которых модель еще не обучалась.
  2. Найдите самое высокое предсказанное значение для каждого образца.
  3. Получите индекс n выборок с наименьшим предсказанным значением, т. е. выборок, в отношении которых модель была наиболее неопределенной.
  4. Используйте индексы для извлечения этих образцов и меток из X_train и y_train. (Этот шаг имитирует человека, маркирующего образцы)
  5. Удалите образцы из X_train

Результаты

Экономия времени?

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

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

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

Модель, обученная с наименьшей достоверной неопределенностью, потребовала в 6,5 раз меньше обучающих данных! Другими словами, время, необходимое для маркировки данных, может быть сокращено на 85%.

Визуализация с помощью PCA и t-SNE

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

На рисунке выше мы снова видим рисунки с рисунка 3, которые мы хотели воссоздать с реальными данными.

Выше мы видим график рассеяния всего набора данных MNIST, созданного с использованием PCA и t-SNE, соответствующий графику слева на рисунке 9.

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

На рис. 12 образцы выбраны с использованием наименьшей доверительной неопределенности (соответствует графику 3 на рис. 9).

Как видно на рисунке 11, красные кружки равномерно распределены по всем кластерам, как и следовало ожидать при случайном выборе образцов. На рисунке 12 мы видим, что красные круги в основном выбраны с «края» кластеров на границе с другими кластерами. Это образцы, которые напоминают другие классы в наборе данных, которые модели трудно классифицировать и у которых нашей модели есть чему поучиться ☺️

Настройка обучения

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

Во-первых, мы используем функцию fetch_openml sklearn для загрузки набора данных MNIST в память. Затем мы извлекаем изображения и метки в соответствующие переменные. Наконец, мы нормализуем значения на изображениях до значений от 0 до 1.

Затем мы делим MNIST на обучающий и проверочный наборы и перемешиваем изображения.

Черт! Обратите внимание, что мы используем random_state; это дает нам одинаковое случайное распределение обучающих и проверочных наборов и перетасовку изображений каждый раз. Таким образом, мы гарантируем, что модели, которые мы обучаем, не имеют никаких преимуществ/недостатков, когда дело доходит до данных, на которых они обучаются.

Возможные улучшения и дальнейшая работа

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

Мы также решили создать DNN (Dense Neural Network) в качестве модели для классификации изображений. Это не самая подходящая форма модели машинного обучения для этой проблемы, и, вероятно, можно было бы достичь других результатов, если бы, например, использовалась сверточная нейронная сеть (CNN). Неизвестно, повлияло бы это на расход времени, возможно, модель смогла бы достичь более высокой точности даже быстрее, чем модель, созданная в этом эксперименте?

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

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

[1]: https://www.openml.org/search?type=data&sort=runs&id=554&status=active

[2]: https://en.wikipedia.org/wiki/Principal_component_analysis

[3]: https://en.wikipedia.org/wiki/T-distributed_stochastic_neighbor_embedding