Machine Learning cho người mới bắt đầu (Part 2)

Introduction

Xin chào các bạn, trong phần 1 của series Machine Learning cho người mới bắt đầu, mình đã giới thiệu tới các bạn những khái niệm cơ bản nhất để có thể bắt đầu với Machine Learning. Trong phần 2 này, mình sẽ đi sâu vào 2 mô hình Machine Learning rất phổ biến trong bài toán học giám sát (supervised learning) đó là: linear regression, logistic regression. Đúng với cái tên của nó, linear regression model là mô hình được áp dụng để giải quyết loại bài toán hổi quy tuyến tính (regression problem), logistic regression model là mô hình được áp dụng trong bài toán phân loại (classification problem).

Trong bài viết này, mình sẽ trình bày chi tiết về mặt lý thuyết của cả hai mô hình trên nên sẽ có rất nhiều phần liên quan tới các phép toán về ma trận, đạo hàm của hàm số. Để có thể chuẩn bị kiến thức nền tảng tốt nhất trước khi bắt đầu, các bạn nên ôn tập lại kiến thức về đại số tuyến tính cũng như giải tích cơ bản.

Before we start

Trước khi bắt đầu, có một vài kí hiệu mình sẽ sử dụng nhiều trong suốt bài viết này mình cần các bạn nắm rõ:

  • mm: là số lượng ví dụ training mà ta có
  • nn: là số chiều (feature) của dữ liệu training
  • XX là dữ liệu training đầu vào (training input) có kích thước m×nm\times n
  • YY là đầu ra cần dự đoán (training output) có kích thước m×1m \times 1

Giả sử bài toán đặt ra là dự đoán tuổi thọ của 1 người dựa trên năm sinh, chiều cao, và cân nặng; như vậy số chiều của dữ liệu n=3n = 3. Sau quá trình thu thập dữ liệu, ta có được thông tin về năm sinh, chiều cao, cân nặng và tuổi thọ của 150 người, như vậy m=150m=150XX có kích thước 150$\times$ 3, YY có kích thước 150 ×\times 1. Mỗi 1 hàng của ma trận XX là 1 vector chứa thông tin về năm sinh, chiều cao, cân nặng: xix^{i} = [năm sinh, chiều cao, cân nặng], tương tự mỗi hàng của ma trận YY chứa thông tin về tuổi thọ tương ứng của 1 người thuộc XX.

Linear regression

