Sử dụng Machine Learning trên Compute Engine để recommend sản phẩm (phần 1)

1776

Bạn có thể sử dụng Google Cloud Platform để xây dựng dịch vụ có thể mở rộng, hiệu quả và có khả năng để chuyển các recommend sản phẩm có liên quan đến người dùng trong một cửa hàng trực tuyến.

Cạnh tranh trong các trang web bán hàng trực tuyến chưa bao giờ trở nên khốc liệt như hiện nay. Khách hàng dành nhiều tiền hơn cho tất cả các nhà sản xuất nhưng họ chi tiêu ít hơn cho mỗi nhà bán lẻ. Kích thước trung bình của mỗi giỏ hàng đang giảm, một phần do sự cạnh tranh chỉ là một cú nhấp chuột. Cung cấp các khuyến nghị có liên quan đến khách hàng tiềm năng có thể đóng vai trò trung tâm trong việc chuyển đổi người xem sang người mua và kích thước đơn hàng tăng lên.

Sau khi đọc giải pháp này, bạn sẽ có thể thiết lập được một công cụ hỗ trợ cơ bản mà bạn có thể phát triển và cải tiến, dựa trên nhu cầu của khối lượng công việc cụ thể của bạn. Việc chạy một công cụ đề xuất trên Cloud Platform sẽ cung cấp cho bạn tính linh hoạt và khả năng mở rộng trong các giải pháp mà bạn muốn chạy.

Trong giải pháp này, bạn sẽ thấy cách một công ty cho thuê bất động sản có thể tính toán các đề xuất có liên quan và giới thiệu cho khách hàng đang xem trên trang của họ.

Scenario

Samantha đang tìm kiếm thuê một căn nhà cho những ngày nghỉ của cô. Cô có một hồ sơ trên một trang web cho thuê và trước đây đã thuê và đánh giá một số gói kỳ nghỉ. Sam đang tìm kiếm các đề xuất dựa trên sở thích của cô ấy. Hệ thống cần phải biết được thị hiếu của Sam. Rõ ràng cô ấy thích một kiểu nhà nào đấy, dựa trên trang xếp hạng của cô ấy. Hệ thống nên đề nghị một cái gì đó tương tự.

User interface enables renting vacation properties

Solution overview

Để cung cấp các đề xuất, cho dù theo thời gian thực trong khi khách hàng online hoặc qua email sau này, một vài điều cần phải xảy ra. Lúc đầu, trong khi bạn biết rất ít về thị hiếu và sở thích của người dùng, bạn có thể đề xuất các khuyến nghị về các thuộc tính một mình. Nhưng hệ thống của bạn cần có thể học hỏi từ người dùng, thu thập dữ liệu về thị hiếu và sở thích của họ. Theo thời gian và với đủ dữ liệu, bạn có thể sử dụng các thuật toán machine learning để thực hiện các phân tích hữu ích và đưa ra những đề xuất có ý nghĩa. Đầu vào của người dùng khác cũng có thể cải thiện kết quả, cho phép hệ thống được đào tạo theo định kỳ. Giải pháp này đề cập đến hệ thống recommend đã có đủ dữ liệu để có thể sử dụng các thuật toán Machine Learning.

Công cụ đề xuất thường xử lý dữ liệu thông qua bốn giai đoạn sau:

Kiến trúc của một hệ thống như vậy có thể được biểu diễn bằng sơ đồ sau:

Mỗi bước có thể được tùy chỉnh để đáp ứng các yêu cầu. Hệ thống bao gồm:

  • Một frontend có thể mở rộng để ghi lại tương tác người dùng để thu thập dữ liệu.
  • Lưu trữ vĩnh viễn mà có thể được truy cập bởi một nền tảng machine learning. Việc tải dữ liệu vào bộ nhớ này có thể bao gồm một vài bước, chẳng hạn như xuất nhập và chuyển đổi dữ liệu.
  • Một nền tảng machine learning có thể phân tích nội dung hiện có để tạo ra các khuyến nghị có liên quan.
  • Bộ nhớ có thể được sử dụng cho frontend, theo thời gian thực hoặc sau đó, dựa trên yêu cầu kịp thời cho các đề xuất.

Tham khảo: Machine Learing job in Vietnam

Choosing the components

Để đạt được sự kết hợp tốt giữa tốc độ, đơn giản, kiểm soát chi phí và độ chính xác, giải pháp này sử dụng  Google App EngineGoogle Cloud SQL, và Apache Spark chạy trên Google Compute Engine sử dụng bdutil.

App Engine có thể xử lý hàng chục ngàn truy vấn mỗi giây chỉ với một ít sự quản lý. Cho dù tạo trang web hoặc lưu dữ liệu vào bộ nhớ lưu trữ phụ trợ, App Engine cho phép bạn viết code của mình và triển khai nó tới sản phẩm chỉ trong vài giây.

