How do I train word embeddings?

Word Embeddings: Ghid Complet de Antrenament

06/05/2023

Rating: 4.5 (13664 votes)

În era digitală, textul este peste tot: de la recenzii de filme și postări pe rețelele sociale, până la articole științifice și conversații zilnice. Dar cum poate o mașină să înțeleagă și să proceseze această vastă cantitate de informație textuală? Mașinile operează cu numere, nu cu cuvinte. Aici intervine conceptul de Word Embeddings – o tehnică revoluționară care permite transformarea cuvintelor în reprezentări numerice dense și semnificative, capabile să surprindă relațiile semantice dintre ele. Acest ghid complet te va purta prin procesul de înțelegere și antrenare a propriilor tale Word Embeddings, utilizând un model Keras simplu pentru o sarcină de clasificare a sentimentelor.

Where are embeddings stored?
That is, embeddings are stored as a ∣ V ∣ × D ∣V ∣ ×D matrix, where D D is the dimensionality of the embeddings, such that the word assigned index i i has its embedding stored in the i i ’th row of the matrix. In all of my code, the mapping from words to indices is a dictionary named word_to_ix.
Cuprins

Reprezentarea Textului pentru Mașini: De la Cuvinte la Numere

Pentru ca un model de învățare automată să poată lucra cu text, primul pas este să convertim șirurile de caractere în vectori (matrici de numere). Există mai multe strategii pentru a face acest lucru, fiecare cu avantajele și dezavantajele sale.

Codificarea One-Hot: Simplu, dar Ineficient

Cea mai simplă idee este să codificăm "one-hot" fiecare cuvânt din vocabular. Să luăm exemplul propoziției "Pisica a stat pe covor". Vocabularul unic din această propoziție este (pisica, covor, pe, a, stat). Pentru a reprezenta fiecare cuvânt, vom crea un vector de zerouri cu o lungime egală cu dimensiunea vocabularului, apoi vom plasa un "unu" la indicele care corespunde cuvântului respectiv. De exemplu, dacă "pisica" este la indicele 0, vectorul său va fi [1, 0, 0, 0, 0].

Pentru a crea un vector care să conțină codificarea întregii propoziții, am putea concatena vectorii one-hot pentru fiecare cuvânt. Cu toate acestea, există un dezavantaj major: această abordare este extrem de ineficientă. Un vector codificat one-hot este sparse (adică majoritatea indicilor sunt zero). Imaginează-ți un vocabular de 10.000 de cuvinte. Pentru a codifica one-hot fiecare cuvânt, ai crea un vector în care 99,99% din elemente ar fi zero. Această risipă de memorie și putere de calcul devine problematică rapid.

Codificarea Numerică Unică: Densă, dar Arbitrară

O a doua abordare ar fi să codificăm fiecare cuvânt folosind un număr unic. Continuând exemplul anterior, am putea asocia 1 cu "pisica", 2 cu "covor" și așa mai departe. Apoi, propoziția "Pisica a stat pe covor" ar putea fi codificată ca un vector dens precum [5, 1, 4, 3, 5, 2]. Această abordare este eficientă din punct de vedere al spațiului, deoarece nu mai avem vectori sparse.

Cu toate acestea, există două dezavantaje semnificative:

  1. Codificarea numerică este arbitrară: Nu surprinde nicio relație semantică între cuvinte. Numărul 1 (pisica) și 2 (covor) nu sugerează nicio similitudine sau diferență inerentă.
  2. O codificare numerică poate fi dificil de interpretat pentru un model. Un clasificator liniar, de exemplu, învață o singură pondere pentru fiecare caracteristică. Deoarece nu există o relație între similitudinea a două cuvinte și similitudinea codificărilor lor numerice, această combinație de caracteristică și pondere nu este semnificativă.

Soluția Magică: Word Embeddings

Word Embeddings ne oferă o modalitate de a utiliza o reprezentare densă și eficientă, în care cuvintele similare au o codificare similară. Important este că nu trebuie să specifici această codificare manual. Un embedding este un vector dens de valori în virgulă mobilă (lungimea vectorului este un parametru pe care îl specifici). În loc să specifici manual valorile pentru embedding, acestea sunt parametri antrenabili (ponderi învățate de model în timpul antrenamentului, la fel cum un model învață ponderile unui strat dens).

