Sådan bruges foruddannede Word-indlejringer i PyTorch

”I årtier har maskinindlæringsmetoder, der er rettet mod naturlige sprogbehandlingsproblemer, været baseret på lavvandede modeller (f.eks. SVM og logistisk regression), der er trænet på meget højdimensionelle og sparsomme funktioner. I de sidste par år har neurale netværk baseret på tætte vektorrepræsentationer produceret overlegne resultater på forskellige NLP-opgaver. Denne tendens er udløst af succes med ordindlejringer og dybe indlæringsmetoder. ”[1]

I dette indlæg lærer vi, hvordan man bruger GloVe foruddannede vektorer som input til neurale netværk for at udføre NLP-opgaver i PyTorch.

Kreditter til https://www.tensorflow.org/tutorials/word2vec

Handske

I stedet for at træne vores egne ordvektorer fra bunden, vil vi udnytte gearet på GloVe. Dets forfattere har frigivet fire tekstfiler med ordvektorer trænet på forskellige massive webdatasæt. De kan downloades her.

Vi bruger “Wikipedia 2014 + Gigaword 5”, som er den mindste fil (“glove.6B.zip”) med 822 MB. Det blev trænet på et korpus på 6 milliarder tokens og indeholder et ordforråd på 400 tusind tokens.

Efter udpakning af den downloadede fil finder vi fire txt-filer: glove.6B.50d.txt, glove.6B.100d.txt, glove.6B.200d.txt, glove.6B.300d.txt. Som deres filnavne antyder, har de vektorer med forskellige dimensioner. Vi vælger den mindste med ord repræsenteret ved vektorer af dim 50 (“handske.6B.50d.txt”).

Hvis vi udskrev filens indhold på konsollen, kunne vi se, at hver linje indeholder som et første element et ord efterfulgt af 50 reelle tal. For eksempel er dette de første to linjer, der svarer til symboler “the” og “,”:

0.418 0.24968 -0.41242 0.1217 0.34527 -0.044457 -0.49688 -0.17862 -0.00066023 -0.6566 0.27843 -0.14767 -0.55677 0.14658 -0.0095095 0.011658 0.10204 -0.12792 -0.8443 -0.12181 -0.0671.909 -0.19526 4.0071 -0.18594 -0.52287 -0.31681 0.00059213 0.0074449 0.17778 -0.15897 0.012041 -0.054223 -0.29871 -0.15749 -0.34758 -0.045637-0.44251 0.18785 0.0027849 -0.18411 -0.11514 -0,781
0,013441 0,23682 -0,16899 0,40951 0,63812 0,47709 -0,42852 -0,55641 -0,364 -0,23938 0.13001 -0.063734 -0.39575 -0.48162 0.23291 0,0487122 0108244 0108244 0108242 0.11956 -0.014533 -0.1499 0.21864 -0.33412 -0.13872 0.31806 0.70358 0.44858 -0.080262 0.63003 0.32111 -0.46765 0.22786 0.36034 -0.37818-0.56657 0.044691 0.30392

Vi er nødt til at analysere filen for at få den som output: liste over ord, ordbog, der kortlægger hvert ord til deres id (position) og matrix af vektorer.

I betragtning af at ordforrådet har 400k-symboler, bruger vi bcolz til at gemme matrixen af ​​vektorer. Det leverer kolonnede, afskårne databeholdere, der kan komprimeres enten i hukommelsen og på disken. Det er baseret på NumPy og bruger det som standarddatabeholder til at kommunikere med bcolz-objekter.

Vi gemmer derefter output på disken til fremtidig brug.

Ved hjælp af disse objekter kan vi nu oprette en ordbog, der får et ord, der returnerer sin vektor.

Lad os f.eks. Få vektoren til ordet "the":

Når vi sammenligner numrene med dem, der er udskrevet fra txt-filen, kan vi kontrollere, at de er lig, så processen er kørt korrekt.

PyTorch

Hvad vi skal gøre på dette tidspunkt er at oprette et indlejringslag, det vil sige et ordbog, der kortlægger heltalindekser (som repræsenterer ord) til tætte vektorer. Det tager som input-heltal, det ser disse heltal op i en intern ordbog, og det returnerer de tilhørende vektorer.

Vi har allerede bygget en Python-ordbog med lignende egenskaber, men den understøtter ikke auto-differentiering, så den kan ikke bruges som et neuralt netværkslag og blev også bygget på baggrund af GloVes ordforråd, sandsynligvis forskellig fra vores datasætets ordforråd. I PyTorch er et indlejringslag tilgængeligt gennem fakkel.nn. Indlejringsklasse.

Vi skal bygge en matrix med vægte, der indlæses i PyTorch-indlejringslaget. Dens form vil være lig med:

(datasættets ordforrådslængde, ordvektordimension).

For hvert ord i datasættets ordforråd tjekker vi, om det er på GloVes ordforråd. Hvis det gør det, indlæser vi dens foruddannede ordvektor. Ellers initialiserer vi en tilfældig vektor.

Vi opretter nu et neuralt netværk med et indlejringslag som første lag (vi indlæser vægtmatrixen i det) og et GRU-lag. Når vi foretager et fremadgående pas, skal vi først kalde indlejringslaget.

Referencer

[1] Unge Tom, Hazarika Devamanyu, Poria Soujanya, Cambria Erik. 2017. Nye tendenser inden for dyb læring baseret på naturligt sprogbehandling.

Chollet François. Deep Learning med Python. 2017.