21.5 Personalizuotas rikiavimas rekomendacinėms sistemoms
Ankstesniuose skyreliuose buvo nagrinėjama tik aiškioji grįžtamoji informacija, o modeliai buvo apmokomi ir testuojami pagal stebėtus įvertinimus. Tokie metodai turi du trūkumus. Pirma, didžioji dalis grįžtamosios informacijos realiuose scenarijuose yra ne aiškioji, o numanomoji, o aiškiąją grįžtamąją informaciją gali būti brangiau rinkti. Antra, nestebėtos naudotojų ir elementų poros, kurios gali padėti prognozuoti naudotojų interesus, visiškai ignoruojamos, todėl šie metodai netinka atvejams, kai įvertinimų trūksta ne atsitiktinai, o dėl naudotojų pageidavimų. Nestebėtos naudotojų ir elementų poros yra tikrosios neigiamos grįžtamosios informacijos (naudotojai nesidomi elementais) ir trūkstamų reikšmių (naudotojas ateityje gali sąveikauti su elementais) mišinys. Matricos faktorizavime ir AutoRec nestebėtas poras tiesiog ignoruojame. Akivaizdu, kad šie modeliai negali atskirti stebėtų ir nestebėtų porų ir paprastai netinka personalizuoto rikiavimo užduotims.
Todėl išpopuliarėjo rekomendacinių modelių klasė, skirta sudaryti surikiuotus rekomendacijų sąrašus iš numanomosios grįžtamosios informacijos. Apskritai personalizuoto rikiavimo modelius galima optimizuoti taškiniu, porų arba sąrašų požiūriu. Taškiniai požiūriai vienu metu nagrinėja vieną sąveiką ir apmoko klasifikatorių ar regresorių individualiems pageidavimams prognozuoti. Matricos faktorizavimas ir AutoRec optimizuojami taškiniais tikslais. Porų požiūriai kiekvienam naudotojui nagrinėja elementų porą ir siekia aproksimuoti optimalią tos poros tvarką. Paprastai porų požiūriai labiau tinka rikiavimo užduočiai, nes santykinės tvarkos prognozavimas primena pačią rikiavimo prigimtį. Sąrašų požiūriai aproksimuoja viso elementų sąrašo tvarką, pavyzdžiui, tiesiogiai optimizuodami rikiavimo matus, tokius kaip normalizuotas diskontuotas kaupiamasis naudingumas (NDCG). Tačiau sąrašų požiūriai yra sudėtingesni ir reikalauja daugiau skaičiavimų nei taškiniai ar porų požiūriai. Šiame skyrelyje pristatysime du porų tikslus (nuostolius): Bajeso personalizuoto rikiavimo nuostolį ir vyrio nuostolį bei jų įgyvendinimus.
21.5.1 Bajeso personalizuoto rikiavimo nuostolis ir jo įgyvendinimas
Bajeso personalizuotas rikiavimas (angl. Bayesian personalized ranking, BPR) (Rendle ir kt., 2009) yra porų personalizuoto rikiavimo nuostolis, išvestas iš maksimalaus aposteriorinio vertintuvo. Jis plačiai naudojamas daugelyje esamų rekomendacinių modelių. BPR apmokymo duomenis sudaro ir teigiamos, ir neigiamos poros (trūkstamos reikšmės). Daroma prielaida, kad naudotojas teikia pirmenybę teigiamam elementui prieš visus kitus nestebėtus elementus.
Formaliai apmokymo duomenys sudaromi iš eilučių , reiškiančių, kad naudotojas teikia pirmenybę elementui prieš elementą . Žemiau pateikta BPR Bajeso formuluotė, kuria siekiama maksimizuoti aposteriorinę tikimybę:
Čia žymi savavališko rekomendacinio modelio parametrus, o – pageidaujamą personalizuotą visų elementų pilnąją tvarką naudotojui . Galime suformuluoti maksimalų aposteriorinį vertintuvą, kad išvestume bendrąjį personalizuoto rikiavimo užduoties optimizavimo kriterijų.
kur yra apmokymo aibė, žymi elementus, kurie patiko naudotojui , žymi visus elementus, o – visus kitus elementus, išskyrus tuos, kurie patiko naudotojui. ir yra atitinkamai naudotojo prognozuojami balai elementams ir . Apriorinis skirstinys yra normalusis pasiskirstymas su nuliniu vidurkiu ir dispersijų bei kovariacijų matrica . Čia imame .
Įgyvendinsime bazinę klasę
mxnet.gluon.loss.Loss ir perrašysime metodą forward, kad sukonstruotume Bajeso personalizuoto rikiavimo nuostolį. Pradedame importuodami klasę Loss ir modulį np.
from mxnet import gluon, np, npx
npx.set_np()
BPR nuostolio įgyvendinimas yra toks.
#@save
class BPRLoss(gluon.loss.Loss):
def __init__(self, weight=None, batch_axis=0, **kwargs):
super(BPRLoss, self).__init__(weight=None, batch_axis=0, **kwargs)
def forward(self, positive, negative):
distances = positive - negative
loss = - np.sum(np.log(npx.sigmoid(distances)), 0, keepdims=True)
return loss
21.5.2 Vyrio nuostolis ir jo įgyvendinimas
Rikiavimo vyrio nuostolis yra kitokios formos nei gluon bibliotekoje pateiktas vyrio nuostolis, dažnai naudojamas klasifikatoriuose, tokiuose kaip SVM. Rekomendacinėse sistemose rikiavimui naudojamas nuostolis yra tokios formos.
kur yra saugos ribos dydis. Juo siekiama nustumti neigiamus elementus nuo teigiamų. Kaip ir BPR, jis siekia optimizuoti santykinį atstumą tarp teigiamų ir neigiamų pavyzdžių, o ne absoliučias išvestis, todėl gerai tinka rekomendacinėms sistemoms.
#@save
class HingeLossbRec(gluon.loss.Loss):
def __init__(self, weight=None, batch_axis=0, **kwargs):
super(HingeLossbRec, self).__init__(weight=None, batch_axis=0,
**kwargs)
def forward(self, positive, negative, margin=1):
distances = positive - negative
loss = np.sum(np.maximum(- distances + margin, 0))
return loss
Šie du nuostoliai yra pakeičiami vienas kitu personalizuotam rikiavimui rekomendavime.
21.5.3 Santrauka
- Rekomendacinių sistemų personalizuoto rikiavimo užduočiai yra trys rikiavimo nuostolių tipai: taškiniai, porų ir sąrašų metodai.
- Du porų nuostoliai – Bajeso personalizuoto rikiavimo nuostolis ir vyrio nuostolis – gali būti naudojami pakaitomis.
21.5.4 Pratimai
- Ar yra BPR ir vyrio nuostolio variantų?
- Ar galite rasti rekomendacinių modelių, naudojančių BPR ar vyrio nuostolį?