Este comun să vezi Word Embeddings de 8 dimensiuni (pentru seturi de date mici), până la 1024 de dimensiuni când se lucrează cu seturi de date mari. Un embedding de dimensiuni mai mari poate surprinde relații detaliate între cuvinte, dar necesită mai multe date pentru a fi învățat.

O altă modalitate de a te gândi la un embedding este ca la o "tabelă de căutare". După ce aceste ponderi sunt învățate, poți codifica fiecare cuvânt căutând vectorul dens căruia îi corespunde în tabelă. Această tehnică este fundamentală pentru procesarea modernă a limbajului natural (NLP) și deschide uși către o înțelegere mult mai profundă a textului de către mașini.

Metoda de ReprezentareDescriereAvantajeDezavantaje
Codificare One-HotFiecare cuvânt devine un vector cu un singur '1' și restul '0'.Simplu de înțeles și implementat.Extrem de sparse, ineficientă, nu captează relații semantice.
Codificare Numerică UnicăFiecare cuvânt primește un ID numeric unic.Mai densă, eficientă ca spațiu.Arbitrară, nu surprinde relații semantice, dificil de interpretat pentru model.
Word EmbeddingsCuvintele sunt mapate la vectori denși de numere reale, învățați.Dense, eficiente, captează relații semantice, parametri antrenabili.Necesită date și putere de calcul pentru antrenament, dimensiunea embedding-ului este un hiperparametru.

Antrenarea Word Embeddings cu Keras

Keras face procesul de utilizare și antrenare a Word Embeddings extrem de accesibil. Vom parcurge pașii necesari pentru a antrena propriile tale embeddings folosind setul de date de recenzii de filme IMDb, o resursă clasică pentru clasificarea sentimentelor.

Pregătirea Setului de Date IMDb

Setul de date de recenzii de filme IMDb conține 50.000 de recenzii, împărțite în 25.000 pentru antrenament și 25.000 pentru testare, fiecare etichetată ca pozitivă sau negativă. Este ideal pentru a învăța embeddings de la zero într-o sarcină de clasificare binară.

Descărcarea și organizarea datelor este primul pas. Setul de date este structurat în foldere 'pos' și 'neg' în cadrul directorului 'train'. Ne asigurăm că eliminăm orice director suplimentar care nu este relevant pentru sarcina noastră, precum 'unsup'.

Creăm apoi obiecte tf.data.Dataset folosind tf.keras.utils.text_dataset_from_directory. Această utilitate simplifică enorm crearea seturilor de date pentru text, gestionând automat încărcarea fișierelor și etichetarea. De asemenea, împărțim setul de date de antrenament într-un subset de antrenament și unul de validare (20% pentru validare) pentru a monitoriza performanța modelului pe date nevăzute în timpul antrenamentului.

Pentru a optimiza performanța I/O și a preveni blocajele în timpul antrenamentului, utilizăm metodele .cache() și .prefetch(). .cache() menține datele în memorie după ce sunt încărcate de pe disc, asigurându-se că setul de date nu devine un gât de sticlă. Dacă setul de date este prea mare pentru a încăpea în memorie, poate fi utilizat și pentru a crea un cache pe disc de înaltă performanță. .prefetch() suprapune preprocesarea datelor și execuția modelului, permițând GPU-ului sau CPU-ului să lucreze continuu.

How do I train word embeddings?
This tutorial contains an introduction to word embeddings. You will train your own word embeddings using a simple Keras model for a sentiment classification task, and then visualize them in the Embedding Projector (shown in the image below). Machine learning models take vectors (arrays of numbers) as input.

Stratul de Embedding Keras: Inima Reprezentării

Stratul tf.keras.layers.Embedding este componenta cheie pentru Word Embeddings în Keras. Poate fi înțeles ca o tabelă de căutare care mapează indici întregi (reprezentând cuvinte specifice) la vectori denși (embeddings-urile lor). Dimensionalitatea (sau lățimea) embedding-ului este un parametru cu care poți experimenta pentru a vedea ce funcționează cel mai bine pentru problema ta. Când creezi un strat de embedding, ponderile pentru embedding sunt inițializate aleatoriu (la fel ca orice alt strat). În timpul antrenamentului, acestea sunt ajustate treptat prin retropropagare. Odată antrenate, embeddings-urile învățate vor codifica aproximativ similitudinile dintre cuvinte, așa cum au fost învățate pentru problema specifică pe care modelul tău a fost antrenat.

