Word2vecWord2vec è un insieme di modelli che sono utilizzati per produrre word embedding, il cui pacchetto fu originariamente creato in C da Tomas Mikolov[1], poi implementato anche in Python[2] e Java[3]. Word2vec è una semplice rete neurale artificiale a due strati progettata per elaborare il linguaggio naturale, l'algoritmo richiede in ingresso un corpus e restituisce un insieme di vettori che rappresentano la distribuzione semantica delle parole nel testo. Per ogni parola contenuta nel corpus, in modo univoco, viene costruito un vettore in modo da rappresentarla come un punto nello spazio multidimensionale creato. In questo spazio le parole saranno più vicine se riconosciute come semanticamente più simili. Per capire come Word2vec possa produrre word embedding è necessario comprendere le architetture CBOW e Skip-Gram. CBOW e Skip-GramWord2vec può produrre word embedding utilizzando uno tra i seguenti due modelli di architettura: continuous bag-of-words (CBOW) e Skip-Gram[4]. Per addestrare i modelli è necessario disporre di un corpus di documenti testuali quanto più ampio possibile. Da questo corpus sarà possibile estrarre un vocabolario di parole distinte (token). Nel mezzo del cammin di nostra vita
mi ritrovai per una selva oscura
Ogni token distinto è quindi rappresentato con una codifica One-hot encoding. Questo approccio presenta però alcuni limiti poiché la dimensione del vettore dipende dalla dimensione del vocabolario che potrebbe essere anche molto ampia. Questo enorme utilizzo di dati potrebbe manifestarsi nella curse of dimensionality. Inoltre, se venissero aggiunti/rimossi token dal word embedding, il modello dovrebbe essere riaddestrato da zero. L'ultimo grosso limite di questo approccio è dovuto al fatto che non viene risolto il problema della polisemia dei termini (meaning conflation deficiency). Nell'esempio di corpus sopra riportato sono presenti 13 token distinti, perciò la lunghezza del vettore è necessariamente 13. nel [1,0,0,0,0,0,0,0,0,0,0,0,0]
mezzo [0,1,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]
cammin [0,0,0,1,0,0,0,0,0,0,0,0,0]
di [0,0,0,0,1,0,0,0,0,0,0,0,0]
nostra [0,0,0,0,0,1,0,0,0,0,0,0,0]
vita [0,0,0,0,0,0,1,0,0,0,0,0,0]
mi [0,0,0,0,0,0,0,1,0,0,0,0,0]
ritrovai[0,0,0,0,0,0,0,0,1,0,0,0,0]
per [0,0,0,0,0,0,0,0,0,1,0,0,0]
una [0,0,0,0,0,0,0,0,0,0,1,0,0]
selva [0,0,0,0,0,0,0,0,0,0,0,1,0]
oscura [0,0,0,0,0,0,0,0,0,0,0,0,1]
I due modelli esplorano il contesto dei token investigando gli altri token che sono prossimi a quest'ultimo. Qui si evidenzia la principale differenza tra le architetture CBOW e Skip-Gram. Se la prima architettura mira a predire il token corrente (output) a partire da una finestra di parole di contesto (input); la seconda ha lo scopo di predire le parole di contesto (output) a partire dal token corrente (input). Il parametro definisce la dimensione della finestra di contesto: sono incluse nel contesto i token immediatamente precedenti/successivi al token corrente.
Entrambi i modelli sono implementati tramite una rete neurale artificiale costituita da tre strati: uno strato d'ingresso (input layer), uno strato nascosto (hidden layer) e uno strato d'uscita (output layer). L'input varia a seconda del modello di architettura utilizzato così come varia il tipo di output predetto. Infatti, a seconda dell'architettura il token corrente e la finestra di contesto saranno l'input o l'output del modello. A seguito del training del modello tramite backpropagation, la matrice dei pesi conterrà le rappresentazioni delle word embedding dei token del vocabolario dove N è la dimensione del word embedding. In altre parole, la riga della matrice conterrà la rappresentazione word embedding del token . La funzione softmax viene applicata nell'ultimo layer della rete neurale. CBOWL'architettura CBOW ha lo scopo di predire il token corrente (output, es. nel) a partire da una finestra di parole di contesto (input, es. mezzo e del). L'input consiste quindi nella rappresentazione One-hot encoding di token di contesto. La matrice è la stessa descritta nell'architettura generale, ma, in questo caso, l'hidden layer è la media dei vettori corrispondenti alle parole di contesto in ingresso. Facendo ciò l'hidden layer perde l'informazione della posizione nel testo dei token che fanno parte della finestra di contesto così come avviene nella rappresentazione bag of words. Skip-GramL'architettura Skip-Gram ha lo scopo di predire le parole di contesto (output, es. nel, del e cammin) a partire dal token corrente (input, es. mezzo). L'output è rappresentato da un vettore ottenuto dalla media della rappresentazione One-hot encoding di ogni token di contesto. L'input consiste invece nella rappresentazione One-hot encoding del token corrente. L'hidden layer corrisponde quindi alla rappresentazione word embedding del token corrente. Il modello genererà un vettore di output per ogni token di contesto. Di conseguenza saranno presenti altrettanti vettori di errore di dimensione . Al fine di avviare la back propagation i vettori di errore vengono sommati tra di loro per ottenere un solo vettore . I pesi dell'hidden layer verranno quindi aggiornati in base a questo vettore di errore cumulativo. Anche nell'architettura skip-gram non viene quindi tenuto conto della posizione nel testo dei token di contesto . Parametri word2vecShell, CIl pacchetto originale di Word2vec permette di lanciare da shell l'algoritmo scritto in C. Il file demo-word.sh infatti riporta questo comando: $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
Dove $BIN_DIR/word2vec è il percorso delle cartelle per arrivare al file word2vec nella cartella bin; $TEXT_DATA va sostituito invece con il corpus formato testo con cui si vuole fare l'addestramento e $VECTOR_DATA sarà il nome del file che l'algoritmo andrà a creare. Successivamente possiamo vedere dei parametri modificabili:
Gensim, PythonVi sono vari parametri che si possono modificare per personalizzare il processamento dell'algoritmo, alcuni sono scritti di seguito:
Il tutorial di gensim[2] inizializza i parametri (n) in questo modo: class gensim.models.word2vec.Word2Vec(sentences=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=0.001, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=<built-in function hash>, iter=5, null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000)
DL4J, JavaI parametri spiegati sulla documentazione di DL4J[3] sono:
La documentazione di DL4J[3] inizializza i parametri in questo modo: Word2Vec vec = new Word2Vec.Builder()
.minWordFrequency(5)
.iterations(1)
.layerSize(100)
.seed(42)
.windowSize(5)
.iterate(iter)
.tokenizerFactory(t)
.build();
Note
Bibliografia |