Почему «facebook/bart-large-mnli» дает разные вероятности при использовании «конвейера» и ручной токенизации?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему «facebook/bart-large-mnli» дает разные вероятности при использовании «конвейера» и ручной токенизации?

Сообщение Anonymous »

Я наблюдаю существенно разные вероятности для одних и тех же входных данных (предпосылка и гипотеза) при использовании модели facebook/bart-large-mnli с методом конвейера по сравнению с токенизацией вручную и подачей входных данных в модель. Я использую предварительно обученную версию модели, перенос обучения не проводился.
Следуют версии пакета, а среда — Google-colab под управлением Ubuntu 22.04.3 LTS.

Код: Выделить всё

$pip list | grep -E 'torch|transformers'
sentence-transformers              3.2.1
torch                              2.5.1+cu121
transformers                       4.46.2
Использование конвейера:

Код: Выделить всё

import torch
from transformers import pipeline

torch_device = torch.device('cuda:0')
classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli", device=torch_device)

result = classifier(
"one day I will see the world",
['travel', 'cooking', 'dancing', 'exploration'],
multi_label=True
)
print(result)
Вывод:

Код: Выделить всё

{
'sequence': 'one day I will see the world',
'labels': ['travel', 'exploration', 'dancing', 'cooking'],
'scores': [0.9945111274719238, 0.9383887052536011, 0.005706209223717451, 0.0018193129217252135]
}
Токенизация и передача входных данных в модель вручную:

Код: Выделить всё

from transformers import AutoModelForSequenceClassification, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained('facebook/bart-large-mnli')
nli_model = AutoModelForSequenceClassification.from_pretrained('facebook/bart-large-mnli').to(torch_device)

inputs = tokenizer.batch_encode_plus(
['one day I will see the world'] + ['travel', 'exploration', 'dancing', 'cooking'],
return_tensors='pt',
padding=True
)

output = nli_model(
inputs['input_ids'].to(torch_device),
attention_mask=inputs['attention_mask'].to(torch_device)
)[0]
# doing `1:` to discard outputs for the premise
label_reps = output[1:, [0, 2]]
# softmax to not have logits
probs = label_reps.softmax(dim=1)
# extract probabilities that the output class is 1
prob_label_is_true = probs[:, 1]
print(prob_label_is_true)
Вывод:

Код: Выделить всё

tensor([0.8655, 0.4706, 0.9117, 0.7982], device='cuda:0', grad_fn=)
Ключевые проблемы:
  • Вероятности из конвейера значительно выше и имеют больше смысла с учетом входных данных. .
  • Ручная токенизация и метод вывода модели дают гораздо меньшие вероятности.
Вопрос:Что может быть причиной такого несоответствия вероятностей между двумя методами? Как я могу заставить метод, размеченный вручную, создавать вероятности, более близкие к вероятностям конвейера (например, в пределах 1-2 десятичных знаков), в то же время имея эквивалент multi_label=True, чтобы иметь несколько правильных классов ? Мне нужно использовать метод ручной токенизации, поскольку я собираюсь позже экспортировать модель в torch.jit, хотя я не совсем уверен, что это сработает для этой конкретной модели.


Подробнее здесь: https://stackoverflow.com/questions/791 ... g-pipeline
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»