Dịch Văn Bản Tự Động Sử Dụng Mô Hình T5

Dịch văn bản (translation) chuyển đổi một chuỗi văn bản từ một ngôn ngữ này sang ngôn ngữ khác. Đây là một trong nhiều nhiệm vụ mà bạn có thể định hình như là một vấn đề sequence-to-sequence (chuỗi đầu vào sang chuỗi đầu ra), một framework mạnh mẽ cho việc trả về output từ input, như dịch thuật hay tóm tắt. Hệ thống dịch văn bản tự động thường được sử dụng để dịch giữa các văn bản 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ố sự kết hợp giữa chúng như văn bản thành giọng nói hoặc giọng nói thành văn bản.

Hướng dẫn này sẽ hướng dẫn bạn cách:

  1. Tinh chỉnh (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.
  2. Sử dụng mô hình đã tinh chỉnh cho suy diễn (inference).

Nhiệm vụ được mô phỏng trong hướng dẫn này được hỗ trợ bởi các kiến trúc mô hình sau:
BART, BigBird-Pegasus, Blenderbot, BlenderbotSmall, Encoder decoder, FairSeq Machine-Translation, GPTSAN-japanese, LED, LongT5, M2M100, Marian, mBART, MT5, MVP, NLLB, NLLB-MOE, Pegasus, PEGASUS-X, PLBart, ProphetNet, SwitchTransformers, T5, XLM-ProphetNet

Trước khi bạn 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:

Chuẩn bị cho dịch văn bản

pip install transformers datasets evaluate sacrebleu

Chúng tôi khuyến nghị bạn đăng nhập vào tài khoản Hugging Face của mình để bạn có thể tải lên và chia sẻ mô hình của bạn với cộng đồng. 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 của 🤗:

from datasets import load_dataset

books = load_dataset("opus_books", "en-fr")

Chia bộ dữ liệu thành tập train và tập test với phương thức train_test_split:

books = books["train"].train_test_split(test_size=0.2)

Sau đó, hãy xem một sample:

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: một bản dịch Tiếng Anh và Tiếng Pháp của văn bản.

Tiền xử lý (Preprocess)

Bước tiếp theo là tải một tokenizer T5 để xử lý cặp ngôn ngữ Tiếng Anh – Tiếng Pháp:

from transformers import AutoTokenizer

checkpoint = "t5-small"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

Hàm tiền xử lý mà bạn muốn tạo cần phải:

  1. Thêm tiền tố vào đầu input để T5 biết đây là một nhiệm vụ dịch thuật. Một số mô hình có khả năng thực hiện nhiều nhiệm vụ NLP đòi hỏi phải nhắc nhở cho các nhiệm vụ cụ thể.
  2. Tokenize input (Tiếng Anh) và target (Tiếng Pháp) riêng biệt vì bạn không thể tokenize văn bản Tiếng Pháp với một tokenizer được tiền huấn luyện trên từ vựng Tiếng Anh.
  3. Cắt ngắn 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ý trên toàn bộ bộ dữ liệu, sử dụng phương thức map của Datasets 🤗. Bạn có thể tăng tốc độ của 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 một lúc:

tokenized_books = books.map(preprocess_function, batched=True)

Bây giờ, tạo một batch các ví dụ sử dụng DataCollatorForSeq2Seq. Việc đệm động các câu cho độ dài dài nhất trong một batch khi tổng hợp là hiệu quả hơn so với việc đệm toàn bộ bộ dữ liệu đến độ dài tối đa.

from transformers import DataCollatorForSeq2Seq

data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=

checkpoint)

Đánh giá (Evaluate)

Bao gồm một metric trong quá trình huấn luyện thường rất hữu ích để đánh giá hiệu suất của mô hình của bạn. Bạn có thể nhanh chóng tải một phương pháp đánh giá với thư viện 🤗 Evaluate. Đối với nhiệm vụ này, tải metric SacreBLEU (xem hướng dẫn nhanh của 🤗 Evaluate để tìm hiểu thêm về cách tải và tính toán metric):

import evaluate

metric = evaluate.load("sacrebleu")

Sau đó, tạo một hàm mà truyền 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 result

Hàm compute_metrics của bạn đã sẵn sàng để sử dụng, và bạn sẽ quay lại nó khi bạn thiết lập huấn luyện của mình.

Huấn luyện (Train)

Nếu bạn chưa quen với việc tinh chỉnh một mô hình với Trainer, hãy xem hướng dẫn cơ bản ở đây!

Bạn đã sẵn sàng để bắt đầu huấn luyện mô hình của mình bây giờ! Tải T5 với AutoModelForSeq2SeqLM:

from transformers import AutoModelForSeq2SeqLM, Seq2SeqTrainingArguments, Seq2SeqTrainer

model = AutoModelForSeq2SeqLM.from_pretrained(checkpoint)

Tại thời điểm này, chỉ còn ba bước:

  1. Định nghĩa tham số huấn luyện của bạn trong Seq2SeqTrainingArguments. Tham số duy nhất cần thiết là output_dir, chỉ định nơi lưu mô hình của bạn. Bạn sẽ đẩy mô hình này lên Hub bằng cách đặt push_to_hub=True (bạn cần phải đăng nhập vào Hugging Face Hub để làm được điều này).
  2. Truyền Seq2SeqTrainingArguments và mô hình của bạn vào Seq2SeqTrainer. Truyền data_collator và compute_metrics từ trước để hỗ trợ trong quá trình huấn luyện.
  3. Gọi phương thức train để bắt đầu huấn luyện!
args = Seq2SeqTrainingArguments(
    "test-translation",
    evaluation_strategy = "epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=batch_size,
    per_device_eval_batch_size=batch_size,
    weight_decay=0.01,
    save_total_limit=3,
    num_train_epochs=1,
    push_to_hub=False,
    predict_with_generate=True,
)

trainer = Seq2SeqTrainer(
    model,
    args,
    train_dataset=tokenized_books["train"],
    eval_dataset=tokenized_books["test"],
    data_collator=data_collator,
    tokenizer=tokenizer,
    compute_metrics=compute_metrics
)

trainer.train()

Nếu bạn đã thiết lập push_to_hub, bạn có thể dễ dàng tải mô hình của mình từ Hub để dùng cho suy diễn sau đây:

from transformers import AutoModelForSeq2SeqLM

model = AutoModelForSeq2SeqLM.from_pretrained("your-model-name")

Suy diễn (Inference)

Sau khi huấn luyện, bạn có thể sử dụng mô hình của mình để dịch từ Tiếng Anh sang Tiếng Pháp! Để làm điều này, hãy xác định một hàm generate_translation:

def generate_translation(model, tokenizer, text, max_length=128):
    model_inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True, max_length=max_length)
    generated_ids = model.generate(**model_inputs, forced_bos_token_id=tokenizer.get_lang_id("fr"))
    translation = tokenizer.decode(generated_ids[0], skip_special_tokens=True)
    return translation

Cuối cùng, bạn có thể dùng mô hình đã tinh chỉnh để dịch một chuỗi Tiếng Anh:

generate_translation(model, tokenizer, "This is an example sentence.")

‘This is an example sentence.’ sẽ được dịch thành Tiếng Pháp! Chúc mừng bạn đã tạo thành công một hệ thống dịch văn bản tự động sử dụng T5!