01. Giới thiệu và mô tả bài toán

Bài toán, Input / Output, Mục tiêu

Bài toán

Đây là bài toán phân loại văn bản (multiclass classification): dự đoán rating từ 1 đến 5 cho review thời trang.

  • Input: title (có thể rỗng) + review_text.
  • Output: 1 trong 5 nhãn rating (1, 2, 3, 4, 5).
  • Mục tiêu: tối ưu chất lượng macro-F1 trong bối cảnh mất cân bằng lớp.

Mục tiêu thực nghiệm

  • So sánh 4 backbone: BiLSTM, BiLSTM+Attention, DistilBERT, BERT-base.
  • Đánh giá 3 chế độ fine-tune cho Transformer: freeze, full, llrd.
  • Đánh giá 2 chế độ xử lý imbalance: weighted_ce (train gốc + weighted cross-entropy) và undersample_ce (train undersampled + cross-entropy thường).
  • Kiểm tra trade-off giữa chất lượng và latency/size để dễ triển khai thực tế.
  • Mở rộng với robustness, error analysis, XAI và ensemble.

02. EDA

Phân bố dữ liệu và minh họa mẫu

Sample compact

Raw rating and review word-count distribution
Phân bố rating và số từ review theo từng rating trên dữ liệu gốc.
Raw title and review lengths
Độ dài title/review trước preprocessing.
Missing values and review-title word-count gap
Tỉ lệ missing và khoảng cách số từ giữa title và review.

03. Tiền xử lý / Feature preparation

Pipeline tiền xử lý dữ liệu cho huấn luyện

Các bước tiền xử lý đã áp dụng

  1. Drop missing review_text/rating, fill missing title.
  2. Deduplicate theo title + review_text + rating.
  3. Normalize whitespace cho title và review_text.
  4. Bỏ review quá ngắn (<3 từ).
  5. Tạo full_text = title [SEP] review_text và map label 0-4.

Số liệu before/after theo pipeline

Chỉ số Giá trị
Raw rows (ban đầu)23,486
Sau drop missing review_text/rating 22,641 ↓845
Sau deduplicate title + review_text + rating 22,636 ↓5
Sau lọc review < 3 từ - kết quả cuối 22,628 ↓8
Tỉ lệ giữ lại cuối cùng so với raw96.35%

So sánh review word count before/after

Thống kê số từ review Before After
Mean58.0360.22
Median5759
P95101101
Rating distribution before and after prepare
So sánh phân bố rating trước/sau prepare data.
Review word count before and after prepare
So sánh review word count before/after preprocessing.

04. Data Split / Scenario Split / Undersampling

Train-Val-Test, phân bố lớp và dataloader

Data split

  • Tỷ lệ split thực tế: 70/15/15 (stratified by label).
  • Train: 15,839 | Val: 3,394 | Test: 3,395.
  • Tổng sau clean: 22,628 mẫu.

Noisy scenario

  • Tạo noisy từ test.csv bằng create_noisy_test_set(full_text).
  • Cấu hình: typo 0.03 | case 0.08 | punctuation 0.03 | drop token 0.03.
  • Ví dụ: "Amazing dress" có thể thành "aMaizng dress!..." sau pipeline nhiễu.
  • Số record: 3,395 (clean) -> 3,395 (noisy).

Undersampling

  • Dùng random_undersample theo cột label trên train set.
  • Nguyên tắc: lấy về bằng lớp nhỏ nhất (min class = 575).
  • Kết quả: 15,839 -> 2,875 mẫu (5 lớp, mỗi lớp 575).
  • Thiết lập train tương ứng: với tập undersampled thì dùng cross-entropy thường (không class weights).

Data loader

  • RNNDataset: build/load vocab trước, rồi encode token ids -> DataLoader(batch=64).
  • TransformerDataset: dùng HF tokenizer (DistilBERT/BERT) để tokenize -> DataLoader(batch=16).
  • Input model đều dùng full_text + label sau preprocessing.

Phân bố class theo split

Class distribution before and after undersampling
So sánh phân bố class giữa Original Train, Undersampled Train, Validation và Test.

05. Phương pháp / Backbone / Thuật toán

Từ pipeline đến 4 backbone chính

Nhóm RNN

  • BiLSTM và BiLSTM + Attention.
  • Dùng Vocabulary riêng từng checkpoint.
  • Batch size 64, max length 256.

