Transformers documentation
Bản dịch
Bản dịch
Việc dịch chuyển đổi một chuỗi văn bản từ ngôn ngữ này sang ngôn ngữ khác. Đây là một trong nhiều tác vụ có thể được xây dựng dưới dạng bài toán sequence-to-sequence, một khung làm việc mạnh mẽ để tạo ra một đầu ra từ một đầu vào, chẳng hạn như dịch hoặc tóm tắt. Các hệ thống dịch thường được sử dụng để dịch giữa các văn bản thuộc các ngôn ngữ khác nhau, nhưng cũng có thể được sử dụng cho giọng nói hoặc một số kết hợp ở giữa như text-to-speech hoặc speech-to-text.
Hướng dẫn này sẽ cho bạn thấy cách:
- Finetune T5 trên tập con tiếng Anh - tiếng Pháp của bộ dữ liệu OPUS Books để dịch văn bản tiếng Anh sang tiếng Pháp.
- Sử dụng mô hình đã tinh chỉnh của bạn để suy luận.
Để xem tất cả các kiến trúc và checkpoint tương thích với tác vụ này, chúng tôi khuyến nghị bạn kiểm tra trang tác vụ.
Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt tất cả các thư viện cần thiết:
pip install transformers datasets evaluate sacrebleu
Chúng tôi khuyến khích bạn đăng nhập vào tài khoản Hugging Face của mình để có thể tải lên và chia sẻ mô hình của bạn với cộng đồng. Khi được yêu cầu, hãy nhập token của bạn để đăng nhập:
>>> from huggingface_hub import notebook_login
>>> notebook_login()Tải bộ dữ liệu OPUS Books
Bắt đầu bằng cách tải tập con tiếng Anh - tiếng Pháp của bộ dữ liệu OPUS Books từ thư viện 🤗 Datasets:
>>> from datasets import load_dataset
>>> books = load_dataset("Helsinki-NLP/opus_books", "en-fr")Chia bộ dữ liệu thành tập huấn luyện và tập kiểm tra bằng phương thức train_test_split:
>>> books = books["train"].train_test_split(test_size=0.2)Sau đó, hãy xem một ví dụ:
>>> 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: bản dịch tiếng Anh và tiếng Pháp của văn bản.
Tiền xử lý
Bước tiếp theo là nạp một T5 tokenizer để xử lý các cặp ngôn ngữ Anh - Pháp:
>>> from transformers import AutoTokenizer
>>> checkpoint = "google-t5/t5-small"
>>> tokenizer = AutoTokenizer.from_pretrained(checkpoint)Hàm tiền xử lý mà bạn muốn tạo cần phải:
- Thêm prompt vào đầu đầu vào để T5 biết đây là một tác vụ dịch. Một số mô hình có khả năng thực hiện nhiều tác vụ NLP khác nhau yêu cầu prompt cho từng tác vụ cụ thể.
- Đặt ngôn ngữ đích (tiếng Pháp) trong tham số
text_targetđể đảm bảo tokenizer xử lý văn bản đích chính xác. Nếu bạn không đặttext_target, tokenizer sẽ xử lý văn bản đích như tiếng Anh. - Cắt ngắn các chuỗi để không dài hơn độ dài tối đa được đặt bởi tham số
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Để áp dụng hàm tiền xử lý lên toàn bộ bộ dữ liệu, hãy sử dụng phương thức map của 🤗 Datasets. Bạn có thể tăng tốc hàm map bằng cách đặt batched=True để xử lý nhiều phần tử của bộ dữ liệu cùng lúc:
>>> tokenized_books = books.map(preprocess_function, batched=True)Bây giờ hãy tạo một batch các ví dụ bằng cách sử dụng DataCollatorForSeq2Seq. Việc đệm động các câu đến độ dài dài nhất trong một batch trong quá trình collation sẽ hiệu quả hơn so với việc đệm toàn bộ dataset đến độ dài tối đa.
>>> from transformers import DataCollatorForSeq2Seq
>>> data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=checkpoint)Đánh giá
Việc đưa một chỉ số vào trong quá trình huấn luyện thường hữu ích để đánh giá hiệu suất của mô hình. Bạn có thể nhanh chóng tải một phương pháp đánh giá bằng thư viện 🤗 Evaluate. Đối với tác vụ này, hãy tải chỉ số SacreBLEU (xem quick tour của 🤗 Evaluate để tìm hiểu thêm về cách tải và tính toán một chỉ số):
>>> import evaluate
>>> metric = evaluate.load("sacrebleu")Sau đó, tạo một hàm truyền các dự đoán và nhãn của bạn vào compute để tính điểm 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 resultHàm compute_metrics của bạn đã sẵn sàng, và bạn sẽ quay lại với nó khi thiết lập quá trình huấn luyện.
Huấn luyện
Nếu bạn chưa quen với việc tinh chỉnh mô hình bằng Trainer, hãy xem hướng dẫn cơ bản tại đây!
Bạn đã sẵn sàng để bắt đầu huấn luyện mô hình của mình! Tải T5 bằng AutoModelForSeq2SeqLM:
>>> from transformers import AutoModelForSeq2SeqLM, Seq2SeqTrainingArguments, Seq2SeqTrainer
>>> model = AutoModelForSeq2SeqLM.from_pretrained(checkpoint)Tới bước này, chỉ còn ba bước nữa:
- Định nghĩa các siêu tham số huấn luyện của bạn trong Seq2SeqTrainingArguments. Tham số bắt buộc duy nhất là
output_dir, chỉ định nơi lưu trữ mô hình của bạn. Bạn sẽ đẩy mô hình này lên Hub bằng cách đặtpush_to_hub=True(bạn cần đăng nhập vào Hugging Face để tải lên mô hình). Vào cuối mỗi epoch, Trainer sẽ đánh giá chỉ số SacreBLEU và lưu checkpoint huấn luyện. - Truyền các đối số huấn luyện vào Seq2SeqTrainer cùng với model, dataset, tokenizer, data collator và hàm
compute_metrics. - Gọi train() để tinh chỉnh mô hình của bạn.
>>> 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()Khi quá trình huấn luyện hoàn tất, hãy chia sẻ mô hình của bạn lên Hub bằng phương thức push_to_hub() để mọi người có thể sử dụng mô hình của bạn:
>>> trainer.push_to_hub()Để xem một ví dụ chi tiết hơn về cách tinh chỉnh mô hình cho dịch thuật, hãy xem notebook PyTorch tương ứng.
Suy luận
Tuyệt, giờ đây bạn đã tinh chỉnh một mô hình, bạn có thể sử dụng nó để suy luận!
Hãy nghĩ ra một đoạn văn bản mà bạn muốn dịch sang ngôn ngữ khác. Đối với T5, bạn cần thêm tiền tố cho đầu vào tùy thuộc vào tác vụ bạn đang thực hiện. Đối với việc dịch từ tiếng Anh sang tiếng Pháp, bạn nên thêm tiền tố cho đầu vào như minh họa bên dưới:
>>> text = "translate English to French: Legumes share resources with nitrogen-fixing bacteria."Chia token văn bản và trả về input_ids dưới dạng tensor PyTorch:
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("username/my_awesome_opus_books_model")
>>> inputs = tokenizer(text, return_tensors="pt").input_idsSử dụng phương thức generate() để tạo bản dịch. Để biết thêm chi tiết về các chiến lược tạo văn bản khác nhau và các tham số để kiểm soát quá trình tạo, hãy xem API 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)Giải mã các id token đã tạo thành văn bản:
>>> tokenizer.decode(outputs[0], skip_special_tokens=True)
'Les lignées partagent des ressources avec des bactéries enfixant l'azote.'