SageMaker: Training & Fine-Tuning

#exam-tip

Mục lục

1. Transfer Learning & Fine-Tuning #important #exam-tip

1.1 Transfer Learning là gì?

Định nghĩa: Sử dụng một mô hình đã được huấn luyện sẵn (pre-trained model) làm điểm xuất phát thay vì huấn luyện lại từ đầu (training from scratch).

Khái niệm cốt lõi: Các mô hình pre-trained đã học được những đặc trưng (features) hữu ích từ các tập dữ liệu khổng lồ. Bạn chỉ cần điều chỉnh chúng (adapt) cho bài toán cụ thể của mình, nhờ đó tốn ít dữ liệu và thời gian huấn luyện hơn.

Các Use Cases phổ biến:

  • Thị giác máy tính (Computer Vision): Sử dụng các mô hình đã huấn luyện trên tập ImageNet (1.4 triệu ảnh, 1000 phân lớp)
  • Xử lý ngôn ngữ tự nhiên (NLP): Sử dụng các mô hình huấn luyện trên các kho văn bản khổng lồ (BERT, GPT)
  • Chuỗi thời gian (Time Series): Sử dụng các mô hình đã huấn luyện trên các tập dữ liệu chuỗi thời gian tương tự

1.2 Tại sao nên dùng Transfer Learning? #exam-tip

Lợi ích:

Lợi ích Giải thích Mức độ liên quan trong bài thi
Cần ít dữ liệu huấn luyện hơn Các pre-trained features có thể hoạt động tốt chỉ với hàng trăm thay vì hàng ngàn bức ảnh Các kịch bản tập dữ liệu nhỏ
Huấn luyện nhanh hơn Bắt đầu ở điểm gần với mức tối ưu hơn, cần ít epochs hơn Các câu hỏi về tối ưu hóa chi phí
Hiệu suất tốt hơn Tận dụng được tri thức học từ các tập dữ liệu khổng lồ Các kịch bản hạn chế về dữ liệu
Chi phí thấp hơn Ít thời gian tính toán hơn = chi phí huấn luyện thấp hơn Các kịch bản ngân sách eo hẹp

Khi nào nên dùng Transfer Learning: #important

Sử dụng Transfer Learning khi:

  • Tập dữ liệu nhỏ (< 10,000 samples)
  • Tồn tại miền bài toán tương tự (như ImageNet cho ảnh, BERT cho text)
  • Ngân sách tính toán (compute budget) có hạn
  • Cần có kết quả nhanh chóng
  • Tác vụ cần giải quyết tương tự như tác vụ gốc của pre-trained model

Huấn luyện từ đầu (Train from Scratch) khi:

  • Tập dữ liệu cực kỳ lớn (hàng triệu samples)
  • Miền dữ liệu quá đặc thù (ảnh y tế chuyên sâu, ảnh vệ tinh)
  • Có nguồn tài nguyên tính toán (compute resources) khổng lồ
  • Các pre-trained models hoạt động kém trên miền dữ liệu của bạn

1.3 Các chiến lược Transfer Learning #exam-tip

Ba cách tiếp cận chính:

1. Trích xuất đặc trưng (Feature Extraction - Đóng băng phần Base)

Cách làm: Dùng pre-trained model đóng vai trò như một bộ trích xuất đặc trưng cố định (fixed), chỉ huấn luyện duy nhất layer phân loại cuối cùng (final classification layer).

Quy trình:

  1. Tải pre-trained model (ví dụ: ResNet-50)
  2. Đóng băng (Freeze) tất cả các layers ngoại trừ layer cuối cùng
  3. Thay thế layer cuối bằng một layer mới tương ứng với số lượng lớp (classes) của bạn
  4. Chỉ huấn luyện (train) layer mới này

Khi nào nên dùng:

  • Tập dữ liệu rất nhỏ (100-1000 samples)
  • Miền dữ liệu tương tự (Similar domain) với pre-trained model
  • Tài nguyên compute eo hẹp

Ưu điểm (Pros):

  • ✅ Huấn luyện cực kỳ nhanh (chỉ train 1 layer)
  • ✅ Ít nguy cơ overfitting hơn (vì ít tham số hơn)
  • ✅ Chi phí thấp nhất

