Logistic Regression: Ứng Dụng, Hàm Mất Mát và Tối Ưu Thuật Toán

1. Giới thiệu về Logistic Regression

Nhắc lại về các mô hình tuyến tính

Các mô hình tuyến tính như Linear Regression và Perceptron Learning Algorithm (PLA) có dạng chung:

y = f(wTx)

Trong đó f() là activation function và x là dữ liệu đầu vào đã được mở rộng, với x_0 = 1 để đơn giản hóa tính toán. Với Linear Regression, f(s) = s, còn với PLA, f(s) = sgn(s). Linear Regression dự đoán trực tiếp giá trị đầu ra y (số thực), phù hợp khi cần dự đoán một giá trị không bị chặn. PLA, trái lại, chỉ cho ra hai giá trị 1 hoặc -1, phù hợp cho bài toán binary classification.

Bài viết này giới thiệu mô hình thứ ba, sử dụng một activation function khác, linh hoạt hơn và có thể biểu diễn đầu ra dưới dạng xác suất. Ví dụ, xác suất đỗ kỳ thi dựa trên thời gian ôn tập, hoặc xác suất mưa ngày mai dựa trên dữ liệu thời tiết hôm nay. Mô hình này được gọi là Logistic Regression. Tương tự Linear Regression, đầu ra của Logistic Regression là một số thực, nhưng tương tự PLA, đầu ra bị chặn trong khoảng [0, 1]. Mặc dù tên gọi có chứa “regression,” Logistic Regression thường được dùng cho các bài toán classification.

Ví dụ minh họa

Xét ví dụ sau (trích từ Wikipedia):

20 sinh viên dành từ 0 đến 6 giờ để ôn thi. Liệu thời gian ôn thi có ảnh hưởng đến xác suất đỗ kỳ thi không?

Kết quả thu được như sau:

Giờ Đỗ/Trượt Giờ Đỗ/Trượt
0.5 0 2.75 1
0.75 0 3 0
1 0 3.25 1
1.25 0 3.5 0
1.5 0 4 1
1.75 0 4.25 1
1.75 1 4.5 1
2 0 4.75 1
2.25 1 5 1
2.5 0 5.5 1

Nhìn chung, thời gian ôn tập càng nhiều, khả năng đỗ càng cao. PLA không phù hợp vì không thể xác định ngưỡng thời gian ôn tập để đảm bảo 100% đỗ hoặc trượt. Hơn nữa, dữ liệu này không linearly separable. Các điểm đỏ và xanh được vẽ ở hai độ cao khác nhau chỉ để dễ quan sát. Linearly separable chỉ xét trên dữ liệu đầu vào x.

Biểu diễn dữ liệu trên đồ thị:

Cả Linear Regression và PLA đều không phù hợp. Cần một mô hình linh hoạt hơn.

Mô hình Logistic Regression

Đầu ra dự đoán:

  • Linear Regression: f(x) = wTx
  • PLA: f(x) = sgn(wTx)

Logistic Regression: f(x) = θ(wTx)

Trong đó θ là logistic function. So sánh các activation function:

  • Đường màu vàng (Linear Regression) không bị chặn, không phù hợp. “Cắt” giá trị nhỏ hơn 0 thành 0 và lớn hơn 1 thành 1, rồi lấy điểm 0.5 làm ngưỡng phân chia cũng không phải là lựa chọn tốt. Nếu có sinh viên ôn 20 giờ và đỗ, Linear Regression có thể dự đoán sai nhiều trường hợp đỗ/trượt.
  • Đường màu đỏ (PLA) là ngưỡng cứng (hard threshold). PLA không hoạt động vì dữ liệu không linearly separable.
  • Đường màu xanh lam và xanh lục phù hợp hơn, với các tính chất:
    • Liên tục, nhận giá trị thực, bị chặn trong khoảng (0, 1).
    • Điểm có tung độ 1/2 là điểm phân chia. Các điểm càng xa về bên trái có giá trị càng gần 0, càng xa về bên phải càng gần 1. Phù hợp với việc ôn tập nhiều thì xác suất đỗ cao.
    • Mượt (smooth) nên có đạo hàm, thuận lợi cho việc tối ưu.

Sigmoid function

Hàm Sigmoid:

f(s) = 1 / (1 + e-s) ≜ σ(s)

được sử dụng nhiều nhất vì thỏa mãn các tính chất trên và bị chặn trong khoảng (0, 1).

lim(s→-∞) σ(s) = 0; lim(s→+∞) σ(s) = 1

Đặc biệt:

σ'(s) = σ(s)(1 - σ(s))

Công thức đạo hàm đơn giản giúp Sigmoid được sử dụng rộng rãi. Phần sau sẽ giải thích nguồn gốc của hàm số này.

Hàm tanh cũng được sử dụng:

