Тонкая настройка современного 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.