Kuinka yritykset käyttävät yhteistyöhön perustuvaa suodatusta oppiaksesi juuri haluamasi

Kuva Jens Johnsson Unsplash-kuvassa

Kuinka Amazonin ja Netflixin kaltaiset yritykset tietävät tarkalleen mitä haluat? Olipa kyse sitten uudesta kaiuttimista, joita olet silmäilenyt, tai seuraavasta Black Mirror -jaksosta - heidän ennustavien algoritmien käyttö on tehnyt työstäsi myymällä sinulle tavaroita naurettavan tehokkaasti.

Mutta niin paljon kuin me kaikki haluaisimme mehukasta salaliitoteoriaa, ei, he eivät käytä psykiaa.

He käyttävät jotain paljon maagista - matematiikkaa. Tänään tarkastellaan lähestymistapaa, jota kutsutaan yhteistyösuodatukseksi.

Mikä tarkalleen on yhteistyösuodatus?

Kuten Jeremy Howard mainitsee mahtavassa syväoppimiskurssissaan fast.ai-sivustolla, jäsennellyt syväoppimallit eivät saa paljon rakkautta nykyään.

Todennäköisesti siksi, ettet pääse näkemään tällaisia ​​asioita:

Lähde: https://cdn.vox-cdn.com/thumbor/NN7jTnph9VCkyyt2nrTFml3XbYw=/0x0:600x338/1200x800/filters:focal(252x121:348x217):no_upscale()/cdn.voup-cdn.vox-cdn.vox-cdn.vox-cdn image / 57380619 / ezgif.com_gif_maker__1_.0.gif

Mutta strukturoidut algoritmit, kuten yhteistyösuodatus, ovat niitä, joita käytetään yleisimmin todellisessa maailmassa. Ne ovat syy siihen, että Amazonin sivun alaosassa näkyvät tavarat vaikuttavat niin houkuttelevalta ostaa.

Lähde: https://www.highspot.com/wp-content/uploads/Amazon_Recomunded_Edit.png

Yhteistyöhön perustuva suodatus toimii perusperiaatteella: pidät todennäköisesti siitä, mikä sinulle samankaltainen joku pitää.

Algoritmin tehtävä on löytää joku, jolla on osto- tai katselutapoja kuin sinun, ja ehdottaa sinulle mitä hän antoi korkean arvosanan.

Se voi toimia myös päinvastoin.

Algoritmi voi suositella tuotetta, joka on samanlainen kuin toinen tuote, jolle olet aiemmin antanut korkean arvosanan. Kaiken tämän samankaltaisuuden tarkistuksen ja vertailun suorittaa jokin melko suoraviivainen lineaarinen algebra (matriisimatematiikka).

Lähde: https://johnolamendy.files.wordpress.com/2015/10/01.png

Onko se todella niin helppoa?

Ei niin nopeasti. Ennen kuin aloitamme vektoreiden ja pistetuotteiden heittämistä ympäri, käsitellään merkittävää ongelmaa, johon kaikki suositusjärjestelmän algoritmit kohtaavat - kylmäkäynnistysongelmaa.

Lähde: https://thermex-systems.com/wp-content/uploads/portathaw-cold-start-system-on-heavy-dump-truck.jpg

Yhteistyöllinen suodatus toimii hyvin, kun sinulla on kaksi asiaa:

  • paljon tietoa siitä, mitä jokainen asiakas pitää (sen perusteella, mitä he aiemmin arvostelivat)
  • paljon tietoa siitä, mihin yleisöön kukin elokuva tai tuote voi palvelea (sen perusteella, minkä tyyppiset ihmiset sitä arvostelivat).

Mutta entä uudet käyttäjät ja uudet tuotteet, joista sinulla ei ole paljon tietoa?

Lähde: https://1843magazine.static-economist.com/sites/default/files/styles/article-main-image-overlay/public/0312ILIN03-web.jpg

