Grid search và Random search

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

Training và hyperparameter tuning - Grid search & 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 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:

  1. Xác định một tập hợp các giá trị cho mỗi hyperparameter

  2. Tạo ra tất cả các tổ hợp có thể từ các giá trị này

  3. Huấn luyện và đánh giá mô hình với mỗi tổ hợp

  4. Chọn tổ hợp hyperparameter mang lại hiệu suất tốt nhất

  • Đầ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

  • 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 đượ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.

  1. Xác định một phân phối xác suất cho mỗi hyperparameter

  2. 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

  3. Huấn luyện và đánh giá mô hình với mỗi tổ hợp

  4. Chọn tổ hợp hyperparameter mang lại hiệu suất tốt nhất

  • 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

  • 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_)
Tiêu chí
Grid Search
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 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 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:

  1. 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ử

  2. 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

  3. 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ả

  4. 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

  1. Bergstra, J., & Bengio, Y. (2012). Random search for hyper-parameter optimization. Journal of Machine Learning Research, 13, 281-305.

  2. Scikit-learn: Machine Learning in Python, Pedregosa et al., JMLR 12, pp. 2825-2830, 2011.

  3. Snoek, J., Larochelle, H., & Adams, R. P. (2012). Practical Bayesian optimization of machine learning algorithms. Advances in neural information processing systems, 25.

Last updated