Kiến trúc mạng học sâu: từ nền tảng đến LLM·Chương 1 — Nền tảng để hiểu kiến trúc học sâu

Chế độ xem

Từ dữ liệu có nhãn đến model: một quy trình supervised training hoàn chỉnh

Biết forward, loss, backpropagation và optimizer vẫn chưa đủ để train một model đúng cách. Trong dự án thật, phần khó thường nằm ở cách đặt bài toán, chuẩn bị dữ liệu, chia tập, chọn checkpoint và đánh giá.

Bài viết này ghép các mảnh đã học thành một quy trình end-to-end không cần code.

Bài toán xuyên suốt

Giả sử cần phát hiện sớm sinh viên có nguy cơ trượt môn.

Mỗi mẫu có:

  • tỷ lệ đi học;
  • tỷ lệ nộp bài;
  • điểm giữa kỳ;
  • một số feature học tập khác;
  • label: có nguy cơ / không có nguy cơ.

Ta có 5.000 mẫu lịch sử đã được gắn nhãn.

Mục tiêu là tạo một model có thể nhận dữ liệu của sinh viên mới và ước lượng nguy cơ.

Bước 1: xác định chính xác input, output và đơn vị dự đoán

Trước khi chọn model, cần trả lời:

  • Một sample là gì: một sinh viên, một học kỳ hay một lần đăng nhập?
  • Prediction được tạo ở thời điểm nào?
  • Những feature nào thật sự có sẵn tại thời điểm đó?
  • Label được định nghĩa thế nào?

Ví dụ nếu muốn dự đoán nguy cơ ở tuần thứ 6, không được dùng điểm cuối kỳ làm feature. Điểm cuối kỳ chưa tồn tại ở tuần 6.

Đây là một dạng data leakage: model được nhìn thấy thông tin mà lúc triển khai thực tế không thể có.

Một model có leakage có thể cho metric rất đẹp nhưng vô dụng khi sử dụng thật.

Bước 2: kiểm tra dữ liệu trước khi nghĩ tới architecture

Các câu hỏi tối thiểu:

  • Có bao nhiêu mẫu?
  • Hai lớp có cân bằng không?
  • Có dữ liệu thiếu không?
  • Có duplicate không?
  • Label có đáng tin không?
  • Có feature nào vô tình tiết lộ label không?
  • Dữ liệu train có giống dữ liệu sẽ gặp khi deploy không?

Một pipeline deep learning không thể sửa được mọi lỗi dữ liệu.

Bước 3: chia train, validation và test

Ví dụ với 5.000 mẫu:

  • 3.500 train;
  • 750 validation;
  • 750 test.

Tỷ lệ này chỉ là ví dụ, không phải quy tắc cố định.

Điều quan trọng là vai trò.

Training set

Dùng để tính gradient và update parameter.

Model nhìn tập này rất nhiều lần.

Validation set

Dùng để:

  • theo dõi khả năng generalize;
  • chọn hyperparameter;
  • chọn số epoch;
  • chọn checkpoint;
  • so sánh các model candidate.

Validation không nên được dùng như training set để update weight trong training loop thông thường.

Test set

Dùng để đánh giá model cuối sau khi phần lớn quyết định đã được chốt.

Nếu liên tục nhìn test rồi sửa model, test set dần trở thành một phần của model selection và mất vai trò đánh giá độc lập.

D2L nhấn mạnh đúng nguyên tắc này: model selection nên dựa vào validation thay vì dùng test data để tune hyperparameter.

Chia ngẫu nhiên không phải lúc nào cũng đúng

Nếu dữ liệu có thời gian, người dùng hoặc nhóm liên quan, random split có thể làm rò rỉ thông tin.

Ví dụ theo thời gian

Dự đoán dữ liệu tương lai nên cân nhắc:

train: dữ liệu cũ
validation: dữ liệu gần hơn
test: dữ liệu mới nhất

Ví dụ theo người

Nếu một sinh viên có nhiều bản ghi, không nên để bản ghi của cùng người xuất hiện cả train lẫn test nếu mục tiêu là generalize sang sinh viên mới.

Ví dụ ảnh gần trùng lặp

