Combinaison de caractéristiques numériques et textuelles dans des réseaux de neurones profonds
Dans l’apprentissage automatique appliqué, les données se composent souvent de plusieurs types de données, par exemple texte et données numériques. Pour construire un modèle qui combine des fonctionnalités des deux domaines, il est nécessaire de les empiler ensemble. Cet article présente différentes solutions pour combiner le traitement du langage naturel et les fonctionnalités traditionnelles dans un seul modèle dans Keras (apprentissage de bout en bout).
Les ensembles de données scientifiques sont généralement limités à un seul type de données, par exemple texte, images ou données numériques. Cela a beaucoup de sens, car l’objectif est de comparer les nouveaux modèles et approches existants. Dans les scénarios du monde réel, les données sont souvent plus diverses. Pour utiliser des réseaux de neurones d’apprentissage de bout en bout, au lieu d’empiler manuellement des modèles, nous devons combiner ces différents espaces fonctionnels à l’intérieur du réseau de neurones.
Supposons que nous voulons résoudre un problème de classification de texte et que nous avons des métadonnées supplémentaires pour chacun des documents de notre corpus. Dans les approches simples, où notre document est représenté par un Sac de mots vecteur, nous pourrions simplement ajouter nos métadonnées au vecteur en tant que mots supplémentaires, et nous avons terminé. Mais lorsque vous utilisez une approche moderne comme l’intégration de mots, c’est un peu plus compliqué.
La solution simple consiste à ajouter nos métadonnées en tant que plongements spéciaux supplémentaires. Similaire aux jetons spéciaux dans les modèles de langage comme BERT, ces plongements sont des jetons qui peuvent apparaître comme des mots. Ils sont binaires, donc nous n’avons pas d’espace de valeur continu. Nous devons transformer nos données en fonctionnalités catégorielles par binning ou codage à chaud. Après avoir déterminé le nombre de fonctionnalités supplémentaires dont nous avons besoin, nous pouvons étendre la taille du vocabulaire par le nombre de fonctionnalités supplémentaires et les traiter comme des mots supplémentaires.
Exemple: Notre dictionnaire contient 100 mots et nous avons 10 fonctionnalités supplémentaires.
La séquence des incorporations commence désormais toujours par les fonctionnalités de métadonnées (jetons spéciaux), nous devons donc augmenter notre longueur de séquence de 10. Chacune de ces 10 intégrations spéciales représente l’une des fonctionnalités ajoutées.
Cette solution présente plusieurs inconvénients. Nous n’avons que des caractéristiques catégorielles, pas des valeurs continues et encore plus important, notre espace d’intégration mélange le texte et les métadonnées.
Pour construire un modèle, qui peut gérer des données continues et des données texte sans ces facteurs limitatifs, nous examinons la représentation interne des données à l’intérieur du modèle. À un moment donné, chaque réseau de neurones a une représentation interne des données. Généralement, cette représentation est juste avant que la dernière couche (entièrement connectée) du réseau soit impliquée. Pour les réseaux récurrents en PNL (par exemple les LSTM), cette représentation est une intégration de document. En étendant cette représentation avec nos fonctionnalités supplémentaires, nous surmontons les limites.
Ce qui se passe dans un tel modèle, c’est que nous empilons essentiellement deux modèles les uns sur les autres, mais conservons la possibilité d’être entraînés simultanément par la même étiquette cible. Par conséquent, cela s’appelle un modèle de bout en bout.
Exemple:
Dans Keras, cela est possible avec plusieurs modèles d’entrée. Encore une fois, nous avons 100 mots et 10 fonctionnalités supplémentaires.
nlp_input = Input(shape=(seq_length,))
meta_input = Input(shape=(10,)
emb = Embedding(output_dim=embedding_size, input_dim=100, input_length=seq_length)(nlp_input)
nlp_out = Bidirectional(LSTM(128)(emb)
concat = concatenate([nlp_out, meta_input])
classifier = Dense(32, activation='relu')(concat)
output = Dense(1, activation='sigmoid')(classifier)
model = Model(inputs=[nlp_input , meta_input], outputs=[output])
Nous utilisons un modèle LSTM bidirectionnel et combinons sa sortie avec les métadonnées. Par conséquent, nous définissons deux couches d’entrée et les traitons dans des «chemins de données» distincts (nlp_input et meta_input). Nos données NLP passent par la transformation d’intégration et la couche LSTM. Les métadonnées sont simplement en cours de normalisation, nous pouvons donc les concaténer directement avec la sortie LSTM (nlp_out). Ce vecteur combiné est maintenant la représentation complète de notre entrée et peut enfin être classé dans une couche entièrement connectée.
Ce concept est utilisable pour tout autre domaine, où les données de séquence des RNN sont mélangées avec des données de non-séquence. De plus, il est possible de mélanger des images, du texte et des séquences uniformes en un seul modèle.
Ce message a été initialement publié sur mon blog ici.