Xây dựng hệ thống gán nhãn chuỗi dựa trên Transformer bằng Thinc: Hướng dẫn chi tiết từ cơ bản đến nâng cao

Tại sao nên chọn Thinc cho bài toán gán nhãn chuỗi?

Thinc cung cấp một giao diện lập trình hàm độc đáo, giúp việc xây dựng mô hình trở nên trực quan và linh hoạt hơn. Thư viện này tích hợp mượt mà với Hugging Face Transformers, cho phép bạn tận dụng sức mạnh của các mô hình được huấn luyện sẵn. Với các tác vụ phức tạp như gán nhãn chuỗi, khả năng tổ hợp nhiều lớp và kiểm tra kiểu dữ liệu là một lợi thế lớn.

Cài đặt môi trường và cấu trúc dự án

Để bắt đầu, bạn cần cài đặt các thư viện cần thiết:

pip install thinc ml_datasets typer tqdm transformers torch

Mã nguồn chính cho hệ thống gán nhãn chuỗi được đặt tại examples/transformers_tagger.py, bao gồm toàn bộ quy trình xử lý dữ liệu, định nghĩa mô hình, huấn luyện và đánh giá.

Các bước xây dựng mô hình Transformer

1. Thiết lập tệp cấu hình

Thinc sử dụng tệp cấu hình để quản lý tham số và thiết lập huấn luyện:

[model]
@layers = "TransformersTagger.v1"
starter = "bert-base-multilingual-cased"

[optimizer]
@optimizers = "RAdam.v1"
weight_decay = 1e-8

[optimizer.learn_rate]
@schedules = "warmup_linear.v1"
initial_rate = 0.01
warmup_steps = 3000
total_steps = 6000

[training]
batch_size = 128
words_per_subbatch = 2000
n_epoch = 10

2. Thiết kế kiến trúc mô hình

Việc xây dựng mô hình trong Thinc dựa trên cách tiếp cận hàm, sử dụng hàm chain để kết hợp các lớp:

@thinc.registry.layers("TransformersTagger.v1")
def TransformersTagger(
    starter: str, n_tags: int = 17
) -> Model[List[List[str]], List[Floats2d]]:
    return chain(
        TransformersTokenizer(starter),
        Transformer(starter),
        with_array(Softmax(nO=n_tags)),
    )

Mô hình gồm ba thành phần chính: bộ tách từ (TransformersTokenizer), mô hình Transformer và lớp đầu ra Softmax.

3. Tiền xử lý dữ liệu

Thinc cung cấp các công cụ linh hoạt để xử lý dữ liệu văn bản trong tác vụ gán nhãn chuỗi:

def convert_transformer_inputs(model, tokens: TokensPlus, is_train):
    kwargs = {
        "input_ids": tokens.input_ids,
        "attention_mask": tokens.attention_mask,
        "token_type_ids": tokens.token_type_ids,
    }
    return ArgsKwargs(args=(), kwargs=kwargs), lambda dX: []

Hàm này chuyển đổi dữ liệu đầu vào thành định dạng phù hợp với mô hình Transformer.

4. Quy trình huấn luyện

Thinc hỗ trợ quy trình huấn luyện hiệu quả với khả năng xử lý các batch lớn:

for epoch in range(n_epoch):
    batches = model.ops.multibatch(batch_size, train_X, train_Y, shuffle=True)
    for outer_batch in tqdm.tqdm(batches, leave=False):
        for batch in minibatch_by_words(outer_batch, words_per_subbatch):
            inputs, truths = zip(*batch)
            guesses, backprop = model(inputs, is_train=True)
            backprop(calculate_loss.get_grad(guesses, truths))
        model.finish_update(optimizer)
        optimizer.step_schedules()

Chiến lược này giúp tối ưu hóa việc sử dụng bộ nhớ GPU và tăng tốc độ huấn luyện.

Xử lý lỗi và kiểm thử

Hệ thống kiểm tra kiểu dữ liệu của Thinc giúp phát hiện lỗi sớm trong quá trình phát triển. Khi có sự không khớp kiểu giữa các lớp mô hình, hệ thống sẽ cảnh báo ngay lập tức, giúp bạn sửa lỗi nhanh chóng và nâng cao chất lượng mã nguồn.

Đánh giá và triển khai mô hình

Sau khi huấn luyện xong, bạn có thể đánh giá mô hình bằng hàm sau:

def evaluate_sequences(
    model, Xs: List[Floats2d], Ys: List[Floats2d], batch_size: int
) -> float:
    correct = 0.0
    total = 0.0
    for X, Y in model.ops.multibatch(batch_size, Xs, Ys):
        Yh = model.predict(X)
        for yh, y in zip(Yh, Y):
            correct += (y.argmax(axis=1) == yh.argmax(axis=1)).sum()
            total += y.shape[0]
    return float(correct / total)

Khi hài lòng với hiệu suất mô hình, bạn có thể lưu lại để triển khai:

if out_dir:
    model.to_disk(out_dir / f"{epoch}.bin")

Thẻ: thinc Transformer sequence-tagging deep-learning NLP

Đăng vào ngày 21 tháng 10 lúc 08:04