Вы также можете посмотреть мою презентацию и видео на конференции FWdays об использовании Active Learning и Weak Supervision для решения проблем NLP.

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

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

Рассмотрим возможные сценарии:

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

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

Здесь активное обучение оказывается в центре внимания!

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

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

Также, помимо поста, вы можете просмотреть подготовленный Блокнот Colab и поработать кодингом :)

Приступим!

Оглавление

  1. Набор данных и стартовые компоненты
  2. Структура активного обучения
  3. Стратегии запросов для активного обучения
    - Базовые стратегии запросов
    - Как выбрать стратегию запросов
    - Как настроить стратегию запросов
  4. Полный трубопровод
  5. "Полученные результаты"
  6. "Резюме"
  7. "Использованная литература"

Набор данных и стартовые компоненты

В этом посте для простоты и понимания мы будем использовать классический набор данных SMS Spam Collection [1] [2] для обнаружения спам-сообщений. Набор данных содержит ~ 5200 образцов. Соотношение классов показано на рис. 1 ниже.

Мы делим этот набор данных на три части:

  • 20% взят за тестовый набор.
  • ~ 75% было взято как пул SMS, где мы предполагаем, что ярлыков нет.
  • Остальные (~ 200 образцов) берутся как помеченный начальный набор поездов - seed.

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

В качестве модели мы возьмем векторизатор TF-IDF и простую логистическую регрессию. В качестве отслеживаемого показателя - F1-оценка для класса «спам».

Структура активного обучения

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

Основная идея AL состоит в том, чтобы позволить нашей модели выбирать данные для обучения умным способом. Похожая идея используется в алгоритме AdaBoost, где больший вес присваивается более информативным выборкам, т. Е. Тем, которые модель допускает больше ошибок. Накормим модель самыми информативными и сложными примерами. Таким образом, затраты на обучение будут оптимизированы за счет маркировки меньшего количества точек данных.

Существуют разные виды активного обучения [3]. Мы сконцентрируемся на самом популярном - пульном типе активного обучения (AL).

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

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

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

Стратегии запросов для активного обучения

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

Вы можете попробовать различные программные пакеты для активного обучения (например, modAL или ALiPy) с уже реализованными различными стратегиями запросов. Однако, если вам не нужны сложные программы или вы хотите создать быстрый POC, запишите его самостоятельно.

Я использовал идеи для реализации из этого туториала [5].

Во-первых, нам нужно определить мета-класс только с одним абстрактным методом - «selection».

Базовые стратегии запросов

Случайный выбор

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

Ниже показано, как будет реализован метод «selection» (pool_len - это количество выборок данных в немаркированном пуле, а num_samples - наш пакет size, сколько образцов мы разметим за одну итерацию):

Выборка неопределенности: выбор маржи

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

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

Пошаговая реализация выбора маржи:

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

2. Вычислите разницу между двумя максимальными вероятностями:

3. Возьмите образцы (в количестве num_samples) с наименьшими значениями - наиболее неопределенными:

Чтобы узнать больше о стратегиях запросов, прочтите этот справочник [3] по Активному обучению.

Чтобы узнать больше о пакетах Python для активного обучения, прочтите этот обзор [4].

Как выбрать стратегию запроса

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

Модель не поддерживает вероятностный вывод. В таком случае вы можете рассмотреть стратегии запросов, которые не используют вероятности, например запрос по комитету. Также имейте в виду, что: 'наименее надежный экземпляр находится на границе классификации, но не является «репрезентативным» для других экземпляров в распределении, поэтому знание его метки вряд ли повысит точность данных в целом '[3]. Вот почему, даже если ваша модель имеет вероятностные выходные данные, вы можете использовать не только стратегии запросов, основанные на неопределенности.

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

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

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

Не забываем про холодный старт. Вначале попробуйте поиграть с парой стратегий запросов и не сосредотачиваться на каких-то конкретных.

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

Как настроить стратегию запросов

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

Классическая стратегия запросов, основанная на неопределенности, отбирает образцы, близкие к прогнозируемому значению вероятности 0,5. Однако что, если вы измените порог принятия решения с 0,5 по умолчанию на другой? Теперь вас могут заинтересовать значения вероятности, которые попадают в области, близкие к вашему пороговому значению. Затем вы можете создать стратегию, которая будет выбирать образцы, близкие к вашему пороговому значению.

Максимальное количество ошибок в интервале

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

