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

В следующих разделах я рассмотрю концепции слабого супервизии. Я также представлю инструмент под названием Snorkel, разработанный Стэнфордским университетом. Наконец, я покажу вам, как HK01 использует Snorkel для захвата трендовых тем на Facebook и, следовательно, улучшения нашего механизма рекомендаций.

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

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

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

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

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

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

Итак, следующий вопрос: как мы можем внедрить эти правила в наши модели машинного обучения? Ответ - трубка.

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

Левая часть приведенной выше диаграммы представляет собой вероятностную модель, представляющую процесс генерации от истинной метки до зашумленной метки. Хотя истинный ярлык ненаблюдаем, мы все же можем узнать точность и корреляцию по соглашениям и разногласиям от разных шумных ярлыков. Следовательно, мы можем оценить P (L | y) каждой зашумленной метки, что, по сути, является показателем качества. Агрегируя зашумленные метки, мы получаем предполагаемую истинную метку и используем ее для обучения нашей модели.

В Snorkel шумные метки запрограммированы как функции маркировки. Функция метки - это в основном функция Python, которая жестко кодирует правило для определения метки. Например, если вы пишете программу для определения того, какое письмо является спамом, программа должна выглядеть примерно так:

from snorkel.labeling import labeling_function
SPAM = 1
NORMAL = 0
ABSTAIN = -1
@labeling_function()
def contain_hyperlink(x):
    if 'http' in x:
        return SPAM 
    else:
        return NORMAL
@labeling_function()
def contain_foul_language(x):
    for each in x:
        if each in foul_language:
            return SPAM
        else:
            return NORMAL

В этом примере игрушки вы можете увидеть основные элементы шноркеля.

  • определить метки. В этом примере метки: СПАМ, НОРМАЛЬНО и ВОЗДЕРЖАЛСЯ. ABSTAIN - это метка, используемая, когда вы не можете определить метку.
  • определить функции маркировки. Добавьте декоратор @labeling_function() для объявления.

После определения меток и функции маркировки вы можете применить функции маркировки к набору данных и оценить лучшую метку:

from snorkel.labeling import PandasLFApplier, LabelModel
lfs = [contain_hyperlink, contain_foul_language]
applier = PandasLFApplier(lfs=lfs)
overall_result = applier.apply(df=dataset, progress_bar=False)
label_model = LabelModel(cardinality=2, verbose=True)
label_model.fit(L_train=overall_result, n_epochs=100, lr=0.001, log_freq=100, seed=123)
score = label_model.predict_proba(overall_result)
  • объявить список функций маркировки lfs
  • создайте приложение и примените функции маркировки к набору данных, чтобы получить шумные метки overall_result
  • создать генеративную модель label_model для разрешения конфликтов между зашумленными этикетками
  • получить прогнозируемую вероятность score обучающих выборок

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

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

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

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

Ссылка

  1. Http://ai.stanford.edu/blog/weak-supervision/
  2. Https://www.snorkel.org/
  3. Https://arxiv.org/pdf/1711.10160.pdf