Trong cuộc sống hằng ngày, chúng ta đang tối ưu hóa các biến số dựa trên quyết định cá nhân của mình và thậm chí chúng ta không nhận ra quá trình này một cách có ý thức. Các kỹ thuật tối ưu hóa được sử dụng, chẳng hạn như khi đi làm, chọn một tuyến đường ngắn hơn để giảm thiểu tai nạn giao thông, một cuộc đi dạo nhanh trong khuôn viên trong giờ nghỉ, hoặc lên lịch trước để đến sân bay đúng giờ.
Tối ưu hóa là mục tiêu cuối cùng, cho dù bạn đang xử lý các sự kiện thực tế trong đời thực hay tạo ra một sản phẩm công nghệ. Tối ưu hóa là trọng tâm của hầu hết các kỹ thuật thống kê và học máy được sử dụng rộng rãi trong khoa học dữ liệu.
Tối ưu hóa trong Học máy
Độ chính xác là thứ mà chúng ta quan tâm nhất trong quá tình giải quyết các vấn đề liên quan đến học máy và trí tuệ nhân tạo. Bất kỳ tệ lệ sai sót nào cũng không thể được chấp nhận trong khi giải quyết các vấn đề trong thế giới thực.
Chúng ta hãy xem xét trường hợp ô tô tự lái. Mô hình được trang bị trong xe sẽ phát hiện bất kỳ chướng ngại vật nào cản đường và thực hiện các hành động thích hợp, ví dụ như giảm tốc độ hoặc kéo phanh. Bây giờ chúng ta cần ghi nhớ điều này, không có người trong xe để vận hành hoặc rút lại các hành động do xe tự lái thực hiện. Trong trường hợp như vậy, giả sử mô hình không chính xác, nó sẽ không thể phát hiện ra những chiếc xe khác hoặc bất kỳ người đi bộ nào, và cuối cùng sẽ đâm vào, dẫn đến nguy hiểm tính mạng của của một số người.
Đây là lúc chúng ta cần các thuật toán tối ưu hóa để đánh giá mô hình và liệu mô hình có hoạt động theo yêu cầu của chúng ta hay không. Việc đánh giá có thể được thực hiện dễ dàng bằng cách tính hàm chi phí (chúng ta sẽ xem xét chi tiết trong bài viết này). Về cơ bản, nó là một chứng năng ánh xạ cho chúng ta biết về sự khác biệt giữa đầu ra mong muốn và kết quả tính toán của mô hình. Từ đó, chúng ta có thể chỉnh sửa lại mô hình và tránh được những hành động không mong muốn.
Tối ưu hóa có thể được định nghĩa là quá trình đạt được mức tối ưu. Bao gồm tất cả các công việc thiết kế một đầu ra tối ưu cho các vấn đề bằng cách sử dụng các tài nguyên có sẵn. Tuy nhiên, tối ưu hóa trong học máy hơi khác một chút. Trong hầu hết các trường hợp, chúng ta nhận thức được dữ liệu, hình dạng và kích thước, điều này còn giúp chúng ta nhận biết được những lĩnh vực nào cần cải thiện. Nhưng trong học máy, chúng ta không biết dữ liệu mới có thể trông như thế nào, đây chính là lúc áp dụng việc tối ưu hóa. Các kỹ thuật tối ưu hóa được thực hiện trên dữ liệu huấn luyện và sau đó, tập dữ liệu xác nhận được sử dụng để kiểm tra tính chính xác của nó.
Có rất nhiều ứng dụng tiên tiến trong tối ưu hóa được sử dụng rộng rãi trong định tuyến đường hàng không, phân tích thị trường, nhận dạng khuôn mặt,…Các thuật toán học máy như hồi quy tuyến tính, KNN, mạng noron hoàn toàn phụ thuộc vào kỹ thuật tối ưu hóa. Ở đây, chúng ta sẽ xem xét một kỹ thuật tối ưu hóa được sử dụng phổ biến là Gradient Descent.
Gradient Descent là gì?
Gradient Descent là một thuật toán tối ưu hóa, được sử dụng chủ yếu để tìm giá trị nhỏ nhất của một hàm. Trong học máy, Gradient Descent được sử dụng để cập nhật các tham số trong mô hình. Các tham số có thể thay đổi tùy theo thuật toán, chẳng hạn như các hệ số trong hồi quy tuyến tính và các trọng số trong mạng nơ-ron.
Để hiểu rõ, chúng ta hãy xét mối liên hệ giữa Gradient Descent với thực tế. Hãy nghĩ về một thung lũng mà bạn muốn đi xuống, nhưng bạn lại không có bất kì thông tin nào. Một người bình thường sẽ bước một bước và xác định độ dốc của thung lũng, cho dù đang đi lên hay đi xuống. Khi đã xác định được độ dốc đi xuống, bạn sẽ thực hiện việc trên và lặp lại bước này nhiều lần cho đến khi bạn đến được điểm thấp nhất của thung lũng.
Tương tự, chúng ta hãy xem xét một phép loại suy khác. Giả sử bạn có một quả bóng và đặt nó trên một mặt phẳng nghiêng (tại vị trí A). Theo định luật, nó sẽ bắt đầu lăn và dừng lại cho đến khi nó gặp một phẳng (tại vị trí B như hình vẽ)
Đây chính xác là những gì diễn ra trong Gradient Descent. Độ dốc chính là hàm chi phí và vai trò của Gradient Descent là cung cấp hướng và vận tốc (tốc độ học) của chuyển động để đạt được cực tiểu của hàm – nơi có chi phí nhỏ nhất.
Gradient Descent hoạt động như thế nào?
Mục tiêu chính của của các thuật toán học máy là xây dựng một mô hình, về cơ bản là một giả thuyết có thể được sử dụng để dự đoán Y dựa trên X. Chúng ta hãy xem xét ví dụ về một mô hình dựa trên dữ liệu nhà ở, bao gồm giá bán, kích thước,…của ngôi nhà. Giả sử chúng ta muốn dự đoán giá của ngôi nhà dựa trên kích thước của nó. Rõ ràng đây là một bài toán hồi quy, trong đó với một số dữ liệu đầu vào, chúng ta muốn dự đoán một đầu ra liên tục. Ta có:
Trong đó theta là các tham số.
Chúng ta hãy xem xét một số ví dụ và hình dung giả thuyết.
Lúc đó ta có h(x) = 1.5 + 0x. 0x có nghĩa là không có hệ số góc và y luôn là hằng số, minh họa bằng hình vẽ sau:
Bây giờ chúng ta xét
Lúc này h(x) = 1 + 0.5x
Hàm chi phí
Mục tiêu của Gradient Descent là tìm một đường thẳng đi qua càng nhiều điểm X ,Y càng tốt. Hàm chi phí được định nghĩa là “một hàm ánh xạ các sự kiện, hoặc các giá trị của một hoặc nhiều biến vào một số thực biểu thị một cách trực quan chi phí liên quan đến sự kiện đó”.
Với một tập dữ liệu đầu vào đã biết và đầu ra tương ứng của chúng, mô hình học máy sẽ cố gắng đưa ra dự đoán theo tập dữ liệu đầu vào mới.
Quy trình học máy
“Sai số” được định nghĩa là sự khác biệt giữa 2 dự đoán:
Điều này dẫn đến ý tưởng về Hàm chi phí hay còn gọi là Hàm mất mát.
Hàm chi phí/mất mát cho chúng ta biết mức độ hiệu quả của mô hình trong việc đưa ra các dự đoán cho một tập hợp tham số nhất định. Hàm chi phí bao gồm một đường cong và một gradient, độ dốc của đường cong này giúp chúng ta cập nhật các tham số và xây dựng một mô hình chính xác.
Tối thiểu hóa Hàm chi phí
Mục tiêu chính của bất kỳ thuật toán học máy nào cũng đều là tối thiểu hóa Hàm chi phí. Việc tối thiểu hóa Hàm chi phí sẽ giảm sai số giữa các giá trị dự đoán và giá trị thực tế, điều này cũng thể hiện rằng thuật toán đã hoạt động chính xác.
Chúng ta tối thiểu hóa các hàm bằng cách nào?
Thông thường, các hàm chi phí có dạng Y = X². Trong hệ tọa độ Đề-các, điều này đại diện cho một phương trình parabol, có thể được biểu diễn bằng đồ thị sau:
Để tối thiểu hóa hàm nói trên, trước hết chúng ta cần xác định giá trị nào của X cho ra giá trị nhỏ nhất của Y tương ứng (trong trường hợp này, điểm màu đỏ chính là giá trị cần tìm). Trong không gian có số chiều thấp (2 chiều), việc xác định vị trí cực tiểu trở trên dễ dàng hơn. Điều này ngược lại đối với không gian nhiều chiều hơn. Trong những trường hợp như vậy, chúng ta cần sử dụng thuật toán Gradient Descent để xác định vị trí cực tiểu.
Một hàm phổ biến được sử dụng để tối thiểu hóa các tham số trên một tập dữ liệu chính là Sai số bình phương trung bình (mean squared error). Hàm này tính toán sự khác biệt giữa giá trị ước tính (dự đoán) với tập dữ liệu.
Việc này đặt ra câu hỏi, Tại sao chúng ta lấy bình phương sai số chứ không lấy giá trị tuyệt đối? Bởi vì bình phương sai số giúp việc xác định đường thẳng hồi quy dễ dàng hơn. Thật vậy, để tìm ra đường thẳng đó, chúng ta cần tính đạo hàm bậc nhất của Hàm chi phí. Việc tính đạo hàm của các giá trị tuyệt đối khó hơn nhiều so với các giá trị bình phương. Ngoài ra, bình phương sai số làm tăng khoảng cách sai số, do đó, giúp dễ dàng xác định xác dự đoán không chính xác.
Phương trình:
Áp dụng Hàm chi phí với dữ liệu sau:
Chúng ta sẽ tính toán một số giá trị theta và sau đó vẽ đồ thị hàm chi phí bằng tay. Vì hàm này đi qua (0,0), chúng ta sẽ chỉ xem xét một giá trị duy nhất của theta. Ta quy ước hàm mất mát là J(ϴ).
Khi giá trị của ϴ là 1, với J(1) ta có điểm O. Bạn sẽ nhận thấy rằng giá trị của J(1) cho ra một đường thẳng đi qua tất cả các điểm dữ liệu. Bây giờ chúng ta hãy thử với ϴ = 0.5
Hàm MSE cho ra giá trị 0.58. Vẽ 2 giá trị J(1) = 0 và J(0.5) = 0.58. Ta có:
Tiếp tục tính thêm một số giá trị của J (ϴ).
Nối các điểm một cách cẩn thận, ta có:
Hàm chi phí J (ϴ)
Dễ dàng thấy được hàm chi phí nhỏ nhất khi theta = 1, có nghĩa là dữ liệu ban đầu là một đường thẳng với độ dốc/gradient là 1, được thể hiện bằng đường màu cam ở hình trên.
Sử dụng phương pháp thử và sai, chúng ta đã tối thiểu hóa được J(ϴ). Chúng ta thực hiện được điều này bằng cách thử nhiều giá trị và vẽ chúng ra. Gradient Descent cũng thực hiện tương tự nhưng hiệu quả hơn nhiều, bằng cách thay đổi các giá trị hoặc tham số theta cho đến khi nó giảm xuống giá trị nhỏ nhất.
Bạn có thể tham khảo mã nguồn Python dưới đây để tìm hàm chi phí.
import matplotlib.pyplot as plt
import numpy as np
# original data set
X = [1, 2, 3]
y = [1, 2, 3]
# slope of best_fit_1 is 0.5
# slope of best_fit_2 is 1.0
# slope of best_fit_3 is 1.5
hyps = [0.5, 1.0, 1.5]
# multiply the original X values by the theta
# to produce hypothesis values for each X
def multiply_matrix(mat, theta):
mutated = []
for i in range(len(mat)):
mutated.append(mat[i] * theta)
return mutated
# calculate cost by looping each sample
# subtract hyp(x) from y
# square the result
# sum them all together
def calc_cost(m, X, y):
total = 0
for i in range(m):
squared_error = (y[i] - X[i]) ** 2
total += squared_error
return total * (1 / (2*m))
# calculate cost for each hypothesis
for i in range(len(hyps)):
hyp_values = multiply_matrix(X, hyps[i])
print("Cost for ", hyps[i], " is ", calc_cost(len(X), y, hyp_values))
Cost for 0.5 is 0.5833333333333333
Cost for 1.0 is 0.0
Cost for 1.5 is 0.5833333333333333
Tốc độ học (Learning Rate)
Bây giờ chúng ta bằng đầu bằng cách khởi tạo 2 giá trị theta0 và theta1 bất kì. Thuật toán như sau:
Gradient Descent
Trong đó α là tốc độ học, hoặc tốc độ chúng ta muốn tiến tới giá trị nhỏ nhất. Chúng ta có thể vượt quá giá trị này nếu α quá lớn.
Tính đạo hàm riêng của hàm chi phí giúp chúng ta biết hướng (dấu) mà giá trị các hệ số nên thay đổi để đạt được chi phí nhỏ hơn trong lần lặp sau.
Đạo hàm một phần của Hàm chi phí mà chúng ta cần tính
Khi biết được hướng từ đạo hàm, chúng ta có thể cập nhật giá trị các hệ số. Bây giờ chúng ta cần định nghĩa một tham số tốc độ học, giá trị sẽ kiểm soát tốc độ thay đổi của các hệ số sau mỗi lần cập nhật.
hệ số = hệ số - (alpha * delta)
Quá trình này được lặp lại cho đến khi chi phí của các hệ số là 0, 0 hoặc tiến tới 0, minh họa như sau: