Phương pháp chọn ngẫu nhiên các xếp hạng để cập nhật

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu kỹ thuật phân tích ma trận trong các hệ thống khuyến nghị (Trang 48)

Phương pháp ngẫu nhiên nói chung được hưởng sự hội tụ tốt, chịu ảnh hưởng chủ yếu từ bộ nhớ gián đoạn. Lý do này không chỉ cho xếp hạng được truy cập một cách ngẫu nhiên khi các mã đồng nhất của user/item cũng trở thành gián đoạn.

Mức độ nghiêm trọng của bộ nhớ gián đoạn bị biến thiên trong các phương pháp là khác nhau. Trong HogWild mỗi luồng lấy ngẫu nhiên một phần tử nào đó trong sốR độc lập, vì vậy nó bị gián đoạn bộ nhớ trong R, P và Q. Ngược lại, đối với DSGD mỗi một khối được chọn ngẫu nhiên dễ dàng thay đổi được thứ tự cập nhật để giảm thiểu sự gián đoạn bộ nhớ.

3.4.3 Giải quyết vấn đề

Để giải quyết 2 vấn đề được đề cập ở trên, ở đây chúng ta xem xét đến 2 kĩ thuật: lập lịch khóa nhàn rỗi (lock - free scheduling) và phương pháp ngẫu nhiên từng phần. Chúng ta đặt tên cho phương pháp thực hiện SGD song song là FPSGD (Fast Parallel SGD). Trong phần này, chúng ta sẽ thảo luận FPSGD gán động các khối cho luồng để tránh vấn đề locking như thế nào. Tiếp theo, chúng ta quan sát một lựa chọn ngẫu nhiên và hiển thị ngẫu nhiên mà có thể chỉ được áp dụng giữa các khối thay vì trong khối duy trì bộ nhớ liên tục và hội tụ nhanh. Từ đó, chúng ta đi đến tổng quát thiết kế hoàn chỉnh FPSGD. Cuối cùng, chúng ta giới thiệu các kỹ thuật thực hiện để đẩy nhanh tiến độ tính toán.

Lập lịch Lock - Free

Chúng ta theo dõi DSGD dạng lưới R khối và thiết kế một lập lịch để giữ s luồng đang làm việc với tập hợp các khối độc lập. Xét khối bi,j, nếu nó độc lập với tất cả các khối đang được xử lý thì được gọi là khối rỗi (free block). Ngoài ra, còn có khối không rỗi khác (non-free block). Khi luồng kết thúc tiến trình với một khối, lập lịch giao một khối mới thỏa mãn 2 tiêu chuẩn dưới đây:

1. Là một khối rỗi.

3.4 Thuật toán FPSGD 39

số đó. Cho sluồng, ta biểu diễn FPSGD bằng việc chiaR thành ít nhất(s+ 1)×(s+ 1)

khối. Lấy 2 khối làm ví dụ. Cho T1 là luồng đang cập nhật một khối xác định và T2 là luồng vừa kết thúc cập nhật một khối khác và đang gán một công việc mới trong lập lịch. Nếu ta chia R thành 2×2 khối như trong hình 3.4a thì T2 chỉ có một lựa chọn: khối đó chỉ xử lý chính nó. Tình trạng xảy ra tương tự khi T1 xử lý công việc mới. Vì T1 và T2

luôn luôn xử lý cùng một khối, còn lại 2 khối không bao giờ được xử lý. Ngược lại, nếu chúng ta chiaR thành 3×3khối như hình 3.4b thì T2 có 3 lựa chọn:b1,1, b1,2 và b2,1 khi tạo một khối mới.

Hình 3.4: Minh họa cách chia R thành các khối ảnh hưởng từ việc lập lịch.

Ở hình trên, T1 là luồng đang cập nhật khối b0,0. T2 là luồng đang tạo một khối mới từ lập lịch. Các khối được đánh dấu "x" phụ thuộc vào khối b0,0 nên chúng không thể được cập nhật bởi khốiT2.