Dacă îi pasezi un număr întreg unui strat de embedding, rezultatul înlocuiește fiecare număr întreg cu vectorul din tabela de embedding. Pentru probleme de text sau secvențe, stratul Embedding ia un tensor 2D de numere întregi, de forma (samples, sequence_length), unde fiecare intrare este o secvență de numere întregi. Poate încorpora secvențe de lungime variabilă. Tensorul returnat are o axă în plus față de intrare, vectorii de embedding fiind aliniați de-a lungul noii axe.

Când primește un lot de secvențe ca intrare, un strat de embedding returnează un tensor de tip float 3D, de forma (samples, sequence_length, embedding_dimensionality). Pentru a converti această secvență de lungime variabilă într-o reprezentare fixă, există o varietate de abordări standard. Poți folosi un strat RNN, de atenție sau de pooling înainte de a-l pasa unui strat dens. În acest tutorial, vom folosi pooling-ul deoarece este cel mai simplu, prin stratul GlobalAveragePooling1D.

Preprocesarea Textului

Înainte de a alimenta textul în stratul de embedding, este necesară o etapă de preprocesare. Aceasta implică normalizarea textului (convertirea la litere mici), eliminarea tag-urilor HTML (precum <br />) și a semnelor de punctuație, și apoi transformarea șirurilor de caractere în indici numerici. Stratul tf.keras.layers.TextVectorization este perfect pentru această sarcină. Inițializăm un strat TextVectorization cu o funcție de standardizare personalizată și specificăm dimensiunea vocabularului maxim (vocab_size) și lungimea secvenței de ieșire (output_sequence_length). Apoi, apelăm metoda .adapt() pe un set de date doar cu text pentru a construi vocabularul. Această metodă analizează datele și determină mapările de la cuvinte la indici.

Construirea Modelului de Clasificare a Sentimentelor

Vom utiliza API-ul secvențial Keras pentru a defini modelul de clasificare a sentimentelor. Acesta este un model simplu de tip "Bag of Words" continuu. Structura modelului este următoarea:

  1. vectorize_layer: Acesta este primul strat al modelului nostru end-to-end, transformând șirurile de intrare în indici de vocabular.
  2. Embedding: Primește vocabularul codificat numeric și caută vectorul de embedding pentru fiecare indice de cuvânt. Acești vectori sunt învățați pe măsură ce modelul se antrenează.
  3. GlobalAveragePooling1D: Acest strat returnează un vector de ieșire de lungime fixă pentru fiecare exemplu, făcând media pe dimensiunea secvenței. Acest lucru permite modelului să gestioneze intrări de lungime variabilă, într-un mod simplu și eficient. Este o formă de agregare.
  4. Dense(16, activation='relu'): Vectorul de ieșire de lungime fixă este apoi canalizat printr-un strat complet conectat cu 16 unități ascunse și o funcție de activare ReLU.
  5. Dense(1): Ultimul strat este un strat dens conectat cu un singur nod de ieșire, utilizat pentru clasificarea binară (pozitiv/negativ).

Este important de menționat că acest model simplu nu utilizează mascare, așa că padding-ul cu zerouri este folosit ca parte a intrării și, prin urmare, lungimea padding-ului poate afecta ieșirea. Pentru probleme mai complexe sau pentru a gestiona mai bine padding-ul, ar trebui să consulți ghidul de mascare și padding din documentația Keras.

Compilarea și Antrenarea Modelului

Pentru a pregăti modelul pentru antrenament, îl compilăm specificând un optimizator ('adam', o alegere populară și eficientă), o funcție de pierdere (tf.keras.losses.BinaryCrossentropy(from_logits=True) pentru clasificarea binară) și metricele pe care dorim să le monitorizăm ('accuracy'). De asemenea, integrăm tf.keras.callbacks.TensorBoard pentru a vizualiza metricele de antrenament și validare, inclusiv pierderea și acuratețea, într-o interfață grafică interactivă.

Antrenamentul modelului se realizează prin apelarea metodei .fit(), furnizând seturile de date de antrenament și validare, precum și numărul de epoci. Pe parcursul epocilor, vei observa cum pierderea scade și acuratețea crește, atât pe setul de antrenament, cât și pe cel de validare. Este crucial să urmărim performanța pe setul de validare pentru a detecta suprafitting-ul (overfitting), o situație în care modelul învață prea bine datele de antrenament și își pierde capacitatea de a generaliza pe date noi.