Hai ảnh chụp liên tiếp của cùng một vật thể có thể rất giống nhau. Nếu một ảnh ở train và ảnh gần giống ở test, metric có thể bị thổi phồng.

Nguyên tắc:

Cách split phải mô phỏng đúng loại dữ liệu mới mà model sẽ gặp sau này.

Bước 4: preprocessing phải tôn trọng ranh giới dữ liệu

Ví dụ cần chuẩn hóa feature bằng mean và standard deviation.

Mean/std nên được tính từ training set, sau đó áp dụng cho validation/test.

Không nên tính thống kê preprocessing trên toàn bộ dataset rồi mới chia, vì validation/test đã góp thông tin vào pipeline.

Tương tự với:

  • vocabulary;
  • feature selection;
  • imputation statistics;
  • normalization;
  • dimensionality reduction.

Không phải mọi preprocessing đều gây leakage, nhưng nguyên tắc an toàn là: mọi bước có “học” thống kê từ dữ liệu nên fit trên train.

Bước 5: chọn baseline trước khi làm model phức tạp

Một baseline giúp trả lời:

“Model deep learning có thực sự tạo ra giá trị không?”

Với bài toán nguy cơ trượt:

  • baseline cực đơn giản: luôn dự đoán lớp phổ biến nhất;
  • baseline hợp lý hơn: logistic regression hoặc tree model;
  • model neural: MLP.

Nếu MLP không vượt baseline đủ đáng kể, cần kiểm tra lại dữ liệu và cách đánh giá trước khi tăng số layer.

Bước 6: chọn architecture, loss và optimizer

Với input dạng vector cố định, MLP là lựa chọn dễ hiểu.

Ta cần xác định:

  • architecture;
  • loss function;
  • optimizer;
  • learning rate;
  • batch size;
  • số epoch tối đa.

Ví dụ khái niệm:

MLP 8 features → 32 → 16 → 1 logit
loss: binary cross-entropy phù hợp logits
optimizer: Adam
batch size: 64
max epochs: 50

Không cần xem đây là “cấu hình chuẩn”. Đó chỉ là một cấu hình thử nghiệm.

Bước 7: training diễn ra theo batch

Mỗi batch thực hiện:

Ví dụ một batch cụ thể

Giả sử batch size = 3, tức mỗi lần model thấy 3 sinh viên cùng lúc:

Batch 1:
  SV A: x=[0.75, 0.60, 5.5], y=1  → model dự đoán 0.72 → loss nhỏ
  SV B: x=[0.40, 0.50, 3.5], y=1  → model dự đoán 0.31 → loss lớn (bỏ sót)
  SV C: x=[1.00, 0.95, 8.0], y=0  → model dự đoán 0.08 → loss nhỏ

Loss trung bình batch = (nhỏ + lớn + nhỏ) / 3 = ...
→ Gradient tính xong → weight được cập nhật một lần.

Batch 2: 3 sinh viên khác → cập nhật lần 2.
...
Batch 100: cập nhật lần 100 → kết thúc epoch 1.

Ở epoch tiếp theo, batch 1 lại là 3 sinh viên đó nhưng model đã có weight mới hơn, nên prediction và loss cũng khác.

Sau khi model đi qua toàn bộ training set, ta hoàn thành một epoch.

PyTorch định nghĩa batch size là số sample được truyền qua network trước một lần update parameter, còn epoch là số lượt đi qua dataset trong optimization loop.

Bước 8: cuối epoch, đánh giá trên validation

Validation loop khác training loop ở điểm quan trọng: không cập nhật parameter dựa trên validation data.

Sau mỗi epoch, log có thể như sau:

EpochTrain lossVal lossVal F1
10.680.660.61
50.490.510.73
100.350.440.79
150.240.460.78
200.160.550.74

Một cách đọc:

  • model học rõ từ epoch 1 tới 10;
  • train loss tiếp tục giảm sau epoch 10;
  • val loss bắt đầu xấu;
  • val F1 cũng giảm.

Đây là dấu hiệu model đang overfit từ vùng sau epoch 10-15.

Đọc biểu đồ train/val loss