Nhược điểm (Cons):

  • ❌ Kém linh hoạt hơn (không thể điều chỉnh các features bên dưới)
  • ❌ Có thể không hiệu quả nếu miền dữ liệu quá khác biệt

2. Tinh chỉnh một phần (Fine-Tuning - Partially Frozen)

Cách làm: Đóng băng các layers đầu tiên, chỉ huấn luyện các layers phía sau + layer cuối cùng.

Quy trình:

  1. Tải pre-trained model
  2. Đóng băng các layers đầu (Freeze early layers) (phụ trách các features cấp thấp như góc cạnh, đường nét)
  3. Mở khóa các layers sau (Unfreeze later layers) (phụ trách các features cấp cao)
  4. Huấn luyện các layers đã mở khóa + layer cuối cùng mới thêm vào
  5. Sử dụng learning rate thấp hơn (để tránh phá hỏng các pre-trained weights đã có)

Khi nào nên dùng:

  • Tập dữ liệu cỡ vừa (1,000-10,000 samples)
  • Miền dữ liệu hơi khác biệt một chút
  • Có nhiều tài nguyên compute hơn

Ưu điểm (Pros):

  • ✅ Thích ứng (adapt) tốt hơn với dữ liệu của bạn
  • ✅ Vẫn nhanh hơn so với train từ đầu
  • ✅ Cân bằng tốt giữa hiệu suất và chi phí

Nhược điểm (Cons):

  • ❌ Nguy cơ bị overfitting nếu tập dữ liệu quá nhỏ
  • ❌ Cần phải tinh chỉnh learning rate cẩn thận

3. Tinh chỉnh toàn bộ (Full Fine-Tuning - All Layers)

Cách làm: Huấn luyện toàn bộ mạng lưới, sử dụng pre-trained weights làm giá trị khởi tạo (initialization) ban đầu.

Quy trình:

  1. Tải pre-trained model
  2. Mở khóa toàn bộ các layers (Unfreeze all layers)
  3. Huấn luyện toàn bộ mạng với learning rate cực kỳ thấp
  4. Dùng pre-trained weights để khởi tạo thay vì khởi tạo ngẫu nhiên (random)

Khi nào nên dùng:

  • Tập dữ liệu lớn (10,000+ samples)
  • Miền dữ liệu khác biệt so với pre-trained model
  • Cần đạt hiệu suất tối đa (Maximum performance)

Ưu điểm (Pros):

  • ✅ Mức độ thích ứng tối đa với dữ liệu của bạn
  • ✅ Tiềm năng đạt hiệu suất cao nhất

Nhược điểm (Cons):

  • ❌ Thời gian huấn luyện lâu nhất
  • ❌ Tốn kém nhất
  • ❌ Nguy cơ cao bị overfitting nếu không có đủ dữ liệu

1.4 Khung quyết định Transfer Learning #important #exam-tip

Kích thước dữ liệu Độ tương đồng miền Chiến lược Lý do
Nhỏ (< 1K) Rất tương đồng Feature Extraction Tránh overfitting, tận dụng tối đa pre-trained features
Nhỏ (< 1K) Khác biệt Fine-Tuning (vài layers) Cần sự thích ứng nhất định, nhưng phải cẩn trọng
Vừa (1K-10K) Tương đồng Fine-Tuning (layers cuối) Cân bằng giữa sự thích ứng và nguy cơ overfitting
Vừa (1K-10K) Khác biệt Full Fine-Tuning (LR thấp) Cần sự thích ứng đáng kể
Lớn (> 10K) Tương đồng Fine-Tuning hoặc Từ đầu Cách nào cũng được
Lớn (> 10K) Khác biệt Train from Scratch (Từ đầu) Đủ dữ liệu để tự học các features đặc thù của miền

