Les encodeurs automatiques ne peuvent pas apprendre de fonctionnalités significatives

24

J'ai 50 000 images comme celles-ci:

exemple de données exemple de données2

Ils représentent des graphiques de données. Je voulais extraire des fonctionnalités de ces images, j'ai donc utilisé le code de l'encodeur automatique fourni par Theano (deeplearning.net).

Le problème est que ces encodeurs automatiques ne semblent pas apprendre de fonctionnalités. J'ai essayé RBM et c'est pareil.

L'ensemble de données MNIST fournit de belles fonctionnalités mais mes données ne semblent pas en produire. Je joins des exemples ci-dessous:

Filtres créés sur MNIST:

filtre mniste

Filtres créés par la formation sur mes données:

filtres de mes données

J'ai utilisé de nombreuses permutations différentes de tailles de couches cachées et d'époques d'apprentissage, mais les résultats sont toujours les mêmes.

Pourquoi ça ne marche pas? Pourquoi les encodeurs automatiques ne peuvent-ils pas extraire des fonctionnalités de ces images?

MODIFIER:

Pour tous ceux qui ont un problème similaire. La solution était vraiment simple et la cause vraiment stupide. J'ai juste oublié de redimensionner les valeurs de pixels de l'encodage RVB pour qu'elles flottent dans la plage 0 - 1.

La mise à l'échelle des valeurs a résolu le problème.

b93dh44
la source

Réponses:

15

Le débogage des réseaux de neurones implique généralement de modifier les hyperparamètres, de visualiser les filtres appris et de tracer des mesures importantes. Pourriez-vous partager les hyperparamètres que vous avez utilisés?

  • Quelle est la taille de votre lot?
  • Quel est votre taux d'apprentissage?
  • Quel type d'autoencodeur utilisez-vous?
  • Avez-vous essayé d'utiliser un auto-encodeur de débruitage? (Quelles valeurs de corruption avez-vous essayées?)
  • Combien de couches cachées et de quelle taille?
  • Quelles sont les dimensions de vos images d'entrée?

L'analyse des journaux d'entraînement est également utile. Tracez un graphique de votre perte de reconstruction (axe Y) en fonction de l'époque (axe X). Votre perte de reconstruction est-elle convergente ou divergente?

Voici un exemple d'auto-encodeur pour la classification de genre humain qui était divergente, a été arrêté après 1500 époques, a fait régler les hyperparamètres (dans ce cas une réduction du taux d'apprentissage), et a redémarré avec les mêmes poids qui divergeaient et finalement convergeaient.

En voici un qui converge: (nous le voulons)

La vanille "sans contrainte" peut rencontrer un problème où elle apprend simplement le mappage d'identité. C'est l'une des raisons pour lesquelles la communauté a créé les saveurs Denoising, Sparse et Contractive.

Pourriez-vous publier un petit sous-ensemble de vos données ici? Je serais plus que disposé à vous montrer les résultats d'un de mes encodeurs automatiques.

Sur une note latérale: vous voudrez peut-être vous demander pourquoi vous utilisez des images de graphiques en premier lieu alors que ces graphiques pourraient facilement être représentés comme un vecteur de données. C'est à dire,

[0, 13, 15, 11, 2, 9, 6, 5]

Si vous êtes en mesure de reformuler le problème comme ci-dessus, vous simplifiez essentiellement la vie de votre encodeur automatique. Il n'a pas d'abord besoin d'apprendre à voir les images avant de pouvoir apprendre la distribution génératrice.

Réponse de suivi (compte tenu des données.)

Voici les filtres d'une 1000 unité cachée, auto-encodeur Denoising monocouche. Notez que certains filtres sont apparemment aléatoires. C'est parce que j'ai arrêté la formation si tôt et que le réseau n'a pas eu le temps d'apprendre ces filtres.

Voici les hyperparamètres avec lesquels je l'ai formé:

batch_size = 4
epochs = 100
pretrain_learning_rate = 0.01
finetune_learning_rate = 0.01
corruption_level = 0.2

J'ai arrêté la pré-formation après la 58e époque parce que les filtres étaient suffisamment bons pour être affichés ici. Si j'étais vous, je formerais un autoencodeur de débruitage empilé à 3 couches avec une architecture 1000x1000x1000 pour commencer.