tanh(s) = (es - e-s) / (es + e-s)

Hàm số này nhận giá trị trong khoảng (-1, 1) và có thể dễ dàng chuyển về (0, 1).

tanh(s) = 2σ(2s) - 1

2. Hàm mất mát và phương pháp tối ưu

Xây dựng hàm mất mát (Loss Function)

Với mô hình trên, giả sử xác suất để một điểm dữ liệu x thuộc class 1 là f(wTx) và class 0 là 1 - f(wTx). Với các điểm dữ liệu training đã biết đầu ra y, ta có:

P(yi = 1 | xi; w) = f(wTxi) (1)

P(yi = 0 | xi; w) = 1 - f(wTxi) (2)

trong đó P(yi = 1 | xi; w) là xác suất yi = 1 khi biết wxi. Mục đích là tìm w sao cho f(wTxi) càng gần 1 với các điểm thuộc class 1 và càng gần 0 với class 0.

Đặt zi = f(wTxi), viết gộp (1) và (2):

P(yi| xi; w) = zi^yi (1 - zi)^(1-yi)

Biểu thức này tương đương với (1) và (2). Khi yi = 1, phần thứ hai triệt tiêu. Khi yi = 0, phần thứ nhất triệt tiêu! Mục tiêu là mô hình gần với dữ liệu nhất, tức xác suất này đạt giá trị cao nhất.

Xét toàn bộ training set với X = [x1, x2, ..., xN] ∈ ℝ^(d×N)y = [y1, y2, ..., yN], cần tìm w để biểu thức sau đạt giá trị lớn nhất:

P(y|X; w)

Tìm tham số để mô hình gần với dữ liệu nhất là bài toán Maximum Likelihood Estimation. Hàm số phía sau argmax được gọi là likelihood function.

Giả sử các điểm dữ liệu độc lập:

P(y|X; w) = ∏(i=1 to N) P(yi| xi; w) = ∏(i=1 to N) zi^yi (1 - zi)^(1-yi)

Tối ưu trực tiếp hàm số này theo w không đơn giản! Hơn nữa, khi N lớn, tích của N số nhỏ hơn 1 có thể gây ra lỗi số học (numerical error) vì kết quả quá nhỏ. Phương pháp thường dùng là lấy logarit tự nhiên của likelihood function để biến phép nhân thành phép cộng, sau đó đổi dấu để được hàm mất mát (negative log likelihood):

J(w) = -log P(y|X; w) = -∑(i=1 to N) (yi log zi + (1-yi) log (1 - zi))

với zi là hàm của w. Biểu thức vế phải là cross entropy, dùng để đo khoảng cách giữa hai phân phối. Trong bài toán này, một phân phối là dữ liệu cho trước (0 hoặc 1), phân phối còn lại được tính theo Logistic Regression. Khoảng cách giữa hai phân phối nhỏ đồng nghĩa với việc chúng rất gần nhau.

Lưu ý: Trong Machine Learning, logarit tự nhiên được sử dụng phổ biến, nên log thường ký hiệu cho logarit tự nhiên.

Tối ưu hàm mất mát

Sử dụng Stochastic Gradient Descent (SGD). Hàm mất mát với một điểm dữ liệu (xi, yi):

J(w; xi, yi) = -(yi log zi + (1-yi) log (1 - zi))

Đạo hàm:

∂J(w; xi, yi) / ∂w = -(yi/zi - (1-yi)/(1-zi)) ∂zi/∂w = (zi - yi) / (zi(1 - zi)) ∂zi/∂w (3)

Để biểu thức gọn hơn, tìm hàm z = f(wTx) sao cho mẫu số bị triệt tiêu. Đặt s = wTx:

∂zi/∂w = (∂zi/∂s) (∂s/∂w) = (∂zi/∂s) x

Tìm hàm z = f(s) sao cho:

∂z/∂s = z(1 - z) (4)

Phương trình vi phân này tương đương với:

dz / (z(1-z)) = ds

(1/z + 1/(1-z)) dz = ds

log z - log(1 - z) = s

log (z / (1 - z)) = s

z / (1 - z) = es

z = es (1 - z)

z = es / (1 + es) = 1 / (1 + e-s) = σ(s)

Vậy hàm Sigmoid thỏa mãn điều kiện trên.

Chú ý: Việc bỏ qua hằng số khi lấy nguyên hàm không ảnh hưởng đến kết quả.

Công thức cập nhật cho Logistic Sigmoid Regression

Kiểm tra lại:

∂J(w; xi, yi) / ∂w = (zi - yi)xi

Công thức cập nhật (SGD):

w = w + η(yi - zi)xi

Đơn giản và hiệu quả!

3. Ví dụ với Python

Ví dụ với dữ liệu 1 chiều

Trở lại ví dụ ở phần Giới thiệu. Cần khai báo thư viện và dữ liệu:

