Apprendimento multi-task in Keras


12

Sto cercando di implementare livelli condivisi in Keras. Vedo che Keras ha keras.layers.concatenate, ma non sono sicuro della documentazione sul suo utilizzo. Posso usarlo per creare più livelli condivisi? Quale sarebbe il modo migliore per implementare una semplice rete neurale condivisa come mostrato di seguito usando Keras?Rete neurale condivisa

Si noti che tutte le forme di input, output e layer condivisi per tutte e 3 le NN sono uguali. Esistono più livelli condivisi (e livelli non condivisi) nei tre NN. Gli strati colorati sono unici per ogni NN e hanno la stessa forma.

Fondamentalmente, la figura rappresenta 3 NN identici con più livelli nascosti condivisi, seguiti da più livelli nascosti non condivisi.

Non sono sicuro di come condividere più livelli come nell'esempio di Twitter, c'era solo un livello condiviso (esempio nel documento API).

Risposte:


10

Utilizzando l'API funzionale è possibile condividere facilmente pesi tra le diverse parti della rete. Nel tuo caso abbiamo una che è il nostro input, quindi avremo uno strato chiamato condiviso. Quindi avremo tre diversi layer chiamati sub1, sub2 e sub3 e poi tre layer di output chiamati out1, out2 e out3.Input xDenseDense

x = Input(shape=(n, ))
shared = Dense(32)(x)
sub1 = Dense(16)(shared)
sub2 = Dense(16)(shared)
sub3 = Dense(16)(shared)
out1 = Dense(1)(sub1)
out2 = Dense(1)(sub2)
out3 = Dense(1)(sub3)

Ora possiamo definire il nostro modello in questo modo:

model = Model(inputs=x, outputs=[out1, out2, out3])

Si aspetterà una tupla / elenco di tre elementi ora, uno per ogni output.

Puoi andare molto oltre con questi concetti. Diciamo che vorremmo imparare pesi individuali per i livelli persona, ma vogliamo comunque avere gli stessi pesi per la combinazione lineare verso il livello di output, potremmo ottenere ciò facendo questo:

out = Dense(1)
out1 = out(sub1)
out2 = out(sub2)
out3 = out(sub3)

EDIT: la concatenazione è sostanzialmente l'opposto di quello che vuoi fare, sta incollando le uscite (intermedie) di diverse parti della tua rete in un nuovo livello. In realtà vuoi dividere in più parti diverse.


Molte grazie. Quando facciamo un model.fit([data1, data2], [labels1, labels2]), questo sarà addestrato (la propagazione posteriore) come un singolo modello, giusto?
Aditya,

1
Sì, sarà solo una cosa, se alle etichette sono associate perdite diverse, dovrai fare un po 'più di lavoro, non è molto facile in Keras ma non impossibile, se condividono la stessa funzione di perdita senza ripesare, funziona immediatamente
Jan van der Vegt,

Ciò richiederebbe una riqualificazione del modello unificato. E se disponessi già dei pesi di allenamento per i sottomodelli? C'è un modo per usare quei pesi per creare i wieghts per il modello unito?
shahar_m,

@shahar_m scusa Non sono sicuro di quale sia il caso d'uso. se i pesi di allenamento del modello unificato sono fissi, è possibile caricare e congelare quei livelli.
Aditya,
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.