Trọng tâm: Feature extraction, fine-tuning và viết lại workflow.
Thời gian: 40 phút đọc, 15 phút viết lại.
Mục tiêu cần hiểu
Phân biệt dùng pretrained Transformer như feature extractor và fine-tuning toàn bộ model.
Hiểu vai trò của Trainer, metric, validation set và training arguments trong workflow fine-tuning.
Biết cách đọc error analysis để phát hiện lỗi dữ liệu, nhãn hoặc pattern model học sai.
Tự viết lại được quy trình huấn luyện text classifier từ dữ liệu thô đến model lưu lại.
Câu hỏi dẫn đường
Feature extraction khác fine-tuning ở điểm nào?
Vì sao fine-tuning thường tốt hơn nhưng tốn tài nguyên hơn?
Nếu gặp bài toán sentiment mới, tôi sẽ bắt đầu từ đâu?
Ghi chú trong khi đọc
Phần hôm nay nối tiếp sau tokenization: khi text đã thành input_ids và attention_mask, có hai hướng chính để train text classifier bằng pretrained Transformer.
Hướng 1 là dùng Transformer như feature extractor:
Load DistilBERT bằng AutoModel.
Đóng băng hoặc không cập nhật phần pretrained body.
Đưa input đã tokenize qua model để lấy last_hidden_state.
Lấy hidden state của token [CLS] làm vector đại diện cho cả sequence.
Dùng vector này làm feature cho classifier truyền thống, ví dụ logistic regression.
Hidden state có shape dạng [batch_size, n_tokens, hidden_dim]. Với DistilBERT, hidden_dim = 768, nghĩa là mỗi token được biểu diễn bằng vector 768 chiều.
Với sequence classification, thường lấy last_hidden_state[:, 0], tức vector ứng với [CLS]. Ý tưởng là token này đóng vai trò gom representation cấp câu/sequence để đưa vào classifier.
Feature extraction nhanh và ít tốn tài nguyên hơn fine-tuning. Nó phù hợp khi không có GPU, cần baseline nhanh, hoặc muốn tận dụng Transformer như một bộ tạo đặc trưng.
Nhược điểm của feature extraction là pretrained representation không được cập nhật cho task cụ thể. Model chỉ học classifier phía sau, nên nếu hidden states chưa tách tốt các emotion class thì performance bị giới hạn.
Chapter dùng UMAP để giảm hidden states từ 768 chiều xuống 2D nhằm nhìn sơ bộ embedding space. Đây chỉ là projection để trực quan hóa, không phải bằng chứng tuyệt đối về khả năng tách class trong không gian gốc.
Visualization cho thấy sadness, anger và fear dễ chồng lấn; joy và love gần nhau; surprise phân tán hơn. Điều này giải thích tại sao model hay nhầm các class cảm xúc có sắc thái gần nhau.
Logistic regression trên hidden states đạt accuracy tốt hơn baseline majority class. Baseline DummyClassifier(strategy="most_frequent") rất quan trọng vì dataset bị imbalance; nếu không có baseline, mình khó biết kết quả classifier có thật sự tốt hay chỉ hơn random một chút.
Confusion matrix giúp nhìn lỗi theo từng class. Accuracy chỉ nói tổng thể đúng bao nhiêu, còn confusion matrix nói nhãn nào bị nhầm sang nhãn nào.
Hướng 2 là fine-tuning:
Load model bằng AutoModelForSequenceClassification.
Thêm classification head trên pretrained DistilBERT.
Train toàn bộ model end-to-end để cả hidden states và classification head cùng thích nghi với task emotion classification.
Khi load AutoModelForSequenceClassification, classification head mới thường được khởi tạo random. Cảnh báo này là bình thường vì pretrained model chưa có head đúng cho task 6 nhãn của mình.
Fine-tuning dùng Trainer API để gom training loop, evaluation, logging, dataset, tokenizer và metric vào một chỗ.
TrainingArguments quản lý các hyperparameters chính:
output_dir: nơi lưu artifact/checkpoint.
num_train_epochs: số epoch.
learning_rate: tốc độ cập nhật weights.
per_device_train_batch_size và per_device_eval_batch_size: batch size train/eval.
weight_decay: regularization.
evaluation_strategy: tần suất đánh giá.
push_to_hub: có đẩy model lên Hugging Face Hub không.
Metric trong chapter gồm accuracy và weighted F1. Vì dataset imbalance, F1 quan trọng hơn accuracy đơn thuần; weighted F1 phản ánh precision/recall có xét tới phân phối class.
Fine-tuning cải thiện mạnh so với feature extraction vì representation bên trong DistilBERT được update để giảm loss của emotion classification, không chỉ giữ nguyên như feature extractor.
Sau fine-tuning, cần làm error analysis:
Tính loss cho từng sample validation.
Sort loss giảm dần để xem các case model sai nặng hoặc không chắc.
Sort loss tăng dần để xem các case model quá tự tin.
Loss cao có thể chỉ ra nhãn sai, text mơ hồ, dữ liệu nhiễu, hoặc class cần định nghĩa rõ hơn.
Loss thấp cũng cần xem vì deep learning model có thể học shortcut. Nếu model quá tự tin vì một từ khóa hời hợt, khi gặp dữ liệu thật khác phân phối nó có thể fail.
Trong ví dụ của chapter, nhiều sample joy có vẻ bị gán nhãn gây tranh cãi, và model rất tự tin với class sadness.
Lưu và chia sẻ model là bước nối từ training sang sử dụng thực tế. Có thể dùng trainer.push_to_hub() rồi gọi lại model bằng pipeline("text-classification", model=model_id).
Tổng kết chapter: muốn xây text classifier tốt thì không chỉ chọn model mạnh; phải có workflow gồm inspect dữ liệu, tokenization đúng, baseline, fine-tuning, evaluation, error analysis và lưu/deploy model.
Viết lại bằng lời của tôi
Sau khi có dữ liệu đã tokenize, mình có hai cách tận dụng pretrained Transformer. Cách nhẹ hơn là coi DistilBERT như một bộ biến text thành vector. Mình lấy hidden state, thường là vector của [CLS], rồi train một classifier nhỏ bên ngoài. Cách này giống dùng Transformer làm máy trích đặc trưng: nhanh, ít tốn tài nguyên, nhưng không sửa được representation bên trong model.
Cách mạnh hơn là fine-tuning. Thay vì giữ nguyên DistilBERT, mình thêm classification head và train toàn bộ model cho task cảm xúc. Vì loss từ task emotion classification chảy ngược vào cả encoder, representation dần được uốn lại để tách các nhãn tốt hơn. Đó là lý do fine-tuning thường vượt feature extraction.
Nhưng fine-tuning không có nghĩa là bỏ qua các bước kiểm tra. Mình vẫn cần baseline để biết kết quả có ý nghĩa không, cần metric phù hợp vì nhãn bị lệch, cần confusion matrix để biết model nhầm class nào, và cần error analysis để xem lỗi đến từ model hay từ dữ liệu.
Trainer trong Hugging Face là lớp đóng gói training workflow. Nó không thay thế việc hiểu training, nhưng giúp giảm boilerplate: truyền model, args, dataset, tokenizer, metric vào và để Trainer xử lý loop train/eval.
Điều quan trọng nhất mình rút ra: evaluation không kết thúc ở một con số. Nếu chỉ nhìn F1/accuracy, mình biết model tốt hơn hay kém hơn; nhưng khi nhìn confusion matrix và sample loss cao/thấp, mình biết vì sao model sai và nên sửa dữ liệu, metric, sampling hay model.
Tóm tắt chapter 2 bằng 5-7 dòng:
Text classification bắt đầu từ hiểu dataset, label, class distribution và độ dài văn bản.
Tokenization biến raw text thành input_ids và attention_mask để Transformer xử lý.
Feature extraction dùng pretrained Transformer để tạo hidden states cố định rồi train classifier ngoài.
Fine-tuning train toàn bộ model cùng classification head nên thường cho performance tốt hơn.