Cloud SQL cung cấp sự đơn giản của việc triển khai. Cloud SQL có thể nâng cấp lên 32-core máy ảo với tối đa 208 GB RAM, và có thể phát triển dung lượng lưu trữ theo yêu cầu lên đến 10 TB với 30 IOPS trên GB và hàng ngàn kết nối đồng thời. Các thông số kỹ thuật này rất đầy đủ cho giải pháp ví dụ này và cho một số lượng lớn các công cụ thực tế. Cloud SQL cũng cung cấp lợi thế là nó có thể được truy cập trực tiếp từ Spark.

Spark cung cấp hiệu suất tốt hơn nhiều so với thiết lập Hadoop điển hình; Spark có thể nhanh gấp 10 đến 100 lần. Với Spark MLlib, bạn có thể phân tích hàng trăm triệu ratings trong vài phút, làm tăng sự nhanh nhẹn của các đề xuất, cho phép quản trị viên chạy thuật toán thường xuyên hơn. Spark cũng có xu hướng có các mô hình lập trình đơn giản, một API dễ sử dụng, và linh hoạt ngôn ngữ. Nó thúc đẩy bộ nhớ cho máy tính, nhiều nhất có thể, để giảm các vòng quay đĩa và để giảm thiểu I / O. Giải pháp này sử dụng Compute Engine để lưu trữ cơ sở hạ tầng phân tích. Compute Engine giữ giá phân tích thấp nhất có thể thông qua việc định giá theo mỗi yêu cầu trên 1 giây.

Biểu đồ sau đây hiển trước sơ đồ kiến ​​trúc, nhưng cũng hiển thị công nghệ đang sử dụng cho từng bước:

Collecting the data

Công cụ đề xuất có thể thu thập dữ liệu về người dùng dựa trên hành vi ngầm hoặc đầu vào rõ ràng của họ.

Dữ liệu hành vi dễ thu thập vì bạn có thể giữ lịch sử các hoạt động của người dùng. Thu thập dữ liệu này cũng đơn giản bởi vì nó không yêu cầu bất kỳ hành động bổ sung nào từ người dùng. Nhược điểm của cách tiếp cận này là nó khó phân tích hơn. Ví dụ, lọc các bản ghi thú vị từ những cái ít thú vị rất rườm rà. Để xem ví dụ về phân tích dữ liệu tiềm ẩn bằng cách sử dụng lịch sử, hãy xem Real-time Log Analysis sử dụng Fluentd và BigQuery.

Nhập dữ liệu có thể khó thu thập hơn bởi vì người dùng cần thực hiện các hành động bổ sung, chẳng hạn như viết bài đánh giá. Người dùng có thể không muốn cung cấp dữ liệu này vì nhiều lý do. Nhưng khi nói đến sự hiểu biết về sở thích người dùng, kết quả như vậy khá chính xác.

Storing the data

Bạn càng có nhiều dữ liệu cung cấp cho các thuật toán của mình, thì các đề xuất càng tốt. Điều này có nghĩa là bất kỳ dự án recommendation có thể nhanh chóng chuyển thành một dự án big data.

Loại dữ liệu bạn sử dụng để tạo đề xuất có thể giúp bạn quyết định loại lưu trữ để sử dụng. Bạn có thể chọn sử dụng một cơ sở dữ liệu NoSQL, một cơ sở dữ liệu SQL chuẩn, hoặc thậm chí một số loại lưu trữ đối tượng. Mỗi một trong các tùy chọn này khả thi tùy thuộc vào việc bạn đang nắm bắt đầu vào hoặc hành vi của người dùng và các yếu tố như dễ thực hiện, lượng dữ liệu mà bộ lưu trữ có thể quản lý, tích hợp với phần còn lại của môi trường và khả năng lưu động.

Khi lưu các rating hoặc sự kiện của người dùng, một cơ sở dữ liệu có thể mở rộng và giảm thiểu số lượng các tác vụ hoạt động cần thiết và giúp tập trung vào đề xuất. Cloud SQL đáp ứng cả hai nhu cầu này và cũng giúp dễ dàng tải dữ liệu trực tiếp từ Spark.

Ví dụ mã sau đây cho thấy các giản đồ của các bảng Cloud SQL.  Accommodation table đại diện cho mục hiển thị và Rating table thể hiện xếp hạng của người dùng cho một mục cụ thể.

CREATE TABLE Accommodation
(
  id varchar(255),
  title varchar(255),
  location varchar(255),
  price int,
  rooms int,
  rating float,
  type varchar(255),
  PRIMARY KEY (ID)
);

