← Quay lại trang chủ

BTL 1 - Multimodal Classification Report

Trang báo cáo tổng hợp cho Assignment 1 - phần Multimodal Classification. Tập trung phân tích mô hình Zero-Shot CLIP và LoRA Few-Shot trên tập MM-IMDB (23 genres).

Dataset: MM-IMDB Framework: PyTorch + Transformers Method: LoRA CLIP (r=8) Visualization: Attention Rollout
01

Giới thiệu

Bài toán là phân loại đa phương thức đa nhãn (Multi-label multimodal classification), sử dụng cặp thông tin Ảnh poster và Tiêu đề phim. Tập dữ liệu chứa tổng cộng 23 thể loại (genres).

Bài toán
Multi-label Classification
Số lớp (genres)
23
Mô hình gốc
CLIP ViT-B/32
Kỹ thuật
LoRA Few-Shot
02

EDA (Exploratory Data Analysis) & Thống kê Dữ liệu

Phân tích sâu tập dữ liệu MM-IMDB cho thấy tính chất đặc thù của bài toán phân loại đa nhãn (multi-label) trong không gian điện ảnh. Đa số các bộ phim chỉ sở hữu từ 1 đến 3 thể loại trong tổng số 23 nhãn có sẵn, dẫn đến ma trận nhãn thưa thớt (sparse matrix) với hơn 95% giá trị là 0. Đặc tính mất cân bằng nghiêm trọng (extreme class imbalance) và phân bố đuôi dài (long-tail distribution) này đặt ra thách thức lớn, dễ khiến mô hình rơi vào "bẫy" giả định toàn bộ nhãn là 0 (collapse). Vì vậy, kỹ thuật lấy mẫu K-shot và áp dụng trọng số mảng pos_weight được sử dụng như giải pháp triệt để.

Hình 2.1: Phân bố các nhãn thể loại (Genres Distribution) trên tập huấn luyện mẫu thực tế, phản ánh rõ rệt sự chênh lệch tần suất giữa các nhãn phổ biến (Drama, Comedy) và nhãn hiếm (Short, Film-Noir).

Sự Mở Rộng Thống Kê Dữ Liệu (Advanced EDA)

Để lượng hóa chính xác mức độ thử thách của bài toán Multimodal, ta tiến hành 4 phép phân tích cốt lõi (sử dụng Matplotlib/Seaborn):

Max Co-occurrence (Drama & Romance)
2,184
Max Label Cardinality
9 Genres
Avg Plot Summary Length
104 Words
03

Data Split & K-shot Sampling

Dữ liệu được chia train/val/test theo tỉ lệ 70/15/15. Vì bài toán nhắm vào Few-Shot learning, tập huấn luyện được lấy mẫu ngẫu nhiên (stratified) đảm bảo mỗi lớp có ít nhất K mẫu để mô hình có đủ khái niệm cơ bản về từng thể loại.

K-shot Configuration
K = 16, 32, 64
Train / Val / Test
70% / 15% / 15%
Zero-Shot Baseline
Full Test Set
04

Model Selection & Baseline

Dự án thực hiện đánh giá chéo giữa 2 cấu hình tiếp cận (Approaches): Zero-Shot Inference truyền thống và Few-Shot Fine-tuning bằng cơ chế Parameter-Efficient Fine-Tuning (PEFT).

Zero-Shot CLIPBaseline
Khai thác tính chất Alignment Image-Text bằng Prompt Matrix: "A movie poster for a {genre} movie" nhân chập cosine similarity với ảnh. KHÔNG cập nhật tham số.
LoRA CLIP Fine-tuningProposed
Tích hợp Low-Rank Adaptation (LoRA) vào QKV Attention Blocks của mảng Text/Vision Backbone. Dữ liệu huấn luyện ở mức K-shot.
05

Architecture & Multimodal Fusion Stream

Mô hình giải quyết bài toán bằng chiến lược Late Fusion với hai luồng xử lý song song (parallel streams) để trích xuất đặc trưng độc lập trước khi dung hợp:

flowchart TD classDef lora fill:#3730a3,stroke:#8b5cf6,stroke-width:2px,color:#fff classDef norm fill:#065f46,stroke:#10b981,stroke-width:2px,color:#fff classDef fuse fill:#7f1d1d,stroke:#ef4444,stroke-width:2px,color:#fff classDef base fill:#1f2937,stroke:#4b5563,stroke-width:1px,color:#e5e7eb subgraph Vision_Stream [Vision Stream] V1[Visual Inputs]:::base --> V2[ViT-B/32 Transformer]:::lora V2 --> V3[Visual Embed: 512]:::base end subgraph Text_Stream [Text Stream] T1[Textual Inputs]:::base --> T2[Text Transformer]:::lora T2 --> T3[Text Embed: 512]:::base end V3 --> N1[L2 Normalization]:::norm T3 --> N2[L2 Normalization]:::norm N1 --> F1{Concatenate 1024-dim}:::fuse N2 --> F1 F1 --> C1[MLP Classifier Head + Dropout]:::base C1 --> O1((Output Logits: 23 Genres)):::base

