Aprendizagem multi-tarefa em Keras

12

Estou tentando implementar camadas compartilhadas no Keras. Vejo que Keras tem keras.layers.concatenate, mas não tenho certeza da documentação sobre seu uso. Posso usá-lo para criar várias camadas compartilhadas? Qual seria a melhor maneira de implementar uma rede neural compartilhada simples, como mostrado abaixo usando Keras?Rede neural compartilhada

Observe que todas as formas de entrada, saída e camadas compartilhadas das três NNs são iguais. Existem várias camadas compartilhadas (e não compartilhadas) nas três NNs. As camadas coloridas são exclusivas para cada NN e têm a mesma forma.

Basicamente, a figura representa 3 NNs idênticos com várias camadas ocultas compartilhadas, seguidas por várias camadas ocultas não compartilhadas.

Não tenho certeza de como compartilhar várias camadas, como no exemplo do Twitter, havia apenas uma camada compartilhada (exemplo no doc da API).

Aditya
fonte

Respostas:

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)

Podemos definir nosso modelo agora assim:

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

Esperará agora uma tupla / lista de três elementos, um para cada saída.

Você pode ir muito além com esses conceitos. Digamos que gostaríamos de aprender pesos individuais para as camadas de pessoa, mas ainda queremos ter os mesmos pesos para a combinação linear em direção à camada de saída, podemos conseguir isso fazendo isso:

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

EDIT: Concatenar é basicamente o oposto do que você quer fazer, colando saídas (intermediárias) de diferentes partes da sua rede em uma nova camada. Você realmente deseja dividir em várias partes diferentes.

Jan van der Vegt
fonte
Muito obrigado. Quando fizermos a model.fit([data1, data2], [labels1, labels2]), isso será treinado (a propagação traseira) como um modelo único, certo?
Aditya
1
Sim, será apenas uma coisa: se os rótulos tiverem perdas diferentes associadas, você precisará fazer mais trabalho, não é super fácil em Keras, mas não impossível, se eles compartilham a mesma função de perda sem reponderar, apenas funciona imediatamente
Jan van der Vegt
Isso exigiria um novo treinamento do modelo unificado. E se você já tiver os pesos de treinamento para os submodelos? Existe uma maneira de usar esses pesos para criar os wieghts para o modelo mesclado?
shahar_m
@shahar_m desculpe, não tenho certeza qual é o caso de uso. se os pesos de treinamento do modelo unificado forem fixos, você poderá carregar e congelar essas camadas.
Aditya