CREATE TABLE Rating
(
  userId varchar(255),
  accoId varchar(255),
  rating int,
  PRIMARY KEY(accoId, userId),
  FOREIGN KEY (accoId)
    REFERENCES Accommodation(id)
);

Spark có thể nhận dữ liệu từ nhiều nguồn khác nhau, chẳng hạn như Hadoop HDFS hoặc Cloud Storage. Giải pháp này nhận dữ liệu trực tiếp từ Cloud SQL bằng cách sử dụng Spark Java Database Connectivity (JDBC) connector. Bởi vì Spark chạy song song, đầu nối phải có sẵn trên tất cả các trường hợp.

Analyzing the data

Thiết kế giai đoạn phân tích đòi hỏi sự hiểu biết về các yêu cầu của ứng dụng. Những yêu cầu này bao gồm:

  • Tính kịp thời (timeliness) của một recommendation. Ứng dụng cần đưa ra các đề xuất nhanh như thế nào?
  • Cách tiếp cận lọc cho dữ liệu. Ứng dụng sẽ đưa ra khuyến cáo về sở thích của người dùng một cách đơn lẻ, xoay các dữ liệu dựa trên những gì người dùng khác nghĩ ra, hoặc xoay quanh những sản phẩm nào hợp lý với nhau?

Hiểu rõ timeliness

Yếu tố đầu tiên cần cân nhắc khi phân tích dữ liệu là bạn cần đưa ra các đề xuất cho người dùng nhanh như thế nào. Nếu bạn muốn đưa ra đề xuất ngay lập tức, chẳng hạn như khi người dùng đang xem một sản phẩm, bạn sẽ cần một loại phân tích linh hoạt hơn là khi bạn muốn gửi cho khách hàng một email có chứa các khuyến nghị vào một ngày sau đó.

  • Các hệ thống real time có thể xử lý dữ liệu khi nó được tạo ra. Loại hệ thống này thường bao gồm các công cụ có thể xử lý và phân tích các luồng sự kiện. Một hệ thống real time sẽ được yêu cầu để cung cấp cho các khuyến nghị trong một thời điểm.
  • Batch analysis yêu cầu bạn phải xử lý dữ liệu định kỳ. Phương pháp này hàm ý rằng cần phải tạo đủ dữ liệu để phân tích có liên quan, chẳng hạn như khối lượng bán hàng một ngày. Một batch system có thể làm việc tốt để gửi một e-mail vào một ngày sau đó
  • Near-real-time analysis cho phép bạn thu thập dữ liệu nhanh chóng để bạn có thể làm mới phân tích trong vài phút hoặc vài giây. Hệ thống gần thời gian thực có thể tốt cho việc cung cấp các đề xuất trong suốt phiên duyệt web giống nhau

Một đề xuất có thể thuộc bất kỳ loại nào trong ba loại thời gian này, nhưng đối với một công cụ bán hàng trực tuyến, bạn có thể cân nhắc điều gì đó giữa gần thời gian thực và xử lý hàng loạt, tùy thuộc vào lượng truy cập và người dùng nhập vào ứng dụng. Nền tảng chạy các phân tích có thể làm việc trực tiếp từ một cơ sở dữ liệu, nơi dữ liệu được lưu hoặc trên một dump saved được lưu định kỳ trong lưu trữ liên tục.

Filtering the data

Một thành phần cốt lõi của việc xây dựng một công cụ recommendation là filtering. Cách tiếp cận phổ biến nhất bao gồm:

  • Content-based: Một sản phẩm phổ biến, được đề nghị có các thuộc tính tương tự với những gì người dùng xem hoặc thích.
  • Cluster: Các sản phẩm được đề xuất liên kết tốt, cho dù người dùng khác đã làm gì.
  • Collaborative: Những người dùng khác, những người sử dụng các sản phẩm tương tự người dùng xem hoặc thích, cũng thích một sản phẩm được đề nghị

Mặc dù Cloud Platform có thể hỗ trợ bất kỳ phương pháp nào, nhưng giải pháp này tập trung vào lọc các liên kết, được thực hiện bằng cách sử dụng Apache Spark. Để biết thêm thông tin về lọc dựa trên nội dung hoặc lọc cụm, xem appendix.

Collaborative filter cho phép bạn tạo ra các thuộc tính sản phẩm trừu tượng và đưa ra các dự đoán dựa trên thị hiếu của người sử dụng. Đầu ra của lọc này dựa trên giả định rằng hai người dùng khác nhau thích những sản phẩm giống nhau trong quá khứ có thể sẽ giống như những sản phẩm tương tự hiện nay.

