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

Перед тем, как начать

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







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



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

Что такое трансферное обучение?

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

Адаптировать технологию от одного варианта использования к другому - это весело. Я никогда не забуду острых ощущений, когда однажды выглянул из окна поезда недалеко от Сан-Франциско и увидел машину, мчащуюся с поездом в водах лагуны Брисбена. Кто-то переделал Делориан из славы« Назад в будущее » в судно на воздушной подушке.

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

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

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

Заставляем вашу модель предсказывать собственные ошибки

Новые ярлыки для Transfer Learning могут быть любыми категориями, которые вы хотите. Сюда входит информация о самой задаче! Это первая из трех основных идей для активного трансферного обучения:

Вывод 1: вы можете использовать трансферное обучение, чтобы спросить свою модель, в чем она запуталась, и заставить ее предсказать собственные ошибки.

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

Этот процесс состоит из трех этапов:

  1. Примените модель к набору данных проверки и определите, какие элементы проверки были классифицированы правильно и неправильно. Это ваши новые данные для обучения: ваши элементы проверки теперь имеют дополнительную метку «Верно» или «Неправильно».
  2. Создайте новый выходной слой для модели и обучите этот новый слой на ваших новых обучающих данных, предсказывая ваши новые метки «Правильно» / «Неправильно».
  3. Пропустите свои немаркированные элементы данных через новую модель и выберите элементы, которые, согласно прогнозам, являются «неправильными», с наивысшей степенью достоверности.

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

def forward(self, feature_vec, return_all_layers=False):
    hidden1 = self.linear1(feature_vec).clamp(min=0)
    output = self.linear2(hidden1)
    log_softmax = F.log_softmax(output, dim=1)
    if return_all_layers:
        return [hidden1, output, log_softmax]        
    else:
        return log_softmax

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

correct_predictions = [] # validation items predicted correctly
incorrect_predictions = [] # validation items predicted incorrectly
item_hidden_layers = {} # hidden layer of each item, by id
for item in validation_data:
    # assume "item" contains id, label & features of each data point
    id = item["id"] 
    label = item["label"] 
    feature_vector = item["feature_vector"]
    
    hidden, logits, log_probs = model(feature_vector, True)
    item_hidden_layers[id] = hidden # record hidden layer value
    
    if is_correct(label, log_probs):
        correct_predictions.append(item)
    else:
        incorrect_predictions.append(item)

Затем мы можем обучить новую модель предсказанию «Верно» или «Неправильно», используя скрытый слой в качестве нового входного (признакового) вектора. Предположим, мы назвали эту новую модель correct_model в нашем коде.

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

active_transfer_preds = []
with torch.no_grad():    #A
    v=0
    for item in unlabeled_data:
        id = item["id"] 
        label = item["label"] 
        feature_vector = item["feature_vector"]
        
        # get prediction from initial model
        hidden, logits, log_probs = model(feature_vector, True)

       # get predictions from correct/incorrect model
        correct_log_probs = correct_model(hidden, False)

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

Этот код представляет собой немного упрощенную версию кода из файла advanced_active_learning.py в бесплатной библиотеке PyTorch: https://github.com/rmunro/pytorch_active_learning/blob/master/advanced_active_learning.py

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

python advanced_active_learning.py --transfer_learned_uncertainty=10

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

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

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

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

Активное трансферное обучение для репрезентативной выборки

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

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

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

Шаги выглядят так:

  1. Возьмите данные проверки из того же распределения, что и данные обучения, и присвойте им метку «Обучение». Возьмите немаркированные данные из нашего целевого домена и дайте ему ярлык «Приложение».
  2. Обучите новый выходной слой предсказанию меток обучения / приложения, предоставив ему доступ ко всем слоям модели.
  3. Примените новую модель к немаркированным данным и выберите элементы, которые наиболее надежно предсказываются как «Применение».
  4. Предположим, что недавно выбранные элементы получат метку и станут частью обучающих данных: измените метку этих элементов с «Приложение» на «Обучение», а затем повторите действия, начиная с шага 2.

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

Идея 2: вы можете предположить, что элемент без ярлыка позже получит ярлык, даже если вы еще не знаете, что это за ярлык.

Активное обучение передачи для адаптивной выборки (ATLAS)

Наиболее изощренное использование активного трансферного обучения - это активное обучение для адаптивной выборки (ATLAS). Он объединяет принципы двух предыдущих моделей, представленных в этой статье: прогнозирование неопределенности и адаптация к данным до того, как будут добавлены какие-либо человеческие ярлыки.

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

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

