# Bayesian optimization

<figure><img src="https://616784931-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsJETMq4Jw2ooB00cBKNk%2Fuploads%2F4orGH608NHIJ8xpaklAn%2Fimage.png?alt=media&#x26;token=c4c4e8b9-f7e7-4f44-b725-334e43adcd12" alt=""><figcaption><p>Bayesian optimization</p></figcaption></figure>

### Giới thiệu

Tối ưu hóa Bayesian là một phương pháp tiên tiến để tìm giá trị tối ưu của các hàm phức tạp và tốn kém khi đánh giá. Nó đã trở thành một kỹ thuật nền tảng trong học máy, đặc biệt là cho việc điều chỉnh siêu tham số, thiết kế thực nghiệm, và bất kỳ tình huống nào mà việc đánh giá hàm mục tiêu tốn nhiều chi phí hoặc thời gian.

Không giống như phương pháp tìm kiếm lưới (grid search) hoặc tìm kiếm ngẫu nhiên (random search) lấy mẫu không phân biệt trong không gian tham số, tối ưu hóa Bayesian xây dựng một mô hình xác suất của hàm mục tiêu và sử dụng nó để chọn những điểm triển vọng nhất để đánh giá tiếp theo. Điều này làm cho nó đặc biệt hiệu quả cho việc tối ưu hóa các hàm black-box phức tạp khi chúng ta không có kiến thức rõ ràng về dạng hoặc độ dốc của hàm.

### Các Thành phần Cốt lõi của Tối ưu hóa Bayesian

#### 1. Mô hình Thay thế (Surrogate Model)

Trọng tâm của tối ưu hóa Bayesian là mô hình thay thế, thường là một Quá trình Gaussian (Gaussian Process - GP), mô phỏng hàm mục tiêu. GP không chỉ cung cấp dự đoán mà còn ước tính độ không chắc chắn, điều này rất quan trọng để cân bằng giữa thăm dò và khai thác.

Một Quá trình Gaussian được định nghĩa bởi một hàm trung bình μ(x) và một hàm hiệp phương sai k(x, x′) (còn được gọi là hàm kernel):

f(x) \~ GP(μ(x), k(x, x′))

Các lựa chọn kernel phổ biến bao gồm:

* Kernel hàm cơ sở xuyên tâm (Radial Basis Function - RBF)
* Kernel Matérn
* Kernel tuyến tính

Mô hình thay thế được cập nhật sau mỗi quan sát mới, tinh chỉnh mô phỏng của nó về hàm mục tiêu theo thời gian.

#### 2. Hàm Thu nhận (Acquisition Function)

Hàm thu nhận xác định điểm nào để lấy mẫu tiếp theo bằng cách cân bằng:

* **Khai thác (Exploitation)**: Lấy mẫu tại những điểm mà mô hình thay thế dự đoán có giá trị cao
* **Thăm dò (Exploration)**: Lấy mẫu tại những điểm có độ không chắc chắn cao

Các hàm thu nhận phổ biến bao gồm:

**Cải thiện Kỳ vọng (Expected Improvement - EI)**

EI đo lường mức độ cải thiện kỳ vọng tại một điểm so với giá trị tốt nhất hiện tại (incumbent). Công thức như sau:

EI(x) = E\[max(f(x) - f(x⁺), 0)]

Trong đó, f(x⁺) là giá trị tốt nhất đã quan sát được.

**Giới hạn Tin cậy Trên (Upper Confidence Bound - UCB)**

UCB cân bằng giữa trung bình dự đoán và độ không chắc chắn:

UCB(x) = μ(x) + κσ(x)

Trong đó κ là tham số cân bằng giữa thăm dò và khai thác.

**Entropy Search và Predictive Entropy Search**

Các phương pháp này nhằm giảm thiểu entropy (độ bất định) về vị trí của điểm tối ưu toàn cục.

### Quy trình Tối ưu hóa Bayesian

1. **Khởi tạo**: Bắt đầu với một số điểm đánh giá ban đầu để khởi tạo mô hình thay thế.
2. **Lặp lại**:
   * Cập nhật mô hình surrogate dựa trên tất cả các điểm đã đánh giá.
   * Sử dụng hàm thu nhận để chọn điểm triển vọng nhất tiếp theo.
   * Đánh giá hàm mục tiêu tại điểm được chọn.
3. **Kết thúc**: Dừng sau khi đạt đến số lượng đánh giá tối đa hoặc khi đáp ứng tiêu chí hội tụ.

### Ứng dụng Tối ưu hóa Bayesian

#### Điều chỉnh Siêu tham số trong Học Máy

Tối ưu hóa Bayesian đặc biệt hiệu quả cho việc điều chỉnh siêu tham số mô hình học máy, nơi mỗi lần đánh giá đòi hỏi việc huấn luyện và xác thực một mô hình hoàn chỉnh. Các thư viện như scikit-optimize, Hyperopt, và Optuna triển khai tối ưu hóa Bayesian cho mục đích này.

#### Thiết kế Thực nghiệm

Trong các lĩnh vực như hóa học, vật liệu, và sinh học, tối ưu hóa Bayesian có thể hướng dẫn thiết kế thực nghiệm để tìm các điều kiện tối ưu với số lượng thử nghiệm tối thiểu.

#### Tối ưu hóa Kiến trúc Neural Network

Tìm kiếm kiến trúc neural network tối ưu thường đòi hỏi một không gian tìm kiếm rộng lớn. Tối ưu hóa Bayesian có thể giúp khám phá hiệu quả hơn không gian này.

