Grid search và Random search
Training và hyperparameter tuning - Grid search và Random search

Hyperparameter tuning là một trong những bước quan trọng nhất trong quá trình xây dựng và tối ưu hóa mô hình machine learning. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về hai phương pháp tìm kiếm hyperparameter phổ biến: Grid Search và Random Search.
Hyperparameter là gì?
Hyperparameter là các tham số được thiết lập trước khi quá trình training mô hình bắt đầu. Khác với các parameter được học trong quá trình training, hyperparameter không được học từ dữ liệu mà phải được chúng ta xác định. Một số ví dụ điển hình về hyperparameter bao gồm:
Learning rate trong các thuật toán gradient descent
Số lượng cây trong Random Forest
Độ sâu tối đa của cây quyết định
Số lượng layer và neuron trong mạng neural
Hệ số regularization
Batch size
Số lượng epoch
Việc lựa chọn hyperparameter thích hợp có ảnh hưởng rất lớn đến hiệu suất của mô hình. Tuy nhiên, không có một bộ hyperparameter chuẩn nào phù hợp với mọi vấn đề, vì vậy chúng ta cần các phương pháp tìm kiếm hiệu quả.
Grid Search
Grid Search là phương pháp truyền thống và dễ hiểu nhất để tìm kiếm hyperparameter tối ưu. Phương pháp này hoạt động bằng cách:
Xác định một tập hợp các giá trị cho mỗi hyperparameter
Tạo ra tất cả các tổ hợp có thể từ các giá trị này
Huấn luyện và đánh giá mô hình với mỗi tổ hợp
Chọn tổ hợp hyperparameter mang lại hiệu suất tốt nhất
Ưu điểm của Grid Search:
Đầy đủ: Kiểm tra tất cả các tổ hợp có thể trong không gian tìm kiếm đã định nghĩa
Dễ triển khai: Thuật toán đơn giản, dễ hiểu và triển khai
Khả năng song song hóa: Các tổ hợp hyperparameter có thể được đánh giá song song
Nhược điểm của Grid Search:
Hiệu quả kém khi số lượng hyperparameter lớn: Số lượng tổ hợp tăng theo cấp số nhân với số lượng hyperparameter (curse of dimensionality)
Tài nguyên tính toán cao: Đòi hỏi nhiều tài nguyên vì phải thử tất cả các tổ hợp
Không hiệu quả về thời gian: Nhiều tổ hợp hyperparameter không mang lại cải thiện đáng kể
Code ví dụ với scikit-learn:
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# Tạo dữ liệu mẫu
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Định nghĩa mô hình
model = RandomForestClassifier()
# Định nghĩa grid các hyperparameter
param_grid = {
'n_estimators': [100, 200, 300],
'max_depth': [None, 5, 10, 15],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 4]
}
# Thực hiện Grid Search với cross-validation
grid_search = GridSearchCV(
estimator=model,
param_grid=param_grid,
cv=5,
scoring='accuracy',
verbose=1,
n_jobs=-1
)
# Fit Grid Search
grid_search.fit(X_train, y_train)
# In ra hyperparameter tốt nhất
print("Best hyperparameters:", grid_search.best_params_)
print("Best accuracy:", grid_search.best_score_)Random Search
Random Search được đề xuất bởi Bergstra và Bengio năm 2012 như một giải pháp thay thế hiệu quả hơn cho Grid Search. Thay vì thử tất cả các tổ hợp, Random Search lấy mẫu ngẫu nhiên từ phân phối của các hyperparameter.
Xác định một phân phối xác suất cho mỗi hyperparameter
Lấy mẫu ngẫu nhiên một số lượng nhất định các tổ hợp từ các phân phối này
Huấn luyện và đánh giá mô hình với mỗi tổ hợp
Chọn tổ hợp hyperparameter mang lại hiệu suất tốt nhất
Ưu điểm của Random Search:
Hiệu quả với không gian hyperparameter lớn: Khám phá không gian tìm kiếm hiệu quả hơn Grid Search
Tiết kiệm tài nguyên: Có thể tìm được hyperparameter tốt với số lần thử ít hơn
Linh hoạt trong việc định nghĩa phân phối: Có thể sử dụng nhiều loại phân phối khác nhau cho các hyperparameter
Nhược điểm của Random Search:
Không đảm bảo tìm được giải pháp tối ưu toàn cục: Do tính ngẫu nhiên, có thể bỏ qua một số tổ hợp tốt
Khó xác định số lượng lặp tối ưu: Cần cân bằng giữa số lượng lặp và hiệu suất tìm kiếm
Code ví dụ với scikit-learn:
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
from scipy.stats import randint, uniform
# Định nghĩa mô hình
model = RandomForestClassifier()
# Định nghĩa phân phối cho các hyperparameter
param_distributions = {
'n_estimators': randint(100, 500),
'max_depth': randint(5, 30),
'min_samples_split': randint(2, 20),
'min_samples_leaf': randint(1, 10),
'max_features': uniform(0.1, 0.9)
}
# Thực hiện Random Search với cross-validation
random_search = RandomizedSearchCV(
estimator=model,
param_distributions=param_distributions,
n_iter=100, # Số lượng tổ hợp sẽ thử
cv=5,
scoring='accuracy',
verbose=1,
n_jobs=-1,
random_state=42
)
# Fit Random Search
random_search.fit(X_train, y_train)
# In ra hyperparameter tốt nhất
print("Best hyperparameters:", random_search.best_params_)
print("Best accuracy:", random_search.best_score_)So sánh Grid Search và Random Search
Hiệu quả với không gian lớn
Thấp
Cao
Tài nguyên tính toán
Cao
Trung bình
Khả năng tìm kiếm toàn diện
Cao (trong không gian đã định nghĩa)
Trung bình
Khả năng song song hóa
Cao
Cao
Phù hợp với số lượng hyperparameter
Ít (≤ 3)
Nhiều (> 3)
Khi nào nên sử dụng Grid Search?
Khi số lượng hyperparameter cần tối ưu ít (thường ≤ 3)
Khi bạn đã có hiểu biết tốt về phạm vi giá trị tối ưu
Khi tài nguyên tính toán không phải là vấn đề
Khi cần tìm kiếm đầy đủ và có thể tái tạo kết quả chính xác
Khi nào nên sử dụng Random Search?
Khi số lượng hyperparameter lớn (> 3)
Khi bạn không chắc chắn về phạm vi giá trị tối ưu
Khi tài nguyên tính toán bị giới hạn
Khi một số hyperparameter quan trọng hơn các hyperparameter khác
Một số phương pháp tìm kiếm hyperparameter khác
Ngoài Grid Search và Random Search, có nhiều phương pháp tìm kiếm hyperparameter tiên tiến khác:
Bayesian Optimization: Sử dụng mô hình xác suất để dự đoán hiệu suất của các tổ hợp hyperparameter chưa được thử
Genetic Algorithms: Sử dụng các nguyên lý tiến hóa để tìm kiếm tổ hợp hyperparameter tối ưu
Hyperband: Tối ưu hóa việc phân bổ tài nguyên bằng cách loại bỏ sớm các cấu hình kém hiệu quả
Population-based Training (PBT): Kết hợp tìm kiếm hyperparameter và training trong một quá trình động
Kết luận
Việc lựa chọn giữa Grid Search và Random Search phụ thuộc vào bài toán cụ thể, số lượng hyperparameter, và tài nguyên tính toán có sẵn. Trong thực tế, một chiến lược phổ biến là bắt đầu với Random Search để xác định vùng có triển vọng trong không gian hyperparameter, sau đó sử dụng Grid Search để tinh chỉnh trong vùng đó.
Cuối cùng, hãy nhớ rằng hyperparameter tuning chỉ là một phần trong quá trình xây dựng mô hình machine learning. Feature engineering, lựa chọn mô hình, và chất lượng dữ liệu thường có ảnh hưởng lớn hơn đến hiệu suất cuối cùng.
Tài liệu tham khảo
Bergstra, J., & Bengio, Y. (2012). Random search for hyper-parameter optimization. Journal of Machine Learning Research, 13, 281-305.
Scikit-learn: Machine Learning in Python, Pedregosa et al., JMLR 12, pp. 2825-2830, 2011.
Snoek, J., Larochelle, H., & Adams, R. P. (2012). Practical Bayesian optimization of machine learning algorithms. Advances in neural information processing systems, 25.
Last updated