Với mình và đa số các bạn sinh viên chuyên ngành khoa học máy tính nói chung, Hồi quy tuyến tính (hay Linear Regression) là một thuật toán gối đầu giường, hay nói cách khác là cực kỳ quen thuộc, phổ biến, thậm chí là "đẻ" ra là đã phải biết thuật toán này. Nên trong nội dung bài báo này mình chỉ tóm tắt sơ qua những gì đã quá quen thuộc với các bạn
Ta có một bảng dữ liệu như sau
Kinh nghiệm (tháng) | Lương (USD) |
---|---|
1 | 120 |
6 | 200 |
12 | 450 |
24 | 923 |
Ở đây có | Rất nhiều dòng như vậy |
Note: Thật ra thì lương không thấp z đâu mấy bạn ơi
Việc của ta là đi tìm mức lương cho các mức kinh nghiệm tiếp theo dựa vào đống dữ liệu cho sẵn.
Trên thực tế, ai cũng biết bài toán này giải như nào. Để mình tóm tắt lại nhé. Đặt là ma trận đã thêm bias vào cột Kinh nghiệm và sẽ là cột Lương.
Ta sẽ có bài toán đi tìm bộ tham số sao cho
là nhỏ nhất. Trong đó, là bộ dữ liệu huấn luyện được cho trước của chúng ta, ở đây là
Cách làm thông thường của chúng ta sẽ là biến nó về dạng đại số tuyến tính rồi dùng giải tích tuyến tính tính đạo hàm rồi cho đạo hàm bằng để giải quyết bài toán. Các bạn sẽ kết thúc với một công thức như thế này:
Cách này đúng, đúng mạnh luôn. Không thể nói là cách này sai hay sao đó và thậm chí mình thừa nhận luôn, lúc đi làm đi học mình code công thức này cho nhanh chứ Gradient Descent cái quái gì? (sẽ có một bài về bạn này sau, bạn này khá hay nhưng mà để hiểu nó phải từ từ mình coi lại sách của Prof. Boyd)
Giờ ví dụ như mình không chỉ có thuộc tính là số tháng làm việc chuyên nghiệp, mà mình có thuộc tính khác nhau, có thể ví dụ như số căn nhà, tuổi tác, số người bạn, ngôn ngữ sử dụng, điện thoại bạn xài,…. Vậy để đoán lương, đôi lúc ta không thật sự dùng đến mà chỉ dùng cái hoặc những cái mà chúng ta cho rằng liên quan nhất thì ta phải bỏ cái nào? Nhắc đến đây các bạn nghĩ ngay tới Principal Component Analysis? No, nó là đổi trục toạ độ so với những thuộc tính ban đầu, chúng ta sẽ bàn về vấn đề này sau (ý tôi là những bài blogpost khác). Ta sẽ bỏ thẳng các đặc trưng mà ta nghĩ là không cần thiết bằng một cách nào đó.
Đây là bài toán cũng khá nổi trong giới học máy. Nói nôm na là như thế này: Bạn có một mô hình (gọi là ) được định nghĩa bằng tham số và một đống dữ liệu . Ta sẽ GIẢ SỬ DỮ LIỆU ĐÃ ĐÚNG RỒI vậy thì chúng ta sẽ cố gắng tìm ra bộ tham số tốt nhất cho mô hình kia HỢP LÝ NHẤT. Ta sẽ gọi là xác suất điểm dữ liệu đúng với mô hình . Gọi là tất cả các điểm dữ liệu vậy thì ta sẽ muốn xác xuất của các điểm dữ liệu đều đúng
là cao nhất.
Trong bài toán hồi quy tuyến tính ta cũng có tập dữ liệu và các điểm dữ liệu , hơn nữa chúng ta đặt giả thiết là có mối quan hệ tuyến tính với các thuộc tính của , tức là . Vậy ta có thể nhìn bài toán này dưới góc nhìn bài toán Maximum Likelihood vì lúc này nói trên chính là bộ tham số của mô hình tuyến tính
Ta định hình bài toán lại như sau. Giả sử ta có biến ngẫu nhiên . Với mỗi cặp , sẽ có quan hệ tuyến tính với các công thuộc tính của . Công thức xấp xỉ dựa vào sẽ là:
Sau đó ta sẽ lấy mẫu ngẫu nhiên và ta sẽ được rất nhiều quan sát khác nhau. Lúc này tập dữ liệu ta có sẽ là
Vậy, nhiệm vụ lúc này của ta là ước lượng các sao cho các số này gần tương ứng.
Lúc này ta sẽ cần cực đại hoá . Ta sẽ giả sử với một cho trước thì sẽ luôn có giá trị nằm xung quanh và phân phối của độ lệch này sẽ là một phân phối chuẩn với độ lệch chuẩn . Điều này tức là:
Dựa vào phương trình trên ta có được
Vì lương của mấy ông kia không liên quan đến nhau (ta giả sử không có trường hợp chia lương nhé :D, chơi z kỳ lắm). Nên các . Vậy cho nên ta có
Và tất nhiên, bài toán chúng ta là Maximum Likelihood và hàm log là hàm đồng biến trên đoạn nên ta hoàn toàn có thể dùng Maximum Log Likehood và đưa bài toán về dạng tổng các Squared Error. Đây cũng chính là Mean Square Error. Nghiệm của bài toán tất nhiên là vẫn giữ nguyên: .
Ta chứng minh 2 ý sau đây:
Ta thừa nhận hai quan sát sau (1 cái chứng minh ròi, cái sau dùng nhiều kỹ thuật khá phức tạp nên chưa dám nhắc đến ở đây):
Vì quan sát đầu tiên, khi đặt thì ta có:
Giờ ta sẽ thực hiện kiểm định giả thuyết thống kê cho từng với cặp giả thuyết sau:
Lúc này, với độ tin cậy là thì nếu
Bài viết dùng những biến đổi đơn giản và những bổ đề mệnh đề lấy từ trong sách ra để đưa ra cho các bạn một góc nhìn khác về một thuật toán tưởng chừng quá quen thuộc. Khi nhìn bài toán dưới dạng thống kê, ta hoàn toàn có thể khai thác thêm nhiều khía cạnh của môn toán này trong ứng dụng thực tiễn. Trong khuôn khổ bài viết, mình cũng chưa thử bất kỳ thí nghiệm nào về việc chọn/bỏ các đặc trưng dựa trên kiểm định giả thuyết thống kê. Hãy thực hiện nó và cho mình biết kết quả nếu có thể nhé.
Mình đọc bài này cũng lâu rồi, trong blog nào đấy mình không nhớ, nay mình đọc lại mấy quyền sách Statiscal Learning thì thấy được họ có phân tích khá hay nên viết với chứng minh lại mấy công thức cho nó quen tay dần, tất nhiên sau tầm năm không đụng gì tới toàn thì biến đổi của mình có thể bị lỗi và trình bày có thể sai nên mong được bỏ qua. Bài này kickstart lại cái quá trình học toán sắp tới của mình. Nếu được hy vọng có thể viết thêm vài bài về các thuật toán khác.