Comment améliorer la capacité de mon réseau neuronal à prédire les ondes sinusoïdales?

21

Ici, jetez un œil: Onde sinusoïdale générée vous pouvez voir exactement où se terminent les données d'entraînement. Les données d'entraînement vont de à .1-11

J'ai utilisé Keras et un réseau dense 1-100-100-2 avec activation tanh. Je calcule le résultat à partir de deux valeurs, p et q comme p / q. De cette façon, je peux obtenir n'importe quelle taille de nombre en utilisant uniquement des valeurs inférieures à 1.

Veuillez noter que je suis toujours un débutant dans ce domaine, alors allez-y doucement avec moi.

Markus Appel
la source
1
Pour clarifier, vos données d'entraînement sont d'environ -1,5 à +1,5, donc le réseau l'a appris avec précision? Votre question porte donc sur l'extrapolation du résultat à des nombres invisibles en dehors de la plage des données d'entraînement?
Neil Slater
11
Vous pouvez essayer Fourier tout transformer et travailler dans le domaine fréquentiel.
Nick Alger
4
Aux futurs examinateurs: je ne sais pas pourquoi cela est signalé pour fermeture. Cela me semble parfaitement clair: il s'agit de stratégies de modélisation de données périodiques avec des réseaux de neurones.
Sycorax dit Réintégrer Monica
1
Je pense que c'est une question raisonnable pour un débutant dans le domaine de l'apprentissage automatique, que nous devrions aborder ici. Je ne le fermerais pas
Aksakal
1
Je ne sais pas si cela va aider, mais hors de la boîte, un NN vanille ne pourra apprendre qu'une fonction polynomiale. En pratique, c'est bien puisque vous pouvez faire un polynôme se fermer arbitrairement sur un intervalle fixe. Mais cela signifie que vous ne pouvez jamais apprendre une onde sinusoïdale qui s'étend au-delà des extrémités de l'intervalle. L'astuce, comme d'autres réponses l'ont indiqué ci-dessous, consiste à transformer le problème en un problème qui peut être résolu de cette façon. C'est ce que fait la transformation de Fourier suggérée, et dans ce cas, apprendre une onde sinusoïdale, c'est simplement apprendre une constante.
Ukko

Réponses:

19

Vous utilisez un réseau à action directe; les autres réponses sont exactes: les FFNN ne sont pas excellents pour l'extrapolation au-delà de la plage des données d'entraînement.

Cependant, étant donné que les données ont une qualité périodique, le problème peut se prêter à une modélisation avec un LSTM. Les LSTM sont une variété de cellules de réseau neuronal qui opèrent sur des séquences et ont une "mémoire" sur ce qu'elles ont "vu" auparavant. Le résumé de ce chapitre du livre suggère qu'une approche LSTM est un succès qualifié sur les problèmes périodiques.

Dans ce cas, les données d'apprentissage seraient une séquence de tuples , et la tâche de faire des prédictions précises pour les nouvelles entrées pour certains et indexe une séquence croissante. La longueur de chaque séquence d'entrée, la largeur de l'intervalle qu'elles couvrent et leur espacement sont à vous. Intuitivement, je m'attendrais à ce qu'une grille régulière couvrant une période soit un bon point de départ, avec des séquences d'entraînement couvrant un large éventail de valeurs, plutôt que limitées à un certain intervalle.(Xje,péché(Xje)) n iXje+1Xje+nnje

(Jimenez-Guarneros, Magdiel et Gomez-Gil, Pilar et Fonseca-Delgado, Rigoberto et Ramirez-Cortes, Manuel et Alarcon-Aquino, Vicente, "Prédiction à long terme d'une fonction sinusoïdale utilisant un réseau neuronal LSTM", dans Nature- Conception inspirée de systèmes intelligents hybrides )

Sycorax dit de réintégrer Monica
la source
2
Quelle est la séquence modélisée ici? Quels sont les pas de temps? Cela ressemble à une simple application d'ajustement de courbe pour moi.
David J. Harris
@ DavidJ.Harris J'ai mis à jour ma réponse.
Sycorax dit Réintégrer Monica
quelle est la fréquence des séries n'est pas ? 1/(2π)
Aksakal
Est-ce ainsi qu'ils font les prévisions du marché, par exemple?
Markus Appel
3
Non, ce n'est pas comme ça que vous faites les prévisions du marché. Du moins pas comment vous le faites pour gagner de l'argent.
Aksakal
13

Si ce que vous voulez faire est d'apprendre des fonctions périodiques simples comme celle-ci, alors vous pouvez envisager d'utiliser des processus gaussiens. Les GP vous permettent d'appliquer vos connaissances de domaine dans une certaine mesure en spécifiant une fonction de covariance appropriée; dans cet exemple, puisque vous savez que les données sont périodiques, vous pouvez choisir un noyau périodique, puis le modèle extrapolera cette structure. Vous pouvez voir un exemple dans l'image; ici, j'essaie d'ajuster les données de hauteur de marée, donc je sais qu'il a une structure périodique. Parce que j'utilise une structure périodique, le modèle extrapole plus ou moins correctement cette périodicité. OFC si vous essayez d'en apprendre davantage sur les réseaux de neurones, ce n'est pas vraiment pertinent, mais cela pourrait être une approche légèrement plus agréable que les fonctionnalités d'ingénierie manuelle. Soit dit en passant, les réseaux de neurones et les gp sont étroitement liés en théorie,entrez la description de l'image ici

