Qual è la differenza principale tra word2vec e fastText?
La differenza principale tra word2vec e fasttext è esattamente quella menzionata da Trevor
- word2vec tratta ogni parola nel corpus come un'entità atomica e genera un vettore per ogni parola. In questo senso Word2vec è molto simile a Glove - entrambi trattano le parole come la più piccola unità su cui allenarsi. Riferimento. Qual è la differenza tra fastText e GloVe?
Fasttext (che è essenzialmente un'estensione del modello word2vec), tratta ogni parola come composta da ngrammi di caratteri. Quindi il vettore di una parola è composto dalla somma di questi ngrammi di caratteri. Per esempio il vettore parola "mela" è una somma dei vettori degli n-grammi "", "ppl", "pple", "pple>", "ple", "ple>", "le>" (assumendo iperparametri per il più piccolo ngram[minn] è 3 e il più grande ngram[maxn] è 6). Questa differenza si manifesta come segue.
- Genera migliori embeddings per parole rare (anche se le parole sono rare i loro caratteri n grammi sono ancora condivisi con altre parole - quindi le embeddings possono ancora essere buone).
- Questo è semplicemente perché, in word2vec una parola rara (ad esempio 10 occorrenze) ha meno vicini da cui essere rimorchiata, in confronto ad una parola che ricorre 100 volte - quest'ultima ha più parole vicine di contesto e quindi viene rimorchiata più spesso risultando in migliori vettori di parole. Riferimento: come funziona word2vec?
- Parole fuori dal vocabolario - possono costruire il vettore di una parola dai suoi caratteri n grammi anche se la parola non appare nel corpus di allenamento. Sia Word2vec che Glove non possono farlo.
- Da un punto di vista di utilizzo pratico, la scelta degli iperparametri per la generazione di fasttext embeddings diventa la chiave
- Poiché l'addestramento è a livello di n-grammi di carattere, ci vuole più tempo per generare fasttext embeddings rispetto a word2vec - la scelta degli iperparametri che controllano la dimensione minima e massima degli n-grammi ha un effetto diretto su questo tempo.
- Al crescere della dimensione del corpus, cresce anche la richiesta di memoria - il numero di ngrammi che vengono inseriti nello stesso bucket di ngram cresce. Quindi la scelta dell'iperparametro che controlla il totale dei bucket dell'hash, comprese le dimensioni minime e massime degli n-grammi, ha un peso. Per esempio, anche una macchina con 256GB di RAM è insufficiente (con lo spazio di swap esplicitamente impostato molto basso per evitare lo swap) per creare vettori di parole per un corpus con ~50 milioni di parole uniche con minn=3 e maxn=3 e min word count 7. Il numero minimo di parole ha dovuto essere portato a 15 (eliminando così un gran numero di parole con un numero di occorrenze inferiore a 15) per generare vettori di parole.
- L'uso di embeddings di caratteri (caratteri individuali invece di n-grammi) per compiti a valle ha recentemente dimostrato di aumentare le prestazioni di tali compiti rispetto all'uso di embeddings di parole come word2vec o Glove.
- Mentre gli articoli che riportano questi miglioramenti tendono ad usare LSTMs di caratteri per generare embeddings, non citano l'uso di fasttext embeddings. https://arxiv.org/pdf/1508.02096.pdf (codice sorgente basato su Java per questo modello - wlin12/JNN)
- Per questi compiti vale forse la pena considerare fasttext embeddings poiché la generazione di fasttext embeddings (nonostante sia più lenta di word2vec) è probabilmente più veloce di LSTMs (questa è solo un'intuizione dal tempo impiegato da LSTMs - deve essere validata. For instance one test could be to compare fasttext with minn=1, maxn=1 with a corrsesponding char LSTM and evaluate performance for a POS tagging task).
Additional references
Does Facebook’s fastText library have a concept of word boundaries?
How does fastText output a vector for a word that is not in the pre-trained model?