ИИ, ориентированный на данные, без перемаркировки данных вручную

Я использовал библиотеку cleanlab с открытым исходным кодом, чтобы удалить некачественные метки в наборе данных изображений. Модель, обученная на наборе данных без низкокачественных данных, повысила точность на 4 процентных пункта по сравнению с базовой моделью (обученной на всех данных).

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

Что, если мы сможем автоматизировать этот процесс? Я не знал, что это возможно, пока не столкнулся с Cleanlab. Это была библиотека, которая выявляла ошибки маркировки в больших наборах данных изображений, таких как ImageNet.

Что такое клинлаб?

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

В этом посте я приведу пример того, как я использовал cleanlab для улучшения производительности модели в конкурсе ИИ, ориентированном на данные, который проводил Эндрю Нг. Я пройду через следующее:

  • Загрузка набора данных
  • Обучение базовой модели (предварительно обученный Resnet50)
  • Установка клинлаб
  • Выявление проблем с качеством данных с помощью cleanlab
  • Решение проблем с качеством данных
  • Тонкая настройка той же предварительно обученной модели Resnet50 с очищенными данными
  • Сравните производительность базовой модели и новой модели, обученной на очищенных данных.

Все коды в этом посте есть в этом блокноте. Следуй!

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

Давайте начнем.

Загрузка набора данных

Набор данных конкурса по ИИ, ориентированному на данные состоит из рукописных изображений римских цифр от I до X. Он содержит 2880 изображений из 10 категорий, которые разделены на наборы данных для обучения и проверки.

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

Обучение базовой модели (Resnet50)

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

def get_net():
 
   base_model = tf.keras.applications.ResNet50(
       input_shape=(32, 32, 3),
       include_top=False,
       weights=None,
   )
   base_model = tf.keras.Model(
       base_model.inputs, outputs=[base_model.get_layer("conv2_block3_out").output]
   )
 
   inputs = tf.keras.Input(shape=(32, 32, 3))
   x = tf.keras.applications.resnet.preprocess_input(inputs)
   x = base_model(x)
   x = tf.keras.layers.GlobalAveragePooling2D()(x)
   x = tf.keras.layers.Dense(10)(x)
   model = tf.keras.Model(inputs, x)
 
   model.compile(
       optimizer=tf.keras.optimizers.Adam(lr=0.0001),
       loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
       metrics=["accuracy"],
)

После обучения в течение 100 эпох точность тренировочного набора взлетела до 100%, а потери при обучении упали почти до 0. Однако потери при проверке сильно колебались. Это случай недообучения, поскольку модели недостаточно данных для обобщения на проверочный набор.

Модель также не слишком хорошо показала себя на тестовом наборе. В целом точность составляет 59%.

В частности, мы видим, что он неэффективен на этикетке «II», часто путая его с «I» и «III». То же самое можно сказать и о «VIII», который часто неправильно классифицируют как «VII».

Учитывая его плохую производительность, что мы можем сделать с моделью?

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

Вместо повторения модели давайте улучшим набор данных.

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

Ну, это если у вас нет Cleanlab. Cleanlab автоматически находит и устраняет проблемы с метками в ваших наборах данных машинного обучения.

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

Установка Cleanlab

pip install cleanlab scikeras

Подготовка

Поскольку функции cleanlab требуют совместимости с scikit-learn, нам потребуется соответствующим образом адаптировать нашу нейронную сеть Keras. К счастью, скикеры справятся с этим без особых усилий.

from scikeras.wrappers import KerasClassifier
mdl = KerasClassifier(model=get_net, epochs=num_epochs, batch_size=8, verbose=0)

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

from sklearn.model_selection import cross_val_predict
num_crossval_folds = 5 # for efficiency; values like 5 or 10 will generally work better
pred_probs = cross_val_predict(
   mdl,
   images,
   labels,
   cv=num_crossval_folds,
   method="predict_proba",
)

Выявление проблем с качеством данных с помощью cleanlab

Теперь начинается захватывающая часть. С помощью cleanlab мы можем идентифицировать образцы с плохой маркировкой.

from cleanlab.filter import find_label_issues
 
ranked_label_issues = find_label_issues(
   labels=full_labels, pred_probs=pred_prob, return_indices_ranked_by="self_confidence"
)
print(f"Cleanlab found {len(ranked_label_issues)} label issues.")
>>>Cleanlab found 1282 label issues.

Cleanlab выявила более 1000 проблем с этикетками в нашем (обучающем и проверочном) наборе данных, состоящем менее чем из 3000 точек данных. Это значительное число. Посмотрим, права ли Cleanlab.

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

Создать общий отчет о состоянии данных

Мы также можем получить сводку о состоянии здоровья от Cleanlab.

from cleanlab.dataset import health_summary
health_summary(full_labels, pred_prob)

Давайте посмотрим, что включает в себя отчет о состоянии здоровья.

Общее качество класса

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

В нашем случае мы видим, что класс с наибольшим шумом метки — это классы 3, 7 и 5. Это «IV», «VIII» и «VI» (Класс 0 соответствует «I»).

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

Пересечение классов

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

В нашем случае мы видим, что cleanlab сообщает нам о 125 перекрывающихся примерах в классах «VII» и «VIII» (из строки 0). С этим открытием мы можем изучить метки для классов «VII» и «VIII» и выявить любые неправильные метки.

Рассчитать показатель качества ярлыка

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

# Get quality scores
from cleanlab.rank import get_label_quality_scores
quality_scores = get_label_quality_scores(full_labels,pred_prob)

Исправление проблемных данных

Теперь мы лучше понимаем, почему наша модель неэффективна.

Отсюда можно пойти несколькими путями:

  1. Удалите все данные, которые cleanlab считает проблемными.
  2. Удалите данные с показателями качества ниже порогового значения. Мы определяем или удаляем заданное количество точек данных.
  3. Вручную отметьте данные для удаления, начиная с самого низкого показателя качества.

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

Здесь мы используем подход 2. В частности, мы удаляем 10% точек данных, которые Cleanlab считает проблематичными, из обучающего набора. Получается 142 образца.

Модель переподготовки

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

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

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

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

Закрытие

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

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

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

Вот почему cleanlab так ценен. Поверьте мне. Я провел мучительную неделю, тщательно проверяя этикетки, пытаясь не заснуть. Вы не хотите этого делать.

Ознакомьтесь с документацией cleanlab здесь.

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