Apprentissage multi-tâches à Keras

12

J'essaie d'implémenter des couches partagées dans Keras. Je vois que Keras a keras.layers.concatenate, mais je ne suis pas sûr de la documentation sur son utilisation. Puis-je l'utiliser pour créer plusieurs couches partagées? Quelle serait la meilleure façon de mettre en œuvre un réseau neuronal partagé simple comme indiqué ci-dessous en utilisant Keras?Réseau de neurones partagé

Notez que toutes les formes des couches d'entrée, de sortie et partagées pour les 3 NN sont identiques. Il existe plusieurs couches partagées (et non partagées) dans les trois NN. Les couches colorées sont uniques à chaque NN et ont la même forme.

Fondamentalement, la figure représente 3 NN identiques avec plusieurs couches cachées partagées, suivies de plusieurs couches cachées non partagées.

Je ne sais pas comment partager plusieurs couches comme dans l'exemple Twitter, il n'y avait qu'une seule couche partagée (exemple dans le document API).

Aditya
la source

Réponses:

10

En utilisant l'API fonctionnelle, vous pouvez facilement partager des poids entre différentes parties de votre réseau. Dans votre cas, nous avons un qui est notre entrée, puis nous aurons une couche appelée partagée. Ensuite, nous aurons trois couches différentes appelées sub1, sub2 et sub3, puis trois couches de sortie appelées out1, out2 et 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)

Nous pouvons maintenant définir notre modèle comme ceci:

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

Il attendra maintenant un tuple / liste de trois éléments, un pour chaque sortie.

Vous pouvez aller beaucoup plus loin avec ces concepts. Disons que nous aimerions apprendre des poids individuels pour les couches personne mais que nous voulons toujours avoir les mêmes poids pour la combinaison linéaire vers la couche de sortie, nous pourrions y parvenir en procédant comme suit:

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

EDIT: La concaténation est fondamentalement l'opposé de ce que vous voulez faire, c'est coller des sorties (intermédiaires) de différentes parties de votre réseau dans une nouvelle couche. Vous voulez réellement vous séparer en plusieurs parties différentes.

Jan van der Vegt
la source
Merci beaucoup. Lorsque nous faisons un model.fit([data1, data2], [labels1, labels2]), ce sera formé (la propagation arrière) comme un seul modèle, non?
Aditya
1
Oui, ce sera juste une chose, si les étiquettes ont des pertes différentes associées, vous devrez faire un peu plus de travail, ce n'est pas super facile à Keras mais pas impossible, si elles partagent la même fonction de perte sans repondération, cela fonctionne juste hors de la boîte
Jan van der Vegt du
Cela nécessiterait un recyclage du modèle unifié. Et si vous avez déjà les poids d'entraînement pour les sous-modèles? Existe-t-il un moyen d'utiliser ces poids pour créer les poids pour le modèle fusionné?
shahar_m
@shahar_m désolé, je ne sais pas quel est le cas d'utilisation. si les poids d'entraînement du modèle unifié sont fixes, vous pouvez charger et geler ces couches.
Aditya