pipeline — модел дар як сатр
Чаро pipeline лозим аст?
Мағозаи интернетӣ бояд садҳо шарҳро бинад: кадом муштариён қаноатманданд ва ба кадомашон ёрӣ лозим аст? Барои намунаи аввал аз сифр омӯзондани шабакаи нейронӣ душвор аст. Китобхонаи transformers истифодаи модели омӯхташударо имкон медиҳад ва pipeline омодасозии матн, иҷрои модел ва тартиб додани натиҷаро муттаҳид мекунад.
Hugging Face Hub феҳристи моделҳо ва файлҳои вобаста аст. Номи distilbert/distilbert-base-uncased-finetuned-sst-2-english модели муайянеро барои шарҳҳои англисӣ нишон медиҳад. Даъвати аввалини from_pretrained файлҳоро ба cache-и маҳаллӣ боргирӣ мекунад; баъд файлҳои захирашударо дубора истифода бурдан мумкин аст. Пешгӯӣ дар компютери шумо иҷро мешавад.
Мисолҳо бо transformers 5.21.0 санҷида шудаанд. Блокҳоро бо тартиб дар як раванд иҷро кунед. Барои пешгирӣ аз боргирии модели калон модели хурди наомӯхта месозем: вазнҳоро сифр карда, афзалияти доимии POSITIVE медиҳем. Ин намунаи интерфейс аст, на муайянкунандаи оҳанг. Матну тамғаҳои англисӣ додаҳои намунаанд.
1. Функсия аз модел ва tokenizer
Tokenizer матнро ба ададҳо табдил медиҳад. Модел аз онҳо баҳои синфҳоро месозад. Конфигуратсия андозаҳои модел ва мувофиқати рақамҳоро ба номҳо муайян мекунад. BertConfig дар ин ҷо хеле хурд аст ва device=-1 CPU-ро интихоб мекунад.
import torch
from transformers import BertConfig, BertForSequenceClassification, BertTokenizer, pipeline
vocab = ['[PAD]', '[UNK]', '[CLS]', '[SEP]', '[MASK]', 'good', 'bad']
tok = BertTokenizer(vocab={t: i for i, t in enumerate(vocab)})
config = BertConfig(vocab_size=len(vocab), hidden_size=8, num_hidden_layers=1, num_attention_heads=2, intermediate_size=16, num_labels=2, id2label={0: 'NEGATIVE', 1: 'POSITIVE'})
model = BertForSequenceClassification(config).eval()
with torch.no_grad():
for parameter in model.parameters():
parameter.zero_()
model.classifier.bias.copy_(torch.tensor([-1.0, 1.0]))
classify = pipeline('sentiment-analysis', model=model, tokenizer=tok, device=-1)
print(callable(classify))
Натиҷа:
True
True нишон медиҳад, ки объектро мисли функсия даъват кардан мумкин аст. Дар лоиҳаи воқеӣ ба ҷойи сохтани модели тасодуфӣ pipeline("sentiment-analysis", model=номи_модел) медиҳанд. Номи вазифа коркарди натиҷа ва model вазнҳои истифодашавандаро муайян мекунад. Моделро ошкоро нишон диҳед ва ҳангоми зарурат revision-и онро собит кунед.
2. Сатр ва рӯйхати сатрҳо
Муайянкунандаи маъмулии оҳанг рӯйхати луғатҳоро медиҳад. Дар ҳар кадом label синфи интихобшуда ва score баҳои эътимод аст. Тартиби ҷавобҳо ба тартиби матнҳои вурудӣ мувофиқ аст.
results = classify(['good', 'bad'])
print([(r['label'], round(r['score'], 4)) for r in results])
print(len(classify('good')))
Натиҷа:
[('POSITIVE', 0.8808), ('POSITIVE', 0.8808)]
1
Ҷавобҳои якхела барои good ва bad интизоранд: намуна наомӯхта аст ва маъноро намефаҳмад. Натиҷаи модели ҳақиқӣ аз матн, забон ва додаҳои омӯзишӣ вобаста аст. Ҳатто барои як сатр натиҷа рӯйхати якэлемента мемонад.
3. Эътимод чӣ маъно дорад?
Дар ин ҷо ду синфи ҳамдигарро истиснокунанда ҳастанд, бинобар ин pipeline баҳоро бо softmax ба эҳтимолият табдил медиҳад. Баҳои 0.88 маънои «88% калимаҳои мусбат» ё «сифати мол 88 аз 100»-ро надорад. Он тақсимоти моделро байни синфҳо тавсиф мекунад ва метавонад хато бошад.
result = results[0]
print(result['label'])
print(f"{result['score']:.1%}")
print(result['score'] >= 0.9)
Натиҷа:
POSITIVE
88.1%
False
Муқоиса бо 0.9 натиҷаи False медиҳад: баҳои зоҳиран баланд ҳам аз ҳадд намегузарад. Ҳадд қоидаи барнома аст ва аз рӯйи мисолҳои ҷавобашон маълум интихоб мешавад. Барои ду синфи баробар 0.5 набудани афзалиятро нишон медиҳад; барои се синф баҳои яксон тақрибан 0.33 аст.
4. Мавзӯъҳо бе омӯзиши иловагӣ
Zero-shot classification мувофиқати матнро ба мавзӯъҳои пешниҳодшуда месанҷад. Модели мувофиқи омӯхташуда, масалан facebook/bart-large-mnli, ва параметри candidate_labels лозиманд. Луғати зерин ҷавоби омӯзишии дастӣ аст, на натиҷаи иҷрои он модел:
answer = {'sequence': 'A parcel arrived', 'labels': ['delivery', 'price'], 'scores': [0.8, 0.2]}
print(list(zip(answer['labels'], answer['scores'])))
print(round(sum(answer['scores']), 1))
Натиҷа:
[('delivery', 0.8), ('price', 0.2)]
1.0
labels ва scores-ро ҷуфт хонед. Дар ҳолати маъмулӣ як мавзӯъ интихоб ва баҳоҳо байни номзадҳо меъёрбандӣ мешаванд. Бо multi_label=True мавзӯъҳо мустақил арзёбӣ мешаванд ва ҷамъашон ҳатман як нест.
Дар дохил чӣ мегузарад?
Pipeline ба конвейер монанд аст: tokenizer вурудро омода мекунад, шабака баҳои хомро ҳисоб мекунад ва коркардкунанда онҳоро ба луғат табдил медиҳад. Ин иҷрои модел, яъне inference аст, на омӯзиш. Санҷиши масъалаҳои мавзӯъ ҷавобҳои омодаи ҳамин шаклро медиҳад; қолаби маҳаллӣ модели ҳақиқиро иҷро мекунад.
Хатоҳои маъмул
classify("good")["label"]баTypeErrorмеорад: ҷавоб рӯйхат аст. Аввал элементи[0]-ро гиред.result["label"] == "positive"бароиPOSITIVEнатиҷаиFalseмедиҳад. Номҳои дақиқи конфигуратсияро муқоиса кунед.result["score"] * 100фоизи ҷавобҳои дуруст нест. Сифатро дар мисолҳои тамғагузоришуда санҷед.- Сохтани
pipeline(...)дар давра оғози гаронро такрор мекунад. Объектро як бор созед. - Модели sentiment-и англисӣ дар шарҳи русӣ метавонад бо эътимод хато кунад. Моделро мувофиқи забону вазифа интихоб кунед.
Ёдномаи кӯтоҳ
| Ниёз | Восита |
|---|---|
| Коркарди тайёр | pipeline(вазифа, model=...) |
| Ҷавоби sentiment pipeline | рӯйхати луғатҳои label ва score |
| Санҷиши эътимод | муқоисаи score бо ҳадд |
| Мавзӯъҳо ҳангоми даъват | candidate_labels |
| Мавзӯъҳои мустақил | multi_label=True |
Тавсифи интерфейс: ҳуҷҷатҳои pipeline.