Extragerea și Salvarea Embeddings-urilor Antrenate

După ce modelul a fost antrenat, putem extrage Word Embeddings-urile învățate. Acestea sunt ponderile stratului Embedding din model. Matricea de ponderi are forma (vocab_size, embedding_dimension). Obținem ponderile modelului folosind model.get_layer('embedding').get_weights()[0] și vocabularul corespunzător cu vectorize_layer.get_vocabulary(). Primul element al vocabularului (indicele 0) este de obicei rezervat pentru padding, deci îl vom sări peste.

Pentru a vizualiza embeddings-urile în Proiectorul de Embeddings (o unealtă oferită de TensorBoard), trebuie să salvăm ponderile în două fișiere formatate în tab-uri: un fișier de vectori (vectors.tsv) care conține embedding-urile și un fișier de metadate (metadata.tsv) care conține cuvintele corespunzătoare. Fiecare rând din vectors.tsv va fi un vector de embedding, iar rândul corespondent din metadata.tsv va fi cuvântul.

Vizualizarea Embeddings-urilor: O Fereastră spre Semnificație

Vizualizarea este pasul cel mai fascinant. Prin încărcarea fișierelor vectors.tsv și metadata.tsv în Proiectorul de Embeddings, poți explora spațiul semantic învățat de modelul tău. Vei putea căuta cuvinte și să vezi vecinii lor cei mai apropiați în spațiul de embedding. De exemplu, căutând "frumos", s-ar putea să vezi vecini precum "minunat" sau "splendid", indicând că modelul a învățat că aceste cuvinte sunt semantic similare în contextul recenziilor de filme. Această vizualizare îți oferă o intuiție directă asupra modului în care modelul tău "înțelege" relațiile dintre cuvinte.

Este important de reținut că, de obicei, este nevoie de un set de date mult mai mare pentru a antrena Word Embeddings mai interpretabile și mai robuste. Acest tutorial utilizează un set de date IMDb relativ mic în scopuri demonstrative. Cu toate acestea, principiile rămân aceleași, iar rezultatele obținute sunt o dovadă a puterii acestei tehnici.

Întrebări Frecvente (FAQ)

Ce sunt Word Embeddings?
Word Embeddings sunt reprezentări numerice dense ale cuvintelor, sub formă de vectori de numere reale. Spre deosebire de reprezentările sparse (precum one-hot), embeddings-urile capturează relații semantice și contextuale între cuvinte, permițând modelelor de învățare automată să înțeleagă mai bine sensul textului.
De ce nu ar trebui să folosesc codificarea One-Hot sau numerică unică?
Codificarea One-Hot este extrem de ineficientă pentru vocabulare mari (vectori sparse) și nu surprinde nicio relație semantică între cuvinte. Codificarea numerică unică este mai densă, dar este arbitrară și nu oferă nicio informație despre similitudinea sau diferența dintre cuvinte, făcând-o dificil de interpretat pentru modele.
Cum sunt antrenate Word Embeddings?
Word Embeddings sunt parametri antrenabili (ponderi) într-un strat special al rețelelor neuronale. Modelul le ajustează treptat în timpul procesului de antrenament, pe baza sarcinii specifice (cum ar fi clasificarea sentimentelor sau traducerea automată), astfel încât cuvintele cu semnificații similare să aibă vectori similari în spațiul de embedding.
Cum aleg dimensiunea embedding-ului?
Dimensiunea embedding-ului (numărul de dimensiuni al vectorului) este un hiperparametru. Pentru seturi de date mici, valori precum 8, 16 sau 32 pot fi suficiente. Pentru seturi de date mari, se pot folosi dimensiuni de 128, 256, 512 sau chiar 1024. O dimensiune mai mare poate capta relații mai complexe, dar necesită mai multe date și putere de calcul pentru a fi învățată eficient.
Pot folosi embeddings pre-antrenate?
Da, este o practică comună și adesea foarte eficientă să folosești embeddings pre-antrenate (de exemplu, Word2Vec, GloVe, FastText, BERT). Acestea sunt antrenate pe corpuri de text masive și captează relații semantice generale. Le poți apoi utiliza ca punct de plecare în modelul tău (finetuning) sau le poți menține fixe, economisind timp și resurse de antrenament, mai ales pentru seturi de date mici.

Dacă vrei să descoperi și alte articole similare cu Word Embeddings: Ghid Complet de Antrenament, poți vizita categoria Fitness.

Go up