Nguyên tắc cốt lõi cho bài thi: #exam-tip

  • Dữ liệu càng nhỏ → Huấn luyện càng ít (Feature Extraction)
  • Dữ liệu càng lớn → Huấn luyện càng nhiều (Fine-Tuning hoặc From Scratch)
  • Miền càng giống → Dùng pre-trained càng nhiều (Feature Extraction)
  • Miền càng khác → Train nhiều layers hơn (Fine-Tuning hoặc From Scratch)

1.5 Hỗ trợ Transfer Learning trong SageMaker #important

Các Framework phổ biến đi kèm Pre-trained Models:

1. TensorFlow/Keras

Các Pre-trained Models có sẵn:

  • ImageNet: ResNet, VGG, Inception, MobileNet, EfficientNet
  • NLP: BERT, GPT

Triển khai trên SageMaker:

from sagemaker.tensorflow import TensorFlow

estimator = TensorFlow(
    entry_point='train.py',
    role=role,
    instance_type='ml.p3.2xlarge',
    framework_version='2.12',
    py_version='py310'
)

estimator.fit({'training': s3_training_data})

Bên trong file train.py:

import tensorflow as tf
from tensorflow.keras.applications import ResNet50

# Tải pre-trained ResNet50 (bỏ layer top/cuối)
base_model = ResNet50(
    weights='imagenet',  # Đã pre-train trên ImageNet
    include_top=False,   # Loại bỏ layer phân loại cuối cùng
    input_shape=(224, 224, 3)
)

# Đóng băng base model (Feature Extraction)
base_model.trainable = False

# Thêm các custom layers cho bài toán của bạn
model = tf.keras.Sequential([
    base_model,
    tf.keras.layers.GlobalAveragePooling2D(),
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(num_classes, activation='softmax')
])

# Biên dịch (Compile) và huấn luyện
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(train_data, epochs=10)

Fine-Tuning (Mở khóa các layers phía sau):

# Sau đợt huấn luyện ban đầu, mở khóa một số layers
base_model.trainable = True

# Đóng băng các layers đầu, mở khóa các layers sau
for layer in base_model.layers[:100]:
    layer.trainable = False  # Đóng băng 100 layers đầu tiên

# Biên dịch lại với learning rate thấp hơn
model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5),  # LR rất thấp
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

# Tiếp tục huấn luyện
model.fit(train_data, epochs=10)

2. PyTorch

Các Pre-trained Models có sẵn:

  • torchvision.models: ResNet, VGG, Inception, MobileNet
  • Hugging Face Transformers: BERT, GPT, RoBERTa

Triển khai trên SageMaker:

from sagemaker.pytorch import PyTorch

estimator = PyTorch(
    entry_point='train.py',
    role=role,
    instance_type='ml.p3.2xlarge',
    framework_version='2.0',
    py_version='py310'
)

Bên trong file train.py:

import torch
import torchvision.models as models

# Tải pre-trained ResNet
model = models.resnet50(pretrained=True)

# Feature Extraction: Đóng băng tất cả các layers
for param in model.parameters():
    param.requires_grad = False

# Thay thế layer cuối cho bài toán của bạn
num_features = model.fc.in_features
model.fc = torch.nn.Linear(num_features, num_classes)

# Lúc này chỉ layer cuối mới được train
optimizer = torch.optim.Adam(model.fc.parameters(), lr=0.001)

Fine-Tuning: Mở khóa các layers

# Mở khóa toàn bộ layers
for param in model.parameters():
    param.requires_grad = True

# Sử dụng learning rate thấp hơn
optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)

3. Hugging Face Transformers (Dành cho NLP)

Các Pre-trained Models cho NLP:

  • BERT, DistilBERT, RoBERTa
  • GPT-2, GPT-3
  • T5, BART

Triển khai trên SageMaker:

from sagemaker.huggingface import HuggingFace

estimator = HuggingFace(
    entry_point='train.py',
    role=role,
    instance_type='ml.p3.2xlarge',
    transformers_version='4.26',
    pytorch_version='1.13',
    py_version='py39'
)

Bên trong file train.py:

from transformers import BertForSequenceClassification, Trainer, TrainingArguments

# Tải pre-trained BERT
model = BertForSequenceClassification.from_pretrained(
    'bert-base-uncased',
    num_labels=num_classes
)