Bạn có thể diễn tả cho dữ liệu về xếp hạng hoặc tương tác như một bộ ma trận, với sản phẩm và người dùng làm thứ nguyên. Collaborative filter cố gắng dự đoán các ô bị thiếu trong ma trận cho một cặp sản phẩm người dùng cụ thể. Hai ma trận sau đây là tương tự, nhưng thứ hai là suy luận từ cái đầu tiên bằng cách thay thế xếp hạng hiện tại bằng số thứ nhất và thiếu xếp hạng theo số không. Ma trận kết quả là một bảng chân trị, trong đó số một thể hiện sự tương tác giữa người dùng với một sản phẩm.

Có hai cách tiếp cận riêng biệt để sử dụng collaborative filter:

  • Memory-based filtering tính toán sự tương đồng giữa các sản phẩm hoặc người dùng.
  • Model-based filtering cố gắng tìm hiểu cơ bản để chỉ ra cách người dùng đánh giá hoặc tương tác với các mặt hàng.

Giải pháp này sử dụng cách tiếp cận dựa trên mô hình, nơi mà người dùng đánh giá các mặt hàng.

Tất cả các phân tích các tính năng giải pháp này đòi hỏi có sẵn thông qua PySpark, cung cấp một giao diện Python với ngôn ngữ lập trình Spark. Các tùy chọn khác có sẵn bằng cách sử dụng Scala hoặc Java. Xem thêm tại Spark documentation

Training cho các models

Spark MLlib thực hiện thuật toán Alternating Least Squares (ALS) để huấn luyện các mô hình. Bạn sẽ sử dụng các kết hợp khác nhau của các thông số sau để có được sự thỏa hiệp tốt nhất giữa phương sai và xu hướng:

  • Rank: Số yếu tố không xác định khiến người dùng đưa ra xếp hạng. Các yếu tố này có thể bao gồm các yếu tố như tuổi, giới tính hoặc vị trí. Xếp hạng càng cao, khuyến cáo sẽ càng tốt ở một mức độ nào đó. Bắt đầu từ 5 và tăng trên 5 cho đến khi tốc độ cải tiến đề xuất chậm lại, bộ nhớ và CPU cho phép, là một cách tiếp cận tốt.
  • Lambda: Một thông số regularization để ngăn chặn overfitting, đại diện bởi phương sai cao, và xu hướng thấp. Sự khác biệt thể hiện mức độ dự báo dao động ở một điểm nhất định, qua nhiều lần chạy, so với giá trị chính xác về mặt lý thuyết cho điểm đó.Xu hướng thể hiện mức độ xa những dự đoán được tạo ra từ giá trị đích thực mà bạn đang dự đoán. Việc overfitting xảy ra khi mô hình hoạt động tốt trên việc huấn luyện dữ liệu bằng cách sử dụng các nhiễu số đã biết nhưng không thực hiện tốt trên dữ liệu thử nghiệm thực tế. Các lambda cao hơn, thấp hơn overfitting nhưng sự xu hướng lớn hơn. Các giá trị 0,01, 1 và 10 là các giá trị tốt để kiểm tra.
    Sơ đồ dưới đây cho thấy mối quan hệ giữa sự sai lệch và xu hướng. Các bullseye đại diện cho giá trị mà các thuật toán đang cố gắng để dự đoán.
Variance versus Bias (best is on the top left)

 

  • Iteration: Số lần huấn luyện sẽ chạy. Trong ví dụ này, bạn sẽ làm 5, 10, và 20 lặp cho các kết hợp khác nhau của cấp bậc và lambda.
from pyspark.mllib.recommendation import ALS
model = ALS.train(training, rank = 10, iterations = 5, lambda_=0.01)

Finding the right model

Việc collaborative filter sử dụng thuật toán ALS dựa trên ba bộ dữ liệu khác nhau:

  • Training set: Bao gồm dữ liệu có đầu ra đã biết. Bộ này là kết quả hoàn hảo. Trong giải pháp này, nó chứa các xếp hạng của người dùng.
  • Validating set: Bao gồm dữ liệu sẽ giúp điều chỉnh quá trình đào tạo để chọn đúng sự kết hợp của các thông số và chọn mô hình tốt nhất.
  • Testing set: Bao gồm dữ liệu sẽ được sử dụng để đánh giá hiệu suất của mô hình được đào tạo tốt nhất. Điều này sẽ tương đương với việc chạy phân tích trong một ví dụ thực tế.

Để tìm ra mô hình tốt nhất, bạn cần phải tính sai số gốc-trung bình-vuông (RMSE) dựa trên mô hình đã được tính toán, bộ xác nhận và kích thước của nó. Các RMSE thấp hơn, mô hình tốt hơn.

Tham khảo: Machine Learing job in Vietnam

(còn tiếp)

Nguồn: topdev.vn via cloud.google.com