Như đã thảo luận ở trên, vì chúng ta luôn luôn có thể chỉ định một khối rảnh rỗi cho một luồng khi nó kết thúc cập nhật trước đó, lập lịch của chúng không bị vấn đề locking. Tuy nhiên, đối với các tập dữ liệu lớn không cân bằng, hầu hết các xếp hạng có sẵn có trong các khối nhất định, lập lịch của chúng không thể giữ số lượng các bản cập nhật trong tất cả các khối cân bằng. Trong trường hợp các khối có nhiều xếp hạng nó chỉ được cập nhất rất ít thời gian. Một biện pháp đơn giản để khắc phục là dùng kĩ thuật xáo trộn ngẫu nhiên đã được giới thiệu ở phần DSGD. Theo kinh nghiệm ở các nghiên cứu thì sau khi xáo trộn ngẫu nhiên, số các xếp hạng trong khối nặng nhất nhỏ hơn 2 lần khối nhẹ nhất. Đã có nhiều nghiên cứu và phần thực nghiệm kiểm tra mức độ nghiêm trọng của vấn đề mất cân bằng sau khi xáo trộn ngẫu nhiên. Ở đây chúng ta xác định mức độ cân bằng (DoI) để kiểm tra số các cập nhật trong tất cả các khối.

Cho U TM(t) và U Tm(t) lần lượt là cực đại và cực tiểu số các cập nhật trong tất cả các khối, trong đót là chỉ số lặp. (FPSGD không có khái niệm lặp. Ở đây chúng ta gọi mỗi chu kỳ xử lý(s+ 1)2 như một lần lặp.) DoI được định nghĩa bởi công thức sau:

DoI = U TM(t)−U Tm(t)

t (3.8)

DoI nhỏ cho thấy số các cập nhật tương tự nhau trên tất cả các khối. Trong hình 3.5 minh họa DoI cho 3 tập dữ liệu khác nhau. Chúng ta có thể thấy lập lịch giảm DoI xuống 0 chỉ trong vài lần lặp. Trong hình 3.5 có 8 luồng được sử dụng và R được chia thành

Hình 3.5: DoI trên 3 tập dữ liệu.

Phương pháp ngẫu nhiên từng phần

Để đạt được bộ nhớ liên tục, ngược lại với phương pháp ngẫu nhiên chúng ta xét một phương pháp sắp xếp tuần tự khi chọn trường hợp đánh giá bằng danh tính người dùng hoặc một item nào đó. Hình 3.6 cung cấp ví dụ theo một trật tự người dùng. Sau đó ma trậnP có thể được truy cập liên tục. Ngoài ra, nếu theo thứ tự các item sau đó truy cập liên tụcQđạt được. Đối với R, nếu trật tự các trường hợp xếp hạng là cố định thì chúng ta có thể lưu trữR vào cùng bộ nhớ để đảm bảo truy cập liên tục của nó.

Hình 3.6: Phương pháp sắp thứ tự chọn các xếp hạng để cập nhật.

Mặc dù phương pháp sắp xếp có thể truy cập dữ liệu một cách liên tục hơn nhưng kinh nghiệm cho thấy nó không thực sự được ổn định nhất. Hình 3.7 cho ta ví dụ chứng tỏ rằng với hai tỉ lệ học khác nhau rất nhỏ thì đối với SGD, phương pháp sắp xếp có thể nhanh hơn hoặc chậm hơn nhiều so với phương pháp ngẫu nhiên.

3.4 Thuật toán FPSGD 41

Hình 3.7: So sánh giữa phương pháp ngẫu nhiên và phương pháp sắp thứ tự vớitập dữ liệu của Yahoo!Music. Ở đây chỉ xét 1 luồng được sử dụng tập dữ liệu của Yahoo!Music. Ở đây chỉ xét 1 luồng được sử dụng