# Theo mặc định, mọi layers đều trainable (Fine-Tuning toàn bộ)
training_args = TrainingArguments(
    output_dir='./results',
    learning_rate=2e-5,  # Learning rate thấp dành cho fine-tuning
    num_train_epochs=3,
    per_device_train_batch_size=16
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset
)

trainer.train()

1.6 Thuật toán Image Classification tích hợp sẵn của SageMaker #exam-tip

Tự động sử dụng Transfer Learning:

Thuật toán SageMaker Image Classification:

  • Được xây dựng dựa trên kiến trúc ResNet
  • Đã được pre-trained trên ImageNet
  • Tự động thực hiện transfer learning
  • Hai chế độ:
    • Chế độ Full training: Huấn luyện tất cả các layers (dùng cho tập dữ liệu lớn)
    • Chế độ Transfer learning: Đóng băng các layers đầu (dùng cho tập dữ liệu nhỏ)

Cấu hình:

import sagemaker
from sagemaker import image_uris

# Lấy thuật toán Image Classification tích hợp sẵn
image_uri = image_uris.retrieve('image-classification', region, version='latest')

estimator = sagemaker.estimator.Estimator(
    image_uri,
    role=role,
    instance_type='ml.p3.2xlarge',
    instance_count=1,
    output_path=s3_output
)

# Thiết lập Hyperparameters
estimator.set_hyperparameters(
    num_classes=10,
    num_training_samples=5000,
    use_pretrained_model=1,  # Bật transfer learning (1=có, 0=không)
    epochs=10,
    learning_rate=0.001,
    mini_batch_size=128
)

estimator.fit({'train': s3_train_data, 'validation': s3_val_data})

Siêu tham số cốt lõi (Key Hyperparameter): #exam-tip

  • use_pretrained_model
    • 1 - Dùng Transfer learning (mặc định, khuyên dùng cho dữ liệu nhỏ)
    • 0 - Train từ đầu - From scratch (chỉ dùng cho dữ liệu cực lớn)

1.7 Best Practices khi Fine-Tuning #exam-tip

1. Tốc độ học (Learning Rate) #important

  • Tối quan trọng: Bắt buộc phải dùng learning rate thấp hơn so với khi train từ đầu
  • Feature Extraction: LR bình thường (0.001-0.01)
  • Fine-Tuning: LR thấp hơn từ 10-100 lần (0.00001-0.0001)
  • Lý do: Tránh phá hỏng (destroy) các pre-trained weights quý giá

2. Tiền xử lý dữ liệu (Data Preprocessing)

  • Phải khớp với cách tiền xử lý của pre-trained model
  • Ví dụ: Các mô hình ImageNet yêu cầu ảnh đầu vào phải được chuẩn hóa (normalized) với một mean/std cụ thể
  • Tuyệt đối không thay đổi: Kích thước đầu vào (Input size), phương pháp chuẩn hóa (normalization method)

3. Chiến lược Đóng băng Layer (Layer Freezing Strategy)

  • Các layers đầu: Đặc trưng cấp thấp (góc cạnh, vân bề mặt) - thường sẽ đóng băng (freeze)
  • Các layers sau: Đặc trưng cấp cao (các bộ phận của vật thể) - mở khóa (unfreeze) để fine-tune
  • Layer cuối cùng: Luôn luôn thay thế và train lại

4. Mở khóa dần dần (Gradual Unfreezing) (Kỹ thuật nâng cao)

  • Bắt đầu bằng việc đóng băng base, chỉ train layer cuối
  • Mở khóa block cuối cùng, train tiếp
  • Mở khóa dần dần thêm nhiều layers
  • Lợi ích: Quá trình huấn luyện ổn định (stable) hơn

5. Tăng cường dữ liệu (Data Augmentation)

  • Áp dụng augmentation mạnh tay hơn đối với các tập dữ liệu nhỏ
  • Giúp ngăn ngừa overfitting trong quá trình fine-tuning
  • Ví dụ: xoay (rotation), lật (flip), chỉnh màu (color jitter), cắt ngẫu nhiên (random crops)