Cơ chế LoRA: Câu hỏi thường gặp

Hỏi: Mô hình thực sự học được điều gì từ LoRA với chưa tới 2% tham số? Nó có học nhận diện sự vật mới không?

Giải ảo (Intuition): Hoàn toàn không. Trọng số backbone CLIP đã có sẵn năng lực liên kết phân phối không gian hình ảnh/văn bản. LoRA rank-thấp không tái trích xuất năng lực nhận dạng mới (no new feature extraction). Thay vào đó, nó thuần túy tinh chỉnh phép chiếu không gian (affine transformation) nhằm phân rã và bóp méo (warp) các representations ngổn ngang tập trung thẳng vào một siêu mặt phẳng (hyperplane). Nơi đây cho phép tuyến tính hoá để chia tách ranh giới cho đúng 23 labels cụ thể trong tập dataset này. Sự hội tụ diễn ra tức thì trong khi triệt tiêu hoàn toàn rủi ro suy giảm nhận thức trí nhớ cũ (Catastrophic forgetting).

# CLIP LoRA Configuration & Custom Fusion Classifier
lora_config = LoraConfig(
    r=8,
    lora_alpha=16,
    target_modules=["q_proj", "k_proj", "v_proj", "out_proj", "fc1", "fc2", "qkv", "proj"],
    lora_dropout=0.05,
    bias="none",
    task_type=TaskType.FEATURE_EXTRACTION,
    modules_to_save=["classifier_head"]
)

# Classifier Head Projection
concat_features = torch.cat((image_features, text_features), dim=1) # 512 + 512 = 1024
logits = self.classifier_head(concat_features) # Output: [B, 23 Categories]
06

Hyper-parameter Strategy & Loss Optimization

Quá trình tối ưu hoá bài toán đa nhãn với đặc thù thưa thớt nhãn yêu cầu thiết kế hàm loss và cấu hình siêu tham số tinh tế.

1. Tại sao BCEWithLogitsLoss lại Superior đối với Multi-label?

BCEWithLogitsLoss kết hợp tầng SigmoidBCELoss vào duy nhất một class, mang tính ổn định số học (numerical stability) vượt trội so với sử dụng hàm Softmax. Với bài toán mà 1 bộ phim vừa có thể là "Action" vừa là "Comedy", CrossEntropyLoss là phi thực tế bởi nó giả định tổng xác suất của mọi nhãn phải bằng 1 (chỉ có duy nhất 1 nhãn đúng). Ngược lại, BCEWithLogitsLoss xử lý từng nơ-ron nhãn một cách hoàn toàn độc lập, dự đoán nhãn nhị phân dạng Independent Bernoulli cho chính xác 23 genres song song.

2. Đối phó 95% Sparse Matrix bằng pos_weight

Bởi ma trận MM-IMDB chứa hơn 95% giá trị 0 (phần lớn nhãn là Negative), một mô hình cơ bản sẽ dính "Cạm bẫy Collapse" – luôn luôn dự đoán kết quả là 0 toàn dải để thu về accuracy 95%. Tham số pos_weight được cài cắm để trừng phạt lỗi False Negatives mạnh gấp nhiều lần. Khi mô hình dự đoán sai một nhãn Positive (nhãn số 1 - cực kiếm gặp), hàm loss sẽ nhân trọng số này lên lỗi thất thoát nhằm ép Gradient dịch chuyển về hướng ưu tiên phát hiện ra đối tượng thiểu số.

3. Cơ chế Khóa Nhận Thức: LoRA Ratio ($\alpha/r$)

Hệ số Scale của LoRA hoạt động theo dạng scale = $\alpha / r$. Với r=8 và $\alpha=16$, scale được khóa cứng ở mức 2. Con số scaling này là phòng tuyến tối đa giúp mạng Neural không bị Catastrophic Forgetting (chứng quên kiến thức cục bộ). Thay vì Fine-tuning chập chờn toàn bộ tỷ trọng của backbone Transformer làm vỡ không gian pre-trained, tỷ lệ chuẩn xác này giữ module LoRA chỉ đóng vai trò như lực "Push" nhỏ để định vị lại (Alignment) bề mặt tri thức điện ảnh của MM-IMDB chứ không tàn phá nền tảng ViT/Transformer khổng lồ bên dưới.

07

Training Logs

Biểu đồ quá trình huấn luyện theo phong cách WandB (Loss và Macro F1 curves).

08

Model Comparison Table (System Metrics & Accuracy)

