Transformers documentation
الترجمة
الترجمة
تقوم الترجمة بتحويل تسلسل من النص من لغة إلى أخرى. وهي إحدى المهام التي يمكن صياغتها كمسألة من تسلسل إلى تسلسل، وهي إطار قوي لإرجاع بعض المخرجات من مدخلات، مثل الترجمة أو التلخيص. تُستخدم أنظمة الترجمة بشكل شائع للترجمة بين نصوص بلغات مختلفة، لكنها يمكن أن تُستخدم أيضاً للصوت أو بعض التوليفات بينهما مثل تحويل النص إلى كلام أو تحويل الكلام إلى نص.
ستُظهر لك هذه الدليل كيفية:
- قم بضبط T5 على مجموعة البيانات الفرعية الإنجليزية-الفرنسية من مجموعة OPUS Books لترجمة النصوص الإنجليزية إلى الفرنسية.
- استخدم النموذج المُحسَّن لديك للاستدلال.
للاطلاع على جميع البنى المعمارية ونقاط التفتيش المتوافقة مع هذه المهمة، ننصح بالاطلاع على صفحة المهمة.
قبل أن تبدأ، تأكد من تثبيت جميع المكتبات اللازمة:
pip install transformers datasets evaluate sacrebleu
ننصحك بتسجيل الدخول إلى حسابك على Hugging Face حتى تتمكن من رفع نموذجك ومشاركته مع المجتمع. عند الطلب، أدخل رمزك (token) لتسجيل الدخول:
>>> from huggingface_hub import notebook_login
>>> notebook_login()تحميل مجموعة بيانات OPUS Books
ابدأ بتحميل مجموعة البيانات الفرعية الإنجليزية-الفرنسية من مجموعة بيانات OPUS Books باستخدام مكتبة 🤗 Datasets:
>>> from datasets import load_dataset
>>> books = load_dataset("Helsinki-NLP/opus_books", "en-fr")قسّم مجموعة البيانات إلى مجموعة تدريب ومجموعة اختبار باستخدام طريقة train_test_split:
>>> books = books["train"].train_test_split(test_size=0.2)ثم اطّلع على مثال:
>>> books["train"][0]
{'id': '90560',
'translation': {'en': 'But this lofty plateau measured only a few fathoms, and soon we reentered Our Element.',
'fr': 'Mais ce plateau élevé ne mesurait que quelques toises, et bientôt nous fûmes rentrés dans notre élément.'}}translation: ترجمة النص إلى الإنجليزية والفرنسية.
المعالجة المسبقة
الخطوة التالية هي تحميل مُرمِّز T5 لمعالجة أزواج اللغتين الإنجليزية والفرنسية:
>>> from transformers import AutoTokenizer
>>> checkpoint = "google-t5/t5-small"
>>> tokenizer = AutoTokenizer.from_pretrained(checkpoint)تحتاج دالة المعالجة المسبقة التي تريد إنشاؤها إلى:
- أضِف بادئة إلى المدخلات حتى يعرف T5 أن هذه مهمة ترجمة. بعض النماذج القادرة على أداء مهام معالجة اللغة الطبيعية المتعددة تتطلب بادئة محددة لكل مهمة.
- اضبط اللغة المستهدفة (الفرنسية) في معامل
text_targetلضمان معالجة المُجزِّئ للنص المستهدف بشكل صحيح. إذا لم تضبطtext_target، فسيُعالج المُجزِّئ النص المستهدف على أنه نص بالإنجليزية. - اقطع التسلسلات بحيث لا تتجاوز الطول الأقصى المحدد بواسطة معامل
max_length.
>>> source_lang = "en"
>>> target_lang = "fr"
>>> prefix = "translate English to French: "
>>> def preprocess_function(examples):
... inputs = [prefix + example[source_lang] for example in examples["translation"]]
... targets = [example[target_lang] for example in examples["translation"]]
... model_inputs = tokenizer(inputs, text_target=targets, max_length=128, truncation=True)
... return model_inputsلتطبيق دالة المعالجة المسبقة على مجموعة البيانات بأكملها، استخدم طريقة map في 🤗 Datasets. يمكنك تسريع دالة map عن طريق تعيين batched=True لمعالجة عدة عناصر من مجموعة البيانات في وقت واحد:
>>> tokenized_books = books.map(preprocess_function, batched=True)الآن أنشئ دفعة من الأمثلة باستخدام DataCollatorForSeq2Seq. من الكفاءة أن نملأ الجمل ديناميكيًا حتى الطول الأطول في الدفعة أثناء التجميع، بدلاً من ملء مجموعة البيانات بأكملها حتى الطول الأقصى.
>>> from transformers import DataCollatorForSeq2Seq
>>> data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=checkpoint)تقييم
غالباً ما يكون تضمين مقياس أثناء التدريب مفيداً لتقييم أداء نموذجك. يمكنك تحميل طريقة تقييم بسرعة باستخدام مكتبة 🤗 Evaluate. لهذه المهمة، حمّل مقياس SacreBLEU (راجع الجولة السريعة في 🤗 Evaluate لمعرفة المزيد حول كيفية تحميل المقياس وحسابه):
>>> import evaluate
>>> metric = evaluate.load("sacrebleu")ثم أنشئ دالةً تمرّر تنبؤاتك والتسميات إلى compute لحساب درجة SacreBLEU:
>>> import numpy as np
>>> def postprocess_text(preds, labels):
... preds = [pred.strip() for pred in preds]
... labels = [[label.strip()] for label in labels]
... return preds, labels
>>> def compute_metrics(eval_preds):
... preds, labels = eval_preds
... if isinstance(preds, tuple):
... preds = preds[0]
... decoded_preds = tokenizer.batch_decode(preds, skip_special_tokens=True)
... labels = np.where(labels != -100, labels, tokenizer.pad_token_id)
... decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)
... decoded_preds, decoded_labels = postprocess_text(decoded_preds, decoded_labels)
... result = metric.compute(predictions=decoded_preds, references=decoded_labels)
... result = {"bleu": result["score"]}
... prediction_lens = [np.count_nonzero(pred != tokenizer.pad_token_id) for pred in preds]
... result["gen_len"] = np.mean(prediction_lens)
... result = {k: round(v, 4) for k, v in result.items()}
... return resultدالة compute_metrics الخاصة بك جاهزة الآن، وستعود إليها عند إعداد التدريب.
تدريب
إذا لم تكن على دراية بتدريب نموذج باستخدام Trainer، فاطّلع على الدرس الأساسي هنا!
أنت مستعد الآن لبدء تدريب نموذجك! حمّل T5 باستخدام AutoModelForSeq2SeqLM:
>>> from transformers import AutoModelForSeq2SeqLM, Seq2SeqTrainingArguments, Seq2SeqTrainer
>>> model = AutoModelForSeq2SeqLM.from_pretrained(checkpoint)في هذه المرحلة، تبقى ثلاث خطوات فقط:
- حدّد معاملات التدريب الفائقة الخاصة بك في Seq2SeqTrainingArguments. المعامل الوحيد المطلوب هو
output_dirالذي يحدد مكان حفظ النموذج. ستقوم بدفع هذا النموذج إلى Hub من خلال تعيينpush_to_hub=True(يتعين عليك تسجيل الدخول إلى Hugging Face لرفع النموذج). في نهاية كل حقبة، سيقوم Trainer بتقييم مقياس SacreBLEU وحفظ نقطة الفحص للتدريب. - مرّر حُجج التدريب إلى Seq2SeqTrainer مع النموذج، ومجموعة البيانات، ومُرمِّز الرموز، ومُجمِّع البيانات، ودالة
compute_metrics. - استدعِ train() لضبط نموذجك.
>>> training_args = Seq2SeqTrainingArguments(
... output_dir="my_awesome_opus_books_model",
... eval_strategy="epoch",
... learning_rate=2e-5,
... per_device_train_batch_size=16,
... per_device_eval_batch_size=16,
... weight_decay=0.01,
... save_total_limit=3,
... num_train_epochs=2,
... predict_with_generate=True,
... fp16=True, #change to bf16=True for XPU
... push_to_hub=True,
... )
>>> trainer = Seq2SeqTrainer(
... model=model,
... args=training_args,
... train_dataset=tokenized_books["train"],
... eval_dataset=tokenized_books["test"],
... processing_class=tokenizer,
... data_collator=data_collator,
... compute_metrics=compute_metrics,
... )
>>> trainer.train()بمجرد اكتمال التدريب، شارك نموذجك على Hub باستخدام طريقة push_to_hub() ليتمكن الجميع من استخدام نموذجك:
>>> trainer.push_to_hub()لمثال أكثر تفصيلاً حول كيفية ضبط نموذج للترجمة، راجع دفتر PyTorch المقابل.
الاستدلال
رائع، والآن بعد أن قمت بضبط نموذج، يمكنك استخدامه للاستدلال!
فكّر في بعض النصوص التي ترغب في ترجمتها إلى لغة أخرى. بالنسبة إلى T5، تحتاج إلى إضافة بادئة إلى مدخلاتك اعتماداً على المهمة التي تعمل عليها. فبالنسبة إلى الترجمة من الإنجليزية إلى الفرنسية، يجب أن تضيف البادئة إلى مدخلاتك كما هو موضح أدناه:
>>> text = "translate English to French: Legumes share resources with nitrogen-fixing bacteria."قم بتجزئة النص وإرجاع input_ids كمُتجهات PyTorch:
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("username/my_awesome_opus_books_model")
>>> inputs = tokenizer(text, return_tensors="pt").input_idsاستخدم طريقة generate() لإنشاء الترجمة. لمزيد من التفاصيل حول استراتيجيات توليد النص المختلفة ومعلمات التحكم في التوليد، راجع واجهة برمجة تطبيقات Text Generation.
>>> from transformers import AutoModelForSeq2SeqLM
>>> model = AutoModelForSeq2SeqLM.from_pretrained("username/my_awesome_opus_books_model")
>>> outputs = model.generate(inputs, max_new_tokens=40, do_sample=True, top_k=30, top_p=0.95)فكّ ترميز معرّفات الرموز المولّدة إلى نص:
>>> tokenizer.decode(outputs[0], skip_special_tokens=True)
'Les lignées partagent des ressources avec des bactéries enfixant l'azote.'