Đọc ngày 2026-07-25

Kế hoạch hôm nay

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_idsattention_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_sizeper_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_idsattention_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.
    • Dataset imbalance khiến accuracy chưa đủ; cần F1, confusion matrix và per-class analysis.
    • Error analysis bằng loss cao/thấp giúp phát hiện nhãn sai, dữ liệu mơ hồ và shortcut.
    • Sau training, model có thể được lưu/chia sẻ và dùng lại qua Hugging Face pipeline.

Điều chưa rõ

  • [CLS] representation có luôn là lựa chọn tốt nhất cho mọi sequence classification task không, hay đôi khi mean pooling/max pooling tốt hơn?
  • Khi dataset bị imbalance, weighted F1 trong chapter có thể che lấp performance kém ở class hiếm không? Có nên xem thêm macro F1 và per-class F1 không?
  • Khi nào nên ưu tiên feature extraction thay vì fine-tuning nếu có GPU nhưng dữ liệu ít?
  • Error analysis bằng loss cao/thấp nên làm bao nhiêu vòng trước khi kết luận cần model lớn hơn?
  • Nếu model phát hiện nhiều label gây tranh cãi, quy trình sửa label nên làm thủ công, dùng nhiều annotator, hay tạo guideline nhãn rõ hơn?
  • Trainer che bớt training loop; cần hiểu sâu hơn các phần bên dưới như optimizer, scheduler, gradient accumulation và mixed precision.

Việc cần làm

  • Đọc trang 58-77
  • Tóm tắt chapter 2 bằng 5-7 dòng
  • Cập nhật NLP Transformers - Chapter 02 - Text Classification
  • Review lại Chapter 02 vào 2026-07-27, tập trung vào confusion matrix, F1 và error analysis.
  • Khi có thời gian, chạy demo nhỏ với Trainer trên subset emotion dataset để kiểm chứng workflow.