Yhteistyöllinen suodatus ei toimi hyvin näissä tilanteissa, joten joudut ehkä kokeilemaan jotain muuta. Joitakin yleisiä ratkaisuja ovat metatietojen analysointi tai uusien käyttäjien saaminen käydä läpi muutamia kysymyksiä oppia alkuperäiset asetukset.

Lähde: http://img.techiesparks.com/2015/07/apple-music-artists.png

Ok, nyt hienoja juttuja

Kuten useimmat koneoppimisongelmat, on luultavasti hyvä idea ensin katsoa tietoja. Tästä lähtien käytän esimerkkejä elokuvista ja arvioista (lähinnä fast.ai-kurssilla käytetyn movielens-tietoaineiston innoittamana).

Aiomme visualisoida sen rakentamalla käyttäjien taulukon niiden elokuville antamien pisteiden perusteella.

Jokainen rivi edustaa käyttäjää ja jokainen sarake elokuvaa.

Ristiviittaukset kertovat, minkä arvosanan käyttäjä on antanut elokuvalle (asteikolla 1–5, missä 0 tarkoittaa 'ei katsonut').

Katsomme yhteistyöhön perustuvaa suodatusmalliamme menestykseksi, jos se pystyy täyttämään nollia. Tämä tarkoittaisi, että se pystyy ennustamaan, kuinka kukin käyttäjä arvioi elokuvaa, sekä käyttäjän millainen että millainen elokuva on.

Nyt algoritmi. Aiomme perustaa 2 matriisia: yhden käyttäjille ja toisen elokuville. Niitä kutsutaan upotusmatriiseiksi. Soitetaan heille W_u (käyttäjille) ja W_m (elokuville).

Jokainen matriisi täytetään e-ulotteisilla vektoreilla (pohjimmiltaan taulukon koko e). Mikä on e, kysyt? Se on maaginen numero, johon puhun myöhemmin. Toistaiseksi vain anna e olla suosikkiluku.

Huomaa, että jos poistat rivi- ja sarakeotsikot, yllä oleva taulukko näyttää myös matriisilta. Tämä ei ole sattumaa. Jos tunnet matriisin kertolaskun, tiedät, että 2 * 3 matriisi kertaa 3 * 2 matriisi antaa 2 * 2 matriisin.

Jos haluat oppia lisää matriisikertomuksesta, sinun kannattaa tutustua tähän soittolistaan ​​Khan-akatemiassa.

Samaa logiikkaa käyttämällä voimme kertoa elokuvan ja käyttäjän matriisit. Mitat toimivat oikein oikein, jotta saadaan matriisi, joka on alkuperäisen taulukkotietojoukon kokoinen (no, teknisesti joudut siirtämään yhden niistä, mutta ohitan toteutuksen yksityiskohdat).

Jos voimme oppia elokuvateatterin ja käyttäjämatriisin merkintöjen arvot, voimme teoriassa saada alkuperäisen taulukomme kertomalla nämä kaksi.

Meillä on perusteellinen totuus: alkuperäinen pöytä. Ainoa mitä meidän on tehtävä on selvittää numerot (tunnetaan myös nimellä painot), jotka jotenkin moninkertaistuvat yhdessä antamaan meille alkuperäisen taulukon.

Anna koneoppinnan mystinen taide.

Näin toimimme seuraavasti:

  • Aloitamme täysin satunnaislukuilla elokuvamatriisissa ja käyttäjämatriisissa.
  • Sitten kerrotaan nämä kaksi saadaksesi toinen matriisi (joka tässä vaiheessa on myös täysin satunnainen), joka näyttää alkuperäiseltä taulukolta.
  • Vertaamalla ennustettuja arvoja taulukon todellisiin arvoihin määrittelemme häviöfunktion. Tämä on pohjimmiltaan mittari siitä, kuinka kaukana ennustetusta arvostamme oli todellisesta arvosanasta.

Huomaa, että meidän on myös ohitettava nollat, koska emme halua mallimme ennustavan luokitusta 0 kenelle tahansa. Se olisi aika hyödytöntä.

Jos haluat lisätietoja häviötoiminnoista, suosittelen Siraj Ravalin videota.

