Bài toán của anh là recommendation: matching sự kiện có liên quan đến người dùng nhất để bán. Ngày trước anh dùng phương pháp tìm hàm sai số với Linear Regression. Thực ra lúc đó anh cũng đoán mò cái hàm ban đầu là f(x) = a1x1 +a2x2 + .. + anxn + b;
cơ mà anh cứ sợ nó sai. Theo anh hiểu thì có 2 cách để xác định cái hàm tuyến tính ban đầu:
1. Sử dụng công cụ đồ hoạ chiếu tất cả các điểm về dạng đồ thì 2 chiều từ đó nhìn vào mật độ phân bố để đoán ra được hàm tuyến tính
2. Có 1 định lý toán học nào đó hoặc có 1 kiểu toán học nào đó có thể áp dụng để suy ra được cái hàm tuyến tính ban đầu này
Anh hiểu vậy đúng không em?
Em chưa có kinh nghiệm làm recommendation system nhưng Linear Regression thì em biết. Với
y = f(x) = a1x_1 + a2x_2 + ... + anx_n + b
. Trong đóa1, a2, ..., an, b
là các tham số ta cần đi tìm để xác định hàm. Ví dụ ta có 1 bộ dữ liệu gồm 100 quan sát{x^(1), y^(1)}, {x^(2), y^(2)}..., {x^(100), y^(100)}
, nhiệm vụ của học máy (machine learning) là đi tìm bộ tham số (a1, a2…, b) sao cho sai số trên bộ dữ liệu là nhỏ nhất.Nguồn: https://machinelearningcoban.com/2016/12/28/linearregression/#-nghiem-theo-cong-thuc
Đi vào trọng tâm câu hỏi của anh:
P/S: Linear Regression là thuật toán học máy thông thường chứ không phải Deep Learning. Khi nào dùng mô hình nhiều lớp (như neural networks mới gọi là Deep Learning anh ạ)
Như thế này có vẻ hàn lâm quá nhỉ, vậy có 1 cách nào đó đơn giản để anh là kỹ sư lập trình, và anh có một số kiến thức về toàn nhất định, anh có thể sử dụng các thuật toán cơ bản kiểu Linear Regression để giải quyết bài toán cho mình không? Cứ giả định anh chấp nhận 1 sai số lớn nhé. Vì khách hàng của anh cũng là một người bình thường, biết xíu xíu về kỹ thuật, nếu mà dùng định lý hay gì đó chứng minh e là họ không hiểu.
Anh hiểu là anh sẽ cần trả qua mấy bước này:
1. Thu thập dữ liệu
2. Tối ưu dữ liệu đầu vào để loại bỏ các dữ liệu trùng nhau
3. Lựa chọn một cách thức nào đó để đưa ra được 1 cái model (một cái biểu thức – một cái hàm nào đó)
4. Sau khi đã có model thì đưa nó vào các công cụ tìm kiếm kiểu elasticsearch để nó đánh score cho dữ liệu. Việc học cũng không cần liên tục, giả sử cái model anh đưa vào nó mang lại kết quả kinh doanh tốt hơn thì anh coi là hợp lý.
5. Thay đổi cách tính toán để tìm ra model mới nếu model cũ không hiệu quả
Mấy bước này có đang đúng như những gì em được học và em đang thực hiện không?
Về cơ bản em thấy đúng rồi anh. Ở bước 4 em chưa biết elasticsearch là gì, thường em sẽ để bước 4 là mang model ở bước 3 đi dự đoán cho dữ liệu mới (hoặc dự đoán tương lai).
Em làm research thì chỉ tập trung ở bước 3, đi nghiên cứu và phát triển các model mới. Những dự án thực tế thì có rất nhiều thư viện hỗ trợ model sẵn, ví dụ tiêu biểu là sklearn, anh có thể dùng mà không cần hiểu thuật toán, biểu thức toán học phía sau.
Ví dụ nếu mình dùng Linear Regression ở bước 3 và 4 (X, y là dữ liệu thu thập, X_new là dữ liệu cần đoán):
Nếu như vậy thì tương lai, những người như em sẽ tạo ra các model cho thế giới này, và đến 1 lúc nào đó đủ số lượng model cover được hết tất cả các trường hợp và viết hết thành lib thì những lập trình viên sẽ không cần phải quan tâm quá nhiều đến bên trong là gì mà chỉ cần gọi hàm là đủ đúng không em?
Rất khó để cover hết các trường hợp anh ạ, tương tự như bên lập trình mỗi ngôn ngữ có điểm mạnh điểm yếu riêng, bên học máy các mô hình cụ thể cũng chỉ dùng được trong 1 số cases nhất định.
Có một số dự án đang hướng đến cái anh nói, chỉ cần đưa dữ liệu đầu vào, mô tả bài toán xong nó tự cho ra model. Tiêu biểu là thằng AutoML của Google.
Tuy nhiên, muốn đạt được sai số nhỏ và triển khai thực tế được thì thường phải có domain knowledge (ví dụ làm bài toán y tế thì phải có chuyên gia y tế trong team). Đồng thời cũng phải tinh chỉnh mô hình bằng tay trong một số bước.
Hồi quy tuyến tính hiểu nôm na là. Có giá trị đầu vào là x. Đầu ra là y. Mỗi cặp đầu vào đâu ra là 1 điểm trên biểu đồ. Chúng ta tìm đg thẳng đi qua chúng. Đường thẳng đó dùng để suy đoán các cặp giá trị đầu vào đầu ra. Nếu ko vẽ dc đường thẳng thì ko tuyến tính. Vd hàm y=f(x)= 5x + 2 là tuyến tính. Còn hàm y=f(x)= x^2 ko tuyến tính vậy đặt xx = x^2 thì y=f(xx) là tuyến tính
Nhưng làm sao anh bạn có thể xác định nó là đường thẳng hay parabola hay đường tròn? đó mới là câu hỏi của mình
@moneky Nếu anh chọn Linear Regression thì anh đã chọn dùng đường thẳng rồi ạ. Còn nếu anh muốn dùng cái đường/mặt phức tạp hơn thì em recommend dùng Neural Networks, vì nó có thể xấp xỉ mọi hàm.
À, ok em, từ trước giờ anh vẫn nghĩ Linear Regression dùng cho cả hàm bậc 2 trở lên được 😀
Vẫn có cách để Linear Regression học được hàm đa thức bậc cao như ví dụ @Tata Vu nói ở trên (đặt xx = x^2). Kỹ thuật này còn có thể gọi là kernel, là một mảng khác nữa của học máy.
Em nghĩ kỹ sư lập trình thì nên biết cách dùng Neural Networks là đủ rồi anh ạ, các mô hình khác đều có thể dùng lại của sklearn.
Rất nhiều cái mà thế giới đã làm ra, chúng ta chỉ cần hiểu và sử dụng là cũng đã đau đầu rồi. Còn nghiên cứu sâu thì cần rất nhiều thời gian cho 1 cái rất nhỏ. Người Việt mình nói chung rất giỏi thuật toán, đó là điều kiện cần để xây dựng các Deep learn. Nhưng khổ nỗi ko mua nổi 1 con máy chủ để chứa đủ lượng dữ liệu cần thiết => sai số lớn. Nên toàn để nước ngoài …
@Vu Luong Anh, trước đây dữ liệu event của anh kiểu thế này:
x1. Giới tính
x2. Sở thích
x3. Địa điểm
Sau khi phân tích anh thấy rằng:
1. Đương nhiên là nam thì thích tham gia sự kiện có nhiều nữ và nữ thích tham gia sự kiện nhiều nam
2. Những người có cùng sở thích sẽ muốn tham gia cùng 1 event
3. Những event có địa điểm gần user nhất sẽ dễ được chọn.
Nên anh đánh trọng số là (thực ra anh không có cơ sở khoa học, mà anh dựa theo suy đoán trên tập dữ liệu khoảng 300k bản ghi):
1. cho x1 là: 30
2. cho x2 là: 20
3. cho x3 là: 50
Anh sẽ dùng Point làm đại lượng tính toán, và cách tính của anh thế này:
a. nếu user là nam:
1. x1 = tỉ lệ nữ / tổng người tham gia
2. x2 = số lượng sở thích của user / tổng số lượng sở thích
3. x3 = khoảng cách của user đến event / khoảng cách tối đa mà user chấp nhận
b. nếu user là nữ
1. x1 = tỉ lệ nam / tổng người tham gia
2. x2 = số lượng sở thích của user / tổng số lượng sở thích
3. x3 = khoảng cách của user đến event / khoảng cách tối đa mà user chấp nhận
anh quy định rằng 1.0 Point sẽ là phù hợp nhất nên hàm ban đầu của anh là:
y = (30 * x1 + 20 * x2 + 50 * x3) / 100
Sau đó anh sử dụng linear regression và anh được 1 cái mớ dữ liệu kiểu này anh gọi nó là model.
Sau đó anh mang cái model này đi loop danh sách các event (anh dùng elasticsearch) anh sẽ tìm ra các event nào có score gần 1 nhất và suggest cho user
Câu hỏi của anh là: em có làm giống như anh không hay em có cách làm khác?
Ở đây anh đang lập trình kiểu heuristic truyền thống, không phải lập trình Machine Learning anh ạ, vì cái y là do anh tự suy diễn ra.
Muốn dùng ML anh phải có cả dữ liệu thật của y, tức là anh có rất nhiều bản ghi của cả x1, x2, x3, và y. Lúc đó anh dùng Linear Regression nó sẽ cho ra trọng số tương ứng. Nó ngược với việc anh đoán trọng số và suy ra y.
Không, cái y là anh có kết quả đó em ạ, vì các event được bán trước đó rồi, nên anh có:
1. danh sách các event đã bán
2. danh sách các user đã tham gia
Tức là anh đã có cả x1, x2, x3 và y rồi em ạ thế nên anh mới truyền được đủ tham số cho cái Linear Regression.
Em hay dùng đại lượng gì để làm kết quả cuối cùng khi sử dụng model?
Vậy input của anh là thông tin user, output là event anh muốn recommend phải không ạ? Nếu vậy bài toán không phải là regression mà là classification. Trong trường hợp này mình nên dùng categorical lost function ví dụ Cross-Entropy Loss Function.
@Vu Luong Anh: anh tách ra đây nhé. Anh thấy là cái kiểu phân cụm là nó sẽ phân rõ ra 2 loại, 1 loại là các event phù hợp với user, 2 là các event không phù hợp. Tuy nhiên thực tế khi bán event thì anh thấy nó chỉ có các event phù hợp ít hay nhiều thôi kiểu khi user vào search thì kết quả kiểu là:
event1 – độ phù hợp 1.0
event2 – độ phù hợp 0.9
event3 – độ phù hợp 0.8
….
event4 – độ phù hợp 0.001
nên anh nghĩ regression sẽ phù hợp hơn em nhỉ?