ML101.04: Logistic Regression

ML101.04: Logistic Regression
Photo by Hope House Press - Leather Diary Studio / Unsplash

Nếu như ở bài trước về Linear Regression, chúng ta đã tìm hiểu về bài toán dự đoán giá căn hộ với giá trị đầu ra là một số thực. Trong bài này, chúng ta sẽ tìm hiểu về logistic regression (hồi quy logistic). Khác với linear regression, logistic regression là phương pháp giúp giải quyết các bài toán phân lớp trong học máy, mà trường hợp cụ thể ở đây là phân lớp nhị phân (binary classification). Ví dụ, thay vì dự đoán giá căn hộ thì bài toán chúng ta đặt ra sẽ là dự đoán xem với những đặc tính cho trước thì căn hộ đó có phải là căn hộ cao cấp hay không. Ta thấy kết quả của bài toán chỉ có thể là một trong hai lựa chọn: "cao cấp", "không cao cấp". Nếu ta định nghĩa nhãn của dữ liệu như sau: %1% là cao cấp, %0% là không cao cấp. Thì bài toán trở thành tìm nhãn %y\in\{0;1\}% với dữ liệu đầu vào %x%. Bài toán này được viết tương tự như linear regression: %y=f_{\theta}(x)%. Nhưng khác với linear regression, %y% ở đây chỉ nhận hai giá trị là %0% hoặc %1%. Như chúng ta đã biết %f_{\theta}(x)=\theta x% luôn cho ra kết quả là một số thực thuộc %\mathbb{R}%. Do đó, để có được kết quả rời rạc, trước hết chúng ta sẽ sử dụng hàm sigmoid để biến đổi giá trị của %f_{\theta}(x)% như sau:

$$\boxed{y=g(f_{\theta}(x))=\frac{1}{1+e^{-f_{\theta}(x)}}=\frac{1}{1+e^{-\theta x}}}\tag{1}$$

Trong đó, %g(z)=\frac{1}{1+e^{-z}}% là hàm sigmoid; %g(z)% cho phép ánh xạ một số thực bất kì %z \in \mathbb{R}% thành một số thực trong đoạn %[0, 1]%. Tính chất này được thể hiện bởi:

$$\lim_{z \to -\infty}g(z)=0;\; \lim_{z \to +\infty}g(z)=1$$

Dạng hình đồ thị của %g(z)%. Nguồn: Wikipedia.

‌                                                                    

Tuy %g(z)% đã đưa giá trị về với đoạn %[0, 1]%, nhưng đó vẫn chưa phải là thứ ta cần. Thứ ta cần đó là một giá trị rời rạc thuộc %\{0; 1\}%. Do đó, chúng ta sẽ sử dụng thêm kỹ thuật lấy ngưỡng (thresholding). Thông thường, ngưỡng được chọn sẽ là %0.5%, tức nếu %g(z) > 0.5% thì kết quả là %1%, ngược lại kết quả là %0%.

Xây dựng hàm mục tiêu

Sau khi đã tìm được mô hình tham số thích hợp cho bài toán, tiếp theo chúng ta cần xây dựng hàm mục tiêu của mô hình đó. Để dễ tính toán, ta sẽ viết gọn %g(f_{\theta}(x))% thành %g_{\theta}(x)%. Vì %y=g_{\theta}(x) \in [0, 1]%, nên ta giả sử %y% chính là giá trị xác suất của một phép thử Bernoulli %x \sim \mathcal{B}(g_{\theta}(x))%. Khi đó,

$$\begin{aligned}‌‌&p(y=1 \mid x ; \theta)=g_\theta(x) \\‌‌&p(y=0 \mid x ; \theta)=1-g_\theta(x)‌‌\end{aligned}\tag{2}$$

Suy ra,

$$\boxed{p(y \mid x ; \theta)=\left(g_\theta(x)\right)^y\left(1-g_\theta(x)\right)^{1-y}}\tag{3}$$

Trong công thức trên, ta có thể chuyển %(3)% thành %(2)% nếu thay lần lượt %y=0% và %y=1% và phương trình.