Например, на графике выше мы можем сказать, что интервал значений вероятностей (0,3, 0,4] - это интервал с наибольшим количеством ошибок.

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

  1. Разделите вероятности, предсказанные моделью, на 10 (вы можете установить другое число) равных интервалов.

2. На поезде сделайте прогнозы и подсчитайте количество ошибок в каждом интервале.

3. Выберите интервал с наибольшим количеством ошибок.

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

Эта стратегия запроса «максимальная ошибка» может использоваться для решения любой задачи классификации.

Стратегия поиска схожести текста

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

Теперь попробуем ответить на вопрос: какие образцы были бы наиболее информативными именно для обнаружения SMS-спама?

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

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

Здесь мы можем использовать простые TF-IDF или BOW, предварительно обученные вложения слов, такие как универсальный кодировщик предложений от TensorFlow, или любые другие предварительно обученные вложения (BERT, LaBSE и т. Д.). Чтобы получить наиболее похожие образцы для нашего класса «спам» с использованием встраивания текста, мы также должны определить метрику подобия. Мы решили использовать встраивание универсального кодировщика предложений и метрику косинусного сходства.

Теперь давайте шаг за шагом запрограммируем эту стратегию запросов:

0. Сначала подготовьте функцию встраивания.

  1. Получите образцы «спама» из наших уже обученных данных и вставьте их.

2. Рассчитайте вложения для нашего немаркированного пула.

3. Рассчитайте косинусное сходство между выборками «спама» из 1 шага и вложениями пула из 2 шагов.

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

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

Как видите, настройка стратегии запросов - это не ракетостроение, а область, в которой вы можете проявить свой творческий потенциал и повеселиться!

Полный конвейер

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

  1. Определите классификатор:

2. Обучите классификатор на нашем первоначальном небольшом маркированном наборе.

3. Сделайте прогнозы для немаркированного пула:

4. Сделайте выбор с помощью выбранной стратегии запроса (например, выбор маржи):

5. Добавьте выбранные образцы данных с метками к уже существующему начальному набору поездов:

6. Удалите выбранные элементы из пула (потому что мы уже добавили эти точки данных в набор поездов):

7. Обучите классификатор на обновленном наборе поездов и рассчитайте обновленные показатели.

8. Повторяйте шаги 2–7, пока не добьетесь удовлетворительных результатов или не исчерпаете ресурсы.

Полученные результаты

Наконец, давайте рассмотрим производительность модели на тестовом наборе с различными стратегиями запросов.

На рис. 5, мы видим, что если мы пометим весь немаркированный пул, мы получим F1-показатель 87%. Итак, 87% F1 будет базовым показателем для оценки, потому что это производительность, которую вы получите, если пометить все данные.

При выборе маржи такая же производительность достигается на 14 итерациях (140 выборок данных). С нашим первоначальным тестом в 207 строках всего будет 347 образцов. Это более чем в десять раз меньше данных!

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

Таблица 1. Результаты экспериментов по активному обучению

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

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

Резюме

Подведем итог всему, что мы сделали выше:

  • Активное обучение может значительно уменьшить количество маркированных точек данных (в нашем примере данных почти в десять раз меньше!);
  • Стратегии запросов активного обучения можно легко настроить и оптимизировать для конкретных задач.

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

Благодарности
Большое спасибо Гиладу Баркану, Ольге Диаденко и Лиору Сиди за отзывы о более ранних версиях этого поста!

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

[1] Репозиторий машинного обучения UCI: набор данных для сбора SMS-спама
[2] Алмейда, Т.А., Гомез Идальго, Дж. М., Ямаками, А. Вклад в исследование фильтрации SMS-спама: новая коллекция и результаты (2011), Труды Симпозиума ACM по проектированию документов 2011 года (DOCENG'11).
[3] Берр Сеттлс. Active Learning Literature Survey (2010), Технический отчет по компьютерным наукам 1648, Университет Висконсин-Мэдисон.
[4] Александр Абрахам. Активный взгляд на пакеты активного обучения - данные из окопов (2020).
[5] Ори Коэн. Active Learning Tutorial (2018).
[6] Юкун Чен, Томас А. Ласко, Цяочжу Мэй, Джошуа Денни, Хуа Сюй. Исследование методов активного обучения для распознавания именованных сущностей в клиническом тексте (2015), Журнал биомедицинской информатики, том 58, стр. 11-18.
[7] Дэниел Гиссин. Пакетное активное обучение | Дискриминационное активное обучение (2018).