Тонкая настройка современного RoBERTa с помощью fast.ai по задаче Commitment Bank NLP.

Это руководство будет во многом основываться на моей предыдущей работе по использованию Roberta с fast.ai для анализа настроений IMDB. Мы просто изменим наш предыдущий код, чтобы проанализировать данные и настроить соответствующую модель Роберты для задачи SuperGLUE, CB. Это руководство также можно применить к другим задачам BoolQ и RTE с небольшими изменениями.

Обновление 2020.11: fast.ai обновился до v2 с момента выхода этой статьи. На совместимость с приведенными ниже шагами версия 2 остается непроверенной. Поэтому использование v1 рекомендуется для чтения вместе с этой статьей.

Банк обязательств или CB - это задача НЛП, в которой, учитывая предпосылку и гипотезу, мы классифицируем, насколько автор предпосылки привержен истинности гипотезы. Таким образом, есть три возможных ярлыка: «следствие», «противоречие» или «нейтральный». Взгляните на этот пример следования:

  • Предпосылка: это был сложный язык. Не записано, а передано по наследству. Можно сказать, сняли.
  • Гипотеза: язык был очищен
  • Ярлык: Вмешательство

Пример противоречия:

  • Предпосылка: A: Я, это было бы глупо, B: Да. A: и я не думаю, что мы это сделали. Все остальное, с чем мы работали, казалось, было совершенно правильным. Не думаю, что они бы так поступили.
  • Гипотеза: они бы это сделали
  • Ярлык: Противоречие

Эта задача очень похожа на RTE или распознавание текстового перехода, где мы прогнозируем состояние следования. Другими словами, мы обнаруживаем, что пара посылки и гипотезы имеет следствие, если гипотеза может быть выведена из посылки. Эта способность распознавать следствие может быть перенесена на другие задачи НЛП, такие как ответы на вопросы и обобщение текста.

Следовательно, как важная задача в тесте SuperGlue, это руководство теперь будет сосредоточено на создании конвейера для CB, синтаксическом анализе данных и построении модели в вашей среде Fastai.

0. Предпосылки

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

У вас должны быть установлены библиотеки fastai и pytorch_transformers.

1. Парсинг CB данных в RoBERTa

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

одиночный эпизод → ‹s› фильм был отличным ‹/s›

несколько последовательностей → ‹s› быстро вздремнув, овца перешла улицу ‹/s› ‹/s› овца вздремнула ‹/s›

‹/S› ‹/s› отмечает конец одной последовательности и начало другой. Следовательно, мы должны добавить эти специальные жетоны Роберты, чтобы разделить наши последовательности CB. Это может быть немного сложно реализовать вместе с Fastai. Увидев, что нет возможности изменить специальные токены fastai по умолчанию для маркировки полей (например, xxfld #), мы обойдем возможность mark_fields токенизатора fastai, чтобы вручную вставлять токены разделителя Roberta во время процесса токенизатора.

2. Загрузка данных

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

path = Path(".")
data_path = path/"data"
feat_cols = ["premise","hypothesis"]
label_cols = "label"
train = pd.read_json(data_path/"CB"/"train.jsonl",lines=True)
val = pd.read_json(data_path/"CB"/"val.jsonl",lines=True)
test = pd.read_json(data_path/"CB"/"test.jsonl",lines=True)

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

3. Построение собственной модели Роберты.

Здесь мы будем использовать класс модели «RobertaForSequenceClassification» из PyTorch Transformers.

После этого мы можем инициализировать нашу модель Роберты:

roberta_model = CustomRobertatModel(num_labels=3)

4. Обучите модель.

Инициализируйте учащегося:

learn = Learner(data, roberta_model, metrics=[accuracy])

Начать обучение:

learn.model.roberta.train() # setting roberta to train as it is in eval mode by default
learn.fit_one_cycle(4, max_lr=1e-5)

После шести коротких периодов использования базовой модели Роберты мы получаем точность проверки 96%. По сравнению с результатами (для набора тестов) на SuperGLUE, мы сделали довольно хорошие результаты:

5. Создание прогнозов.

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

def get_preds_as_nparray(ds_type) -> np.ndarray:
    learn.model.roberta.eval()
    preds = learn.get_preds(ds_type)[0].detach().cpu().numpy()
    sampler = [i for i in data.dl(ds_type).sampler]
    reverse_sampler = np.argsort(sampler)
    ordered_preds = preds[reverse_sampler, :]
    pred_values = np.argmax(ordered_preds, axis=1)
    return ordered_preds, pred_values
# test preds
_, test_pred_values = get_preds_as_nparray(DatasetType.Test)

Надеюсь, это краткое руководство является достаточной отправной точкой для дальнейшего улучшения результатов, а также для реализации других задач НЛП. Как всегда, вы можете получить доступ к полной записной книжке для этого руководства на моем репозитории на github (используйте эту ссылку, если у вас возникли проблемы с просмотром записной книжки на github). Также доступны ноутбуки RTE и BoolQ. Данные Superglue можно скачать с помощью этого скрипта от jiant.