2016-06-23 41 views
7

Sto cercando di capire come funziona word2vec example e non capisco veramente quale sia lo scopo dei pesi e dei bias passati nella funzione nse_loss. Ci sono due input variabili nella funzione: pesi (più bias) e incorporamento.Qual è lo scopo dei pesi e dei bias nell'esempio di tensorflow word2vec?

# Look up embeddings for inputs. 
embeddings = tf.Variable(
    tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0)) 
embed = tf.nn.embedding_lookup(embeddings, train_inputs) 

# Construct the variables for the NCE loss 
nce_weights = tf.Variable(
    tf.truncated_normal([vocabulary_size, embedding_size], 
         stddev=1.0/math.sqrt(embedding_size))) 
nce_biases = tf.Variable(tf.zeros([vocabulary_size])) 

Entrambi sono inizializzati casualmente e (per quanto ho capito) entrambi sono soggetti ad aggiornamenti durante l'apprendimento.

# Compute the average NCE loss for the batch. 
loss = tf.reduce_mean(
    tf.nn.nce_loss(nce_weights, nce_biases, embed, train_labels, 
       num_sampled, vocabulary_size)) 

Suppongo che entrambi dovrebbero rappresentare un modello addestrato. Tuttavia i pesi e le distorsioni non vengono mai utilizzati in seguito per i calcoli di similitudine. Invece, viene utilizzato un solo componente:

# Compute the cosine similarity between minibatch examples and all embeddings. 
norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True)) 
normalized_embeddings = embeddings/norm 
valid_embeddings = tf.nn.embedding_lookup(
    normalized_embeddings, valid_dataset) 
similarity = tf.matmul(
    valid_embeddings, normalized_embeddings, transpose_b=True) 

Quindi, che dire del secondo componente del modello? Perché pese e pregiudizi vengono ignorati?

Grazie.

risposta

3

In word2vec ciò che si desidera è una rappresentazione vettoriale di parole. Per fare ciò puoi usare, tra le altre cose, una rete neurale. Quindi hai input neuroni, uscite e livelli nascosti. Quello che fai per imparare la rappresentazione vettoriale è di avere uno strato nascosto il cui numero di neuroni è uguale alla dimensione che desideri nei tuoi vettori. C'è un input per word e un output per word. E poi si allena la rete per imparare l'input dall'output ma nel mezzo si ha uno strato più piccolo che si può vedere come una codifica dell'input in un vettore. Quindi qui ci sono i pesi e le byases. Ma non ne hai più bisogno in seguito, quello che usi per il test è un dizionario che contiene la parola e il vettore che rappresenta quella parola. Questo è più veloce di eseguire la rete neurale per ottenere la rappresentazione. Questo è il motivo per cui non lo vedi più tardi.

L'ultimo codice che scrivi sulla distanza del coseno è sapere quali vettori sono chiusi al vettore calcolato. Hai alcune parole (vettori) che fai delle operazioni (come: re - uomo + donna) e poi hai un vettore che vuoi convertire nel risultato. Questa è la funzione del coseno che funziona tra tutti i vettori (la regina avrebbe la distanza minima con il vettore risultante dell'operazione).

Per riassumere, non si vede il peso e il byas nella fase di convalida perché non sono necessari. Usi il dizionario che hai creato durante l'allenamento.

UPDATE s0urcer ha spiegato meglio come viene creata la rappresentazione vettoriale.

Il livello di input e il livello di output delle reti rappresentano parole. Significa che il valore è 0 se la parola non è presente e 1 se la parola è presente. La prima posizione è una parola, l'altra seconda, ecc. Hai come input/output i neuroni come parole.

Il livello intermedio è il contesto o si rappresenta vettore delle parole.

Ora si allena la rete con frasi o un gruppo di parole consecutive. Da questo gruppo si prende una parola e la si imposta negli ingressi e le altre parole sono le uscite della rete. Quindi in pratica la rete impara come una parola è correlata con altre parole nel suo contesto.

Per ottenere la rappresentazione vettoriale di ogni parola, impostare il neurone di input di quella parola su 1 e visualizzare i valori del livello di contesto (il livello intermedio). Questi valori sono i valori del vettore. Poiché tutti gli input sono 0 tranne la parola che è 1, questi valori sono i pesi delle connessioni del neurone di input con il contesto.

Non si utilizza la rete in seguito perché non è necessario calcolare tutti i valori del livello di contesto, che sarà più lento. Hai solo bisogno di controllare nel tuo dizionario quali sono quei valori per la parola.

+1

Vedo cosa intendi, ma in questo caso, l'input per parola e l'output per parola sono valori casuali da embeddings. Di solito, durante il processo di apprendimento vengono aggiornati solo pesi e bias dei livelli. Ma in questo caso (ciò che mi confonde) il processo di apprendimento aggiorna gli input, gli output (che provengono entrambi da parti diverse degli embeddings) così come i pesi. Inoltre, l'apprendimento sembra essere casuale poiché i pesi sono casuali per ogni parola. Mi sto perdendo qualcosa? – WarGoth

+1

Non sono valori casuali, sono valori selezionati casualmente. Quando si dispone di un set di dati e si eseguirà l'algoritmo per diverse epoche ciò che si fa è di randomizzare l'ordine del set di dati in ogni epoca, ecco perché i valori vengono selezionati casualmente. I pesi sono casuali all'inizio e quindi vengono modificati dall'ottimizzatore in ogni lotto. Sono casuali all'inizio per evitare di rimanere bloccati nei minimi locali. – jorgemf

+0

Per me è piuttosto sconvolgente. Intendi dire che non abbiamo bisogno di pesi poiché abbiamo bisogno solo di informazioni sulla relazione tra le parole, non dei valori "assoluti"? E in tali operazioni matematiche tutti i pesi si cancellerebbero? – WarGoth

1

pesi e pregiudizi vengono aggiornati qui:

_, loss_val = session.run([optimizer, loss], feed_dict=feed_dict)

L'ottimizzatore fa seguenti - calcola il gradiente e poi fa il passo di aggiornamento.

La somiglianza è un calcolo separato chiamato in una posizione diversa e utilizzato per convalidare i risultati. Che avviene nel seguente sezione di codice:

if step % 10000 == 0: sim = similarity.eval()

La validazione del embedding si basa sulla similitudine incorporamento.

3

L'idea di skip-gramm sta confrontando le parole in base ai rispettivi contesti. Quindi consideriamo le parole uguali se compaiono in contesti uguali. Il primo strato di NN rappresenta le codifiche vettoriali di parole (in pratica ciò che viene chiamato embeddings). Il secondo livello rappresenta il contesto. Ogni volta che prendiamo solo una riga (Ri) del primo livello (perché il vettore di input appare sempre come 0, ..., 0, 1, 0, ..., 0) e lo si moltiplica per tutte le colonne del secondo livello (Cj, j = 1..num of words) e quel prodotto sarà l'output di NN. Formiamo la rete neurale per avere i componenti di uscita massima Ri * Cj se le parole i e j appaiono spesso (nello stesso contesto) spesso. Durante ogni ciclo di allenamento accordiamo solo un Ri (ancora a causa del modo in cui i vettori di input sono scelti) e tutti i Cj, j = 1..w. Quando termina l'allenamento, gettiamo la matrice del secondo livello perché rappresenta il contesto. Usiamo solo la matrice del primo strato che rappresenta la codifica vettoriale delle parole.