Интуиция

Данные - это пища для ИИ. Для машинного обучения или обучения с учителем золотые метки являются ключевыми для моделей, чтобы распознать закономерность в данных. Однако в реальных данных обычно трудно получить большой объем помеченных данных, например, сведения о поиске, темы новостей, автопилот и т. Д. Недавно Ангрю Нг выступил с докладом на тему MLOps: From Model -центричный на ИИ, ориентированный на данные , где он упомянул идею от больших данных к хорошим данным. Хорошие данные определяются последовательно и охватывают важные случаи. Он имеет своевременную обратную связь от производственных данных и имеет соответствующий размер.

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

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

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

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

Активное обучение можно использовать в трех ситуациях.

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

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

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

  • Подбор маржи

Мы выбираем k выборок с наименьшей разницей между двумя наивысшими вероятностями классов, то есть более высокое значение будет дано для выборок, модель которых была очень уверена в одном классе, и ниже для выборок, вероятности классов которых очень похожи. Например, два прогноза для трехклассовой классификации: [0.9,0.06,0.04] и [0.6,0.3,0.1]. Очевидно, что модель знает первый образец лучше, чем второй, потому что она может разделять образец от одного класса к другому.

def marginSample():
    d = {} 
    for i in range(len(X_pool)):
        probs = clf.predict_proba(X_pool[i].reshape(1, -1))
        sorted_probs = sorted(probs[0],reverse=True)
         
        margin = sorted_probs[0]-sorted_probs[1]
        d[i] = margin
    idx = sorted(d, key=d.get,reverse=True)[0]      
    return idx
  • Выбор энтропии

Мы отбираем «k» образцов с наибольшей энтропией, т.е. с высокой неопределенностью.

# pick sample based on maximum entropy
def entropy(x):
    return -x*np.log(x+ 1e-10)
def max_entropy():
    d = collections.defaultdict(list) 
    for i in range(len(X_pool)):
        for _ in range(5):
                  d[i].append(entropy(clf.predict_proba(X_pool[i].reshape(1, -1))))
        d[i] = np.mean(d[i])
    idx = sorted(d, key=d.get,reverse = True)[0]
    return idx, X_pool[idx]
  • Наименьшая уверенность

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

def least_confidence():
    d = {}
    for i in range(len(X_pool)):
        probs = clf.predict_proba(X_pool[i].reshape(1, -1))
        d[i] = max(probs)
    idx = sorted(d, key=d.get)[0]
    return idx

Архитектура решения

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

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

  • Для табличного прогнозирования мы используем случайный лес в H2O.ai как для задач классификации, так и для задач регрессии.
  • Для NLP Labeling мы используем пакет transformers, разработанный Hugging Face, в качестве экстракторов функций для преобразования текста во вложения, которые являются средним значением для всех вложений слов в тексте. Затем мы применяем классификационные модели для выбора образцов с высокой неопределенностью.
  • Что касается аннотации изображений, мы ее активно развиваем.

Мы создаем платформу с оптимизацией и развертываем платформу с помощью Heroku.

Демо

Следующие шаги

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