### Thách thức và Giới hạn

#### Tính toán Mở rộng (Scalability)

Quá trình Gaussian cổ điển có độ phức tạp O(n³) đối với n điểm dữ liệu, làm cho nó trở nên khó khăn cho các vấn đề quy mô lớn. Các phương pháp gần đúng như Sparse Gaussian Processes có thể giúp giảm gánh nặng tính toán này.

#### Không gian Tham số Nhiều chiều

Tối ưu hóa Bayesian có thể gặp khó khăn với không gian tham số nhiều chiều (thường >20 chiều) do "lời nguyền của số chiều" (curse of dimensionality).

#### Chọn lựa Hàm Kernel

Hiệu suất của tối ưu hóa Bayesian phụ thuộc vào việc lựa chọn hàm kernel phù hợp cho vấn đề cụ thể.

### Tiến bộ Gần đây và Hướng Phát triển

#### Tối ưu hóa Multi-objective

Mở rộng tối ưu hóa Bayesian cho các vấn đề có nhiều mục tiêu cạnh tranh.

#### Tối ưu hóa Bayesian với Ràng buộc

Phát triển các phương pháp để xử lý các ràng buộc trong không gian tham số.

#### Chuyển giao Học tập (Transfer Learning)

Sử dụng kiến thức từ các tác vụ trước đó để cải thiện hiệu quả tối ưu hóa.

### Ví dụ Mã Code: Tối ưu hóa Bayesian với Python

```python
import numpy as np
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import Matern
from scipy.optimize import minimize
from scipy.stats import norm

# Hàm mục tiêu (giả định đắt đỏ để đánh giá)
def objective_function(x):
    return -(x[0]**2 + x[1]**2) + 5  # Hàm đơn giản để minh họa, cực đại tại (0,0)

# Hàm thu nhận - Expected Improvement
def expected_improvement(x, gaussian_process, evaluated_points, best_y, exploration_weight=0.01):
    x = x.reshape(-1, 2)
    mu, sigma = gaussian_process.predict(x, return_std=True)
    
    sigma = sigma.reshape(-1, 1)
    
    # Cải thiện kỳ vọng so với điểm tốt nhất hiện tại
    with np.errstate(divide='warn'):
        improvement = mu - best_y - exploration_weight
        Z = improvement / sigma
        ei = improvement * norm.cdf(Z) + sigma * norm.pdf(Z)
        ei[sigma == 0.0] = 0.0
        
    return -ei  # Minimize để tìm tối đa hóa

# Tối ưu hóa Bayesian
def bayesian_optimization(n_iterations, objective, bounds):
    # Khởi tạo dữ liệu
    n_initial_points = 5
    X_sample = np.random.uniform(bounds[0], bounds[1], size=(n_initial_points, 2))
    Y_sample = np.array([objective(x) for x in X_sample])
    
    # Khởi tạo mô hình Gaussian Process
    kernel = Matern(nu=2.5)
    gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=25)
    
    # Vòng lặp tối ưu hóa Bayesian
    for i in range(n_iterations):
        # Cập nhật mô hình GP
        gp.fit(X_sample, Y_sample)
        
        # Tìm điểm tốt nhất hiện tại
        best_idx = np.argmax(Y_sample)
        best_y = Y_sample[best_idx]
        
        # Sử dụng hàm thu nhận để tìm điểm tiếp theo cho đánh giá
        result = minimize(lambda x: expected_improvement(x, gp, X_sample, best_y),
                         x0=np.random.uniform(bounds[0], bounds[1], size=2),
                         bounds=((bounds[0], bounds[1]), (bounds[0], bounds[1])),
                         method='L-BFGS-B')
        
        # Đánh giá điểm mới
        new_x = result.x.reshape(1, 2)
        new_y = objective(new_x)
        
        # Thêm vào tập dữ liệu đã đánh giá
        X_sample = np.vstack((X_sample, new_x))
        Y_sample = np.append(Y_sample, new_y)
        
        print(f"Iteration {i+1}: Best f(x) = {np.max(Y_sample)}, at x = {X_sample[np.argmax(Y_sample)]}")
    
    # Trả về kết quả tốt nhất
    best_idx = np.argmax(Y_sample)
    return X_sample[best_idx], Y_sample[best_idx]

# Thực hiện tối ưu hóa
bounds = (-5, 5)
best_x, best_y = bayesian_optimization(n_iterations=15, objective=objective_function, bounds=bounds)
print(f"Tối ưu hóa Bayesian tìm được: f({best_x}) = {best_y}")
```

### Kết luận

Tối ưu hóa Bayesian mang lại một phương pháp mạnh mẽ cho việc tối ưu hóa các hàm phức tạp và tốn kém để đánh giá. Bằng cách kết hợp mô hình xác suất với chiến lược lấy mẫu thông minh, nó có thể tìm được giải pháp tối ưu hoặc gần tối ưu với số lượng đánh giá tối thiểu. Khi các hệ thống học máy và trí tuệ nhân tạo ngày càng trở nên phức tạp, tối ưu hóa Bayesian tiếp tục đóng vai trò quan trọng trong việc điều chỉnh và tối ưu hóa chúng.

Các xu hướng nghiên cứu hiện tại tập trung vào việc mở rộng khả năng áp dụng của tối ưu hóa Bayesian cho các vấn đề quy mô lớn hơn, không gian tham số nhiều chiều hơn, và các ứng dụng mới nổi như tìm kiếm kiến trúc neural network tự động và thiết kế vật liệu mới.
