Spark ALS: polecanie nowym użytkownikom

10

Pytanie

Jak przewidzieć ocenę dla nowego użytkownika w modelu ALS przeszkolonym w Spark? (Nowe = niewidoczne podczas treningu)

Problem

Tutaj śledzę oficjalny samouczek Spark ALS:

http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.html

Jestem w stanie zbudować dobrego polecającego z przyzwoitym MSE, ale mam problem z wprowadzaniem nowych danych do modelu. Samouczek zmienia oceny pierwszego użytkownika przed szkoleniem, ale to naprawdę hack. Dają następującą wskazówkę:

9.2 Zwiększanie współczynników macierzy:

W tym samouczku dodajemy Twoje oceny do zestawu treningowego. Lepszym sposobem na uzyskanie rekomendacji jest najpierw szkolenie modelu faktoryzacji macierzy, a następnie ulepszenie modelu przy użyciu twoich ocen. Jeśli brzmi to interesująco, możesz rzucić okiem na implementację MatrixFactorizationModel i zobaczyć, jak zaktualizować model dla nowych użytkowników i nowych filmów.

Wdrożenie wcale mi nie pomaga. Idealnie szukam czegoś takiego:

predictions = model.predictAllNew(newinput)

Ale taka metoda nie istnieje. Mógłbym zmodyfikować oryginalny RDD, ale myślę, że wymagałoby to ponownego przeszkolenia modelu, więc nie byłoby to również idealne rozwiązanie. Z pewnością musi być bardziej elegancki sposób?

Gdzie jestem teraz:

Myślę, że muszę znaleźć utajoną reprezentację nowego wektora. Według oryginalnej pracy możemy to obliczyć w następujący sposób:

Xu=(YT.douY+λja)-1YT.doup(u)

dou

Moja obecna próba:

V = model.productFeatures().map(lambda x: (x[1])).collect() #product latent matrix Y

Cui =  alpha * np.abs(newinput)
Cui =  (1. + Cui) / (Cui)
Cui[np.where(newinput == 0)] = 0
Cui = np.diag(Cui)

lambdaI = len(np.where(newinput!=0)) * regularization_parameter * np.eye(np.shape(V)[1]) #
term   = np.dot(np.dot(Vt,Cui),V)+lambdaI
term   = np.dot(np.linalg.inv(term),Vt)
term   = np.dot(term,Cui)
term   = np.dot(term,newinput)
latentinput = term

Ale to nie pasuje.

Ciri
źródło

Odpowiedzi:

9

Tutaj jest wiele pytań. Po pierwsze, dla prawdziwie nowego użytkownika bez danych nie ma możliwości skorzystania z modelu rekomendującego. Jeśli dosłownie nie masz informacji o użytkowniku, jedyne, co możesz zrobić, to podać pewne domyślne zalecenia.

Oczywiście, kiedy masz już jakieś dane i możesz odbudować model w celu włączenia użytkownika, możesz wydawać rekomendacje. Możesz to zrobić w Spark, ale już o tym wiesz. Trwa to zbyt długo, jeśli będziesz musiał dodać informacje o nowych użytkownikach w czasie wykonywania. Technika, którą chcesz, nazywa się „składaniem”, służy do określenia (w przybliżeniu) nowego wektora użytkownika, biorąc pod uwagę elementy, z którymi użytkownik wchodzi w interakcje. To tylko algebra liniowa, wynikająca z podanego równania.

Odkopałem stary slajd, który może pomóc:

Składany ALS

„Cu” tak naprawdę nie różni się. Dodałem „rozszerzenie”, aby obsłużyć przypadek wejścia ujemnego, ale to samo dotyczy wejścia dodatniego.

Oto implementacja fold-in, choć myślę, że będzie zbyt gęsta, aby mieć dużą wartość:

https://github.com/OryxProject/oryx/blob/2c01d496f93f2825a076eb7fe492aa39a5290aa6/app/oryx-app-common/src/main/java/com/cloudera/oryx/app/als/ALSUtils.java#L74

Obliczenie nowego wektora użytkownika implikowanego przez interakcję użytkownik-element jest dość łatwą algebrą liniową. Trudną częścią, którą znalazłem, jest decyzja, ile ważyć.

Mam nadzieję, że jest to pchnięcie we właściwym kierunku.

Sean Owen
źródło