Les GPs ne sont pas toujours utiles car contrairement aux réseaux neuronaux, ils sont difficiles à mettre à l'échelle pour de grands ensembles de données et des réseaux profonds, mais si vous êtes intéressé par des problèmes de faible dimension comme celui-ci, ils seront probablement plus rapides et plus fiables.

(dans l'image, les points noirs sont des données d'entraînement et le rouge sont les cibles; vous pouvez voir que même s'il ne correspond pas exactement, le modèle apprend la périodicité approximativement. Les bandes colorées sont les intervalles de confiance des modèles prédiction)

lsgs
la source
2
Ce complot est magnifique.
Sycorax dit Réintégrer Monica
11

Les algorithmes d'apprentissage automatique - y compris les réseaux de neurones - peuvent apprendre à approximer des fonctions arbitraires, mais uniquement dans l'intervalle où la densité des données d'entraînement est suffisante.

Les algorithmes d'apprentissage automatique basés sur des statistiques fonctionnent mieux lorsqu'ils effectuent une interpolation - prédisant des valeurs proches ou intermédiaires des exemples de formation.

En dehors de vos données d'entraînement, vous espérez une extrapolation. Mais il n'y a pas de moyen facile d'y parvenir. Un réseau neuronal n'apprend jamais une fonction analytiquement, seulement approximativement via des statistiques - cela est vrai pour presque toutes les techniques d'apprentissage supervisé ML. Les algorithmes les plus avancés peuvent se rapprocher arbitrairement d'une fonction choisie avec suffisamment d'exemples (et de paramètres libres dans le modèle), mais ne le feront toujours que dans la plage des données d'apprentissage fournies.

Le comportement du réseau (ou autre ML) en dehors de la plage de vos données d'entraînement dépendra de son architecture, y compris des fonctions d'activation utilisées.

péchépéché(X),péché(2X+π/4)péché

Neil Slater
la source
"Un réseau de neurones n'apprend jamais une fonction analytiquement, seulement approximativement via des statistiques." - on peut dire la même chose de presque tout ce qui est utilisé dans la pratique, par exemple la FFT n'apprend pas non plus analytiquement. Vous pouvez augmenter le taux d'échantillonnage et la période à l'infini et vous rapprocher infiniment de la vraie fonction, mais il en va de même pour NN.
Aksakal
@Aksakal: Oui c'est vrai. Cependant, je ne voulais pas dire que «tous les algorithmes ML n'apprennent jamais les fonctions analytiquement ...» parce que quelqu'un trouverait sans doute un contre-exemple d'un apprenant analytique bayésien ou d'une programmation génétique, etc. Je vais essayer de le modifier pour le rendre plus général
Neil Slater
9

Dans certains cas, l'approche suggérée par @Neil Slater pour transformer vos fonctionnalités avec une fonction périodique fonctionnera très bien et pourrait être la meilleure solution. La difficulté ici est que vous devrez peut-être choisir la période / longueur d'onde manuellement (voir cette question ).

Si vous souhaitez que la périodicité soit intégrée plus profondément dans le réseau, le moyen le plus simple serait d'utiliser sin / cos comme fonction d'activation dans une ou plusieurs couches. Cet article discute des difficultés potentielles et des stratégies pour gérer les fonctions d'activation périodiques.

Alternativement, cet article adopte une approche différente, où les poids du réseau dépendent d'une fonction périodique. L'article suggère également d'utiliser des splines au lieu de sin / cos, car elles sont plus flexibles. C'était l'un de mes papiers préférés l'année dernière, donc ça vaut le coup de lire (ou du moins de regarder la vidéo) même si vous ne finissez pas par utiliser son approche.

David J. Harris
la source
9

Vous avez adopté une mauvaise approche, rien ne peut être fait avec cette approche pour résoudre le problème.

Il existe plusieurs façons de résoudre le problème. Je vais suggérer la plus évidente grâce à l'ingénierie des fonctionnalités. Au lieu de brancher le temps comme une caractéristique linéaire, mettez-le comme reste du module T = 1. Par exemple, t = 0,2, 1,2 et 2,2 deviendront tous une caractéristique t1 = 0,1 etc. Tant que T est plus grand que la période d'onde, cela fonctionnera. Branchez cette chose dans votre filet et voyez comment cela fonctionne.

L'ingénierie des fonctionnalités est sous-estimée. Il y a cette tendance dans l'IA / ML où les vendeurs prétendent que vous jetez toutes vos entrées dans le net, et d'une manière ou d'une autre cela saura quoi faire avec eux. Bien sûr, il le fait, comme vous l'avez vu dans votre exemple, mais il se décompose aussi facilement. Ceci est un excellent exemple qui montre à quel point il est important de créer de bonnes fonctionnalités, même dans certains cas les plus simples.

En outre, j'espère que vous vous rendez compte qu'il s'agit de l'exemple le plus grossier de l'ingénierie des fonctionnalités. C'est juste pour vous donner une idée de ce que vous pourriez en faire.

Aksakal
la source