Come funziona il livello 'Incorporamento' di Keras?


70

È necessario comprendere il funzionamento del livello 'Incorporamento' nella libreria Keras. Eseguo il seguente codice in Python

import numpy as np
from keras.models import Sequential
from keras.layers import Embedding

model = Sequential()
model.add(Embedding(5, 2, input_length=5))

input_array = np.random.randint(5, size=(1, 5))

model.compile('rmsprop', 'mse')
output_array = model.predict(input_array)

che fornisce il seguente output

input_array = [[4 1 3 3 3]]
output_array = 
[[[ 0.03126476  0.00527241]
  [-0.02369716 -0.02856163]
  [ 0.0055749   0.01492429]
  [ 0.0055749   0.01492429]
  [ 0.0055749   0.01492429]]]

Capisco che ogni valore in input_array è mappato su 2 elementi vettore in output_array, quindi un vettore 1 X 4 dà 1 X 4 X 2 vettori. Ma come vengono calcolati i valori mappati?


1
Forse un buon inizio: github.com/fchollet/keras/issues/3110 ?
fnl

In questo blog una parola incorporamento usando il livello Incorporamento di Keras è considerata learn-neural-networks.com/world-embedding-by-keras
Фаиль Гафаров

Risposte:


87

In effetti, i vettori di output non vengono calcolati dall'input utilizzando alcuna operazione matematica. Al contrario, ogni intero di input viene utilizzato come indice per accedere a una tabella che contiene tutti i vettori possibili. Questo è il motivo per cui è necessario specificare la dimensione del vocabolario come primo argomento (in modo che la tabella possa essere inizializzata).

L'applicazione più comune di questo livello è per l'elaborazione del testo. Vediamo un semplice esempio. Il nostro set di allenamento è composto solo da due frasi:

Spero di vedervi presto

Che bello rivederti

Quindi possiamo codificare queste frasi assegnando a ogni parola un numero intero univoco (per esempio, per ordine di apparizione nel nostro set di dati di addestramento). Quindi le nostre frasi potrebbero essere riscritte come:

[0, 1, 2, 3, 4]

[5, 1, 2, 3, 6]

Ora immagina di voler formare una rete il cui primo livello è un livello di incorporamento. In questo caso, dovremmo inizializzarlo come segue:

Embedding(7, 2, input_length=5)

Il primo argomento (7) è il numero di parole distinte nel set di addestramento. Il secondo argomento (2) indica la dimensione dei vettori di incorporamento. L' argumet input_length, ovviamente, determina la dimensione di ciascuna sequenza di input.

Una volta che la rete è stata addestrata, possiamo ottenere i pesi del livello di incorporamento, che in questo caso sarà di dimensioni (7, 2) e può essere pensato come la tabella utilizzata per mappare numeri interi a vettori di incorporamento:

+------------+------------+
|   index    |  Embedding |
+------------+------------+
|     0      | [1.2, 3.1] |
|     1      | [0.1, 4.2] |
|     2      | [1.0, 3.1] |
|     3      | [0.3, 2.1] |
|     4      | [2.2, 1.4] |
|     5      | [0.7, 1.7] |
|     6      | [4.1, 2.0] |
+------------+------------+

Quindi, secondo questi matrimoni, la nostra seconda frase di addestramento sarà rappresentata come:

[[0.7, 1.7], [0.1, 4.2], [1.0, 3.1], [0.3, 2.1], [4.1, 2.0]]

All'inizio potrebbe sembrare contro intuitivo, ma i motori di differenziazione automatica sottostanti (ad esempio, Tensorflow o Theano) riescono a ottimizzare questi vettori associati a ciascun numero intero di input proprio come qualsiasi altro parametro del modello. È anche interessante utilizzare gli incorporamenti appresi da altri metodi / persone in diversi domini (vedi https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html ) come fatto in [1].

[1] López-Sánchez, D., Herrero, JR, Arrieta, AG e Corchado, JM Hybridizing metric learning e ragionamento basato su casi per il rilevamento adattabile di clickbait. Intelligenza applicata, 1-16.


4
Grazie per la risposta. Solo una domanda su come si ottengono i pesi del livello di incorporamento. Come per l'indice 0, come si ottiene [1.2, 3.1].
prashanth,

5
Il contenuto della tabella che mette in relazione gli indici con i vettori di inclusione (ovvero i pesi del livello di inclusione) viene inizializzato a caso e quindi ottimizzato dall'algoritmo di addestramento (ad esempio, Discendente gradiente).
Daniel López,

