Адаптация модели, обученной на наборе данных обзоров фильмов IMDB, для определения настроений в обзорах продуктов Amazon.

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

Схема:

  1. Что такое трансферное обучение?
  2. Какое место в картине занимает адаптация домена?
  3. Немного о задаче анализа настроений
  4. Адаптация предметной области для анализа настроений
  5. Вывод
  6. использованная литература

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

Внедрение моделей-трансформеров, таких как BERT, Roberta и т. Д., Оказалось моментом «ImageNet» для сообщества, занимающегося обработкой естественного языка. Эти предварительно обученные модели (предварительно обученные на огромном корпусе текста) можно использовать для множества последующих задач НЛП, просто добавив линейный слой поверх. Такие архитектуры достигают очень высокой точности в таких задачах, как классификация текста, ответы на вопросы, логический вывод на естественном языке и т. Д.

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

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

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

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

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

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

Примеры сценариев трансферного обучения, в которых домены источника и цели различаются:

  1. Исходные и целевые наборы данных содержат документы на разных языках.
  2. Исходные и целевые наборы данных содержат документы по разным темам. Например, в исходном наборе данных есть документы, связанные с медициной, а в целевом наборе данных - документы, связанные со спортом.

Примеры сценариев трансферного обучения, в которых задачи источника и цели различаются:

  1. Исходные и целевые наборы данных имеют разные наборы меток.
  2. Распределение меток в исходной и целевой задаче различается. Например, метка «A» составляет 1% всех меток в исходной задаче и 80% в целевой задаче.

Я хотел бы определить еще один термин, который будет служить мостом между текущим и следующим абзацами. «Трансдуктивное трансферное обучение».

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

Какое место в картине занимает адаптация домена?

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

Теперь, когда у нас есть некоторое представление об адаптации домена, давайте определим две ее подкатегории:

  1. Адаптация домена с одним источником
  2. Адаптация домена с несколькими источниками

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

Теперь давайте сосредоточимся на более интригующем вопросе «Зачем нам нужна адаптация домена?».

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

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

Немного об анализе настроений

Анализ настроений - одна из самых серьезных проблем с текстом в НЛП, и для этой задачи существует несколько наборов данных. Есть несколько вариантов постановки этой проблемы. Некоторые наборы данных включают 5-ступенчатую схему оценок, в которой предоставляется обзор и соответствующие оценки. Некоторые наборы данных включают три класса: положительные, отрицательные и нейтральные, а некоторые наборы данных включают только положительные и отрицательные в качестве меток для обзоров.

Мы рассмотрим два набора данных для нашей задачи адаптации домена:

  1. Фильм IMDB рассматривает набор данных как исходный набор данных:
    Этот набор данных можно загрузить по этой ссылке kaggle. В наборе поездов и разработчиков по 25 тыс. Записей.
  2. Набор данных Обзоры продуктов Amazon в качестве целевого набора данных:
    Этот набор данных является одним из самых популярных ресурсов для работы по адаптации предметной области. Он состоит из обзоров продуктов и соответствующих оценок (1–5) для множества доменов в этом наборе данных. Рассмотрим отзывы о доме и кухне. Любой набор данных из этого сбора данных может быть выбран в качестве целевого домена для нашей задачи, поскольку их распределение отличается от распределения набора данных обзора фильма. Набор данных можно скачать по этой ссылке. Чтобы преобразовать эту задачу 5-этапной классификации в задачу бинарной классификации, мы можем присвоить положительный ярлык обзорам с оценкой 4 или 5, отрицательный - обзорам с рейтингом 1 или 2 и отбросить отзывы. с рейтингом 3. Нам также необходимо разделить набор данных на обучающие и тестовые наборы.

Адаптация предметной области для анализа настроений

Прежде чем мы перейдем к построению модели рассматриваемой проблемы, давайте посмотрим на распределение двух наборов данных. Чтобы визуализировать то же самое, мы строим проекции t-SNE представления записей токеном BERT CLS.

Приведенный выше график показывает четкое разделение между двумя доменами, а также подчеркивает разницу между двумя доменами.

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

Популярные подходы к адаптации домена

  1. Изучение инвариантных функций домена
  2. Состязательная адаптация домена

Теперь давайте кратко обсудим эти подходы один за другим:

  1. Изучение инвариантных к домену функций: он фокусируется на выравнивании исходного и целевого доменов путем создания инвариантного к предметной области представления функции, т. е. поощряется, чтобы функции следовали одному и тому же распределению независимо от того, поступают ли входные данные из источника или целевой домен. Интуиция, лежащая в основе этого подхода, заключается в том, что «если классификатор можно обучить для хорошей работы с исходными данными с использованием не зависящих от предметной области функций, то классификатор может хорошо обобщаться на целевой домен, поскольку функции как источника, так и цели соответствуют одинаковое распределение ».
    Один из методов изучения таких функций - минимизация расхождения, измеряющего расстояние между двумя распределениями. Существуют различные методы для достижения этого, такие как максимальное среднее несоответствие (MMD), согласование корреляции, несоответствие контрастной области и метрика Вассерштейна.
  2. Адаптация домена на основе состязательности: этот подход предполагает состязательное обучение, и ему посвящена данная статья.

