Avatar
3
monkey Enlightened
monkey Enlightened
[Deep Learning] Làm thế nào để xác định được cái hàm tuyến tính nào cần dùng
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?

  • Answer
model deep learning
Remain: 5
5 Answers
Avatar
Vu Luong Anh Enlightened
Vu Luong Anh Enlightened
The Best Answer
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.
  • Nếu anh dùng hàm sai số đơn giản như Least Square Error thì có thể tính ra công thức nghiệm luôn (bằng cách tính tay đạo hàm):

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:

  1. Người ta không làm vậy anh ạ. Linear Regression có thể học cho dữ liệu nhiều chiều (không cân đưa về 2 chiều). Ở 2 chiều thì nó sẽ là đường thẳng, 3 nhiều nó là mặt phẳng, nhiều chiều nó là Hyper-plane. Tuy nhiên, nó vẫn chỉ là dạng tuyến tính (không biểu diễn được mặt cong hay phức tạp hơn)
  2. Đúng rồi anh, mình có thể tính đạo hàm của hàm mất mát và suy ra công thức nghiệm như em viết ở trên.

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 ạ)

 

  • 2
  • Reply
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?

 –  tvd12 1634089390000
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):

from sklearn import datasets, linear_model

# fit the model by Linear Regression
regr = linear_model.LinearRegression()
regr.fit(X, y) // Step 3

y_prediction = regr.predict(X_new) // Step 4

 –  Vu Luong Anh 1634108405000
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?  –  tvd12 1634108893000
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.

 –  Vu Luong Anh 1634145802000
Avatar
Tata Vu Enlightened
Tata Vu Enlightened
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 ...
  • 0
  • Reply
Avatar
Tata Vu Enlightened
Tata Vu Enlightened
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
  • 2
  • Reply
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  –  monkey 1634152538000
@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.  –  Vu Luong Anh 1634159735000
À, 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 :D  –  monkey 1634160009000
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.

 –  Vu Luong Anh 1634160267000
Avatar
monkey Enlightened
monkey Enlightened
@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?

  • 0
  • Reply
Ở đâ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.

 –  Vu Luong Anh 1634160044000
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?

 –  monkey 1634160596000
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 1634177243000
Avatar
monkey Enlightened
monkey Enlightened
@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ỉ?

  • 0
  • Reply