Cũng như với linear regression, chúng ta tiếp tục đặt giả định IID về dữ liệu. Tức là tất cả các mẫu dữ liệu đều độc lập và đồng nhất. Nhờ vậy ta có thể tính likelihood của toàn bộ dữ liệu bằng công thức sau:

$$\begin{aligned}L(\theta) &=p(y^{\prime} \mid X ; \theta)\\&=\prod_{i=1}^n p(y_i \mid x_i ; \theta)\\&=\prod_{i=1}^n(g_{\theta}(x_i))^{y_i}(1-g_{\theta}(x_i))^{1-y_i}\end{aligned}\tag{4}$$

Tiếp đến là công thức log-likelihood:

$$\begin{aligned}\ell(\theta) &=\log L(\theta) \\&=\sum_{i=1}^n y_{i} \log g_{\theta}(x_{i})+(1-y_{i}) \log (1-g_{\theta}(x_{i}))\end{aligned}\tag{5}$$

Maximize Log Likelihood

Tới đây, chúng ta đã thấy được công việc cụ thể cần làm đó là tìm %\theta% để maximize %\ell(\theta)%.

$$\boxed{\theta^{\star}=\arg \max_{\theta} \ell(\theta)}\tag{6}$$

Để giải quyết công việc này, chúng ta hãy thử với gradient descent. Đầu tiên là tính gradient của %\ell(\theta)%. Với mỗi điểm dữ liệu %(x, y)%, ta có:

$$\begin{aligned}\frac{\partial}{\partial \theta_j} \ell(\theta) &=\left(y \frac{1}{g\left(\theta x\right)}-(1-y) \frac{1}{1-g\left(\theta x\right)}\right) \frac{\partial}{\partial \theta_j} g\left(\theta x\right) \\&=\left(y \frac{1}{g\left(\theta x\right)}-(1-y) \frac{1}{1-g\left(\theta x\right)}\right) g\left(\theta x\right)\left(1-g\left(\theta x\right)\right) \frac{\partial}{\partial \theta_j} \theta x \\&=\left(y\left(1-g\left(\theta x\right)\right)-(1-y) g\left(\theta x\right)\right) x_j \\&=\left(y-h_\theta(x)\right) x_j\end{aligned}\tag{7}$$

Ở bước thứ hai trong biến đổi trên, phép khai triển %\frac{\partial}{\partial \theta_j} g\left(\theta x\right)% thành %g\left(\theta x\right)\left(1-g\left(\theta x\right)\right) \frac{\partial}{\partial \theta_j}\theta x% thực hiện được nhờ có chứng minh sau:

$$\begin{aligned}g^{\prime}(z) &=\frac{d}{d z} \frac{1}{1+e^{-z}} \\&=\frac{1}{\left(1+e^{-z}\right)^2}\left(e^{-z}\right) \\&=\frac{1}{\left(1+e^{-z}\right)} \cdot\left(1-\frac{1}{\left(1+e^{-z}\right)}\right) \\&=g(z)(1-g(z))\end{aligned}\tag{8}$$

Bây giờ áp dựng công thức cập nhật tham số của Gradient Descent, ta được:

$$\boxed{\begin{aligned}\theta_{n+1}&:=\theta_{n} + \alpha \nabla \ell(\theta)\\&:=\theta_n + \alpha (y-g_{\theta}(x))x\end{aligned}}\tag{9}$$

Chú ý, ở đây ta dùng dấu "+" thay vì "-" như trong công thức gốc vì đây là bài toán maximize chứ không phải minimize.

Ngoài gradient descent thì phương pháp Newton-Raphson cũng là một cách phổ biến để maximize %\ell(\theta)%. Cũng tương tự gradient descent, Newton-Raphson sử dụng phương pháp cập nhật tham số bằng gradient của hàm mất mát. Tuy nhiên thay vì chỉ sử dụng gradient bậc 1 như gradient descent, Newton-Raphson dùng đến gradient bậc 2 của %\ell(\theta)%, công thức cập nhật tham số của phương pháp Newton-Raphson được viết như sau:

$$\boxed{\theta_{n+1}:=\theta_{n}-H^{-1}\nabla \ell(\theta)}\tag{10}$$