Шаги выглядят так:

  1. Примените модель к набору данных проверки и определите, какие элементы проверки были классифицированы правильно и неправильно. Это ваши новые данные для обучения: ваши элементы проверки теперь имеют дополнительную метку «Верно» или «Неправильно».
  2. Создайте новый выходной слой для модели и обучите этот новый слой на ваших новых обучающих данных, предсказывая ваши новые метки «Правильно» / «Неправильно».
  3. Пропустите свои немаркированные элементы данных через новую модель и выберите элементы, которые, согласно прогнозам, являются «неправильными», с наивысшей степенью достоверности.
  4. Предположим, что вновь выбранные элементы позже получат метки и что модель позже будет правильно предсказывать эти элементы после обучения на них: измените метку этих элементов с «Неправильно» на «Верно», а затем повторите действия, начиная с шага 2.

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

Идея 3: вы можете предположить, что ваша модель правильно предсказывает метки для немаркированных элементов, которые похожи на элементы, которые позже получат метку, даже если вы не знаете, что это за метки. еще.

Этот код находится в том же файле, что и выше, advanced_active_learning.py в той же бесплатной библиотеке PyTorch: https://github.com/rmunro/pytorch_active_learning/blob/master/advanced_active_learning.py

Вы можете запустить его из командной строки с помощью:

python advanced_active_learning.py --atlas=10

Шпаргалка по активному трансферному обучению

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

Для быстрой справки вы можете скачать PDF-версию шпаргалки здесь: http://www.robertmunro.com/Active_Transfer_Learning_Cheatsheet.pdf

Эта статья и шпаргалка взяты из моей книги Машинное обучение человека в цикле: https://www.manning.com/books/human-in-the-loop-machine-learning. Главы моей книги публикуются по мере написания, и теперь доступна глава, содержащая методы активного переноса обучения, включая ATLAS!

Роберт Манро | Январь 2020 | @WWRob

Примечания к архитектурам Active Transfer Learning:

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

  1. Это (математически) эквивалентно удалению последнего слоя и повторному обучению нового слоя (как на изображениях выше) или взятию выходных данных из последнего скрытого слоя (-ов) и использовании его в качестве входных данных для новой модели (как в примеры кода). Я думаю, что первое более интуитивно визуально, но второе менее подвержено ошибкам в коде, потому что оно чисто аддитивное, и вам не нужно беспокоиться о том, как изменение вашей модели может повлиять на другие части вашего кода. Если вы предпочитаете любую реализацию передачи обучения в собственном коде, это нормально. Это также верно, если вы хотите поиграть с настройкой существующих слоев с новыми данными / метками вместо полного удаления слоев: это совместимо с методами активного переноса, описанными здесь.
  2. Обратите внимание, что пример репрезентативной выборки использует все скрытые слои, а также добавляет дополнительный новый слой, в то время как примеры неопределенности и ATLAS представляют собой простое двоичное предсказание после последнего скрытого слоя. Это задумано как хорошая отправная точка для ваших архитектур, но вы можете экспериментировать с разными архитектурами во всех случаях. Причина этих отправных точек заключается в том, что последние уровни нашей модели не различают низкую активацию от элементов, которые плохо представлены в данных, от элементов, которые хорошо представлены в данных, но имеют функции, которые в основном не имеют отношения к модели в его текущее состояние. Таким образом, репрезентативная выборка должна лучше работать с информацией из более ранних слоев. Напротив, примеры Uncertainty Sampling и ATLAS используют только последний уровень, потому что последний уровень модели уже оптимизирован для минимизации неопределенности, и поэтому маловероятно найти больше сигнала на более ранних уровнях и будет более подвержен переобучению, если вы все же включите более ранние слои.
  3. Вы можете рассмотреть несколько моделей и / или прогнозы переменных из одной модели с помощью выборки Монте-Карло. Эти примеры основаны на данных проверки из того же распределения, что и ваша обучающая область, и вы можете легко переобучить конкретные элементы в этом наборе проверки. Если вы разделяете тренировочные данные 90:10 на обучение: проверка, как в приведенных здесь примерах кода, то один простой способ - повторить это для всех комбинаций 90:10. Обратите внимание, что для примеров Uncertainty Sampling и ATLAS вы создаете только один новый двоичный предиктор, поэтому вам не нужно слишком много данных, чтобы результаты были надежными. Это хорошее свойство этих моделей: одно дополнительное двоичное предсказание легко обучить с относительно небольшим объемом данных и часто без ручной настройки.
  4. Active Transfer Learning может работать с более сложными задачами, такими как обнаружение объектов, семантическая сегментация, маркировка последовательностей и создание текста. Практически любой тип нейронной модели может добавить новый слой (или голову) для прогнозирования метки «Правильно / Неправильно» или «Обучение / Применение», так что это очень универсальный метод. Я расскажу о том, как лучше всего подойти к этим и другим вариантам использования в следующей главе книги!