Nhìn vào bảng số không bằng nhìn vào biểu đồ. Dưới đây là ba kịch bản thường gặp và cách nhận dạng chúng:

Kịch bản 1: model học tốt

Cả train loss và val loss đều giảm cùng chiều, khoảng cách giữa hai đường không quá lớn.

Ở kịch bản này, val loss luôn bám sát train loss và cả hai cùng có xu hướng giảm. Không cần lo lắng nhiều - chỉ cần chờ thêm epoch hoặc dừng khi val loss đã đủ thấp.

Kịch bản 2: overfitting

Train loss tiếp tục giảm nhưng val loss bắt đầu tăng lên. Khoảng cách ngày càng doãng ra.

Thời điểm tốt nhất để dừng là khoảng epoch 10-12 - khi val loss còn ở mức thấp nhất trước khi bắt đầu leo lên. Đó là lý do cần checkpoint và early stopping.

Kịch bản 3: underfitting

Cả train loss lẫn val loss đều vẫn còn cao sau nhiều epoch. Model chưa học được gì nhiều.

Trong trường hợp này, mô hình cần được điều chỉnh: tăng capacity, kiểm tra lại feature, hoặc thử learning rate khác.

Tóm tắt: nhìn biểu đồ cần chú ý điều gì?

Quan sátCó thể gợi ý
Cả hai cùng giảm đềuĐang học tốt
Train giảm, val không giảm hoặc tăngOverfitting
Cả hai giảm rất chậm và vẫn còn caoUnderfitting
Val loss dao động mạnhBatch size nhỏ, learning rate chưa ổn, hoặc tập val quá nhỏ
Loss đột ngột tăng vọtLearning rate quá lớn hoặc có lỗi dữ liệu

Không nên đọc từng epoch riêng lẻ - hãy nhìn vào xu hướng chung qua nhiều epoch.

Checkpoint là gì?

Checkpoint là trạng thái model được lưu tại một thời điểm training.

Nếu epoch 10 cho validation tốt nhất, ta có thể lưu weights ở epoch đó thay vì dùng weights ở epoch 50 chỉ vì nó là epoch cuối.

“Best” phải được định nghĩa theo metric hoặc criterion đã chọn trước.

Early stopping là gì?

Early stopping dừng training khi validation không còn cải thiện sau một khoảng thời gian.

Ví dụ:

  • theo dõi val_loss;
  • nếu 5 epoch liên tiếp không cải thiện thì dừng.

Mục tiêu:

  • tránh train thêm vô ích;
  • giảm nguy cơ overfit;
  • tiết kiệm tài nguyên.

Nhưng early stopping không thay thế việc hiểu dữ liệu hay chọn model. Nó chỉ là một kỹ thuật điều khiển training.

Underfitting: model chưa học đủ

Ví dụ:

EpochTrain lossVal loss
11.101.12
100.961.00
300.910.98

Cả train và validation đều còn kém.

Có thể do:

  • architecture quá hạn chế;
  • feature không chứa đủ thông tin;
  • training chưa đủ;
  • learning rate không phù hợp;
  • preprocessing sai;
  • target rất nhiễu.

Không nên mặc định “underfit = thêm layer”. Cần điều tra nguyên nhân.

Overfitting: model khớp train hơn dữ liệu mới

Ví dụ:

EpochTrain lossVal loss
10.900.93
100.400.49
200.180.68

Khoảng cách train-validation tăng.

D2L mô tả overfitting là khi model fit training data tốt hơn đáng kể so với khả năng tổng quát hóa sang dữ liệu khác.

Các hướng xử lý có thể gồm:

  • thêm dữ liệu chất lượng;
  • giảm model capacity;
  • regularization;
  • weight decay;
  • dropout;
  • data augmentation nếu phù hợp;
  • early stopping;
  • sửa leakage/split;
  • cải thiện feature/label.

Không nên áp dụng tất cả cùng lúc. Mỗi thay đổi nên trả lời một giả thuyết cụ thể.

Train loss và val loss không cần bằng nhau

Validation loss thường cao hơn train loss là bình thường vì:

  • model được tối ưu trực tiếp trên train;
  • training có thể có augmentation/noise;
  • một số layer hoạt động khác giữa train và eval mode;
  • dữ liệu validation có thể khó hơn.