1.8 Kịch bản bài thi #important #exam-tip

Tình huống Giải pháp Lý do
“Phân loại 500 hình ảnh vào 10 danh mục tùy chỉnh” Dùng Transfer learning (Feature Extraction) với ResNet/VGG Dữ liệu quá nhỏ, tận dụng pre-trained ImageNet features
“Train từ đầu (from scratch) thất bại với 1000 ảnh” Chuyển sang dùng transfer learning Không đủ dữ liệu để train từ đầu
“Ảnh y tế đặc thù, ImageNet transfer learning không hiệu quả” Fine-tune các layers phía sau hoặc train from scratch Miền dữ liệu quá khác biệt so với ImageNet
“Giảm chi phí huấn luyện cho bài toán phân loại ảnh” Sử dụng transfer learning thay vì train từ đầu Huấn luyện nhanh hơn = chi phí rẻ hơn
“Phân loại cảm xúc văn bản (nhưng có ít dữ liệu gán nhãn)” Fine-tune pre-trained BERT Đây là Transfer learning dành cho NLP
“Cần dựng bản mẫu phân loại ảnh cực nhanh” Dùng SageMaker Image Classification với use_pretrained_model=1 Đã tích hợp sẵn transfer learning
“10,000 ảnh, miền dữ liệu tương tự ImageNet” Fine-tune ResNet (mở khóa các layers phía sau) Dữ liệu cỡ vừa, miền tương tự
“100,000 ảnh, miền dữ liệu cực kỳ khác biệt” Train từ đầu (from scratch) Dữ liệu khổng lồ, miền độc nhất

Các dạng câu hỏi chắc chắn gặp trong bài thi:

  1. “Dữ liệu huấn luyện có hạn, làm sao để cải thiện mô hình?” → Trả lời: Transfer learning (tận dụng pre-trained models)

  2. “Việc huấn luyện mô hình tốn quá nhiều chi phí?” → Trả lời: Transfer learning (nhanh hơn, rẻ hơn so với train từ đầu)

  3. “Nên dùng pre-trained model nào cho hình ảnh?” → Trả lời: ResNet, VGG, Inception (Các mô hình pre-trained trên ImageNet)

  4. “Làm thế nào để điều chỉnh mô hình ImageNet cho các classes tùy chỉnh?” → Trả lời: Thay thế layer cuối, đóng băng phần base, chỉ train layer cuối

  5. “Train từ đầu bị overfitting do tập dữ liệu nhỏ?” → Trả lời: Chuyển sang transfer learning (Chế độ Feature Extraction)

1.9 Transfer Learning vs Train từ đầu (Training from Scratch) #exam-tip

Tiêu chí Transfer Learning Training from Scratch (Từ đầu)
Dữ liệu yêu cầu Vài trăm - Vài ngàn Hàng chục ngàn - Hàng triệu
Thời gian huấn luyện Tính bằng giờ Tính bằng ngày - tuần
Chi phí Rẻ ($) Cực đắt ($$$)
Hiệu năng (Dữ liệu nhỏ) Rất cao Rất tệ (bị overfits)
Hiệu năng (Dữ liệu khổng lồ) Cao Rất cao
Độ tương đồng miền Bắt buộc phải tương đồng Bất kỳ miền nào cũng được
Mặc định trong bài thi Được khuyên dùng trong hầu hết tình huống Chỉ chọn khi có tập dữ liệu khổng lồ

Mẹo làm bài: #important

  • Nếu đề bài nói tập dữ liệu nhỏ (small) (< 10K) → Đáp án gần như chắc chắn là Transfer learning
  • Nếu câu hỏi nhắc đến dữ liệu có hạn (limited data) hoặc tối ưu chi phí (cost optimization) → Chọn Transfer learning
  • Nếu câu hỏi nhắc đến việc cần kết quả nhanh (quick results) → Chọn Transfer learning
  • Chỉ chọn from scratch khi đề bài nói rõ ràng: “tập dữ liệu khổng lồ (massive dataset)” hoặc “miền dữ liệu độc nhất (completely unique domain)”

2. SageMaker JumpStart #important #exam-tip