Thực nghiệm cho thấy một truy cập ngẫu nhiên của dữ liệu/biến có thể có ích cho sự hội tụ. Đặc tính này được quan sát trong các kỹ thuật tối ưu hóa có liên quan. Ví dụ, trong kết hợp phương pháp để giải quyết các vấn đề tối ưu hóa thì phương pháp ngẫu nhiên nhanh hơn sắp xếp tuần tự để cập nhật các biến và nó góp phần cải thiện đáng kể tốc độ hội tụ. Từ sự liên quan giữa dữ liệu liên tục và tốc độ hội tụ trong FPSGD, các tác giả trong tài liệu [11] đã đề xuất phương pháp ngẫu nhiên từng phần dùng để chọn các xếp hạng trong một khối có trật tự, tuy nhiên việc lựa chọn các khối là ngẫu nhiên. Mặc dù lập lịch gần với việc xác định các khối với số truy cập nhỏ nhất, tính ngẫu nhiên có thể tăng lên bởi sự phân chiaR thành nhiều khối. Sau đó, bất cứ thời điểm nào một vài khối được xử lý cùng thời điểm, do vậy lịch trình có thể chọn ngẫu nhiên một trong số đó. Hình 3.8 minh họa hoạt động của phương pháp ngẫu nhiên từng phần. Trình tự cập nhật tổng thể không phải là user by user hay item by item nên một số ngẫu nhiên được chọn thành công.

Hình 3.8: Minh họa phương pháp ngẫu nhiên từng phần.

Mỗi màu khác nhau chỉ các luồng khác nhau. Chấm được tô màu là khối khởi tạo của luồng. Hình 3.9 mở rộng so sánh thời gian chạy trong hình 3.6 bao gồm FPSGD. Chúng ta có thể thấy FPSGD có cả sự hội tụ nhanh và RMSE tốt hơn.

Hình 3.9: So sánh phương pháp sắp thứ tự, phương pháp ngẫu nhiên và ngẫu nhiên từng phần trên tập dữ liệu Yahoo!Music. Ở đây chỉ xét 1 luồng được sử dụng

Một số phương pháp có liên quan đã được nghiên cứu, mặc dù chúng cho thấy sự hội tụ trên phương pháp sắp xếp tồi hơn phương pháp ngẫu nhiên khi bị mất các điều kiện huấn luyện. Quan sát này đối lập với kết quả thực nghiệm; lý do có thể là do việc xét RMSE trên tập dữ liệu kiểm tra khi chúng bị mất huấn luyện.

Có một vài chi tiết cần được lưu ý như sau: Chúng ta đã biết FPSGD áp dụng xáo trộn ngẫu nhiên để tránh số lượng không cân bằng các bản cập nhật của mỗi khối. Tuy nhiên, sau khi áp dụng các xáo trộn ngẫu nhiên và chia R thành các khối, các xếp hạng trong mỗi khối không sắp xếp theo người sử dụng hoặc item. Áp dụng phương pháp ngẫu nhiên từng phần chúng ta phải sắp xếp danh tính người dùng hoặc item trước khi xử lý từng khối một vì phương pháp sắp thứ tự được áp dụng bị khóa (block) trước đó.

Tổng quan về FPSGD

Thuật toán 3: tiến trình tổng thể của FPSGD

1: trộn ngẫu nhiên R

2: chia R thành tập B với ít nhất (s+ 1)×(s+ 1) khối 3: sắp thứ tự mỗi khối theo định dạng của người dùng (item) 4: xây dựng một lập lịch

5: khởi độngs luồng làm việc

6: chờ cho đến khi tổng số cập nhật đạt được một giá trị người dùng (item) xác định Đầu tiên, nó trộn ngẫu nhiên R để tránh sự mất cân bằng dữ liệu. Sau đó nó chia R

thành ít nhất (s+ 1)×(s+ 1) khối và sắp thứ tự mỗi khối theo định dạng người dùng (hay item) vì phương pháp ngẫu nhiên từng phần có thể được áp dụng. Cuối cùng nó tạo một lập lịch và khởi độngsluồng làm việc. Sau khi số lượng yêu cầu lặp đến khi đạt được nó sẽ thông báo lên lịch để ngăn chặn tất cả các luồng làm việc.