Trong mô hình tuyến tính hồi quy, giả sử tao có m training examples với n features (ở đây ra sẽ giả sử m = 1000 và n = 5), ta sẽ định nghĩa 1 hàm học: $ h(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + ... + \theta_nx_n$, và mục tiêu của chúng ta là tìm ra các tham số $ \theta_0, \theta_1, ... , \theta_n $ để sao cho $ h(x) $ có giá trị gần sát với đầu ra output chuẩn nhất. Như đã đề cập ở trên, dữ liệu training mà chúng ta có là 1000 mẫu nên để có thể tính toán một cách nhanh nhất ta không nên tính $ h(x) $ cho từng mẫu training mà nên sử dụng vectorization để có thể tính $ h(x) $ cho toàn bộ tập dữ liệu.

$ X = \begin{bmatrix} x_0^1& x_1^1 & x_2^1 & ... & x_n^1\ x_0^2& x_1^2 & x_2^2 & ... & x_n^2\ \vdots & \ddots & \ddots&\ddots&\vdots &\ x_0^m& x_1^m & x_2^m & ... & x_n^m\
\end{bmatrix}$ và $ \theta = \begin{bmatrix} \theta_0\ \theta_1 \ \vdots \ \theta_n \end{bmatrix} $.

Do đó hàm $ h(x) $ có thể được viết lại thành dạng ngắn gọn hơn: $ h(x) = \theta^TX $, lưu ý rằng giá trị $ x_0^i = 0 $ với mọi $ 1 \leqslant i \leqslant m $ hay nói cách khác giá trị $ x_0^i $ được đưa vào chỉ để hai ma trận $ X $ và $ \theta $ có kích thước phù hợp để có thể nhân được với nhau. Ma trận 1000x6 nhân với ma trận 6x1 sẽ tạo ra ma trận $ h(x) $ có kích thước 1000x1.

Cost function là hàm được định nghĩa nhằm tính toán được độ chính xác của thuật toán. Cost function trong bài toán regression được định nghĩa là sai số giữa bình phương giá trị output chuẩn và giá trị output do thuật toán dự đoán. Ví dụ, output chuẩn là $ y = 1.4 $ trong ki giá trị dự đoán $ h(x) = 1.8 $ thì cost function $ J $ được tính như sau: $ J = (y - h(x))^2 = (1.4 - 1.8)^2 = 0.16$. Trên thực tế, ta cần tính giá trị $ J $ cho toàn bộ tập dữ liệu training gồm $ m = 1000 $ mẫu:

$ J(\theta) = \frac 1 {2m}\sum(h(x^{i}) - y^i)^2 $ với $ 1\leqslant i \leqslant m $

Để có thể tìm ra ma trận $ \theta $ sao cho cost function $ J $ có giá trị thấp nhất ta cần sử dụng thuật toán Gradient Descent. Giải thuật Gradient Descent cũng không có gì phức tạp, ta sẽ lặp lại việc tính θ cho đến khi giá trị $ J $ đạt một ngưỡng mà ta có thể chấp nhận được. Quá trình học có thể dừng lại bất cứ lúc nào mà chúng ta muốn, ta có thể dừng khi $ J \leqslant 10^{-4} $ hoặc nếu ta muốn thuật toán có độ chính xác cao hơn thì ta có thể dừng khi $ J \leqslant 10^{-8} $. Việc dừng quá trình học lại hoàn toàn do bạn kiểm soát. Một cách tổng quát thì giải thuật Gradient Descent có công thức như sau:

$ \theta_j = \theta_j - \alpha \frac 1 m \sum(h(x^{i}) - y^i)x_j^i$ với $ 1\leqslant i \leqslant m $ và $ 0\leqslant j \leqslant n $

Một cách dễ hiểu thì ta sẽ tình đạo hàm của hàm $ J(\theta) = \frac 1 {2m}\sum(h(x^{i}) - y^i)^2 $ theo $ \theta_j $, sau đó nhân $ \alpha $ với giá trị đạo hàm rồi lấy θj\theta_j trừ cho giá trị trên, sau đó ta lại tính lại JJ theo θ\theta mới. Quá trình này lặp lại cho tới khi giá trị JJ đạt một mức ngưỡng nhất định thì dừng lại.

Logistic regression

Đối với bài toán phân loại (classification), mình sẽ chỉ để cập tới dạng bài mà đầu ra y0,1y\in{0, 1} tức là yy chỉ có thể nhận 1 trong 2 giá trị 0 hoặc 1 (true / false) mà thôi. Đối với bài toán phân loại nhiều lớp (multi-classification) đầu ra yy có thể thuộc nhiều lớp thì mình không đề cập ngay trong bài viết này vì mình sợ các bạn có thể bị quá tải do lượng kiến thức quá nhiều.

Rõ ràng rằng ta không thể áp dụng linear regression vào trong bài toán classification được vì đầu ra yy của linear model là một số thực từ $-\infty: +\infty $. Trong bài toán này, ta muốn $ 0\leqslant y \leqslant 1$ và để giải quyết vấn đề này ta chỉ cần thêm 1 bước vô cùng đơn giản là áp dụng hàm sigmoid: g(x)=11+exg(x) = \frac 1 {1+e^{-x}}. alt

Hàm học h(x)h(x) đối với logistic regression có dạng: h(x)=g(θTx)=11+eθTxh(x) = g(\theta^Tx) = \frac 1 {1+e^{-\theta^Tx}}. h(x)h(x) chính là giá trị thể hiện xác suất y=1y = 1, hay nói các khác h(x)h(x) càng gần 1 thì khả năng y=1y=1 càng cao và h(x)h(x) càng gần 0 thì khả năng y=0y=0 càng cao. Như vậy, logistic model khá giống với regression model: tính θTx\theta^Tx như bình thường. Tuy nhiên h(x)h(x) sẽ có một chút khác biệt:

h(x)=sigmoid(θTx)=11+exh(x) = sigmoid(\theta^Tx) = \frac 1 {1+e^{-x}}.

Do bản chất bài toán khác nhau nên cost function của logistic model cũng sẽ khác biệt đôi chút so với linear model:

J=1m(yilog(h(xi))+(1yi)log(1h(xi)))J = \frac 1 m \sum(y^ilog(h(x^i)) + (1-y^i)log(1-h(x^i))) với $ 1\leqslant i \leqslant m $

Để có thể tìm được θ\theta sao cho giá trị JJ đạt một mức ngưỡng đủ nhỏ ta cũng sử dụng thuật toán Gradient Descent giống như trong linear model:

θj=θjα(h(xi)yi)xji\theta_j = \theta_j - \alpha \sum(h(x^i)-y^i)x_j^i $ 1\leqslant i \leqslant m $ và $ 0\leqslant j \leqslant n $

Trong cả hai mô hình linear và logistic regression, ta đề bắt gặp tham số α\alpha trong giải thuật Gradient Descent. α\alpha được định nghĩa là learning rate của giải thuật, nó quy định "tốc độ học" của thuật toán, đây là một tham số cực kì quan trọng và có ảnh hưởng rất lớn tới độ chính xác của model. Tuy nhiên tring bài viết này mình sẽ không đề cập tới việc nên lựa chọn giá trị bằng bao nhiều cho α\alpha vì mình thấy bài viết lần này cũng khá nặng về mặt lý thuyết rồi.

Conclusion

Trong bài viết lần này mình đã tóm tắt những kiến thức cơ bản về linear regression, logistic regression model. trong bài viết tiếp theo mình sẽ tiếp tục với một thuật toán Machine Learning có thể giải quyết được cả 2 dạng bài toán regression và classification đó chính là neural network, cũng như đưa ra một số lưu ý cần thiết để có thể xây dựng một neural network hiệu quả. Xin cảm ơn các bạn đã theo dõi bài viết của mình, hẹn gặp lại trong bài viết tiếp theo.