3
Grazie. Sono ancora un po 'poco chiaro su cosa l'ottimizzatore sarebbe contro l'ottimizzatore? Ad esempio, qual è la "risposta corretta" che le consente di calcolare una funzione di perdita? O detto in un altro modo, cosa sta facendo per il passaggio avanti e indietro?
bwest87,

2
quindi ... l'incorporamento è fondamentalmente solo una sottorete dell'architettura generale che riduce qualsiasi input con codifica a caldo in meno input, afaict ..
Mike Campbell,

1
Poiché il livello di incorporamento è addestrabile, quanto è sensibile ai valori mancanti nel set di addestramento? Diciamo che ho dieci parole nel set di allenamento e altre cinque nel set di test - la mia lunghezza del vocabolario è 15 ... ma il livello in realtà non viene mai attivato da quelle cinque parole "test" durante l'allenamento. Potresti spiegare questa situazione, per favore?
mikalai,

6

Ho anche avuto la stessa domanda e dopo aver letto un paio di post e materiali penso di aver capito qual è il ruolo del livello di incorporamento.

Penso che questo post sia anche utile per capire, tuttavia, trovo davvero la risposta di Daniel comoda da digerire. Ma ho anche avuto l'idea dietro principalmente capendo le parole di incorporamento .

Ritengo che sia inesatto affermare che l'incorporamento dei livelli riduce l'input di codifica a caldo a un numero inferiore di input. Dopo tutto, il vettore unidirezionale è un dato monodimensionale e nel nostro caso viene effettivamente trasformato in 2 dimensioni. Meglio dirlo

il livello di incorporamento presenta una relazione degli input in un'altra dimensione

Che si tratti di 2 dimensioni o anche superiore.

Trovo anche una somiglianza molto interessante tra l'incorporamento delle parole nell'analisi della componente principale. Sebbene il nome possa sembrare complicato, il concetto è semplice. Quello che fa PCA è definire un insieme di dati basato su alcune regole generali (i cosiddetti componenti principali). Quindi è come avere un dato e vuoi descriverlo ma usando solo 2 componenti. Che in questo senso è molto simile agli incastri delle parole. Entrambi svolgono lo stesso lavoro in contesti diversi. Puoi saperne di più qui . Spero che forse capire PCA aiuti a comprendere l'incorporamento dei livelli attraverso l'analogia.

Per concludere, la risposta alla domanda originale del post che " come calcola il valore? " Sarebbe:

  • Fondamentalmente, la nostra rete neurale cattura la struttura sottostante degli input (le nostre frasi) e mette la relazione tra le parole nel nostro vocabolario in una dimensione superiore (diciamo 2) mediante l'ottimizzazione.
  • Una comprensione più approfondita direbbe che la frequenza di ogni parola che appare con un'altra parola dalle nostre influenze sul vocabolario (in un approccio molto ingenuo possiamo calcolarla a mano)
  • La suddetta frequenza potrebbe essere una delle molte strutture sottostanti che NN può catturare
  • Puoi trovare l'intuizione sul link di YouTube che spiega la parola decorazioni

7
Bel punto di vista Tuttavia, penso che valga la pena notare che mentre le tecniche di incorporamento delle parole come word2vec cercano di catturare il pieno significato delle parole nell'incorporamento risultante, il livello di incorporamento in una rete controllata potrebbe non apprendere una rappresentazione così semanticamente ricca e generale. Ad esempio, se la tua rete è addestrata a classificare i sentimenti, probabilmente raggrupperà / raggrupperà le parole nell'incorporamento in base al loro carico "emotivo". Tuttavia, in base alla mia esperienza, è spesso utile inizializzare il livello di incorporamento con i pesi appresi da word2vec su un grande corpus.
Daniel López,

2
il vettore one-hot non è un dato monodimensionale. La sua dimensione è la dimensione del vocabolario.
Binu Jasim,

2
@BinuJasim hai ragione. I vettori unidimensionali che rappresentano un vocabolario non sono dati unidimensionali. Ma l'informazione che rappresenta è davvero unidimensionale e ogni entità all'interno del vocabolario è un dato monodimensionale. È vero che abbiamo n * w (n = dimensione del vocabolario, w = numero di bit) ma ogni valore binario rappresenta un vettore che è di nuovo un input unidimensionale.
Novin Shahroudi,

@NovinShahroudi Brilliant, grazie per la spiegazione.
Benyamin Jafari,
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.