(Đoạn này cần code Python minh họa)

Các hàm cần thiết cho Logistic Sigmoid Regression

Với kết quả tìm được, đầu ra y được dự đoán theo công thức: y = sigmoid(-4.1 + 1.55*x). Với dữ liệu training, kết quả là:

(Đoạn này cần code Python và bảng kết quả)

Biểu diễn kết quả trên đồ thị:

Nếu chỉ có hai output là ‘fail’ hoặc ‘pass’, điểm trên đồ thị của hàm sigmoid tương ứng với xác suất 0.5 được chọn làm ngưỡng cứng.

Ví dụ với dữ liệu 2 chiều

Xét ví dụ trong không gian hai chiều. Giả sử có hai class xanh-đỏ với dữ liệu phân bố như hình:

(Đoạn này cần code Python và hình ảnh minh họa dữ liệu 2 chiều)

Với dữ liệu đầu vào 2 chiều, hàm sigmoid có dạng:

Kết quả khi áp dụng Logistic Regression:

Màu nền thể hiện xác suất điểm đó thuộc class đỏ (đỏ hơn = gần 1 hơn, xanh hơn = gần 0 hơn).

Đường thẳng nằm trong khu vực xanh lục là một lựa chọn hợp lý để phân chia hai class. Đường phân chia giữa hai class tìm được bởi Logistic Regression có dạng đường phẳng (tuyến tính).

4. Một vài tính chất của Logistic Regression

Logistic Regression được sử dụng nhiều trong bài toán Classification

Mặc dù tên là Regression (hồi quy), Logistic Regression được dùng nhiều trong Classification (phân loại). Sau khi tìm được mô hình, việc xác định class y cho một điểm x được xác định bằng cách so sánh:

P(y = 1| x; w); P(y = 0| x; w)

Nếu biểu thức thứ nhất lớn hơn, điểm thuộc class 1, ngược lại thuộc class 0. Vì tổng hai biểu thức luôn bằng 1, chỉ cần xác định xem P(y = 1| x; w) lớn hơn 0.5 hay không. Nếu có, class 1, nếu không, class 0.

Boundary tạo bởi Logistic Regression có dạng tuyến tính

Kiểm tra:

P(y = 1| x; w) > 0.5

1 / (1 + e-wTx) > 0.5

e-wTx < 1

wTx > 0

Boundary giữa hai class là đường có phương trình wTx = 0. Đây là phương trình của một siêu mặt phẳng. Vậy Logistic Regression tạo ra boundary tuyến tính.

5. Thảo luận

  • Logistic Regression không yêu cầu dữ liệu linearly separable như PLA. Tuy nhiên, boundary vẫn tuyến tính. Mô hình phù hợp với dữ liệu gần linearly separable. Với dữ liệu phi tuyến (non-linear), ví dụ một class chứa các điểm nằm trong vòng tròn, class kia chứa điểm bên ngoài, Logistic Regression không hoạt động tốt. Các mô hình khác sẽ phù hợp hơn với loại dữ liệu này.

  • Logistic Regression yêu cầu các điểm dữ liệu độc lập. Trong thực tế, các điểm có thể bị ảnh hưởng lẫn nhau. Ví dụ, một nhóm ôn tập cùng nhau trong 4 giờ có xác suất đỗ cao hơn một sinh viên ôn tập một mình trong 4 giờ. Mặc dù vậy, để đơn giản, người ta thường giả sử các điểm dữ liệu độc lập.

  • Biểu diễn theo Neural Networks, Linear Regression, PLA và Logistic Regression có dạng:

  • Nếu hàm mất mát của Logistic Regression được viết dưới dạng: J(w) = ∑(i=1 to N) (yi - zi)^2, điều gì sẽ xảy ra? (Bài tập nhỏ)

  • Source code cho các ví dụ có thể tìm thấy ở đây.

6. Tài liệu tham khảo

[1] Cox, David R. “The regression analysis of binary sequences.” Journal of the Royal Statistical Society. Series B (Methodological) (1958): 215-242.

[2] Cramer, Jan Salomon. “The origins of logistic regression.” (2002).

[3] Abu-Mostafa, Yaser S., Malik Magdon-Ismail, and Hsuan-Tien Lin. Learning from data. Vol. 4. New York, NY, USA:: AMLBook, 2012. (link to course)

[4] Bishop, Christopher M. “Pattern recognition and Machine Learning.”, Springer (2006). (book)

[5] Duda, Richard O., Peter E. Hart, and David G. Stork. Pattern classification. John Wiley & Sons, 2012.

[6] Andrer Ng. CS229 Lecture notes. Part II: Classification and logistic regression

[7] Jerome H. Friedman, Robert Tibshirani, and Trevor Hastie. The Elements of Statistical Learning.