Tappioiden löytämisen jälkeen käytämme jälkikasvausta ja gradientin laskeutumista kahden matriisin optimoimiseksi saadaksesi oikeat arvot.

PUOMI! Olemme valmiit!

Ok, nopea kertaus:

  • Meillä on taulukko luokituksilla, jotka jokainen käyttäjä antoi kullekin elokuvalle. Jos käyttäjä ei katsonut elokuvaa, taulukossa lukee 0. Haluamme ennustaa nollat.
  • Tätä varten me rakensimme kaksi matriisia, yhden käyttäjille ja toisen elokuville. Jokainen matriisi on periaatteessa vain pino e-ulotteisia vektoreita.
  • Arvioiden ennustamiseksi kerrotaan matriisit yhdessä saadaksesi toinen matriisi, joka on saman muotoinen kuin taulukossa on ennusteemme siinä. Alun perin pöydässä on vain ahneutta.
  • Mutta kun olemme käyttäneet häviötoimintoja virheiden löytämiseksi ja käyttäneet dynaamista takaisinsyötön ja gradientin laskeutumista, meillä on nyt malli, joka pystyy tarkkaan ennustamaan, minkä arvosanan käyttäjä antaa elokuvalle. Makea.

Ok… mutta miksi se toimii?

Nyt jos olet kuin minä, saat sen. Mutta et todella saa sitä. Kuinka nämä satunnaiskertomukset lukevat mieliä? Miksi emme voi vain kopioida alkuperäistä taulukkoa ja täyttää nollia? Miksi käydä läpi yksityiskohtainen suunnitelma, jolla kypsennetään kaksi erillistä matriisia ja rakennetaan sitten pöytä uudelleen? Miksi? Miksi? Miksi? Kärsivällisyyttä, nuori heinäsirkka. Kaikki on niin kuin voima haluaa sen.

Muistatko kuinka sanoin aikovani käsitellä e-mysteeriä? No, nyt olen.

Lähde: https://i.imgflip.com/1lai6f.jpg

Muistuta, että rakentaneet matriisit olivat pääosin vektoripinoja. Yksi vektori käyttäjää kohti ja yksi vektori elokuvaa kohti. Tämä ei ollut merkityksetöntä päätöstä.

Jokainen vektori edustaa millaista henkilöä vastaava käyttäjä on. Se tiivistää tykkäämäsi ja inhoamasi, ajatuksesi ja tunteesi, toiveesi ja pelkosi numpy.arrayksi [].

Ymmärrämme tätä paremmin zoomaamalla tiettyyn käyttäjävektoriin olettaen, että e = 3:

Tässä vektorin kolme komponenttia ovat [100, 0, 50]. Jokainen komponentti edustaa jotakin käyttäjän ominaisuutta, jonka kone oppii katsomalla hänen edellistä arvosanaansa.

Oletetaan (ja tämä ei ole oikein tarkka, se on vain analogia), että kolmella komponentilla on seuraava merkitys:

Toivottavasti saat käsityksen siitä, kuinka vektori edustaa ajatusta käyttäjän mieltymyksistä.

Joten yllä olevassa esimerkissä, hyvä ystävämme u ilmeisesti rakastaa toimintaelokuvia, se ei ole suuri romanssi-elokuvissa ja pitää myös komedia-elokuvista, mutta ei yhtä paljon kuin toimintaelokuvat.

Näin koneoppimuksemme käsittää ihmisen monimutkaisuuden upottamalla se e-ulotteiseen vektoritilaan.

Joten e ei ole muuta kuin pieni valitsemamme numero (kutsutaan hyperparametriksi). Mitä suurempi se on, sitä vivaikkaampaa tietoa voimme kerätä käyttäjistämme. Mutta tee siitä liian iso, ja laskenta vie liian kauan.

Mutta odota. Se on viileämpää. Katso elokuvavektoria:

Ja nyt, analysoi komponenttien (ihmisen tulkitsema) merkitys:

