Word2vec

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Word2vec este un set de șabloane care sunt utilizate pentru a produce încorporarea cuvintelor , al căror pachet a fost creat inițial în C de Tomas Mikolov [1] , apoi implementat și în Python [2] și Java [3] . Word2vec este o rețea neuronală artificială cu două straturi simplă concepută pentru a procesa limbajul natural , algoritmul solicită un corpus ca intrare și returnează un set de vectori reprezentând distribuția semantică a cuvintelor în text. Pentru fiecare cuvânt conținut în corpus, un vector este construit în mod unic pentru a-l reprezenta ca un punct în spațiul multidimensional creat. În acest spațiu cuvintele vor fi mai apropiate dacă sunt recunoscute ca semantic mai asemănătoare . Pentru a înțelege cum Word2vec poate produce încorporarea cuvintelor, este necesar să înțelegeți arhitecturile CBOW și Skip-Gram.

CBOW și Skip-Gram [4]

Word2vec poate produce încorporarea cuvintelor utilizând unul dintre următoarele două modele de arhitectură: sac continuu de cuvinte ( CBOW ) și Skip-Gram .

Pentru a instrui modelele este necesar să aveți un corpus cât mai mare de documente textuale. Din acest corpus va fi posibil să se extragă un vocabular de cuvinte distincte ( jetoane ).

 În mijlocul călătoriei vieții noastre
M-am regăsit într-o pădure întunecată

Fiecare jeton distinct este apoi reprezentat cu o codificare One-hot .

Cu toate acestea, această abordare are unele limitări de la dimensiunea vectorului depinde de mărimea vocabularului care ar putea fi foarte mare. Această utilizare masivă a datelor s-ar putea manifesta în blestemul dimensionalității . De asemenea, dacă jetoanele au fost adăugate / eliminate din încorporarea cuvintelor , modelul ar trebui recalificat de la zero. Ultima limitare majoră a acestei abordări se datorează faptului că problema polisemiei termenilor (adică deficiența de confuzie) nu este rezolvată.

