Che cos'è un livello di incorporamento in una rete neurale?


92

In molte librerie di reti neurali, ci sono "livelli di incorporamento", come in Keras o Lasagne .

Non sono sicuro di averne compreso la funzione, nonostante abbia letto la documentazione. Ad esempio, nella documentazione di Keras si dice:

Trasforma interi positivi (indici) in vettori di densi di dimensioni fisse, ad es. [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]

Potrebbe una persona esperta spiegare cosa fa e quando lo useresti?


EDIT: per quanto riguarda l'incollaggio nella documentazione, non c'è molto da incollare dalla documentazione, quindi la mia domanda. Non capisco la trasformazione che fa, né perché debba essere usata.

Ad ogni modo, è così che viene spiegato in Keras:

Incorporare

keras.layers.embeddings.Embedding (input_dim, output_dim, init = 'uniform', input_length = None, weights = None, W_regularizer = None, W_constraint = None, mask_zero = False) Trasforma interi positivi (indici) in vettori di dimensioni fisse , per esempio. [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]

Forma di input: tensore 2D con forma: (nb_samples, sequenza_length). Forma di output: tensore 3D con forma: (nb_samples, sequenza_length, output_dim). Argomenti:

input_dim: int> = 0. Dimensione del vocabolario, cioè. 1 + indice intero massimo presente nei dati di input. output_dim: int> = 0. Dimensione dell'incorporamento denso

Ed ecco come è spiegato in Lasagne:

Un livello per gli incantesimi di parole. L'input deve essere una variabile Tensor di tipo intero.

Parametri: incoming: un'istanza Layer o una tupla

Il livello si inserisce in questo livello o la forma di input prevista.

input_size: int

Il numero di diversi incastonature. L'ultimo incorporamento avrà indice input_size - 1.

output_size: int

La dimensione di ogni incorporamento.

W: Variabile condivisa Theano, espressione, matrice numpy o richiamabile

Valore iniziale, espressione o inizializzatore per la matrice di incorporamento. Dovrebbe essere una matrice con forma (input_size, output_size). Vedi lasagne.utils.create_param () per maggiori informazioni.

Esempi

>>> from lasagne.layers import EmbeddingLayer, InputLayer, get_output
>>> import theano
>>> x = T.imatrix()
>>> l_in = InputLayer((3, ))
>>> W = np.arange(3*5).reshape((3, 5)).astype('float32')
>>> l1 = EmbeddingLayer(l_in, input_size=3, output_size=5, W=W)
>>> output = get_output(l1, x)
>>> f = theano.function([x], output)
>>> x_test = np.array([[0, 2], [1, 2]]).astype('int32')
>>> f(x_test) array([[[  0.,   1.,   2.,   3.,   4.],
                      [ 10.,  11.,  12.,  13.,  14.]],
                     [[  5.,   6.,   7.,   8.,   9.],
                      [ 10.,  11.,  12.,  13.,  14.]]], dtype=float32)

1
Si prega di incollare in qualsiasi contesto sia necessario per comprendere e rispondere alla domanda. Le persone non vogliono andare altrove e leggere la documentazione per rispondere alla tua domanda.
gung - Ripristina Monica

1
Ho apportato le modifiche che hai chiesto
Francesco,

Ero con lo stesso dubbio e ho trovato alcuni documenti che ne parlano. Qui ci sono alcuni interessanti: cs.cmu.edu/afs/cs/academic/class/15782-f06/slides/... fromthebottomoftheheap.net/2011/01/21/... Apparentemente applica ritardi nelle serie temporali inputed e ritengono che ritardi come nuovi vettori.
abutremutante,

Guarda questo video: youtube.com/watch?v=bvZnphPgz74 . Circa 30 minuti parla di matrimoni.
Pieter,

Risposte:


69

Relazione con Word2Vec

==========================================

Word2Vec in una semplice immagine:

word2vec pic

Spiegazione più approfondita:

