Интуиция
Данные - это пища для ИИ. Для машинного обучения или обучения с учителем золотые метки являются ключевыми для моделей, чтобы распознать закономерность в данных. Однако в реальных данных обычно трудно получить большой объем помеченных данных, например, сведения о поиске, темы новостей, автопилот и т. Д. Недавно Ангрю Нг выступил с докладом на тему 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.
Демо
Следующие шаги
В текущей платформе есть много вещей, которые мы можем улучшить. Мы можем позволить пользователю загружать индивидуальные модели для активного обучения. Мы можем поддерживать больше типов задач и можем оптимизировать вычислительные ресурсы для более быстрой маркировки.