Будучи новичком в сцене «Обработка естественного языка», я экспериментально изучаю и реализовал следующий сегмент кода:
from transformers import RobertaTokenizer, RobertaForSequenceClassification
import torch
path = "D:/LM/rb/"
tokenizer = RobertaTokenizer.from_pretrained(path)
model = RobertaForSequenceClassification.from_pretrained(path)
inputs = tokenizer("Hello, my dog is cute", return_tensors = "pt")
outputs = model(**inputs)
pred_logits = outputs.logits
print(pred_logits)
probs = pred_logits.softmax(dim=-1).detach().cpu().flatten().numpy().tolist()
print(probs)
Я понимаю, что применение модели возвращает «torch.FloatTensor
, состоящий из различных элементов в зависимости от конфигурации (RobertaConfig) и входных данных», и что логиты доступны с помощью .logits
. Как показано, я применил к тензору функцию .softmax для возврата нормализованных вероятностей и преобразовал результат в список. У меня выводится следующее:
[0.5022980570793152, 0.49770188331604004]
Представляют ли эти вероятности какую-то общую «замаскированную» вероятность?
Что представляют первый и второй индексы в контексте ввода?
Обновлено:
model.num_labels
Выход:
2
@cronoik объясняет, что модель «пытается классифицировать, принадлежит ли последовательность тому или иному классу»
Должен ли я предположить, что, поскольку нет обученных выходных слоев, эти классы еще ничего не значат?
Например, я могу предположить, что вероятность того, что предложение после анализа принадлежит классу 1, равна 0,5. Однако что такое 1-й класс?
Кроме того, карточки-модели с предварительно обученными выходными слоями, такие как открытый детектор ИИ , помогают различать «настоящее» и «фальшивое», и поэтому я могу предположить, к какому классу относится предложение. к. Однако как я могу подтвердить эти «метки» без какого-либо файла «mapping.txt»?
Вы инициализировали модель RobertaForSequenceClassification
, которая по умолчанию (в случае roberta-base
и roberta-large
, у которых нет обученных выходных слоев для классификации последовательностей) пытается классифицировать, принадлежит ли последовательность тому или иному классу. Я употребил выражение «принадлежит к тому или иному классу», потому что эти классы еще не имеют смысла. Выходной слой необученный и требует тонкой настройки, чтобы придать этим классам смысл. Class 0
может быть X
, а Class 1
может быть Y
или наоборот. Например, руководство по тонкой настройке модели классификации последовательностей для набора данных обзоров IMDb определяет отрицательные отзывы как Class 0
, а положительные — как Class 1
(ссылка).
Вы можете проверить количество поддерживаемых классов с помощью:
model.num_labels
Выход:
2
На выходе вы получаете ненормализованную вероятность для каждого класса (т.е. логиты). Вы применили функцию softmax для нормализации этих вероятностей, что дает 0,5022980570793152 для первого класса и 0,49770188331604004 для второго класса.
Возможно, вы запутались, потому что значения близки друг к другу. Давайте попробуем модель с предварительно обученным выходным слоем (карточка модели):
sentimodel = RobertaForSequenceClassification.from_pretrained('cardiffnlp/twitter-roberta-base-sentiment')
print(sentimodel.num_labels)
outputs = sentimodel(**inputs)
print(outputs.logits.softmax(dim=-1).tolist())
Выход:
3
[[0.0015561950858682394, 0.019568447023630142, 0.9788752794265747]]
Эти значения представляют вероятности того, что предложение Hello, my dog is cute
будет negative
, neutral
или positive
. Мы знаем, что это за классы, потому что авторы предоставили отображение, которое проясняет это. В случае, если авторы модели не предоставляют такого сопоставления (через файл readme или исходный обучающий код), мы можем только догадываться, что представляет собой каждый класс, тестируя его на случайных выборках.
Упомянутая вами карточка модели не предоставляет никакой полезной информации относительно сопоставления классов с тем, что они представляют, но модель предоставляется самим Huggingface , и они предоставляют ссылку на код, используемый для обучение модели. Набор данных dataset.py указывает, что fake
представлен Class 0
, а real
- Class 1
.
Карточка модели содержит ссылку на mapping.txt, который содержит сопоставление. Вы не можете знать это без такой дополнительной информации. @stackoverflowuser2010
Большое спасибо - это начинает иметь смысл. Вы заявляете, что модель по умолчанию «пытается классифицировать, принадлежит ли последовательность тому или иному классу». Должен ли я предположить, что, поскольку нет обученных выходных слоев, эти классы еще ничего не значат? В приведенном вами примере значения представляют настроение. В следующем примере на что можно заменить пробел: «Вероятность того, что ___ равно 0.5022980570793152
»? Кроме того, для следующей карточки модели «сопоставление» не очевидно. Как мне понять смысл значений?
@LearningToNLP Я обновил ответ в начале и в конце текста, чтобы учесть ваши изменения. Пожалуйста, посмотрите.
Откуда вы знаете, что отрицательное, нейтральное и положительное соответствуют элементам списка 0, 1 и 2 соответственно?