2009-12-01 5 views
19

Comment puis-je définir des réseaux neuronaux afin qu'ils acceptent et émettent une plage continue de valeurs plutôt que discrètes? D'après ce que je me rappelle avoir fait un cours Neural Network il y a quelques années, la fonction d'activation serait un sigmoïde, qui donne une valeur entre 0 et 1. Si je veux que mon réseau de neurones donne un scalaire réel, que dois-je faire? faire? Je pensais que peut-être si je voulais une valeur entre 0 et 10, je pourrais simplement multiplier la valeur par 10? Que faire si j'ai des valeurs négatives? Est-ce ce que les gens font habituellement ou existe-t-il un autre moyen? Qu'en est-il de l'entrée?Sortie continue dans les réseaux neuronaux

Merci

Répondre

26

Une grande partie du travail dans le domaine neuroevolution implique l'utilisation de réseaux de neurones avec des entrées et des sorties continues.

Il existe plusieurs approches communes:

  • Un nœud par valeur
    • fonctions d'activation linéaires - comme d'autres l'ont noté, vous pouvez utiliser les fonctions d'activation non sigmoïde sur des noeuds de sortie si vous êtes préoccupé par la gamme limitée des fonctions sigmoïdes. Cependant, cela peut rendre votre sortie arbitrairement grande, ce qui peut causer des problèmes pendant l'entraînement.
    • Les fonctions d'activation sigmoïde - la simple mise à l'échelle de la sortie sigmoïde (ou le déplacement et la mise à l'échelle, si vous voulez des valeurs négatives) est une approche courante en neuroévolution. Cependant, il vaut la peine de s'assurer que votre fonction sigmoïde n'est pas trop raide: une fonction d'activation raide signifie que la plage de valeurs «utiles» est faible, ce qui force les poids du réseau à être petits. (Ceci est principalement un problème avec les algorithmes génétiques, qui utilisent une stratégie de modification de poids fixe qui ne fonctionne pas bien lorsque de petits poids sont souhaités.)

regular sigmoid http://natekohl.net/media/sigmoid-reg.gif steep sigmoid http://natekohl.net/media/sigmoid-steep.gif

  • noeuds multiples par valeur - la diffusion d'une seule valeur continue sur plusieurs nœuds est une stratégie commune pour représenter des entrées continues. Il a l'avantage de fournir plus de "fonctionnalités" pour un réseau avec lequel jouer, au prix d'une augmentation de la taille du réseau.
    • Binning - étaler une seule entrée sur plusieurs noeuds (par exemple RBF networks, où chaque noeud est une fonction de base avec un centre différent qui sera partiellement activé par l'entrée). Vous obtenez certains des avantages des entrées discrètes sans perdre une représentation homogène.
    • Représentation binaire - divisez une seule valeur continue en 2 N blocs, puis indiquez cette valeur dans le réseau en tant que modèle binaire à N noeuds. Cette approche est compacte, mais plutôt fragile et entraîne une entrée qui change de manière non continue.
6

Il n'y a pas de règles qui exigent la sortie (*) être une fonction particulière. En fait, nous avons généralement besoin de ajouter certaines opérations arithmétiques à la fin de la fonction en soi mis en œuvre dans un nœud donné, afin de mettre à l'échelle et contraindre autrement la sortie à une forme particulière. L'avantage de travailler avec des sorties tout-ou-rien et/ou une sortie normalisée de 0.0 à 1.0 est qu'il rend les choses plus faciles à traiter, et évite également les problèmes de débordement et autres. (*) "Sortie" peut être compris ici comme l'un ou l'autre nœud donné (neurone) dans le réseau ou celui du réseau dans son ensemble.
Comme l'indique Mark Bessey, l'entrée [sur le réseau dans son ensemble] et la sortie [du réseau] reçoivent généralement un certain filtrage/conversion. Comme suggéré dans cette réponse et dans le commentaire de Mark, il peut être préférable d'avoir des nœuds normalisés/standard dans les couches "cachées" du réseau, et d'appliquer une normalisation/conversion/discrétisation comme requis pour l'entrée et/ou la sortie de le réseau; Une telle pratique n'est cependant qu'une question d'ordre pratique plutôt qu'une exigence impérative des réseaux de neurones en général.

3

Vous aurez généralement besoin de faire un peu de filtrage (conversion de niveau, etc) à la fois l'entrée et la sortie. Évidemment, le filtrage de l'entrée changera l'état interne, donc il faut prendre en considération de ne pas perdre le signal que vous essayez d'entraîner.

+0

Et comme je suis sûr que quelqu'un va en parler - vous pouvez définir le réseau tel que vous ne * devez * faire une conversion en entrée ou en sortie, bien sûr. Il est souvent plus facile d'avoir des nœuds génériques, et de faire un filtrage explicite, cependant. –

Questions connexes