Transformers documentation

اختيار من متعدد

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

اختيار من متعدد

تُشبه مهمة الاختيار من متعدد مهمة الإجابة عن الأسئلة، باستثناء أن عدة إجابات مرشحة تُقدَّم إلى جانب السياق، ويُدرَّب النموذج على اختيار الإجابة الصحيحة.

ستُظهر لك هذه الدليل كيفية:

  1. قم بضبط BERT على التهيئة regular من مجموعة بيانات SWAG لاختيار أفضل إجابة في ظل وجود عدة خيارات وبعض السياق.
  2. استخدم النموذج المُحسَّن لديك للاستدلال.

قبل أن تبدأ، تأكد من تثبيت جميع المكتبات اللازمة:

pip install transformers datasets evaluate

ننصحك بتسجيل الدخول إلى حسابك على Hugging Face حتى تتمكن من رفع نموذجك ومشاركته مع المجتمع. عند الطلب، أدخل رمزك (token) لتسجيل الدخول:

>>> from huggingface_hub import notebook_login

>>> notebook_login()

تحميل مجموعة بيانات SWAG

ابدأ بتحميل إعداد regular لمجموعة بيانات SWAG من مكتبة 🤗 Datasets:

>>> from datasets import load_dataset

>>> swag = load_dataset("allenai/swag", "regular")

ثم اطّلع على مثال:

>>> 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'}

على الرغم من أن الأمر يبدو وكأنه يحتوي على عدد كبير من الحقول، إلا أنه في الواقع بسيط إلى حد كبير:

  • sent1 وsent2: تُظهر هذه الحقول كيفية بدء الجملة، وإذا جمعتَ الحقلين معًا، فستحصل على حقل startphrase.
  • ending: يقترح نهاية محتملة لكيفية انتهاء الجملة، لكن واحدة منها فقط هي الصحيحة.
  • label: يحدد نهاية الجملة الصحيحة.

المعالجة المسبقة

الخطوة التالية هي تحميل مُجزِّئ BERT لمعالجة بداية الجملة والنهايات الأربع المحتملة:

>>> from transformers import AutoTokenizer

>>> tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")

تحتاج دالة المعالجة المسبقة التي تريد إنشاؤها إلى:

  1. أنشئ أربع نسخ من حقل sent1 وادمج كل واحدة منها مع sent2 لإعادة إنشاء كيفية بدء الجملة.
  2. اجمع sent2 مع كلٍّ من النهايات الأربع المحتملة للجملة.
  3. قم بتسوية هاتين القائمتين حتى تتمكن من تحويلهما إلى رموز، ثم أعد تسويتهما بعد ذلك بحيث يحتوي كل مثال على حقل input_ids، وattention_mask، وlabels مقابلة له.
>>> 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()}

لتطبيق دالة المعالجة المسبقة على مجموعة البيانات بأكملها، استخدم طريقة map في 🤗 Datasets. يمكنك تسريع دالة map عن طريق تعيين batched=True لمعالجة عدة عناصر من مجموعة البيانات في وقت واحد:

>>> tokenized_swag = swag.map(preprocess_function, batched=True)

لإنشاء دفعة من الأمثلة، يكون من الكفاءة أن نملأ ديناميكيًا الجمل حتى أطول طول في الدفعة أثناء التجميع، بدلاً من ملء مجموعة البيانات بأكملها حتى الحد الأقصى للطول. يقوم DataCollatorForMultipleChoice بتسطيح جميع مدخلات النموذج، وتطبيق الملء، ثم إلغاء تسطيح النتائج.

>>> from transformers import DataCollatorForMultipleChoice
>>> collator = DataCollatorForMultipleChoice(tokenizer=tokenizer)

تقييم

غالبًا ما يكون تضمين مقياس أثناء التدريب مفيدًا لتقييم أداء نموذجك. يمكنك تحميل طريقة تقييم بسرعة باستخدام مكتبة 🤗 Evaluate. لهذه المهمة، حمّل مقياس accuracy (راجع quick tour الخاص بـ 🤗 Evaluate لمعرفة المزيد حول كيفية تحميل المقياس وحسابه):

>>> import evaluate

>>> accuracy = evaluate.load("accuracy")

ثم أنشئ دالة تمرّر تنبؤاتك والتسميات إلى compute لحساب الدقة:

>>> 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 الخاصة بك جاهزة الآن، وستعود إليها عند إعداد التدريب.

تدريب

إذا لم تكن على دراية بتدريب نموذج باستخدام Trainer، فاطّلع على الدرس الأساسي هنا!

أنت مستعد الآن لبدء تدريب نموذجك! حمّل BERT باستخدام AutoModelForMultipleChoice:

>>> from transformers import AutoModelForMultipleChoice, TrainingArguments, Trainer

>>> model = AutoModelForMultipleChoice.from_pretrained("google-bert/bert-base-uncased")

في هذه المرحلة، تبقى ثلاث خطوات فقط:

  1. حدّد معاملات التدريب الفائقة في TrainingArguments. المعامل الوحيد الإلزامي هو output_dir الذي يحدد مكان حفظ النموذج. ستقوم بدفع هذا النموذج إلى Hub عن طريق تعيين push_to_hub=True (يتعين عليك تسجيل الدخول إلى Hugging Face لرفع النموذج). في نهاية كل حقبة، سيقوم Trainer بتقييم الدقة وحفظ نقطة الفحص للتدريب.
  2. مرّر حُجج التدريب إلى Trainer مع النموذج، ومجموعة البيانات، ومُجزّئ الرموز، ومُجمِّع البيانات، ودالة compute_metrics.
  3. استدعِ train() لضبط نموذجك.
>>> 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()

بمجرد اكتمال التدريب، شارك نموذجك على Hub باستخدام طريقة push_to_hub() ليتمكن الجميع من استخدام نموذجك:

>>> trainer.push_to_hub()

لمثال أكثر تفصيلاً حول كيفية ضبط نموذج للاختيار من متعدد، راجع دفتر PyTorch المقابل.

الاستدلال

رائع، والآن بعد أن قمت بضبط نموذج، يمكنك استخدامه للاستدلال!

فكّر في بعض النصّ وإجابتين مرشّحتين:

>>> 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."

قم بتجزئة كل زوج من الاستعلام والإجابة المرشحة، ثم أعد مصفوفات PyTorch. كما ينبغي عليك إنشاء بعض labels:

>>> 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)

مرّر مدخلاتك وتسمياتك إلى النموذج وأعد logits:

>>> 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.logits

احصل على الفئة ذات أعلى احتمال:

>>> predicted_class = logits.argmax().item()
>>> predicted_class
0
Update on GitHub