Реализация вышеупомянутой архитектуры в Pytorch с использованием библиотеки преобразователей Huggingface находится в моем репозитории GitHub.

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

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

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

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

from torch.autograd import Function

class GradientReversalFn(Function):
    @staticmethod
    def forward(ctx, x, alpha):
        ctx.alpha = alpha
        
        return x.view_as(x)

    @staticmethod
    def backward(ctx, grad_output):
        output = grad_output.neg() * ctx.alpha

        return output, None

У модели две головки: одна для классификации настроений, а другая - для классификации предметной области. Для обеих этих головок используется линейный слой, но с разными входами. Для заголовка классификации настроений используется представление BERT [CLS], а для заголовка классификации домена используется то же представление [CLS], но после применения функции обращения градиента. См. Приведенный ниже код.

import torch
import torch.nn as nn
import torch.optim as optim

class DomainAdaptationModel(nn.Module):
    def __init__(self):
        super(DomainAdaptationModel, self).__init__()
        
        num_labels = config["num_labels"]
        self.bert = BertModel.from_pretrained('bert-base-uncased')
        self.dropout = nn.Dropout(config["hidden_dropout_prob"])
        self.sentiment_classifier = nn.Sequential(
            nn.Linear(config["hidden_size"], num_labels),
            nn.LogSoftmax(dim=1),
        )
        self.domain_classifier = nn.Sequential(
            nn.Linear(config["hidden_size"], 2),
            nn.LogSoftmax(dim=1),
        )


    def forward(
          self,
          input_ids=None,
          attention_mask=None,
          token_type_ids=None,
          labels=None,
          grl_lambda = 1.0, 
          ):

        outputs = self.bert(
                input_ids,
                attention_mask=attention_mask,
                token_type_ids=token_type_ids,
            )

        pooled_output = outputs[1]
        pooled_output = self.dropout(pooled_output)


        reversed_pooled_output = GradientReversalFn.apply(pooled_output, grl_lambda)

        sentiment_pred = self.sentiment_classifier(pooled_output)
        domain_pred = self.domain_classifier(reversed_pooled_output)

        return sentiment_pred.to(device), domain_pred.to(device)

Теперь давайте определим функции потерь для нашей модели.

  1. Отрицательный логарифм вероятности для классификатора настроений
  2. Отрицательное логарифмическое правдоподобие для классификатора домена.
loss_fn_sentiment_classifier = torch.nn.NLLLoss()
loss_fn_domain_classifier = torch.nn.NLLLoss()

Здесь мы будем использовать оптимизатор Adam

optimizer = optim.Adam(model.parameters(), lr)

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

for epoch_idx in range(n_epochs):
    
    source_iterator = iter(source_dataloader)
    target_iterator = iter(target_dataloader)

    for batch_idx in range(max_batches):
        
        p = float(batch_idx + epoch_idx * max_batches) / (training_parameters["epochs"] * max_batches)
        grl_lambda = 2. / (1. + np.exp(-10 * p)) - 1
        grl_lambda = torch.tensor(grl_lambda)
        
        model.train()
        
        if(batch_idx%training_parameters["print_after_steps"] == 0 ):
            print("Training Step:", batch_idx)
        
        optimizer.zero_grad()
        
        # Souce dataset training update
        input_ids, attention_mask, token_type_ids, labels = next(source_iterator)
        inputs = {
            "input_ids": input_ids,
            "attention_mask": attention_mask,
            "token_type_ids" : token_type_ids,
            "labels" : labels,
            "grl_lambda" : grl_lambda,
        }

        for k, v in inputs.items():
            inputs[k] = v.to(device)
    
        sentiment_pred, domain_pred = model(**inputs)
        loss_s_sentiment = loss_fn_sentiment_classifier(sentiment_pred, inputs["labels"])
        y_s_domain = torch.zeros(training_parameters["batch_size"], dtype=torch.long).to(device)
        loss_s_domain = loss_fn_domain_classifier(domain_pred, y_s_domain)


        # Target dataset training update 
        input_ids, attention_mask, token_type_ids, labels = next(target_iterator)
        inputs = {
            "input_ids": input_ids,
            "attention_mask": attention_mask,
            "token_type_ids" : token_type_ids,
            "labels" : labels,
            "grl_lambda" : grl_lambda,
        }

        for k, v in inputs.items():
            inputs[k] = v.to(device)
    
        _, domain_pred = model(**inputs)
        
        # Note that we are not using the sentiment predictions here for updating the weights
        y_t_domain = torch.ones(training_parameters["batch_size"], dtype=torch.long).to(device)
        loss_t_domain = loss_fn_domain_classifier(domain_pred, y_t_domain)

        # Combining the loss 

        loss = loss_s_sentiment + loss_s_domain + loss_t_domain
        loss.backward()
        optimizer.step()

Вывод:

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

Использованная литература:

  1. Адаптация домена с классификацией доменов на основе BERT и отбором данных
  2. Обзор неконтролируемой адаптации глубокой области
  3. Урок 6: Трансферное обучение и адаптация предметной области