Điều quan trọng là xu hướng, khoảng cách và mức phù hợp với mục tiêu, không phải ép hai con số bằng nhau.

Bước 9: chọn model bằng validation, không bằng test

Giả sử thử ba cấu hình:

ModelVal F1
MLP nhỏ0.77
MLP vừa0.81
MLP lớn0.79

Ta có thể chọn MLP vừa dựa trên validation.

Sau khi quyết định, mới đánh giá trên test.

Bước 10: đánh giá test một cách độc lập

Giả sử model đã chốt đạt:

Test accuracy = 0.88
Test precision = 0.72
Test recall = 0.84
Test F1 = 0.78

Đây mới là ước lượng cuối cho dữ liệu chưa dùng trong training/model selection.

Nếu test F1 tụt mạnh so với validation, cần điều tra:

  • split có khác phân phối không;
  • validation đã bị tune quá mức không;
  • test có nhiễu/khó hơn không;
  • pipeline preprocessing có nhất quán không.

Không nên tiếp tục tune hàng chục lần dựa trên test rồi vẫn gọi nó là “test độc lập”.

Bước 11: metric offline chưa phải kết thúc

Khi deploy, môi trường có thể thay đổi:

  • hành vi người dùng đổi;
  • dữ liệu mới khác dữ liệu cũ;
  • tỷ lệ lớp thay đổi;
  • hệ thống upstream đổi format;
  • label thực tế đến chậm.

Do đó production cần monitoring.

Deep learning trong thực tế là một vòng đời, không phải một lần bấm “train”.

Fine-tuning nằm ở đâu?

Fine-tuning vẫn dùng phần lớn quy trình trên, nhưng điểm khởi đầu khác.

Thay vì random initialization, ta bắt đầu từ pretrained model rồi tiếp tục train trên task mới.

Phần này được tách sang chủ đề 4 (fine-tuning) vì cần hiểu thêm pretrained representation và các architecture phổ biến trước.

Một checklist đọc training log

Khi thấy:

Epoch 12
train_loss = 0.31
val_loss   = 0.39
val_f1     = 0.82

nên hỏi:

  1. So với epoch trước, train loss và val loss thay đổi ra sao?
  2. Model đang được chọn theo val loss hay val F1?
  3. Class distribution có mất cân bằng không?
  4. Baseline đạt bao nhiêu?
  5. Best checkpoint nằm ở epoch nào?
  6. Test đã được dùng để tune chưa?
  7. Có dấu hiệu leakage không?

Kỹ năng đọc log quan trọng hơn việc ghi nhớ một con số “loss tốt” chung cho mọi bài toán - vì không có ngưỡng như vậy.

Nếu chỉ nhớ 10 ý

  • Định nghĩa đúng sample/input/label quan trọng hơn chọn model sớm.
  • Split phải mô phỏng tình huống dữ liệu mới thực tế.
  • Train dùng để update parameter.
  • Validation dùng cho model selection và hyperparameter tuning.
  • Test dùng cho đánh giá cuối, không nên bị tune lặp đi lặp lại.
  • Preprocessing có học thống kê nên fit trên train.
  • Batch là nhóm mẫu cho một update; epoch là một lượt qua training set.
  • Checkpoint tốt nhất không nhất thiết là epoch cuối.
  • Train tốt nhưng validation xấu dần gợi ý overfitting.
  • Metric offline tốt chưa đồng nghĩa production sẽ luôn tốt.

Câu hỏi tự kiểm tra

  1. Nếu dự đoán ở tuần 6 nhưng dùng điểm cuối kỳ làm feature, lỗi gì xảy ra?
  2. Validation set khác test set ở vai trò nào?
  3. Vì sao standardization nên fit trên training set?
  4. Best checkpoint có nhất thiết là model ở epoch cuối không?
  5. Train loss thấp và val loss cao có thể gợi ý điều gì?
  6. Nếu cùng một người xuất hiện cả train lẫn test, khi nào điều đó có thể gây đánh giá quá lạc quan?
  7. Vì sao cần baseline trước khi tăng độ phức tạp model?

Tài liệu tham khảo và đọc thêm