Время прочтения: 4 мин.

Стоит отдать должное NLI (Natural Language Inference), развитие которого позволило моделям пытаться искать логическую взаимосвязь между двумя высказываниями.

У меня есть некоторое выражение (например – «Сократ сказал, что никто не будет жить вечно») и гипотеза (например – «Сократ никогда не умрет»). Модели необходимо определить какое заключение получится:

  • Логическое следствие – из высказывания следует гипотеза;
  • Логическая нейтральность – гипотеза и высказывание не связаны;
  • Логическое противоречие – из высказывания не следует гипотеза.

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

Имеется также возможность подавать модели на вход высказывание без гипотезы, соответственно определив список меток, на основе которых будет проверяться отношение их к высказыванию. Имеется некоторое высказывание («Netflix выпустит третий сезон «Любви. Смерти. Роботов» уже 20 мая») и подаем метки (например – Кино, Музыка, Наука).

В данном случае, при применении модели, получается класс «Кино» с наибольшей вероятностью, так действительно «Любовь, Смерть и Роботы» относится к кинематографу.

Пара высказывание-гипотеза

Реализация работы модели представлена на картинке ниже, где в качестве модели передается мультиязычная модель mDeBERTa-v3-mnli-xnli, которая является дообученой mDeBERTa-v3 на определение присутствия или отсутствия логики в парах высказывание-гипотеза моделью.

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

На выходе обозначу, что буду использовать вычислительные мощности процессора. Для представления результатов работы модели в диапазоне [0; 1] вызываю функцию масштабирования torch.softmax(). Далее обозначаю метки, которые подразумевают результаты логической связи.

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

model_name = “cointegrated/ruber-base-cased-nli-threeway”
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)

premise = “Сократ сказал, что никто не будет жить вечно.”
hypothesis = “Сократ никогда не умрет.”

input = tokenizer(premise, hypothesis, truncation=True, return_tensors=”pt”)
output = model(input[“input_ids”].to(“cpu”))
prediction = torch.softmax(output[“logits”][0], -1).tolist()

label_names = [“Логическое заключение”, “Нейтрально”, “Логическое противоречие”]
prediction = {name: round(float(pred) * 100, 1) for pred, name in zip(prediction, label_names)}

В принте выводится результат по вероятности отнесения пары выражение-гипотеза к тому или иному классу:

{'Логическое заключение': 0.1, ' Логическая нейтральность': 0.1, 'Логическое противоречие': 99.8}

Также существует модель cointegrated/rubert-base-cased-nli-threeway, которая является дообученой моделью DeepPavlov/rubert-base-cased, её аналогично обучили на определение наличия логики в парах высказывание-гипотеза. Для того, чтобы использовать данную модель необходимо поле model_name изменить на model_name = ‘cointegrated/rubert-base-cased-nli-threeway’.

{'Логическое заключение': 29.6, 'Логическая нейтральность': 23.1, 'Логическое противоречие': 47.3}

Данная модель хоть и верно определила наибольшую вероятность того, что это логическое противоречие, однако эта вероятность равна всего лишь 47.3%.

В случае предсказания пар выражение-гипотеза модель mDeBERTa-v3-mnli-xnli показала себя более уверенной в определении связи между текстами.

Высказывание-метки

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

Реализация пайплайна для zero-shot classification представлена ниже:

from transformers import pipeline

zero_short_pipeline = pipeline(
	task=’zero-shot-classification’,
	model=’MoritzLaurer/mDeBERTa-v3-base-mnli-xnli’
)

zero_short_pipeline(
	sequences=”Netflix выпустит третий сезон «Любви. Смерти. Роботов» уже 20 мая”,
	hypothesis_template=”{}.”,
	candidate_labels=”Музыка, Наука, Кино”
)

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

На выходе работы модели MoritzLaurer/mDeBERTa-v3-base-mnli-xnli получается результат следующего вида:

{'sequence': 'Netflix выпустит третий сезон «Любви. Смерти. Роботов» уже 20 мая',
'labels': ['Кино', 'Наука', 'Музыка'],
'scores': [0.964979350566864, 0.03100810945034027, 0.004012515302747488]}

Модель правильно определила, что данное высказывание относится к кинематографу с вероятностью 96.49%.

На выходе работы модели cointegrated/rubert-base-cased-nli-threeway получается результат следующего вида:

{'sequence': 'Netflix выпустит третий сезон «Любви. Смерти. Роботов» уже 20 мая',
 'labels': ['Музыка', 'Наука', 'Кино'],
 'scores': [0.7185790538787842, 0.16108305752277374, 0.12033793330192566]}

Модель неправильно определила, что данное высказывание относится к музыке с вероятностью 71.86%.

Дам данной модели второй шанс, проверив ее на другом высказывании

{'sequence': 'Авиаперелеты в Москву становятся дороже',
'labels': ['Путешествия', 'Искусство', 'Наука'],
'scores': [0.9530848860740662, 0.030094964429736137, 0.016820121556520462]}

Теперь модель правильно определила отнесение высказывания к метке путешествия с вероятностью 95.03%.

Дообучение модели

Модели можно дообучить используя «тренера» Hugging Face используя следующие гиперпараметры:

training_args = TrainingArguments(
    num_train_epochs=2,              			# количество эпох обучения
    learning_rate=2e-05,			# коэффициент скорости обучения
    per_device_train_batch_size=16,  		# размер батча во время обучения
    per_device_eval_batch_size=16,    		# размер батча во время оценки
    warmup_ratio=0.1,                			# количество шагов для планирования скорости обучения
    weight_decay=0.06,               			# сила снижения веса
)

Итоги

Модель MoritzLaurer/mDeBERTa-v3-base-mnli-xnliявляется более точной для обоих случаев, так как она обучалась на большем количестве данных. С учетом того, что она мультиязычная, то будет знать и учитывать некоторые особенности, например, что Netflix, так или иначе, относится к кинематографу. Модель cointegrated/rubert-base-cased-nli-threewayвыигрывает у первой по занимаемому месту и в более простых выражениях показывает высокую точность, несмотря на несоизмеримо разные объемы обучающих датасетов обеих моделей.