Pandad vs tujukad? Pange ise proovile!

Maatrikspunkti toote jõudlus ja Wordi manustamine

Tahaksin teiega jagada mõnda asja, mille olen õppinud pandade ja Numpyte testimisel väga konkreetse toimingu tegemisel: punkttoode.

Jah jah, muidugi tuleb see postitus kaasas ka oma Jupyteri märkmikuga.

Postituse päritolu: Wordi manustamine ja hale server

Kõik algas Metaphorist, isiklikust projektist, mida kasutan Wordi manustamiste uurimiseks. Täiesti varajases staadiumis, kuid paljulubav lõbus! Mida? Te ei tea, mis on sõna kinnistamine? Kuningas-mees + naine =?

Pilt Eunice Angel CS130 ajakirjade kaudu

Noh, kui see ei helista, ärge muretsege. See postitus ei räägi üldse sõnade manustamisest .

Kuid hei, ma räägin teile ikkagi päritolu kohta: arvestades, et manustamine näis olevat hea viis analoogialoomele lähenemiseks, arvasin, et need võivad olla kasulikud ka metafoori loomisel.

Kuid ärgem sukeldugem sellesse ... kõik, mida peate praegu teadma, on:

  • Mul oli vajadus korrutada BIG-maatriksid (et arvutada sarnasust sõnade vektorkujunduse vahel).
  • Mul on fantastiline harjumus: kasutan ja jagan asju väga väga kohmakas serveris (kõige odavam näide Digitalis - teate, ma vihkan tasuta reklaamimist).
  • Aeg on oluline. Mõnikord. Ideaalis meeldiks mulle maatriksitega väga tõhusal viisil töötada. Kuna ma kasutan Pythoni kahte ilmset varianti, mis mul olid, olid Pandas ja Numpy, siis mõtlesin, kumb oleks parem.

Hiiglaste õlgadel

See oli mõeldud suurejooneliseks uurimuseks Pandase ja Numpy etenduse kohta. Kuid sellest sai rumal katse katsetada väga konkreetset kasutusjuhtu.

“Pandas vs tujukas? Oh jah! Lubage mul koguda selle kohta palju andmeid. Olen kindel, et kõikvõimas Internet peab olema tulemuslikkuse ülevaateid täis ”. Hmmm, niipalju kui ma oskan öelda, kardan, et mitte ...

Siis tabas mind see: ma ei vajanud üldse täielikku arvustust. Mõnikord usaldame inertsist lihtsalt pimesi rohkem kui iseennast.

Minu konkreetsel juhul oli empiiriline test oma arvuti ja minu enda sätetega just sõrmeotstes. Super lihtsad asjad!

Lühike aja lugu (see)

Siin on minu veendumuste kogum (või eeltöödeldud ideed) enne testimist:

  • Panda peab olema aeglasem. Teate, sellel on kõik see lahe indekseerimise asi, mis peab olema arvutuslikult tõesti kallis. Ma mõtlen selle lihtsust, et kõrgemal abstraktsuse tasemel olemise tunne peab tulema maksma!
  • Oh, aga mulle meeldiks tõesti Word Embeddings indekseerida Pandastic viisil!
maja 0.915507 -0.603542 1.162295
rakett -0,601400 -1,597486 0,397726
teadus 1.205865 1.056299 0.852544
Trump 0,6889391 -0,224737 -0,522182
df.loc ['Trump'] # supersemantiline viis sõna kinnistamiseks!
  • Olen kindel, et seal peab olema murdepunkt. Maatriksite suuruse kasvades peab aeg hakkama kasvama mittelineaarselt.

Suurejooneline kujundus

Noh, arvestades, et see oli väga lihtne “eksperiment”, arvasin, et katsetaksin lihtsalt punkttoodet erineva suurusega maatriksitel.

Ja teate, mida ma tegin?

impordi aeg
ping = aeg.time ()
E_pd.dot (w_pd.transpose ()) # toiming, mida tahame mõõta
pong = aeg.time ()
print (“Aega kulub:”, ping-ping)

See oli täielik katastroof. Jah, vinge läbikukkumine!

Ma mõtlen, et on lahe saada kiire idee, kui kaua toimingute täitmine võtab, ja seda saab ping-pong-strateegia abil kiiresti proovile panna. Kuid minu hukkamisajad olid täiesti ebajärjekindlad.

Seda nimetan ma suureks kujunduseks. Aga hei, ära ütle mulle, et sa pole seda kunagi varem teinud .

Olen vana kool ja minu masin teeb tuhandeid asju lisaks õnnelike maatrikspunkttoodete arvutamisele (jätan arvuti voogesitusplatvormide kasutamise asemel kogu päeva asju alla laadima ).

Timeit

Ilma põhjalike uuringuteta hakkasin just kasutama timeit Pythoni profileerimisriista. Ja jäin tõesti rahule.

Tõenäoliselt on teil paremaid katsetamisviise ja osa selle postituse mõtetest on erinevate vaieldamatult toredate ja viisakas kommentaaride kaudu erinevate strateegiate õppimine.

Lubage mul lühidalt mainida, kuidas ma seda tegin. Ma lihtsalt kapseldasin kõik meetodisse, et saaksin seda mitu korda katsetada erineva suurusega andmetega:

def dot_prod_benchmark (n, m, num_iters):
    "" "
    Mõned seadete koodid lähevad siia
    "" "
    # tuimaks
    timeit_np = timeit.Timer ('E_np.dot (w_np.T)', globaalid = kohalikud ())
    np_time = timeit_np.timeit (number = num_iters) / num_iters * 1000

    # pandad
    timeit_pd = timeit.Timer ('E_pd.dot (w_pd.transpose ())', globaalid = kohalikud ())
    pd_time = timeit_pd.timeit (number = num_iters) / num_iters * 1000
    
    tagasta np_time, pd_time