Credo che sia legato alla recente innovazione di Word2Vec nell'elaborazione del linguaggio naturale. In parole povere, Word2Vec significa che il nostro vocabolario è discreto e impareremo una mappa che incorporerà ogni parola in uno spazio vettoriale continuo. L'uso di questa rappresentazione dello spazio vettoriale ci consentirà di avere una rappresentazione continua e distribuita delle nostre parole del vocabolario. Se ad esempio il nostro set di dati è composto da n-grammi, ora possiamo usare le nostre funzioni di parole continue per creare una rappresentazione distribuita dei nostri n-grammi. Nel processo di formazione di un modello linguistico impareremo questa parola che incorpora la mappa. La speranza è che usando una rappresentazione continua, il nostro incorporamento mapperà parole simili a regioni simili. Ad esempio nel documento di riferimento Rappresentazioni distribuite di parole e frasi e loro composizionalità, osservare nelle tabelle 6 e 7 che alcune frasi hanno ottime frasi vicine più vicine da un punto di vista semantico. La trasformazione in questo spazio continuo ci consente di utilizzare nozioni metriche continue di somiglianza per valutare la qualità semantica del nostro incorporamento.

Spiegazione usando il codice Lasagne

Analizziamo lo snippet di codice Lasagne:

x = T.imatrix()

x è una matrice di numeri interi. Ok nessun problema. Ogni parola nel vocabolario può essere rappresentata da un intero o da una codifica sparsa a 1 punto. Quindi se x è 2x2, abbiamo due punti dati, ognuno dei quali è un 2 grammi.

l_in = InputLayer((3, ))

w0,w1,w2

W = np.arange(3*5).reshape((3, 5)).astype('float32')

Questa è la nostra matrice di incorporamento delle parole. È una matrice di 3 righe per 5 colonne con voci da 0 a 14.

w0=(1,0,0)w1=(0,1,0)w2=(0,0,1)Ww0w0W=[0,1,2,3,4].w1w1W=[5,6,7,8,9]

Dovrebbe essere notato, a causa della codifica sparse one-hot che stiamo usando, vedete anche questo indicato come ricerche di tabella.

l1 = EmbeddingLayer(l_in, input_size=3, output_size=5, W=W)

Il livello di incorporamento

 output = get_output(l1, x)

Espressione simbolica di Theano per l'incorporamento.

f = theano.function([x], output)

Funzione theano che calcola l'incorporamento.

x_test = np.array([[0, 2], [1, 2]]).astype('int32')

(w0,w2)(w1,w2)

(w0,w2)W

f(x_test) 

ritorna:

          array([[[  0.,   1.,   2.,   3.,   4.],
                  [ 10.,  11.,  12.,  13.,  14.]],
                 [[  5.,   6.,   7.,   8.,   9.],
                  [ 10.,  11.,  12.,  13.,  14.]]], dtype=float32)

Per convincerti che il 3 rappresenta davvero la dimensione del vocabolario, prova a inserire una matrice x_test = [[5, 0], [1, 2]]. Vedrai che genera un errore di errata corrispondenza della matrice.


2
questa risposta è buona. Ho un'estensione di questa domanda, in che modo il livello incorporato converte il campione del sentimento Imdb (o di qualsiasi altro set di dati) in vettoriale. Queste sono raccolte di parole.
sospetto

1

In https://stackoverflow.com/questions/45649520/explain-with-example-how-embedding-layers-in-keras-works/ Ho provato a preparare un esempio usando 2 frasi, keras's text_to_sequences

'This is a text' --> [0 0 1 2 3 4]

e livello di incorporamento. Basato su Come funziona il livello 'Incorporamento' di Keras? il livello di incorporamento inizialmente inizializza il vettore di incorporamento in modo casuale e quindi utilizza l'ottimizzatore di rete per aggiornarlo in modo simile come farebbe con qualsiasi altro livello di rete in keras.

[0 0 1 2 3 4] --> 
[-0.01494285, -0.007915  ,  0.01764857],
[-0.01494285, -0.007915  ,  0.01764857],
[-0.03019481, -0.02910612,  0.03518577],
[-0.0046863 ,  0.04763055, -0.02629668],
[ 0.02297204,  0.02146662,  0.03114786],
[ 0.01634104,  0.02296363, -0.02348827]

Sopra ci sarebbe un vettore di incorporamento iniziale per una frase di (massimo) 6 parole e output_dim di 3.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.