Blockbusterimme m näyttää olevan pääasiassa romanssi-elokuva, jonka päälle sirotellaan kohtuullinen annos komediaa. Ja tiedämme kaiken tämän edes katsomalla elokuvaa tai lukematta itse yhtä arvostelua!

Tarkastelemalla, minkä tyyppiset käyttäjät antoivat elokuville korkeat ja matalat arvosanat, algoritmi voi nyt rakentaa vektoreita, jotka edustavat elokuvan ydin.

Mieti lopullinen finaali, kuinka voimme käyttää näitä tietoja. Meillä on käyttäjä, u ja elokuva, m. Molemmat ovat vektoreita. Kuinka ennustamme, mitä arvosanat u voivat antaa m: lle? Käytämme pistetuotetta.

Pistetuote on se, mitä saat, kun kerrotaan yhden vektorin komponentit toisen komponentilla ja summataan tulokset. Tuloksena on skalaari (tavallinen, ilman johtoja kiinnitetty, hyvän olomuodin reaaliluku).

Joten tapauksessamme pisteiden u ja m tulot ovat:

Sirkka 1350. No, kaikki on suhteellista. Mutta olisimme saaneet huomattavasti suuremman määrän, jos emme olisi kertoneet kahta komponenttia 0: lla.

On melko selvää, että olisi huono idea suositella minua u: lle. Itse asiassa kauhea idea.

Voimme tehdä mallistamme entistäkin paremman

Saadaksesi todellisen luokitusennusteen, hajotamme skalaariarvon skaalatun sigmoidifunktion kautta, joka rajaa tuloksen välillä 0 - 5.

Lähde: https://www.desmos.com/calculator/c4omt4vni3

Jos olet huolestunut kaikista tekemistämme käsin aaltoilevista temppuista, voit olla varma, että tietokone pystyy selvittämään sen kaiken.

Itse asiassa me vain teemme sen työtä helpommaksi tekemällä esimerkiksi selvästi sanomalla sille, että kaikkien luokitusten on oltava suurempia kuin 0 ja vähemmän kuin 5.

Tässä on toinen temppu - ennen kuin skalaariarvomme (jota kutsutaan aktivointiksi) ruiskuttaminen sigmoidifunktioon, voimme lisätä pienen numeron, jota kutsutaan bias, b. Siellä on kaksi puolueellisuutta, yksi kullekin käyttäjälle ja yksi jokaiselle elokuvalle.

Pinoamalla nämä yhteen saadaan bias-vektori kaikille käyttäjille (yhdessä) ja bias-vektori kaikille elokuville (yhdessä). Esiintyvyys johtuu siitä, että jotkut elokuvat ovat yleisesti rakastettuja / vihattuja ja jotkut käyttäjät rakastavat / vihaavat elokuvia yleensä.

Ja sen avulla esitän sinulle yhtälön, joka voi hallita elämääsi (tai ainakin verkkokaupoissa / katselutapoihisi):

Mitä tämä tarkoittaa?

Minulle tämän hulluin osa on se, että puhumme ihmisen käsitteistä. Toiminta, romanssi, komedia, tykkää, ei pidä. Ne kaikki ovat ihmisideoita. Ja ajatella, että heidät kaikki voitaisiin kommunikoida matemaattisessa objektissa, on todella kiehtovaa.

Nyt tiedän, että se on kaikki todella selvästi määriteltyjä algoritmeja ja ihmisten tietoja. Mutta mielestäni siinä on vielä jotain uskomatonta siinä, että matriisikertolaskuilla voidaan opettaa tietokoneille, keitä olemme yksilöinä.

Loppujen lopuksi huolimatta kaikista asioista, jotka tekevät meistä erilaisia ​​- mistä pidämme, miltä näytämme, kenen kanssa vietämme aikaa, missä olemme, miten ajattelemme, miten olemme vuorovaikutuksessa ja miltä tunnemme - koneille, jotka määräävät mitä Ostamme, mitä katsomme, keitä puhumme, mitä teemme, missä vietämme aikamme ja missä emme ole, olemme kaikki saman lineaarisen vektoriavaruuden elementtejä.

Siinä on kauneutta.