În exemplul de corpus de mai sus există 13 jetoane distincte, deci lungimea vectorului este neapărat 13.

 în [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
mijlociu [0,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
del [0,0,1,0,0,0,0,0,0,0,0,0,0,0]
mers [0,0,0,1,0,0,0,0,0,0,0,0,0,0]
din [0,0,0,0,1,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,1,0,0,0,0,0,0,0,0]
talie [0,0,0,0,0,0,1,0,0,0,0,0,0,0]
mi [0,0,0,0,0,0,0,1,0,0,0,0,0,0]
găsit din nou [0,0,0,0,0,0,0,0,0,1,0,0,0,0]
pentru [0,0,0,0,0,0,0,0,0,0,1,0,0,0]
a [0,0,0,0,0,0,0,0,0,0,0,1,0,0]
pădure [0,0,0,0,0,0,0,0,0,0,0,0,1,0]
întuneric [0,0,0,0,0,0,0,0,0,0,0,0,0,1]

Cele două modele explorează contextul jetoanelor investigând alte jetoane apropiate de acestea din urmă. Aici evidențiem diferența principală dintre arhitecturile CBOW și Skip-Gram.

Dacă prima arhitectură își propune să prezică simbolul curent (ieșire) pornind de la o fereastră de cuvinte contextuale (intrare); al doilea are scopul de a prezice cuvintele de context (ieșire) pornind de la simbolul curent (intrare).

Parametrul definește dimensiunea ferestrei de context: acestea sunt incluse în contextul i jetoane care precedă / urmează tokenul curent.

Fereastra contextuală cu C = 2 pentru textul „În mijlocul călătoriei noastre de viață”
simbolul curent fereastra contextuală
În (în, mijloc) (în, din)
mijloc (în mijloc) (mijloc, din) (mijloc, mers)
umblat (jumătate, mers) (del, mers) (mers, di) (mers, al nostru)
din (de, de) (mers, de) (de, al nostru) (de, viață)
al nostru (mers, al nostru) (al, al nostru) (viața, noastră)
viaţă (de, viață) (viața, noastră)

Ambele modele sunt implementate printr-o rețea neuronală artificială formată din trei straturi: un strat de intrare , un strat ascuns și un strat de ieșire .

Arhitectură generică utilizată de CBOW și Skip-gram

Intrarea variază în funcție de modelul de arhitectură utilizat, precum și de tipul de ieșire prezisă. De fapt, în funcție de arhitectură, simbolul curent și fereastra contextuală vor fi intrarea sau ieșirea modelului.

În urma antrenamentului modelului prin propagarea înapoi , matricea de greutate va conține reprezentări ale încorporării cuvântului simbol de vocabular unde N este dimensiunea cuvântului încorporat. Cu alte cuvinte, rândul a matricei va conține cuvântul reprezentând încorporarea simbolului .

Funcția softmax este aplicată în ultimul strat al rețelei neuronale.

CBOW

Arhitectura CBOW. Există mai multe tablouri în figură , dar acest lucru nu ar trebui să ducă la gândirea greșită a matricelor sunt multiple.

Arhitectura CBOW are scopul de a prezice simbolul curent (ieșire, de exemplu, în ) dintr-o fereastră de cuvinte de context (intrare, de exemplu, mijloace și del ). Prin urmare, intrarea constă din reprezentarea de codificare One-hot a jeton contextual. Matricea este la fel ca cel descris în arhitectura generală, dar, în acest caz, stratul ascuns este media vectorilor corespunzător cuvintelor de context de intrare.

Făcând acest lucru, stratul ascuns pierde informațiile poziției din textul jetoanelor care fac parte din fereastra contextuală așa cum se întâmplă în reprezentarea sacului de cuvinte .

Skip-Gram

Arhitectură Skip-Gram. În figură există mai multe matrici W`, dar acest lucru nu ar trebui să ducă pe cineva să creadă greșit că matricile W` sunt multiple.

Arhitectura Skip-Gram își propune să prezică cuvintele de context (ieșire, de exemplu nel , del și andeg ) pornind de la simbolul curent (intrare, de exemplu mediu ). Prin urmare, intrarea constă din reprezentarea de codificare One-hot a simbolului curent. Prin urmare, stratul ascuns corespunde cuvântului care încorporează reprezentarea simbolului curent.

Modelul va genera un vector de ieșire pentru fiecare jeton contextual. În consecință, vor exista cât mai mulți vectori de eroare de dimensiune . Pentru a relua propagarea i vectorii de eroare sunt adăugați împreună pentru a obține un singur vector . Ponderile stratului ascuns vor fi apoi actualizate pe baza acestui vector de eroare cumulativ.

Prin urmare, poziția jetoanelor de context din text nu este luată în considerare în arhitectura skip-gram.

Parametrii Word2vec

Shell, C

Pachetul original Word2vec vă permite să lansați algoritmul scris în C din shell. Fișierul demo-word.sh raportează de fapt această comandă:

 $ BIN_DIR / word2vec -train $ TEXT_DATA -output $ VECTOR_DATA -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3-threads 12 -binary 1

Unde $ BIN_DIR / word2vec este calea folderelor pentru a ajunge la fișierele word2vec din folderul bin ; $ TEXT_DATA trebuie înlocuit cu corpusul de format text cu care doriți să faceți instruirea și $ VECTOR_DATA va fi numele fișierului pe care îl va crea algoritmul.

În continuare putem vedea câțiva parametri modificabili:

  • size pentru a defini dimensiunea vectorilor de creat.
  • fereastră pentru a decide distanța maximă dintre cuvântul curent și cuvântul prezis în cadrul unei propoziții.
  • fire pentru a decide câte fire de procesor să folosiți pentru a antrena modelul.
  • binar determină în ce codificare va fi salvat fișierul (dacă parametrul este inițializat la 1, fișierul creat va fi binar, altfel va putea fi citit de om , adică în format text).

Gensim, Python

Există diferiți parametri care pot fi modificați pentru a personaliza procesarea algoritmului, unii sunt scrise mai jos:

  • propoziția = var , este primul parametru care trebuie introdus pentru a inițializa modelul pornind de la o variabilă var iterabilă și sub forma unei liste de cuvinte (șiruri Unicode) care vor fi folosite pentru antrenament.
  • size = n , vă permite să decideți dimensiunea vectorilor pe care algoritmul îi va crea.
  • fereastra = n , vă permite să decideți distanța maximă dintre cuvântul curent și cuvântul prezis în cadrul unei propoziții.
  • min_count = n , vă permite să ignorați cuvintele cu o frecvență minimă mai mică decât n.
  • lucrători = n , vă permite să decideți câte fire de procesor să utilizați pentru a instrui modelul.
  • seed = n , pentru generatorul de numere aleatorii.

Tutorialul gensim [2] inițializează parametrii ( n ) astfel:

 clasa gensim . modele . word2vec . Word2Vec ( propoziții = Niciuna , dimensiune = 100 , alfa = 0,025 , fereastră = 5 , min_count = 5 , max_vocab_size = Niciuna , eșantion = 0,001 , semințe = 1 , lucrători = 3 , min_alpha = 0,0001 , sg = 0 , hs = 0 , negativ = 5 , cbow_mean = 1 , hashfxn = < built - in function hash > , iter = 5 , null_word = 0 , trim_rule = None , sorted_vocab = 1 , batch_words = 10000 )

DL4J, Java

Parametrii explicați în documentația DL4J [3] sunt:

  • batchSize este cantitatea de cuvinte de procesat simultan.
  • minWordFrequency este frecvența minimă pe care trebuie să o aibă cuvintele pentru a fi luate în considerare de algoritm.
  • layerSize este numărul de dimensiuni pe care vrem să le dăm vectorilor pe care algoritmul îi va crea.

Documentația DL4J [3] inițializează parametrii după cum urmează:

 Word2Vec vec = nou Word2Vec . Constructor () 
    . minWordFrequency ( 5 ) 
    . iterații ( 1 ) 
    . layerSize ( 100 ) 
    . sămânță ( 42 ) 
    . WindowSize ( 5 ) 
    . iteraŃia (iter) 
    . tokenizerFactory ( t ) 
    . build ();

Notă

  1. ^ https://code.google.com/archive/p/word2vec/
  2. ^ a b http://radimrehurek.com/gensim/models/word2vec.html
  3. ^ a b c Copie arhivată , la deeplearning4j.org . Adus la 7 martie 2017 (Arhivat din original la 8 martie 2017) .
  4. ^ Tomas Mikolov, Quoc V. Le și Ilya Sutskever, Exploiting similarities between languages ​​for Machine Translation , în arXiv: 1309.4168 .

Bibliografie