Thuật toán 4: lập lịch cho FPSGD

1:procedur:e GET_JOB 2: bx =N U LL

3: for all b thuộcB do

3.4 Thuật toán FPSGD 43

6: else if b.ut≤bx.ut then

7: bx =b 8: end if 9: end for 10: return bx 11: end procedure 12: procedure PUT_JOB 13: b.ut=b.ut+ 1 14: end procedure

Thuật toán 5: Luồng làm việc FPSGD

1:while true do

2: lấy 1 khối b từ schedule → get_job()

3: xử lý từng phần tử được sắp thứ tự trong khối 4: scheduler → put_job(b)

5:end while

Mã giả của lập lịch và mỗi luồng làm việc được thể hiện tương ứng trong thuật toán 4 và 5. Mỗi luồng làm việc liên tục lấy một khối từ lập lịch bằng việc gọi hàm get_job

và lập lịch sẽ trả về một khối đáp ứng 2 tiêu chí đã đề cập. Sau khi một luồng làm việc lấy khối mới nó xử lý các xếp hạng trong khối đó theo kiểu được sắp thứ tự. Cuối cùng, luồng gọi hàm put_job của lập lịch để cập nhật số thời lần mà khối đó được xử lý.

Thực nghiệm và đánh giá

4.1 Cấu hình thử nghiệm

4.1.1 Dữ liệu thử nghiệm

Mô hình đề xuất được tiến hành thử nghiệm trên tập dữ liệu của bộ dữ liệu MovieLens. MovieLens là một hệ thống khuyến nghị phổ biến, là trang web cộng đồng mạng gợi ý phim cho người dùng xem, dựa trên sở thích phim của họ và sử dụng phương pháp lọc cộng tác. Trang web này là một dự án do GroupLens nghiên cứu, phòng thí nghiệm nghiên cứu tại Khoa Kỹ thuật và Khoa học Máy tính tại Đại học Minnesota đã tạo ra MovieLens vào năm 1997. Mục tiêu cuối cùng của trang web là thu thập dữ liệu nghiên cứu về hệ thống khuyến nghị được cá nhân hóa.

Trang web của MovieLens gợi ý căn cứ vào những gì người sử dụng cung cấp cho các trang web, bao gồm cả bộ phim người dùng thích, và từ những người dùng khác có thị hiếu tương tự thích. Khi người dùng tham gia vào trang web, họ được chọn ngẫu nhiên một số bộ phim và phải xếp hạng cho các bộ phim đó từ 1 đến 5 sao (5 là tốt nhất). Sau đó hệ thống tiến hành so sánh xếp hạng của người sử dụng với những người khác có cùng thị hiếu sao cho phù hợp với các gợi ý từ các bộ phim mà người dùng vẫn chưa thấy. Khi người dùng tìm kiếm một bộ phim cụ thể trên trang web, hệ thống trả về một dự đoán về những gì họ tin rằng người dùng sẽ đánh giá bộ phim sau khi xem nó. Trang web này cho thấy người sử dụng xếp hạng nhiều bộ phim mà họ đã nhìn thấy càng tốt thì các khuyến nghị được đưa ra sẽ càng chính xác hơn, vì vậy hệ thống sẽ có một mẫu tốt hơn về thị hiếu điện ảnh của người dùng.

Tập dữ liệu MovieLen thử nghiệm gồm 6000 người dùng trên 4000 bộ phim với 600000 đánh giá (ratings). Để tiến hành thử nghiệm trên mô hình, tiến hành việc chọn ngẫu nhiên trong tập dữ liệu MovieLen 500 người dùng làm dữ liệu huấn luyện, chọn ngẫu nhiên trong số còn lại 150 người dùng làm dữ liệu kiểm tra.

