Что представляют логиты и вероятности из RobertaForSequenceClassification?

Будучи новичком в сцене «Обработка естественного языка», я экспериментально изучаю и реализовал следующий сегмент кода:

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»?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
6 572
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы инициализировали модель 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.

Откуда вы знаете, что отрицательное, нейтральное и положительное соответствуют элементам списка 0, 1 и 2 соответственно?

stackoverflowuser2010 10.12.2020 06:01

Карточка модели содержит ссылку на mapping.txt, который содержит сопоставление. Вы не можете знать это без такой дополнительной информации. @stackoverflowuser2010

cronoik 10.12.2020 06:06

Большое спасибо - это начинает иметь смысл. Вы заявляете, что модель по умолчанию «пытается классифицировать, принадлежит ли последовательность тому или иному классу». Должен ли я предположить, что, поскольку нет обученных выходных слоев, эти классы еще ничего не значат? В приведенном вами примере значения представляют настроение. В следующем примере на что можно заменить пробел: «Вероятность того, что ___ равно 0.5022980570793152»? Кроме того, для следующей карточки модели «сопоставление» не очевидно. Как мне понять смысл значений?

Enigmatic 10.12.2020 19:30

@LearningToNLP Я обновил ответ в начале и в конце текста, чтобы учесть ваши изменения. Пожалуйста, посмотрите.

cronoik 11.12.2020 00:59

Другие вопросы по теме

Как я могу оптимизировать алгоритмы sklearn KNN, GNB и SVC, чтобы сократить время выполнения?
Синтаксический анализ текста python для разделения списка на куски, включая предшествующие разделители
Как объединить прогнозируемые значения с исходным фреймом тестовых данных pandas, где X_test был преобразован с использованием CountVectorizer перед разделением
Лемматизация навсегда с Spacy
Как я могу проверить сходство по смыслу, а не просто наличие одинаковых слов между двумя текстами с пробелами
Сопоставить наиболее похожие пары строк из двух списков строк?
Косинусное сходство двух столбцов в DataFrame
Не удается загрузить из AutoTokenizer.from_pretrained — TypeError: повторяющееся имя файла (sentencepiece_model.proto)
Создание набора данных Tensorflow и применение слоя TextVectorization с использованием метода карты
Как разбить большой сжатый текстовый файл на небольшие текстовые файлы