Nhóm Transformer

  • DistilBERT và BERT-base.
  • Fine-tune modes: freeze, full, llrd.
  • Batch size 16, warmup + linear decay scheduler.

Đánh giá

  • Metric: accuracy, precision, recall, macro-F1, weighted-F1, MAE.
  • Efficiency: num params, model size, inference ms/sample.
  • Confusion matrix và error analysis bổ sung.

06. Training / Optimization process

Kết quả train BERT (LLRD + weighted_ce) và cấu hình

W&B example for BERT llrd weighted configuration
W&B example: kết quả train nhiều config, đang chọn bert_llrd_weighted để minh họa.

Theo dõi đầy đủ các run (bert_freeze/full/llrd + weighted/undersample), trong đó weighted_ce = train gốc + weighted CE và undersample_ce = undersampled train + CE thường, tại: WandB project dashboard.

Tập hyperparameter đã thử

Hyperparameter Giá trị đã thử
chiến lược fine-tuneBERT/DistilBERT: freeze, full, llrd; BiLSTM: không dùng fine-tune mode
imbalance_strategyweighted_ce (train gốc + weighted CE), undersample_ce (undersampled train + CE thường)
learning_rate (theo họ model)BiLSTM: 5e-4, 1e-3; DistilBERT: 1e-5, 2e-5, 3e-5; BERT: 2e-5, 3e-5
batch_size (theo họ model)BiLSTM: 32, 64; DistilBERT: 16, 32; BERT: 8, 16
epochs (theo họ model)BiLSTM: 15, 20; DistilBERT: 4, 5; BERT: 4, 5
LLRD decaydecay_factor = 0.85; layer_lr = base_lr x (0.85^k), k tăng dần từ layer trên xuống layer dưới; embeddings/pooler dùng mức LR thấp hơn
optimizerAdamW
weight_decay0.01
warmup_ratio (Transformer)0.1, sau đó dùng linear decay scheduler
max_length256 tokens (RNN/Transformer)
grad_clipRNN: 5.0; Transformer: 1.0
early_stoppingpatience = 3, metric = val macro-F1
seed42

07. So sánh toàn bộ cấu hình

Bảng filter + sort, metric và gallery confusion matrix

Càng cao càng tốt Càng thấp càng tốt Top 1 Top 2 Top 3

Top model theo Macro-F1

Confusion matrix gallery

Ensemble alpha search

Ghi chú

  • Pipeline ensemble hiện tại kết hợp 2 checkpoint: BERT-full-undersampleBERT-full-weighted.
  • Phương pháp kết hợp là trung bình có trọng số trên xác suất lớp: p_final = alpha * p_A + (1 - alpha) * p_B, sau đó lấy argmax để suy ra nhãn.
  • Alpha được quét trên {0.3, 0.4, 0.5, 0.6, 0.7}.

Robustness clean vs noisy

Ghi chú

  • Đánh giá robustness được thực hiện trên test.csv (clean) và tập noisy_test_df tạo trực tiếp từ test set bằng create_noisy_test_set (scripts/run_robustness.py, src/robustness.py).
  • Nhiễu áp dụng lên full_text gồm: typo (0.03), random case (0.08), thêm punctuation (0.03), và drop token (0.03).
  • Bảng dùng best checkpoint theo từng family (BiLSTM, BiLSTM+Attention, DistilBERT, BERT-base); trong đó drop = clean - noisy > 0 biểu thị suy giảm, còn với MAE thì drop = noisy - clean.

08. Kết quả thực nghiệm / Tình huống

Phân tích đúng-sai và giải thích hành vi model

IG Case Studies (BERT-base)

Các case dưới đây được tổng hợp trực tiếp từ outputs/reports/xai_results/bert_xai.html (cả đúng và sai), tập trung vào top token theo Integrated Gradients.

Insight tổng hợp

  • Lỗi tập trung mạnh vào cặp nhãn liền kề (5-4, 4-3, 3-2), đúng bản chất ordinal.
  • DistilBERT bền vững hơn trong kịch bản noisy, trong khi BERT đạt đỉnh chất lượng cao nhất.
  • BiLSTM rất nhanh về latency và phù hợp baseline chi phí thấp.

Live Demo

Trải nghiệm trực tiếp trên Gradio Space

Dùng trực tiếp Gradio Space bên dưới để nhập dữ liệu và nhận dự đoán.

Hugging Face Space Embed

Space URL: https://huynguyentuan-dl-assignment-1-demo.hf.space.