Hệ thống dữ liệu của MovieLens được cho bởi cách biểu diễn và mối liên hệ giữa người dùng, các bộ phim và các xếp hạng (ratings) như sau:

4.1 Cấu hình thử nghiệm 45

Trong đó, User - người dùng; Item - phim và Rating là các xếp hạng. Với mối liên hệ người dùng - bộ phim sẽ tạo nên ma trậnm×n

4.1.2 Thực hiện thử nghiệm

Dưới đây là các yêu cầu về cấu hình thử nghiệm:

Cấu hình máy:Máy tính Laptop CORE i3, RAM 6GB

Môi trường thử nghiệm:Linux

Phần mềm:Thuật toán DSGD, FDSGD được cài đặt bằng ngôn ngữ C, các biểu đồ so sánh được vẽ bằng ngôn ngữ R.

Dữ liệu:

- Lập trình C với gói dữ liệu LIBMF: http://www.csie.ntu.edu.tw/∼cjlin/libmf/

- Các hướng dẫn: http://www.csie.ntu.edu.tw/∼cjlin/papers/libmf.pdf

Các chuyển đổi thành ma trận (convert) và thuật toán huấn luyện (training), các kết hợp dữ liệu được thực hiện bằng ngôn ngữ C. Biểu đồ so sánh RMSE của thuật toán DSGD và FPSGD được thực hiện bằng ngôn ngữ R.

Dưới đây là lệnh chạy dữ liệu trong R:

- Copy thư mục data vào thư mục chạy thử nghiệm.

- Mở R lên, vào tab đầu tiên trên menu, kích vào File/Change dir ..., trỏ đến thư mục data ở trên.

Cách đặt tên file trong data:

- testk20-003.txt => dữ liệu của DSGD, trong đó, k = 20, γ = 0.003

- test-fpsgd-20-003.txt => dữ liệu của FPSGD, trong đó, k = 20, γ = 0.003

Trong file dữ liệu của DSGD và FPSGD gồm có 2 cột: 1 cột là số thời gian, 1 cột là RMSE; mỗi dòng là 1 bước lặp - là số bước lặp trong mỗi lần cập nhật dữ liệu cho ma trận (ở đây cho bước lặp chạy là 100).k là số nhân tố ẩn (trong trường hợp thực nghiệm với bộ dữ liệu phim ảnh MovieLens,k là số các tiêu chí đánh giá của bộ phim, ví dụ nếu

k = 3, ta có các tiêu chí đánh giá: thể loại phim, đạo diễn, diễn viên) và γ là tỉ lệ học máy (learning rate) trong thuật toán DSGD và FPSGD (tỉ lệ học máy được chọn là 0.003 để cho kết quả đẹp nhất với nhiều nghiên cứu thực nghiệm đã chọn tỉ lệ này. Mục tiêu là tỉ lệ học cần được chọn ngẫu nhiên).

Mô tả tập dữ liệu huấn luyện: Là thư mục chứa các file dữ liệu cho mỗi bộ phim. Dòng đầu tiên của file chứa ID phim sau dấu hai chấm. Dòng tiếp theo tương ứng với đánh giá của khách hàng và ngày đánh giá theo định dạng sau:

CustomerID, Rating, Date - MovieID: xếp tuần tự

- CustomerID: sắp xếp có khoảng trống với các user tương ứng. - Rating: đánh giá từ 1 đến 5 sao

- Date: có định dạng YYYY-MM-DD.

Mô tả file dữ liệu phim ảnh: Thông tin phim được lưu ở file "movie-titles.txt" theo định dạng:

MovieID, YearOfRelease, Title

- MovieID: tương ứng với ID phim thực tế

- YearOfRelease: dao động từ 1890 - 2005, tương ứng với năm phát hành DVD - Title: là tiêu đề bộ phim, tiêu đề bằng tiếng Anh.

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu kỹ thuật phân tích ma trận trong các hệ thống khuyến nghị (Trang 48)

Tải bản đầy đủ (PDF)

(65 trang)