Bài thứ 2 trong tuần 3 của khóa học Machine Learning của giáo sư Andrew Ng
Xem các bài viết khác tại Machine Learning Course Structure
1. Cost Function for Logistic Regression
Đối với linear regression, ta có thể dùng cost function như sau
Tuy nhiên, nếu áp dụng cùng công thức này với Logistic Regression, ta sẽ có 1 đồ thị vô cùng “gập ghềnh”, với rất nhiều điểm local optimal. Điều này trở thành một trở ngại vô cùng lớn với thuật toán gradient descent.
1.1. Công thức
Nói cách khác, nó sẽ không phải là một “convex function”
Thay vào đó, cost function cho Logistic Regression sẽ giống như sau
1.2. Đồ thị
Khi y = 1, ta có đồ thị sau cho $J(\theta)$ và $h_\theta(x)$:

Tương tự, ta có đồ thị sau khi y = 0, ta có đồ thị sau

Kết luận
Dựa vào đồ thị, ta có thể rút ra kết luận sau
Như vậy, khi cost = 0, thì hàm hypothesis = y (cho cả trường hợp y = 0 hoặc y = 1)
Ngược lại
- nếu y = 0, và hypothesis tiến dần tới 1, thì cost sẽ tiến dần tới vô cực
- nếu y = 1, và hypothesis tiến dần tới 0, thì cost sẽ tiến dần tới vô cực
2. Đơn giản hóa Cost Function và áp dụng Gradient Descent
2.1. Biến đổi
Với biểu thức ở trên, chỉ cần biến đổi một chút, ta có thể thu gọn nó vào thành 1 biểu thức như sau:
y chỉ có 2 giá trị hoặc = 1 hoặc = 0. Lần lượt thay 2 giá trị này vào biểu thức trên, ta sẽ thấy 1 trong 2 biểu thức con bị triệt tiêu.
Với data của bộ training sets, ta có thể viết đầy đủ biểu thức của cost function như sau:
Sau đó, ta có thể “vector hóa” biểu thức này
2.2. Gradient Descent
Nhắc lại một chút, dạng tổng quát của Gradient Descent như sao:
Dùng đạo hàm, ta có thể tính được:
áp bộ giá trị của training set vào, và chuyển thành toán tuyến tính (vectorise), ta có phép tính sau
3. Advanced Optimization
Bên cạnh thuật toán Gradient Descent dùng để tính toán giá trị tối ưu của , chúng ta còn có nhiều thuật toán phức tạp hơn, nhưng cũng nhanh hơn nhiều:
- Conjugate gradient
- BFGS
- l-BFGS
Các thuật toán này đều đã được xây dựng và tối ưu hóa trong các thư viện số học của nhiều ngôn ngữ lập trình.
Đầu tiên, chúng ta sẽ cần công thức để tính toán 2 biểu thức
Tùy thuộc vào ngôn ngữ lập trình sẽ có các cú pháp khác nhau. Đối với Matlab, ta có thể viết 1 function duy nhất trả về cả 2 giá trị trên:
function [jVal, gradient] = costFunction(theta)
jVal = [...code to compute J(theta)...];
gradient = [...code to compute derivative of J(theta)...];
end
Sau đó, ta dùng function optimset()
để tạo ra 1 object chứa các option cân thiết. Dùng object này đưa vào function fminunc()
của Octave. Kết quả tính toán sẽ là 1 vector chứa các giá trị tối ưu của
options = optimset('GradObj', 'on', 'MaxIter', 100);
initialTheta = zeros(2,1);
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);