Trong đó, %H^{-1}% là nghịch đảo ma trận Hessian của %\ell(\theta)%. Theo định nghĩa, ma trận Hessian của hàm %f:\mathbb{R}^n\rightarrow\mathbb{R}% được tính bằng công thức %(11)%:

$$\mathbf{H}_f=\left[\begin{array}{cccc}‌‌\frac{\partial^2 f}{\partial x_1^2} & \frac{\partial^2 f}{\partial x_1 \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_1 \partial x_n} \\‌‌\frac{\partial^2 f}{\partial x_2 \partial x_1} & \frac{\partial^2 f}{\partial x_2^2} & \cdots & \frac{\partial^2 f}{\partial x_2 \partial x_n} \\‌‌\vdots & \vdots & \ddots & \vdots \\‌‌\frac{\partial^2 f}{\partial x_n \partial x_1} & \frac{\partial^2 f}{\partial x_n \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_n^2}‌‌\end{array}\right]\tag{11}$$

Trên thực tế, phương pháp Newton-Raphson so với gradient descent thì ít được sử dụng hơn do việc tính nghịch đảo ma trận Hessian là cực kỳ tốn kém tài nguyên, đặc biệt khi số chiều của dữ liệu lớn. Hơn nữa, phương pháp Newton-Raphson cũng đòi hỏi phải có một chiến lược khởi tạo %\theta_0% tốt để có thể đạt được hiệu quả cao.

Perceptron Learning

Nhữ đã đề cặp, %g(z)% chỉ có nhiệm vụ ánh xạ kết quả thành một số thực trong đoạn %[0, 1]%. Do đó, để có được kết quả phân lớp chúng ta phải sử dụng phương pháp lấy ngưỡng. Nhưng tại sao chúng ta không sử dụng một hàm số có thể ánh xạ trực tiếp kết quả %\theta x% thành giá trị  %0% hoặc %1%. Ta có một hàm đơn giản có thể làm điều đó là hàm %h(z)% được định nghĩa dưới đây:

$$h(z)= \begin{cases}1 & \text { if } z \geq 0 \\ 0 & \text { if } z<0\end{cases}\tag{12}$$

Đây chính là ý tưởng của Perceptron Learning. Perceptron (hay McCulloch-Pitts neuron) là thuật toán có lịch sử phát triển từ rất lâu đời. Ý tưởng của perceptron là mô phỏng lại cách mà các neuron thần kinh trong não bộ con người xử lý thông tin. Perceptron learning cho rằng mỗi neuron sẽ nhận dữ liệu đầu vào và cho ra một trong hai trạng thái %0% hoặc %1%. Việc kết hợp thông tin của nhiều neuron và nhiều tầng neuron với nhau chính là nền tảng cho những đột phá quan trọng của học sâu hiện đại. Chúng ta sẽ tìm hiểu về học sâu chi tiết hơn ở những bài viết sau. Ở đây ta chỉ cần biết rằng, nếu thay %g(z)% thành %h(z)% thì công thức cập nhật tham số của gradient descent cũng vẫn không thay đổi. Chỉ có điều chúng ta có thể lấy thẳng kết quả của %h(z)% làm kết quả cuối cùng của bài toán phân lớp mà không cần phải lấy ngưỡng mà thôi.

$$\theta_{n+1}:=\theta_{n} + \alpha (y-\theta x)x\tag{13}$$


Trên đây là trình bày vắn tắt về logistic regression. Tuy việc dùng gradient descent là đủ để giải quyết bài toán này. Nhưng để hiểu sâu hơn, bạn đọc có thể tìm hiểu về phương pháp tối ưu bằng Newton-Raphson's method như đã đề cặp. Việc dùng Newton-Raphson's method giải bài toán maximum likelihood còn được gọi là Fisher's scoring. Ngoài ra, bạn đọc cũng cần lưu ý đến ý tưởng của perceptron learning. Vì đây là cơ sở quan trọng của học sâu hiện đại mà chúng ta sẽ tìm hiểu về sau.

Tài liệu tham khảo

[1] Wikipedia. Sigmoid function.

[2] Wikipedia. Hessian matrix.

[3] Wikipedia. Perceptron.

[4] CS229 Lecture Notes.

[5] Wikipedia. Newton-Raphson.