Multi-Task-Learning in Keras

12

Ich versuche, gemeinsam genutzte Ebenen in Keras zu implementieren. Ich sehe, dass Keras hat keras.layers.concatenate, aber ich bin nicht sicher, Dokumentation über seine Verwendung. Kann ich damit mehrere gemeinsame Ebenen erstellen? Was wäre der beste Weg, um ein einfaches, gemeinsam genutztes neuronales Netzwerk wie unten gezeigt mit Keras zu implementieren?Gemeinsames neuronales Netzwerk

Beachten Sie, dass alle Formen der Eingabe-, Ausgabe- und gemeinsamen Ebenen für alle 3 NNs gleich sind. In den drei NNs gibt es mehrere gemeinsam genutzte Ebenen (und nicht gemeinsam genutzte Ebenen). Die farbigen Schichten sind für jedes NN einzigartig und haben die gleiche Form.

Grundsätzlich stellt die Figur 3 identische NNs mit mehreren gemeinsam genutzten verborgenen Schichten dar, gefolgt von mehreren nicht gemeinsam genutzten verborgenen Schichten.

Ich bin nicht sicher, wie ich mehrere Ebenen teilen soll, da es im Twitter-Beispiel nur eine gemeinsame Ebene gab (Beispiel in API-Dokument).

Aditya
quelle

Antworten:

10

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)

Wir können unser Modell jetzt so definieren:

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

Es wird nun ein Tupel / eine Liste mit drei Elementen erwartet, eines für jede Ausgabe.

Mit diesen Konzepten können Sie noch viel weiter gehen. Angenommen, wir möchten einzelne Gewichte für die Personenebenen lernen, möchten aber weiterhin die gleichen Gewichte für die Linearkombination in Richtung der Ausgabeebene haben. Dies könnte folgendermaßen erreicht werden:

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

BEARBEITEN: Verketten ist im Grunde das Gegenteil von dem, was Sie tun möchten. Es fügt (Zwischen-) Ausgaben verschiedener Teile Ihres Netzwerks in eine neue Ebene ein. Eigentlich möchten Sie sich in mehrere Teile aufteilen.

Jan van der Vegt
quelle
Danke vielmals. Wenn wir a machen model.fit([data1, data2], [labels1, labels2]), wird dies als ein einziges Modell trainiert (die Ausbreitung des Rückens), oder?
Aditya
1
Ja, es wird nur eine Sache sein, wenn die Etiketten unterschiedliche Verluste aufweisen, müssen Sie etwas mehr arbeiten. Es ist in Keras nicht sehr einfach, aber nicht unmöglich, wenn sie die gleiche Verlustfunktion teilen, ohne sie neu zu gewichten. Das funktioniert sofort
Jan van der Vegt
Dies würde ein erneutes Training des einheitlichen Modells erfordern. Was ist, wenn Sie bereits die Trainingsgewichte für die Untermodelle haben? Gibt es eine Möglichkeit, diese Gewichtungen zum Erstellen der Gewichtungen für das zusammengeführte Modell zu verwenden?
shahar_m
@ Shahar_m Entschuldigung, ich bin mir nicht sicher, was der Anwendungsfall ist. Wenn die Trainingsgewichte des einheitlichen Modells festgelegt sind, können Sie diese Ebenen laden und einfrieren.
Aditya