Je m'adresse à une tâche de classification binaire phrase-niveau. Mes données se composent de 3 sous-groupes de jetons: le contexte de gauche, le noyau et le contexte de droite.Pourquoi 2 presque égales Keras CNN renvoie 2 résultats tout à fait différents
J'utilisé Keras pour concevoir plusieurs alternatives de convolutifs Neural Networks et valider lequel répondent le mieux à mon problème. Je suis un novice en Python et Keras et j'ai décidé de commencer par des solutions plus simples afin de tester quels changements améliorent mes métriques (précision, précision, rappel, f1 et auc-roc). La première simplification est en ce qui concerne les données d'entrée: j'ai décidé de ne pas tenir compte des contextes pour créer un modèle séquentiel de Keras:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 500) 0
_________________________________________________________________
masking_1 (Masking) (None, 500) 0
_________________________________________________________________
embedding_1 (Embedding) (None, 500, 100) 64025600
_________________________________________________________________
conv1d_1 (Conv1D) (None, 497, 128) 51328
_________________________________________________________________
average_pooling1d_1 (Average (None, 62, 128) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 62, 128) 0
_________________________________________________________________
conv1d_2 (Conv1D) (None, 61, 256) 65792
_________________________________________________________________
dropout_2 (Dropout) (None, 61, 256) 0
_________________________________________________________________
conv1d_3 (Conv1D) (None, 54, 32) 65568
_________________________________________________________________
global_max_pooling1d_1 (Glob (None, 32) 0
_________________________________________________________________
dense_1 (Dense) (None, 16) 528
_________________________________________________________________
dropout_3 (Dropout) (None, 16) 0
_________________________________________________________________
dense_2 (Dense) (None, 2) 34
=================================================================
Comme vous pouvez le voir, j'utiliser une taille fixe d'entrées, donc j'appliqué un pré-traitement de rembourrage. J'ai également utilisé une couche d'intégration avec un modèle Word2Vec.
Ce modèle renvoie les résultats suivants:
P 0.875457875
R 0.878676471
F1 0.87706422
AUC-ROC 0.906102654
que je voulais mettre en œuvre comment sélectionner un sous-tableau de données d'entrée à l'intérieur de mon CNN au moyen de couches Lambda. J'utilise la définition suivante de ma couche Lambda:
Lambda(lambda x: x[:, 1], output_shape=(500,))(input)
Et Voici le résumé de mon nouveau CNN (comme vous pouvez le voir est presque la même que la précédente):
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 3, 500) 0
_________________________________________________________________
lambda_1 (Lambda) (None, 500) 0
_________________________________________________________________
masking_1 (Masking) (None, 500) 0
_________________________________________________________________
embedding_1 (Embedding) (None, 500, 100) 64025600
_________________________________________________________________
conv1d_1 (Conv1D) (None, 497, 128) 51328
_________________________________________________________________
average_pooling1d_1 (Average (None, 62, 128) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 62, 128) 0
_________________________________________________________________
conv1d_2 (Conv1D) (None, 61, 256) 65792
_________________________________________________________________
dropout_2 (Dropout) (None, 61, 256) 0
_________________________________________________________________
conv1d_3 (Conv1D) (None, 54, 32) 65568
_________________________________________________________________
global_max_pooling1d_1 (Glob (None, 32) 0
_________________________________________________________________
dense_1 (Dense) (None, 16) 528
_________________________________________________________________
dropout_3 (Dropout) (None, 16) 0
_________________________________________________________________
dense_2 (Dense) (None, 2) 34
=================================================================
Mais les résultats étaient dégoûtant parce que la précision s'arrête à 60% et, évidemment, la précision, le rappel et F1 étaient trop faibles (< 0,10) en ce qui concerne les résultats du premier modèle.
Je ne sais pas ce qui se passe et je ne sais pas si ces réseaux sont plus différents que je pensais.
Des indices sur ce problème?
J'ai reformulé ma question pour la clarifier. Parce que je ne pense pas que tu l'aies compris. Néanmoins, je vais répondre à vos questions. –
1.- Dans ma tâche, les fonctionnalités locales concernant les proches proches sont assez importantes, donc CNN fonctionne bien pour ce genre de tâche. Vous pouvez trouver plusieurs exemples de CNN pour NLP dans la littérature: https://dl.acm.org/citation.cfm?id=2969342, http://www.anthology.aclweb.org/N/N15/N15-1011 .pdf, http://anthology.aclweb.org/C/C14/C14-1008.pdf, http://emnlp2014.org/papers/pdf/EMNLP2014181.pdf. Cependant, je vais essayer seulement des couches Dense afin de comparer les résultats. –
2.- Je compare deux architectures exactement égales de CNN avec la différence de la couche de Labmda (couches de conv. Égales, couches égales et denses, mise en commun égale, chute égale, taux d'apprentissage égal). L'un d'eux se comporte plutôt bien et l'autre se comporte plutôt mal. 3.- Je dois prendre en compte les caractéristiques sémantiques. C'est la principale raison d'utiliser une solution d'incorporation de mots pour vectoriser les jetons. Un des vecteurs chauds ne m'aide pas trop avec ce problème. J'apprécie vraiment votre réponse. –