Hướng dẫn Tinh chỉnh siêu tham số cho Ultralytics YOLO#
Tinh chỉnh siêu tham số trong Ultralytics YOLO là quy trình tìm kiếm tự động, lặp lại nhằm tối ưu các thiết lập — chẳng hạn như learning rate, trọng số loss và cường độ augmentation — để tối đa hóa các chỉ số hiệu suất của machine learning model như accuracy, precision và recall. Thay vì kiểm thử thủ công các giá trị này, Ultralytics YOLO khám phá không gian siêu tham số bằng genetic algorithm, qua đó đột biến và đánh giá các cấu hình ứng viên trong nhiều lần training ngắn.
Watch: How to Tune Hyperparameters for Better Model Performance 🚀
Siêu tham số là gì?#
Siêu tham số là các thiết lập cấp cao, mang tính cấu trúc của algorithm. Chúng được thiết lập trước giai đoạn training và không thay đổi trong suốt giai đoạn này. Dưới đây là một số siêu tham số thường được tinh chỉnh trong Ultralytics YOLO:
- Learning Rate
lr0: Xác định kích thước bước ở mỗi iteration khi tiến về cực tiểu trong loss function. - Batch Size
batch: Số lượng image được xử lý đồng thời trong một forward pass. - Số Epoch
epochs: Một epoch là một lượt forward và backward hoàn chỉnh qua toàn bộ training example. - Chi tiết kiến trúc: Chẳng hạn như số lượng channel, số layer, loại activation function, v.v. Các thiết lập này nằm trong model YAML configuration thay vì training argument.
Trong bốn mục này, chỉ learning rate nằm trong không gian tìm kiếm mặc định: batch, epochs và kiến trúc được giữ nguyên. Tuner cũng đột biến schedule, loss gain và augmentation được liệt kê bên dưới.
Để xem danh sách đầy đủ các augmentation hyperparameter được sử dụng trong YOLO26, hãy tham khảo trang cấu hình.
Tiến hóa và đột biến genetic#
Ultralytics YOLO sử dụng genetic algorithm để tối ưu siêu tham số. Genetic algorithm được lấy cảm hứng từ cơ chế chọn lọc tự nhiên và di truyền học.
- Selection: Mỗi iteration chọn một trong tối đa chín cấu hình có fitness cao nhất, với trọng số dựa trên fitness. Sau 30 kết quả, 20% kết quả tốt nhất trong toàn bộ kết quả (tối đa 30 kết quả) cũng ước tính covariance của parameter, với mức ảnh hưởng tăng lên khi bằng chứng từ các cấu hình elite tích lũy.
- Mutation: Mỗi iteration đột biến khoảng một nửa số parameter bằng các bước Gaussian được chuẩn hóa theo phạm vi tìm kiếm của chúng. Khi covariance hoạt động, một phần được tính theo confidence, tối đa 40%, sử dụng các bước tương quan; reflection đưa các bước đó trở lại trong giới hạn mà không tích lũy các giá trị bị cắt. Khi các trial tích lũy nhưng không có cải thiện, kích thước bước thu hẹp tuyến tính tối đa 20% trong 25 trial và được reset khi tìm thấy kết quả mới tốt nhất. Iteration 1 không có parent và sử dụng training hyperparameter mặc định làm baseline.
Chuẩn bị tinh chỉnh siêu tham số#
Trước khi bắt đầu quy trình tinh chỉnh, điều quan trọng là:
- Xác định metric: Tuner tích hợp sẵn (
use_ray=False) xếp hạng trial theo điểmfitnesscủa task, trong khiuse_ray=Truesử dụng metric của task. Hãy xác định các metric phụ cần kiểm tra, chẳng hạn như AP50 hoặc F1-score. - Thiết lập ngân sách tuning: Xác định lượng tài nguyên tính toán bạn sẵn sàng phân bổ. Tinh chỉnh siêu tham số có thể tiêu tốn nhiều tài nguyên tính toán.
Vòng lặp tuning hoạt động như thế nào#
Trong mỗi iteration, tuner tích hợp sẵn lặp lại vòng lặp sau:
- Khởi tạo siêu tham số — bắt đầu từ một baseline hợp lý, có thể là hyperparameter mặc định do Ultralytics YOLO thiết lập hoặc các giá trị dựa trên kiến thức domain hay những experiment trước đó.
- Đột biến siêu tham số —
Tunerclass tự động tạo một bộ siêu tham số mới từ bộ hiện có bằng method_mutate. - Training model — training bằng các siêu tham số đã đột biến, sau đó đánh giá hiệu suất training bằng các metric đã chọn.
- Đánh giá model — quy trình đánh giá tạo ra fitness score của iteration, được so sánh với các iteration trước để xác định liệu các siêu tham số hiện tại có cải thiện hay không.
- Ghi log kết quả — ghi lại cả performance metric và các siêu tham số tương ứng để tham khảo sau này. Ultralytics YOLO tự động lưu các kết quả này ở định dạng NDJSON.
- Lặp lại — tiếp tục cho đến khi đạt số iteration đã đặt, trong đó mỗi iteration xây dựng dựa trên kiến thức thu được từ các lần chạy trước. Tuner tích hợp sẵn chạy toàn bộ
iterations; Ray Tune báo cáo metric sau mỗi fit epoch, cho phép ASHA dừng các trial yếu sau grace period.
Iteration và kích thước population#
Với tuner tích hợp sẵn (use_ray=False), iterations kiểm soát tổng số trial tuần tự và mặc định là 300. Mỗi trial training một model với một cấu hình siêu tham số — ví dụ, iterations=40 cùng epochs=50 lập lịch 40 lần training độc lập, mỗi lần 50 epoch, chứ không phải một lần chạy 50 epoch với một population riêng gồm 40 ứng viên.
Genetic algorithm tích hợp sẵn không có parameter kích thước population tường minh. Khi đã có các trial trước đó, algorithm chọn tối đa chín cấu hình có fitness cao nhất và đột biến một ứng viên trong mỗi iteration.
Để chạy trial song song hoặc sử dụng các chiến lược tìm kiếm nâng cao hơn, hãy đặt use_ray=True để sử dụng Ray Tune. Ray Tune sử dụng cùng giá trị mặc định 300 trial và nhận iterations dưới dạng num_samples. Xem hướng dẫn tích hợp Ray Tune để biết thêm chi tiết.
Không gian tìm kiếm mặc định#
Bảng sau liệt kê các parameter trong không gian tìm kiếm mặc định để tinh chỉnh siêu tham số trong YOLO26. Mỗi parameter có một phạm vi giá trị cụ thể được định nghĩa bởi tuple (min, max).
| Parameter | Kiểu | Phạm vi giá trị | Mô tả |
|---|---|---|---|
lr0 | float | (1e-5, 1e-2) | Learning rate ban đầu khi bắt đầu training. Giá trị thấp hơn giúp training ổn định hơn nhưng hội tụ chậm hơn |
lrf | float | (0.01, 1.0) | Hệ số learning rate cuối cùng dưới dạng phân số của lr0. Kiểm soát mức độ learning rate giảm trong quá trình training |
momentum | float | (0.7, 0.98) | Hệ số momentum của SGD. Giá trị cao hơn giúp duy trì hướng gradient nhất quán và có thể tăng tốc độ hội tụ |
weight_decay | float | (0.0, 0.001) | Hệ số regularization L2 để ngăn overfitting. Giá trị lớn hơn áp dụng regularization mạnh hơn |
warmup_epochs | float | (0.0, 5.0) | Số epoch cho warmup learning rate tuyến tính. Giúp ngăn tình trạng training không ổn định ở giai đoạn đầu |
warmup_momentum | float | (0.0, 0.95) | Momentum ban đầu trong giai đoạn warmup. Tăng dần đến giá trị momentum cuối cùng |
box | float | (1.0, 20.0) | Trọng số của bounding box loss trong total loss function. Cân bằng giữa box regression và classification |
cls | float | (0.1, 4.0) | Trọng số classification loss trong total loss function. Giá trị cao hơn nhấn mạnh việc dự đoán class chính xác |
cls_pw | float | (0.0, 1.0) | Lũy thừa weighting của class để xử lý mất cân bằng class. Giá trị cao hơn tăng trọng số cho các class hiếm |
dfl | float | (0.4, 12.0) | Trọng số của regression term đối với khoảng cách của box. DFL-free YOLO26 áp dụng gain này cho L1 loss trên khoảng cách box đã chuẩn hóa; giá trị cao hơn nhấn mạnh localization chính xác |
hsv_h | float | (0.0, 0.1) | Phạm vi augmentation hue ngẫu nhiên trong không gian màu HSV. Giúp model tổng quát hóa trước các biến thiên màu sắc |
hsv_s | float | (0.0, 0.9) | Phạm vi augmentation saturation ngẫu nhiên trong không gian HSV. Mô phỏng các điều kiện chiếu sáng khác nhau |
hsv_v | float | (0.0, 0.9) | Phạm vi augmentation value (độ sáng) ngẫu nhiên. Giúp model xử lý các mức phơi sáng khác nhau |
degrees | float | (0.0, 45.0) | Mức augmentation rotation tối đa theo độ. Giúp model bất biến với hướng của object |
translate | float | (0.0, 0.9) | Mức augmentation translation tối đa theo tỷ lệ kích thước image. Cải thiện độ bền vững trước vị trí của object |
scale | float | (0.0, 0.95) | Phạm vi augmentation scaling ngẫu nhiên. Giúp model phát hiện object ở các kích thước khác nhau |
shear | float | (0.0, 10.0) | Mức augmentation shear tối đa theo độ. Thêm các biến dạng giống phối cảnh vào training image |
perspective | float | (0.0, 0.001) | Phạm vi augmentation perspective ngẫu nhiên. Mô phỏng các góc quan sát khác nhau |
flipud | float | (0.0, 1.0) | Xác suất lật image theo chiều dọc trong training. Hữu ích cho imagery từ trên cao/trên không |
fliplr | float | (0.0, 1.0) | Xác suất lật image theo chiều ngang. Giúp model bất biến với hướng của object |
bgr | float | (0.0, 1.0) | Xác suất sử dụng augmentation BGR, hoán đổi các channel màu. Có thể giúp model bất biến với màu sắc |
mosaic | float | (0.0, 1.0) | Xác suất sử dụng augmentation mosaic, kết hợp 4 image. Đặc biệt hữu ích cho phát hiện object nhỏ |
mixup | float | (0.0, 1.0) | Xác suất sử dụng augmentation mixup, trộn hai image. Có thể cải thiện độ bền vững của model |
cutmix | float | (0.0, 1.0) | Xác suất sử dụng augmentation cutmix. Kết hợp các vùng image đồng thời duy trì các đặc trưng cục bộ |
copy_paste | float | (0.0, 1.0) | Trong mode flip, đây là tỷ lệ object đủ điều kiện được sao chép; trong mode mixup, đây cũng là xác suất áp dụng augmentation |
close_mosaic | int | (0.0, 10.0) | Tắt mosaic trong N epoch cuối để ổn định training trước khi hoàn tất. Được đột biến dưới dạng float, sau đó làm tròn thành số nguyên epoch |
Ví dụ về không gian tìm kiếm tùy chỉnh#
Sau đây là cách định nghĩa không gian tìm kiếm và sử dụng method model.tune() để dùng class Tuner tinh chỉnh siêu tham số cho YOLO26n trên COCO8 trong 30 epoch với optimizer AdamW, đồng thời bỏ qua việc vẽ biểu đồ, checkpoint và validation ngoại trừ epoch cuối để tuning nhanh hơn.
Ví dụ này chỉ nhằm minh họa. Các siêu tham số thu được từ những lần tuning ngắn hoặc quy mô nhỏ hiếm khi tối ưu cho training thực tế. Trong thực tế, tuning nên được thực hiện với các thiết lập tương tự training đầy đủ — bao gồm dataset, epoch và augmentation tương đương — để bảo đảm kết quả đáng tin cậy và có thể chuyển giao. Tuning nhanh có thể làm các parameter thiên về hội tụ nhanh hơn hoặc thu được lợi ích validation ngắn hạn nhưng không tổng quát hóa.
from ultralytics import YOLO
# Initialize the YOLO model
model = YOLO("yolo26n.pt")
# Define search space
search_space = {
"lr0": (1e-5, 1e-2),
"degrees": (0.0, 45.0),
}
# Tune hyperparameters on COCO8 for 30 epochs
model.tune(
data="coco8.yaml",
epochs=30,
iterations=300,
optimizer="AdamW",
space=search_space,
plots=False,
save=False,
val=False,
)Tiếp tục một phiên tinh chỉnh siêu tham số bị gián đoạn#
Bạn có thể tiếp tục một phiên tinh chỉnh siêu tham số bị gián đoạn bằng cách truyền resume=True. Bạn có thể tùy chọn truyền directory name được sử dụng dưới runs/{task} để tiếp tục. Nếu không có name, hệ thống sẽ tiếp tục directory có tên chính xác là tune, đây là tên mặc định chứ không phải session chạy gần đây nhất; vì vậy hãy truyền name cho mọi lần chạy được bắt đầu bằng tên tùy chỉnh. Bạn cũng cần cung cấp tất cả training argument trước đó, bao gồm data, epochs, iterations và space.
from ultralytics import YOLO
# Define a YOLO model
model = YOLO("yolo26n.pt")
# Define search space
search_space = {
"lr0": (1e-5, 1e-2),
"degrees": (0.0, 45.0),
}
# Resume previous run
results = model.tune(data="coco8.yaml", epochs=50, iterations=300, space=search_space, resume=True)
# Resume tuning run with name 'tune_exp'
results = model.tune(data="coco8.yaml", epochs=50, iterations=300, space=search_space, name="tune_exp", resume=True)Kết quả#
Sau khi hoàn tất thành công quy trình tinh chỉnh siêu tham số, bạn sẽ nhận được một số file và directory chứa các kết quả tuning. Dưới đây là mô tả từng mục:
Cấu trúc file#
Dưới đây là cấu trúc directory của kết quả. Các directory training như train/ và train-2/ chứa từng iteration tuning riêng lẻ, tức là một model được training với một bộ siêu tham số. Directory tune/ chứa kết quả tuning từ toàn bộ các lần training model riêng lẻ:
runs/
└── detect/
├── train/
├── train-2/
├── ...
└── tune/
├── best_hyperparameters.yaml
├── tune_fitness.png
├── tune_results.ndjson
├── tune_scatter_plots.png
└── weights/
├── last.pt
└── best.ptMô tả file#
best_hyperparameters.yaml#
File YAML này chứa các siêu tham số có hiệu suất tốt nhất được tìm thấy trong quy trình tuning. Bạn có thể sử dụng file này để khởi tạo các lần training sau với những thiết lập đã tối ưu.
-
Định dạng: YAML
-
Cách sử dụng: Kết quả siêu tham số
-
Ví dụ:
# 558/900 iterations complete ✅ (45536.81s) # Results saved to /usr/src/ultralytics/runs/detect/tune # Best fitness=0.64297 observed at iteration 498 # Best fitness metrics are {'metrics/precision(B)': 0.87247, 'metrics/recall(B)': 0.71387, 'metrics/mAP50(B)': 0.79106, 'metrics/mAP50-95(B)': 0.62651, 'val/box_loss': 2.79884, 'val/cls_loss': 2.72386, 'val/l1_loss': 0.68503, 'fitness': 0.64297} # Best fitness model is /usr/src/ultralytics/runs/detect/tune/weights # Best fitness hyperparameters are printed below. lr0: 0.00269 lrf: 0.00288 momentum: 0.73375 weight_decay: 0.00015 warmup_epochs: 1.22935 warmup_momentum: 0.1525 box: 18.27875 cls: 1.32899 dfl: 0.56016 hsv_h: 0.01148 hsv_s: 0.53554 hsv_v: 0.13636 degrees: 0.0 translate: 0.12431 scale: 0.07643 shear: 0.0 perspective: 0.0 flipud: 0.0 fliplr: 0.08631 mosaic: 0.42551 mixup: 0.0 copy_paste: 0.0
tune_fitness.png#
Đây là biểu đồ thể hiện fitness theo số iteration. Biểu đồ giúp bạn hình dung genetic algorithm hoạt động như thế nào theo thời gian.
- Định dạng: PNG
- Cách sử dụng: Trực quan hóa hiệu suất
Biểu đồ bao gồm:
- Một marker cho mỗi iteration trên mỗi dataset, vì vậy lần chạy với một dataset hiển thị một điểm cho mỗi iteration, còn lần chạy với nhiều dataset hiển thị một điểm cho mỗi dataset trong mỗi iteration.
- Một đường "trung bình đã làm mượt" dạng chấm được tính bằng Gaussian smoothing (
sigma=3) trên các giá trị fitness cấp cao nhất theo từng iteration.
tune_results.ndjson#
Một file NDJSON chứa kết quả chi tiết của từng iteration tuning. Mỗi dòng là một JSON object với fitness aggregate, các siêu tham số được tuning và metric theo từng dataset. Tuning một dataset và nhiều dataset sử dụng cùng định dạng file.
- Định dạng: NDJSON
- Cách sử dụng: Theo dõi kết quả theo từng iteration.
- Ví dụ:
Dưới đây là một ví dụ được định dạng đẹp để dễ đọc; trong file .ndjson thực tế, mỗi object được lưu trên một dòng duy nhất.
{
"iteration": 1,
"fitness": 0.48628,
"hyperparameters": {
"lr0": 0.01,
"lrf": 0.01,
"momentum": 0.937,
"weight_decay": 0.0005
},
"datasets": {
"coco8": {
"metrics/precision(B)": 0.65666,
"metrics/recall(B)": 0.85,
"metrics/mAP50(B)": 0.85086,
"metrics/mAP50-95(B)": 0.64104,
"val/box_loss": 1.57958,
"val/cls_loss": 1.04986,
"val/l1_loss": 1.32641,
"fitness": 0.64104
},
"coco8-grayscale": {
"metrics/precision(B)": 0.6582,
"metrics/recall(B)": 0.51667,
"metrics/mAP50(B)": 0.59106,
"metrics/mAP50-95(B)": 0.33152,
"val/box_loss": 1.95424,
"val/cls_loss": 1.64059,
"val/l1_loss": 1.70226,
"fitness": 0.33152
}
},
"save_dirs": {
"coco8": "runs/detect/coco8",
"coco8-grayscale": "runs/detect/coco8-grayscale"
}
}fitness cấp cao nhất là trung bình số học của các giá trị fitness theo từng dataset. Với tuning một dataset, dict datasets có một entry, trong đó fitness bằng fitness cấp cao nhất. Mỗi iteration hoàn tất được ghi lại bằng một JSON object. Các path save_dirs thực tế là path tuyệt đối; chúng được viết tắt ở trên để dễ đọc.
tune_scatter_plots.png#
File này chứa các scatter plot được tạo từ tune_results.ndjson, giúp bạn hình dung mối quan hệ giữa các siêu tham số khác nhau và performance metric. Mutation sử dụng phạm vi đã cấu hình của từng siêu tham số, vì vậy các giá trị có thể phát triển từ những giá trị mặc định bằng không như degrees và shear.
- Định dạng: PNG
- Cách sử dụng: Phân tích dữ liệu khám phá
weights/#
Directory này chứa các model PyTorch đã lưu từ iteration có fitness tốt nhất của lần chạy tuning. Cả hai file đều đến từ cùng iteration đó:
last.pt: last.pt là weights từ epoch cuối cùng của training.best.pt: weights best.pt của iteration đạt fitness score tốt nhất.
Với các kết quả này, bạn có thể đưa ra quyết định có cơ sở hơn cho những lần training và phân tích model sau này.
Kết luận#
Tinh chỉnh siêu tham số trong Ultralytics YOLO vừa dễ khởi chạy vừa mạnh mẽ ở bên trong, sử dụng selection có trọng số theo fitness và mutation được chuẩn hóa theo phạm vi trong genetic algorithm. Thực hiện theo vòng lặp được nêu trong hướng dẫn này cho phép bạn tinh chỉnh model một cách có hệ thống để đạt hiệu suất tốt hơn, sau đó tái sử dụng best_hyperparameters.yaml nhằm khởi tạo các lần training sau. Để mở rộng tuning trên các trial song song và algorithm tìm kiếm nâng cao hơn, hãy tiếp tục với hướng dẫn tích hợp Ray Tune, hoặc chạy các job được quản lý với hyperparameter có thể cấu hình và theo dõi metric theo thời gian thực trên Ultralytics Platform thông qua cloud training.
Đối với các thiết lập không được argument nào cung cấp, chẳng hạn learning rate theo từng layer hoặc fitness metric tùy chỉnh, hãy subclass trainer. Để có thêm thông tin chuyên sâu, hãy khám phá source code của Tuner class. Nếu có câu hỏi hoặc yêu cầu feature, hãy liên hệ qua GitHub hoặc Discord.
FAQ#
Đặt giá trị ban đầu bằng parameter
lr0— các giá trị phổ biến nằm trong khoảng từ0.001đến0.01— sau đó để tuning đột biến parameter này nhằm tìm giá trị tối ưu. Bạn có thể tự động hóa việc này bằng methodmodel.tune(). Ví dụ:Ví dụfrom ultralytics import YOLO # Initialize the YOLO model model = YOLO("yolo26n.pt") # Tune hyperparameters on COCO8 for 30 epochs model.tune(data="coco8.yaml", epochs=30, iterations=300, optimizer="AdamW", plots=False, save=False, val=False)Để biết thêm chi tiết, hãy xem trang cấu hình Ultralytics YOLO.
Các thuật toán di truyền trong Ultralytics YOLO26 cung cấp một phương pháp mạnh mẽ để khám phá không gian siêu tham số, từ đó giúp tối ưu hóa hiệu năng model ở mức cao. Các lợi ích chính bao gồm:
- Tìm kiếm hiệu quả: Phương pháp lựa chọn có trọng số theo độ thích nghi giữ lại các cấu hình tốt, trong khi phép đột biến được chuẩn hóa theo phạm vi sẽ khám phá các ứng viên mới.
- Tránh cực tiểu cục bộ: Bằng cách đưa tính ngẫu nhiên vào quá trình, các thuật toán này giúp tránh các cực tiểu cục bộ, đảm bảo khả năng tối ưu hóa toàn cục tốt hơn.
- Các chỉ số hiệu năng: Các thuật toán này thích ứng dựa trên điểm độ thích nghi dành riêng cho tác vụ (mAP50-95 đối với bài toán phát hiện).
Để xem cách các thuật toán di truyền có thể tối ưu hóa siêu tham số, hãy xem hướng dẫn tiến hóa siêu tham số.
Thời gian cần thiết để tinh chỉnh siêu tham số với Ultralytics YOLO phụ thuộc phần lớn vào một số yếu tố, chẳng hạn như kích thước dataset, độ phức tạp của kiến trúc model, số lượng vòng lặp và tài nguyên tính toán khả dụng. Ví dụ, việc tinh chỉnh YOLO26n trên một dataset như COCO8 trong 30 epoch có thể mất từ vài giờ đến vài ngày, tùy thuộc vào phần cứng.
Để quản lý hiệu quả thời gian tinh chỉnh, hãy xác định trước một ngân sách tinh chỉnh rõ ràng, như được trình bày trong Chuẩn bị cho việc tinh chỉnh siêu tham số. Điều này giúp cân bằng việc phân bổ tài nguyên và các mục tiêu tối ưu hóa.
Khi đánh giá hiệu năng model trong quá trình tinh chỉnh siêu tham số trong YOLO, bạn có thể sử dụng một số chỉ số chính:
- AP50: Precision trung bình tại ngưỡng IoU 0.50.
- F1-Score: Trung bình điều hòa của precision và recall.
- Precision và Recall: Các chỉ số riêng lẻ cho biết độ chính xác của model trong việc xác định true positive so với false positive và false negative.
Các chỉ số này giúp bạn hiểu những khía cạnh khác nhau về hiệu năng của model. Hãy tham khảo hướng dẫn các chỉ số hiệu năng của Ultralytics YOLO để có cái nhìn tổng quan toàn diện.
Có, Ultralytics YOLO26 tích hợp với Ray Tune để tối ưu hóa siêu tham số nâng cao. Ray Tune cung cấp các thuật toán tìm kiếm tinh vi như Bayesian Optimization và Hyperband, cùng khả năng thực thi song song để tăng tốc quá trình tinh chỉnh.
Để sử dụng Ray Tune với YOLO26, chỉ cần đặt tham số
use_ray=Truetrong lệnh gọi phương thứcmodel.tune()của bạn. Để biết thêm chi tiết và xem ví dụ, hãy tham khảo hướng dẫn tích hợp Ray Tune.