Voici les résultats de l'étape de réglage fin:

validation error 24.15 percent
test error 24.15 percent

Donc, à première vue, cela semble mieux que le hasard, cependant, lorsque nous examinons la ventilation des données entre les deux étiquettes, nous constatons qu'elle a exactement le même pourcentage (75,85% rentable et 24,15% non rentable). Cela signifie donc que le réseau a appris à répondre simplement «rentable», quel que soit le signal. J'entraînerais probablement cela plus longtemps avec un filet plus grand pour voir ce qui se passe. En outre, il semble que ces données soient générées à partir d'une sorte de jeu de données financières sous-jacent. Je recommanderais que vous examiniez les réseaux de neurones récurrents après avoir reformulé votre problème dans les vecteurs comme décrit ci-dessus. Les RNN peuvent aider à capturer certaines des dépendances temporelles que l'on trouve dans des données de série temporelle comme celle-ci. J'espère que cela t'aides.

sabalaba
la source
La taille de mon lot est de 20. Le taux d'apprentissage est fixé à 0,1. J'ai essayé les encodeurs automatiques contractuels et débruitants en vain. J'utilise une couche cachée. J'ai tout essayé de 50 à 1000 neurones. Je redimensionne les images au format 25x25 - elles sont donc encore plus petites que les mnist. Pour ce que ça vaut, je joins toutes mes données dans cette archive: pourriez-vous me montrer les résultats de vos auto-encodeurs et ces données?
b93dh44
Les archives: mega.co.nz/…
b93dh44
OK, j'ai formé un réseau avec ces données. Voir l'édition dans la réponse.
sabalaba
Cela semble vraiment intéressant. Pourriez-vous publier votre code? Je l'apprécierais vraiment. Je pense que j'ai peut-être un bug dans mon code qui empêche le réseau de s'entraîner. J'ai remarqué que vous avez une phase de réglage fin? Je pense que mon autoencodeur ne se pré-entraine sans aucun réglage fin. Pourriez-vous me montrer votre solution, si cela ne vous dérange pas?
b93dh44
Je ne peux pas publier mon code car c'est celui de mon entreprise, mais je peux vous indiquer ce tutoriel qui contient un exemple de code pour créer un auto-encodeur de débruitage: deeplearning.net/tutorial/dA.html . Tous les conseils hyperparamétriques seront valables pour ce code.
sabalaba
3

Je n'ai pas assez de représentant pour commenter, donc je vais mettre cela en réponse. Je ne connais cependant pas la raison exacte:

  1. Le motif dans la région en bas à gauche ressemble à votre deuxième exemple, et le motif dans le coin inférieur droit ressemble beaucoup à votre premier exemple, lorsqu'il est inspecté de près. La question est, quelle est la variété de vos données source? Si les 50 000 images sont toutes des variations du même modèle, ces 3 cartes de caractéristiques significatives que nous voyons peuvent être assez suffisantes pour que l'autoencodeur explique et reconstruise toutes vos données.

  2. Deuxièmement, vous voudrez peut-être examiner les erreurs de reconstruction et les images reconstruites réelles. Quels sont les bons résultats? Si l'erreur de reconstruction est faible, vous avez peut-être un surajustement, peut-être en raison des résons décrits ci-dessous (ou peut-être qu'une combinaison de ces 3 modèles suffit juste pour décrire toutes les données intéressées). Sinon, l'autoencodeur ne peut tout simplement pas apprendre à reconstruire vos données et vous avez besoin d'un autoencodeur plus grand ou d'un meilleur algorithme de formation.

Denis Tarasov
la source
1. Je pense qu'il y a beaucoup de variété dans ces données. Chacun de ces 50 000 graphiques est légèrement différent. Je pense qu'il est impossible que l'autoencodeur puisse tous les reconstruire sur la base de seulement 3 filtres. 2. Des conseils pour estimer l'erreur de reconstruction? Le code que j'utilise fournit l'erreur mais c'est un très gros chiffre qui ne me dit pas grand-chose. Dois-je comparer l'erreur de reconstruction à la taille de l'entrée ou au nombre de couches cachées?
b93dh44