Transformers documentation
Çoktan seçmeli
Çoktan seçmeli
Çoktan seçmeli bir görev, soru yanıtlamaya benzer; ancak bağlamın yanı sıra birkaç aday cevap da sağlanır ve model, doğru cevabı seçecek şekilde eğitilir.
Bu kılavuz size şunları gösterecektir:
- BERT modelini, birden fazla seçenek ve bazı bağlam verildiğinde en iyi cevabı seçmek üzere SWAG veri setinin
regularyapılandırması üzerinde ince ayarlayın. - İnce ayarlanmış modelinizi çıkarım için kullanın.
Başlamadan önce, gerekli tüm kütüphanelerin yüklendiğinden emin olun:
pip install transformers datasets evaluate
Modelinizi yükleyip toplulukla paylaşabilmeniz için Hugging Face hesabınıza giriş yapmanızı öneririz. İstendiğinde giriş yapmak için token'ınızı girin:
>>> from huggingface_hub import notebook_login
>>> notebook_login()SWAG veri setini yükle
SWAG veri setinin regular yapılandırmasını 🤗 Datasets kütüphanesinden yükleyerek başlayın:
>>> from datasets import load_dataset
>>> swag = load_dataset("allenai/swag", "regular")Sonra bir örneğe göz atın:
>>> swag["train"][0]
{'ending0': 'passes by walking down the street playing their instruments.',
'ending1': 'has heard approaching them.',
'ending2': "arrives and they're outside dancing and asleep.",
'ending3': 'turns the lead singer watches the performance.',
'fold-ind': '3416',
'gold-source': 'gold',
'label': 0,
'sent1': 'Members of the procession walk down the street holding small horn brass instruments.',
'sent2': 'A drum line',
'startphrase': 'Members of the procession walk down the street holding small horn brass instruments. A drum line',
'video-id': 'anetv_jkn6uvmqwh4'}Burada birçok alan var gibi görünse de aslında oldukça basittir:
sent1vesent2: bu alanlar bir cümlenin nasıl başladığını gösterir ve ikisini bir araya getirdiğinizdestartphrasealanını elde edersiniz.ending: bir cümlenin nasıl bitebileceğine dair olası bir son önerir, ancak bunlardan yalnızca biri doğrudur.label: doğru cümle sonunu belirler.
Ön işleme
Bir sonraki adım, cümle başlangıçlarını ve dört olası sonu işlemek için bir BERT tokenizer'ı yüklemektir:
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")Oluşturmak istediğiniz ön işleme fonksiyonu şunları yapmalıdır:
sent1alanının dört kopyasını oluşturun ve her birinisent2ile birleştirerek bir cümlenin nasıl başladığını yeniden oluşturun.sent2öğesini, dört olası cümle sonundan her biriyle birleştirin.- Bu iki listeyi, onları tokenize edebilmek için düzleştirin ve ardından her örneğin karşılık gelen
input_ids,attention_maskvelabelsalanına sahip olması için yeniden düzleştirilmiş hâle getirin.
>>> ending_names = ["ending0", "ending1", "ending2", "ending3"]
>>> def preprocess_function(examples):
... first_sentences = [[context] * 4 for context in examples["sent1"]]
... question_headers = examples["sent2"]
... second_sentences = [
... [f"{header} {examples[end][i]}" for end in ending_names] for i, header in enumerate(question_headers)
... ]
... first_sentences = sum(first_sentences, [])
... second_sentences = sum(second_sentences, [])
... tokenized_examples = tokenizer(first_sentences, second_sentences, truncation=True)
... return {k: [v[i : i + 4] for i in range(0, len(v), 4)] for k, v in tokenized_examples.items()}Ön işleme fonksiyonunu tüm veri setine uygulamak için 🤗 Datasets map yöntemini kullanın. map fonksiyonunu, veri setinin birden çok öğesini aynı anda işlemek için batched=True ayarlayarak hızlandırabilirsiniz:
>>> tokenized_swag = swag.map(preprocess_function, batched=True)Örneklerden bir parti oluşturmak için, tüm veri setini maksimum uzunluğa doldurmak yerine, dinamik dolgu ile cümleleri parti içindeki en uzun uzunluğa doldurmak daha verimlidir. DataCollatorForMultipleChoice, tüm model girdilerini düzleştirir, dolgu uygular ve ardından sonuçları yeniden biçimlendirir.
>>> from transformers import DataCollatorForMultipleChoice
>>> collator = DataCollatorForMultipleChoice(tokenizer=tokenizer)Değerlendir
Eğitim sırasında bir metrik kullanmak, modelinizin performansını değerlendirmek için genellikle faydalıdır. 🤗 Evaluate kütüphanesiyle bir değerlendirme yöntemini hızla yükleyebilirsiniz. Bu görev için accuracy metrikini yükleyin (metrik yükleme ve hesaplama hakkında daha fazla bilgi için 🤗 Evaluate hızlı turuna bakın):
>>> import evaluate
>>> accuracy = evaluate.load("accuracy")Ardından, tahminlerinizi ve etiketlerinizi compute işlevine geçirerek doğruluğu hesaplayan bir işlev oluşturun:
>>> import numpy as np
>>> def compute_metrics(eval_pred):
... predictions, labels = eval_pred
... predictions = np.argmax(predictions, axis=1)
... return accuracy.compute(predictions=predictions, references=labels)compute_metrics fonksiyonunuz artık hazır ve eğitiminizi kurarken ona geri döneceksiniz.
Eğit
Trainer ile bir modeli ince ayar yapma konusunda deneyiminiz yoksa, temel öğreticiyi burada inceleyebilirsiniz!
Artık modelinizi eğitmeye hazırsınız! BERT'i AutoModelForMultipleChoice ile yükleyin:
>>> from transformers import AutoModelForMultipleChoice, TrainingArguments, Trainer
>>> model = AutoModelForMultipleChoice.from_pretrained("google-bert/bert-base-uncased")Bu noktada yalnızca üç adım kaldı:
- Eğitim hiperparametrelerinizi TrainingArguments içinde tanımlayın. Tek zorunlu parametre, modelin nereye kaydedileceğini belirleyen
output_dir'dir. Modeli Hub'apush_to_hub=Trueayarlayarak yükleyeceksiniz (modelinizi yüklemek için Hugging Face'e giriş yapmış olmanız gerekir). Her epoch'un sonunda Trainer, doğruluğu değerlendirir ve eğitim checkpoint'ini kaydeder. - Eğitim argümanlarını, model, veri seti, tokenizer, veri toplayıcı ve
compute_metricsfonksiyonuyla birlikte Trainer'a iletin. - Modelinizi ince ayar yapmak için train() çağrın.
>>> training_args = TrainingArguments(
... output_dir="my_awesome_swag_model",
... eval_strategy="epoch",
... save_strategy="epoch",
... load_best_model_at_end=True,
... learning_rate=5e-5,
... per_device_train_batch_size=16,
... per_device_eval_batch_size=16,
... num_train_epochs=3,
... weight_decay=0.01,
... push_to_hub=True,
... )
>>> trainer = Trainer(
... model=model,
... args=training_args,
... train_dataset=tokenized_swag["train"],
... eval_dataset=tokenized_swag["validation"],
... processing_class=tokenizer,
... data_collator=collator,
... compute_metrics=compute_metrics,
... )
>>> trainer.train()Eğitim tamamlandıktan sonra, modelinizi herkesin kullanabilmesi için push_to_hub() yöntemiyle Hub'a paylaşın:
>>> trainer.push_to_hub()Bir modeli çoktan seçmeli görevler için ince ayar yapmanın daha ayrıntılı bir örneği için ilgili PyTorch defterine göz atın.
Çıkarım
Harika, bir model ayarladıktan sonra artık çıkarım için kullanabilirsiniz!
Bazı metin ve iki aday cevap üretin:
>>> prompt = "France has a bread law, Le Décret Pain, with strict rules on what is allowed in a traditional baguette."
>>> candidate1 = "The law does not apply to croissants and brioche."
>>> candidate2 = "The law applies to baguettes."Her istem ve aday cevap çiftini tokenlaştırmak ve PyTorch tensörlerini döndürmek için. Ayrıca bazı labels oluşturmalısınız:
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("username/my_awesome_swag_model")
>>> inputs = tokenizer([[prompt, candidate1], [prompt, candidate2]], return_tensors="pt", padding=True)
>>> labels = torch.tensor(0).unsqueeze(0)Girdilerinizi ve etiketlerinizi modele iletin ve logits değerlerini döndürün:
>>> from transformers import AutoModelForMultipleChoice
>>> model = AutoModelForMultipleChoice.from_pretrained("username/my_awesome_swag_model")
>>> outputs = model(**{k: v.unsqueeze(0) for k, v in inputs.items()}, labels=labels)
>>> logits = outputs.logitsEn yüksek olasılığa sahip sınıfı alın:
>>> predicted_class = logits.argmax().item()
>>> predicted_class
0