Bảng phân tích đánh giá đa chiều (Zero-Shot vs Single Modality vs Few-Shot vs Full Fine-tune) nhằm đáp ứng trọn vẹn yêu cầu cấu trúc chuẩn mực về Metrics (Accuracy, F1, Latency, Params).

Models Setup Exact Match Acc (%) Macro F1 Weighted F1 Inference (ms) Params (M)
Baseline (ViT-B/32) Zero-Shot 0.00% 5.63% 28.42% 21.05 ms 151.2
Proposed (CLIP Fusion) Few-Shot LoRA K=16 0.71% 38.06% 49.18% 8.39 ms 154.0 (+2.8)
Proposed (CLIP Fusion) Few-Shot LoRA K=32 4.18% 45.40% 57.17% 7.74 ms 154.0 (+2.8)
Proposed (CLIP Fusion) Few-Shot LoRA K=64 7.07% 48.98% 60.09% 6.97 ms 154.0 (+2.8)

📝 Phân Tích Chuyên Sâu (Zero-Shot, Few-Shot & Modality Parity)

Tồn tại Domain Shift (Zero-Shot vs Few-Shot)

Thực nghiệm trên 1 GPU NVIDIA chỉ ra CLIP Zero-Shot suy luận rất tệ (chỉ đạt ~5.6% F1). Căn nguyên đến từ Domain Shift (độ lệch phân phối miền dữ liệu). Điển hình, mô hình CLIP nền tảng được pre-train trên hàng trăm triệu cặp ảnh-text lấy từ internet vốn mang tính mô tả thực tại/hình thái học (ví dụ: "con chó đang chạy trên cỏ"). Ngược lại, Poster Phim vốn dĩ mang tính trừu tượng nghệ thuật rất cao (v.d: text mờ ảo nghệ thuật, dải băng màu sắc kì dị biểu trưng cho thể loại Horror hoặc Tâm lý/Noir). Sự chênh lệch khốc liệt này làm Zero-Shot lạc lối bởi không khớp Vector space. Tuy nhiên, khi ta mớm chỉ vài examples qua Few-Shot LoRA, lớp Adapter chỉ gồm 2.8 triệu params lập tức ép không gian biểu diễn (embedding space) của ViT xoay vặn lại cho bám khớp đúng cái "vibe" của điện ảnh, giúp Macro F1 nhảy vọt cực nhanh.

Quyền năng của Late Fusion (Multimodal vs Single Text)

Nếu chỉ sử dụng Single Modality (Text-only BERT) chiến đấu độc lập, hiệu suất lập tức bị chặn giới hạn (bottleneck) tại Weighted F1 42.8%. Vấn đề là Plot summary trên IMDB rất nhiều đoạn cụt lủn và trung tính về câu chữ (vd: "Ba người bước vào một tòa nhà bỏ hoang"). Dựa vào text đơn điệu, model phân vân cực độ giữa Adventure hay Horror. Kiến trúc Multimodal Late Fusion của chúng ta đánh bại giới hạn này bởi nó liên kết chéo các Semantic anchors. Trong cùng ví dụ trên, Luồng Visual Stream (Poster rách nát, tông đen tối, font chữ rỉ máu đục lỗ) ngay lập tức gạt bỏ Adventure và thiết lập tỉ lệ suy luận Horror rất mạnh. Sự bù trừ khiếm khuyết của từng kênh đầu vào độc lập này chính là lý do tuyệt đối đẩy Weight F1 của Multimodal vượt xa cấu trúc Single Modality.

Phụ lục trực quan: Đồ thị Metrics comparison
09

Interpretability (Attention Rollout)

Mô hình Transformer-native sử dụng Attention Rollout phân loại vùng trọng điểm trên ảnh các phim (ViT-native, không dùng phương pháp grad-based như GradCAM).

Giải phẫu kỹ thuật Attention Rollout

What it is: Công cụ định lượng dạng visual attribution (hoàn toàn gradient-free) chuyên dùng truy vết các token/patch để xem phần thông tin nào có khả năng "sống sót" lọt qua nhiều hàm biến đổi tới tận classifier cuối.

How it works (Technical): Cấu trúc Attention Block chính là một hệ ma trận định hướng (routing matrices). Trước tiên, ta bảo tồn tín hiệu rễ (identity) bằng cách bù thêm residual connections (0.5 * A_l + 0.5 * I). Lớp Attention Rollout kích kích chuỗi nhân ma trận liên hoàn (Matrix Scalar Iterations) gom chập từ tầng đích n ngược về tầng xuất phát 0: A_rollout = A_n × A_n-1 ... × A_0. Tại mặt phẳng Rollout tổng hợp, ta cô lập ra tensor tương tác thẳng với [CLS] token đại diện tổng để scale up (bilinear interpolation) thành màu trên lưới grid 2D.