Seejärel määratlesin meetodi def full_test (** info), mis kutsuks erineva maatriksisuurusega punkti parameetrit dot_prod_benchmark. Pidage meeles, et täieliku koodi leiate sellest Jupyteri märkmikust. Minu arvates oli tulemuste järkjärguline salvestamine väga mugav (teate, mu emaplaat läks vahel väga kuumaks ).

Tulemused

Lõpuks! Kõik armastavad joonistatud andmeid!

Ei vaja pealkirja. Ma mõtlen, et sa oled nutikas ja tead plotzit!

Niisiis, nagu näete, pole palju vahet. Selle konkreetse teostuse jaoks viisin testimise läbi järgmistel tingimustel:

  • Maatriksi suurus (n x 50). Enamasti plaanin kasutada 50 tunnuse lihtsat sõnavektoriesitust.
  • Suurendasin maatriksi suurust hüpetega 5000. Nii (5000 x 50), (10 000 x 50), (15 000 x 50),…
  • Maatriksi sisu oli juhuslik ujuk, kuid numpy.array ja pd.DataFrame olid samad (minge kontrollige koodi, muidugi kasutasin maagilist juhuslikku seemet!).
  • Maatriksi minimaalne suurus (5000 x 50) kuni maksimaalne suurus (1 000 000 x 50).

Võrrelgem seda minu esialgsete tõekspidamistega:

  • Pandad peavad olema aeglasemad? Hmmm, selle järgi ei tundu see nii. Võib-olla oli see Pandase algversioonides, kuid vähemalt selle konkreetse operatsiooni jaoks tundub, et Pandas täidab sama hästi kui Numpy. Lubage mul näidata teile keskmisi väärtusi:
t_np = info.get ('perf_numpy')
t_pd = info.get ('perf_pandas')
print ("Keskmine aeg (ms) tuimas: {} \ nMean aeg (ms) pandad: {}". vorming (np.mean (t_np), np.mean (t_pd)))
>> Keskmine aeg (ms) tuhat: 13,640309900584189
>> Keskmine aeg (ms) pandad: 13,76465691793053
  • "Olen kindel, et seal peab olema murdepunkt". Noh, on tõsi, et on ka naelu, eriti maatriksi suurenedes. Kuid ma ootasin rohkem eksponentsiaalset kõverat.
  • Mulle tõesti meeldiks pandadega Word Embeddings indekseerida. Jah, arvestades tulemusi, arvan, et kavatsen seda teha. Aga hei, ärge saage minust valesti aru, ma vaatan Jube! Lihtsalt tundus, et sel korral, kui sõna oli haaratud, oleks Pandat sobivam kasutada.

Tundub, et siiski on algusest peale püsiv erinevus (kuni suurus umbes 60 000). Suumi sisse!

Kuid minu jaoks pole sellel suurt tähtsust, esialgu kasutan eelnevalt koolitatud (400 000x50) GloVe-vektoreid.

Asi (d), mida olen õppinud

  1. Testige seda ise (kui see on lihtne). Ole oma empiiriline kuningas. C'mon, see ei võta tavaliselt palju aega ja sel viisil saate testida täpselt seda, mida kavatsete kasutada. Muidugi ei ütle ma, et peaksite kogu oma projekti raamotsuste tegemisel lähtuma väikesest empiirilisest ja tõenäoliselt erapoolikust kogemusest. Nii et tehke oma käed räpaseks, sest võite lihtsalt avastada uusi teadmisi selle kohta, mida soovite saavutada!

See selleks. Ainult üks punkt. Siis, nagu tavaliselt, on õppinud palju lisavõimalusi.

Kaasõpe

  1. Timeit kasutades komistasin vana ja vastamata StackOverflow küsimuse peale. Tegin oma uurimistööd, vastasin sellele ja siin on kõige lahedam külg: sain ühendust Jonathaniga, kes “alustas arvutitega 1957. aastal” ja on nüüd 80-aastane pensionil olev tarkvarainsener, kes hoiab kodeerimist AI huvides. Kui vinge see on?!
  2. Kuidas mitte testida: ping-pong! Noh, võib-olla on hea seda ka ping-pong-stiilis katsetada, kui teie kasutatav masin täidab muid ülesandeid, nagu näiteks tegeliku konteksti simuleerimisel, kus ülesandeid täidetakse.
  3. Ma tean, et see on rumal, kuid lubage hukkamistel järk-järgult liikuda, et saaksite neid jätkata. Kui täidate seda kohapeal, peate tõenäoliselt enne katse lõppu mitu korda protsessi peatama.
  4. Manuste mälu! Vaikimisi loodi need minu arvutis np.float64. Vähendasin np.float16 abil ruumi, mis kulub 177,39 MB-lt 62,95 MB-le. Kuid olge sellega ettevaatlik, läheme vahemikku -0,388916 kuni -0,389, peate katsetama, kas see mõjutab sõnavektorite toiminguid.
  5. Küsimus: mida arvate isikliku testiga ühise hoidla loomisest? Ma küsin seda Redditi andmekogude kogukonnalt.

See on kõik. Tänan tähelepanu eest. Miks üldse uurida metafoore?

Tomas ei teadnud toona, et metafoorid on ohtlikud. Metafooridega ei tohi trügida. Üks metafoor võib sünnitada armastuse. - Milan Kundera, olemise talumatu kergus