Intuition: Đóng vai trò là "máy quét Eye-Tracking" của bản thân mô hình Transformer, bác nghiệm sự phỏng đoán dựa vào hộp đen (black box guesswork) mà là suy diễn có cơ sở.


💡 Khắc Phục Lầm Tưởng: Màu đỏ đập vào mắt trên Heatmap thực sự có nghĩa là gì?

Khu vực rực đỏ biểu thị vùng trọng số đạt giới hạn trên (peak attention magnitude). Mô hình không tư duy concept sự vật như não người. Sắc đỏ chỉ minh chứng vùng pixel tại ô đó đang phản xạ tương quan tĩnh học (statistical correlation) cosine hoàn hảo với label embedding định sẵn. Đặc biệt, nếu nền trống trơn (background darkness) vẫn cháy đỏ bừng — model đang ăn shortcut (ví dụ: bám vào tính chất "khung cảnh thiếu sáng độ phân giải bệch" làm thước đo cho nhãn Thriller/Horror), chứ model hoàn toàn không "tìm thấy con dao giấu ở góc tối"!

Attention Rollout: Parasite
parasite Vanilla Rollout
Vanilla (Mean Fusion)
parasite Enhanced Rollout
Enhanced (Max Fusion + Discard 0.9)
greedandclassdiscriminationthreatenthenewlyformedsymbioticrelationshipbetweenthewealthyparkfamilyandthedestitutekimclan.
Attention Rollout: Inception
inception Vanilla Rollout
Vanilla (Mean Fusion)
inception Enhanced Rollout
Enhanced (Max Fusion + Discard 0.9)
athiefwhostealscorporatesecretsthroughtheuseofdream-sharingtechnologyisgiventheinversetaskofplantinganideaintothemindofac.e.o.
Attention Rollout: La La Land
lalaland Vanilla Rollout
Vanilla (Mean Fusion)
lalaland Enhanced Rollout
Enhanced (Max Fusion + Discard 0.9)
whilenavigatingtheircareersinlosangeles,apianistandanactressfallinlovewhileattemptingtoreconciletheiraspirationsforthefuture.
Attention Rollout: Titanic
titanic Vanilla Rollout
Vanilla (Mean Fusion)
titanic Enhanced Rollout
Enhanced (Max Fusion + Discard 0.9)
aseventeen-year-oldaristocratfallsinlovewithakindbutpoorartistaboardtheluxurious,ill-fatedr.m.s.titanic.
10

Thử nghiệm trực tiếp trên Gradio - Hugging Face Space

Gradio - Hugging Face Space

Nếu iframe bị lỗi, bấm nút bên dưới để mở Hugging Face Space ở tab mới.

Mở Hugging Face Space
11

Efficiency & Latency

Đánh giá tối ưu độ hiệu quả. LoRA chỉ tốn 0.83% tham số huấn luyện (~60x nhỏ hơn) và tốc độ huấn luyện nhanh gấp 2.25x.

Phân tích phần cứng (Inference Profiling) & Ý nghĩa đồ thị

Diễn giải cấu trúc Histogram Biểu đồ Độ trễ phân phối (Latency Variance):

  • Colors & Shift (Đọc Shape Data): Histogram màu Tím tương ứng với mô hình PyTorch thô. Histogram màu Đỏ là hệ thống export ONNX. Hãy quan sát cách đồ thị đỏ bị tịnh tiến mạnh về trái (shift left - tăng tốc thuần), rút hẹp dải phân bố biến thiên (decreased tail distribution - chống request nghẽn nút chai cục bộ).
  • P50 (Median Baseline): Điểm trung vị mà 50% khối tải inference vượt quan mốc nhịp thời gian đó. Dùng phản chiếu hành vi chuẩn (typical execution rate) với tài nguyên phần cứng bình thường.
  • P90 & P99 (Tail Latencies): Mốc giới hạn trần thời gian hứa hẹn hoàn tất gánh dứt điểm cho 90% (hay 99%) lượng truy vấn tổng. Đối với hạ tầng production REST API, một tác vụ trễ nhịp (timeout spike) đủ sức làm gián đoạn (block) quá trình cấp phát memory I/O cho batch sau, kéo dây chuyền deadlock.
  • 💡 Khắc Phục Lầm Tưởng: Tại sao không nhìn Mean (Average) mà phải Optimize P99? Xoay sở ép P50 xuống sát 0ms vô nghĩa nếu dải P99 lại trồi lên chạm mốc 400ms (1 truy vấn kéo 100 truy vấn khác chết treo). Ép hệ thống chạy qua TensorRT Runtime thực chất là nén "cái đuôi bất đồng bộ" cực đoan đó sát lại P50, duy trì sai số xử lý thấp kỷ lục bảo vệ microservices không hỏng vỡ khi load concurrency.
P50 Latency
ONNX / TensorRT
P90 Latency
Optimized Inference
P99 Latency
Low Tails