web-dev-qa-db-fra.com

Comment convertir la sortie d'un réseau neuronal artificiel en probabilités?

J'ai lu sur le réseau de neurones il y a quelque temps et je comprends comment un ANN (en particulier un perceptron multicouche qui apprend par rétropropagation) peut apprendre à classer un événement comme vrai ou faux.

Je pense qu'il y a deux façons:

1) Vous obtenez un neurone de sortie. Si sa valeur est> 0,5, les événements sont vraisemblablement vrais, si sa valeur est <= 0,5, l'événement est probablement faux.

2) Vous obtenez deux neurones de sortie, si la valeur du premier est> à la valeur du second, l'événement est probablement vrai et vice versa.

Dans ces cas, l'ANN vous indique si un événement est vraisemblablement vrai ou vraisemblablement faux. Il ne dit pas quelle est sa probabilité.

Existe-t-il un moyen de convertir cette valeur en cotes ou d'obtenir directement des cotes de l'ANN. Je voudrais obtenir une sortie du type "L'événement a une probabilité de 84% d'être vrai"

37
Mathieu Pagé

Une fois qu'un NN a été formé, par exemple. en utilisant la rétrogradation telle que mentionnée dans la question (selon laquelle la logique de rétrogradation a "poussé" les pondérations de manière à minimiser la fonction d'erreur) les pondérations associées à toutes les entrées individuelles (entrées "extérieures" ou entrées intra-NN) sont fixées. Le NN peut ensuite être utilisé à des fins de classification.

Grâce à quoi les mathématiques (et les "options") pendant la phase d'apprentissage peuvent devenir un peu épaisses, elles sont relativement simples et directes lors de l'utilisation en tant que classifieur. L'algorithme principal consiste à calculer une valeur d'activation pour chaque neurone, comme la somme du poids d'entrée x pour ce neurone. Cette valeur est ensuite introduite dans une fonction d'activation dont le but est de la normaliser et de la convertir en booléen (dans des cas typiques, car certains réseaux n'ont pas de règle tout ou rien pour certaines de leurs couches). La fonction d'activation peut être plus complexe que vous l'avez indiqué, en particulier elle n'a pas besoin d'être linéaire, mais quelle que soit sa forme, généralement sigmoïde, elle fonctionne de la même manière: déterminer où l'activation s'inscrit sur la courbe et, le cas échéant, ci-dessus ou en dessous d'un seuil. L'algorithme de base traite ensuite tous les neurones d'une couche donnée avant de passer à la suivante.

Dans cet esprit, la question de l'utilisation de la capacité du perceptron à qualifier sa supposition (ou bien devine - pluriel) avec une valeur en pourcentage, trouve une réponse facile: vous pariez qu'il le peut, sa ou ses sorties ont une valeur réelle (le cas échéant à normaliser) avant de la convertir en une valeur discrète (un booléen ou un identifiant de catégorie dans le cas de plusieurs catégories), en utilisant les fonctions d'activation et les méthodes de seuil/comparaison décrites dans la question.

Alors ... Comment et où puis-je obtenir "mes pourcentages"? ... Tout dépend de l'implémentation NN, et plus important encore, l'implémentation dicte le type de fonctions de normalisation qui peuvent être utilisées pour apporter des valeurs d'activation dans le 0-1 et d'une manière telle que la somme de tous les pourcentages "s'additionne" à 1. Dans sa forme la plus simple, la fonction d'activation peut être utilisée pour normaliser La valeur et les pondérations de l'entrée dans la couche de sortie peuvent être utilisées comme facteurs pour garantir l'addition à 1 question (à condition que ces pondérations soient elles-mêmes si normalisées).

Et voilà!

Clarification: (suivant la note de Mathieu)
Il n'est pas nécessaire de changer quoi que ce soit dans le fonctionnement du réseau neuronal lui-même; la seule chose nécessaire est de "se connecter" en quelque sorte à la logique des neurones de sortie pour accéder à la valeur d'activation [à valeur réelle] qu'ils ont calculée, ou, éventuellement, mieux, pour accéder à la sortie à valeur réelle de la fonction d'activation, avant sa conversion booléenne (qui est généralement basée sur une valeur de seuil ou sur une fonction stochastique ).

En d'autres termes, le NN fonctionne comme précédemment, ni sa formation ni sa logique de reconnaissance ne sont modifiées, les entrées du NN restent les mêmes, tout comme les connexions entre les différentes couches, etc. Nous n'obtenons qu'une copie de l'activation réelle de la neurones dans la couche de sortie, et nous l'utilisons pour calculer un pourcentage. La formule réelle pour le calcul du pourcentage dépend de la nature de la valeur d'activation et de sa fonction associée (son échelle, sa plage par rapport à la sortie d'autres neurones, etc.).
Voici quelques cas simples (tirés des règles de sortie suggérées de la question) 1) S'il y a un seul neurone de sortie: le rapport de la valeur fournie par la fonction d'activation par rapport à la plage de cette fonction devrait faire. 2) S'il y a deux (ou plusieurs neurones de sortie), comme avec les classificateurs par exemple: Si tous les neurones de sortie ont la même fonction d'activation, le pourcentage pour un neurone donné est celui de sa valeur de fonction d'activation divisé par la somme de toutes les fonctions d'activation valeurs. Si les fonctions d'activation varient, cela devient une situation au cas par cas, car les fonctions d'activation distinctes peuvent indiquer un désir délibéré de donner plus de poids à certains des neurones, et le pourcentage doit respecter cela.

21
mjv

Ce que vous pouvez faire est d'utiliser une fonction de transfert sigmoïde sur les nœuds de la couche de sortie (qui accepte les plages de données (-inf, inf) et génère une valeur dans [-1,1]).
Ensuite, en utilisant le codage de sortie 1 sur n (un nœud pour chaque classe), vous pouvez mapper la plage [-1 , 1] à [0,1] et l'utiliser comme probabilité pour chaque valeur de classe (notez que cela fonctionne naturellement pour plus de seulement deux classes).

18
Amro

La valeur d'activation d'un seul neurone de sortie est une somme pondérée linéairement et peut être directement interprétée comme une probabilité approximative si le réseau est formé pour donner aux sorties une plage de 0 à 1. Cela aurait tendance à être le cas si la fonction de transfert ( ou fonction de sortie) à la fois à l'étape précédente et à condition que la sortie finale soit également comprise entre 0 et 1 (généralement la fonction logistique sigmoïdale). Cependant, rien ne garantit que ce sera le cas, mais des réparations sont possibles. De plus, à moins que les sigmoïdes ne soient logistiques et que les poids soient contraints d'être positifs et totalisent 1, il est peu probable. Généralement, un réseau neuronal s'entraînera de manière plus équilibrée en utilisant le sigmoïde tanh et des poids et activations qui vont de positif à négatif (en raison de la symétrie de ce modèle). Un autre facteur est la prévalence de la classe - si elle est de 50%, un seuil de 0,5 est susceptible d'être efficace pour la logistique et un seuil de 0,0 pour le tanh. Le sigmoïde est conçu pour pousser les choses vers le centre de la plage (sur rétrogradation) et l'empêcher de sortir de la plage (en feedforward). L'importance de la performance (par rapport à la distribution de Bernoulli) peut également être interprétée comme une probabilité que le neurone fasse de vraies prédictions plutôt que de deviner. Idéalement, le biais du prédicteur vers les positifs devrait correspondre à la prévalence des positifs dans le monde réel (qui peut varier à différents moments et à différents endroits, par exemple les marchés haussiers et baissiers, par exemple la solvabilité des personnes qui demandent des prêts par rapport aux personnes qui ne font pas de paiements de prêt ) - le calibrage aux probabilités a l'avantage que tout biais souhaité peut être facilement réglé.

Si vous avez deux neurones pour deux classes, chacun peut être interprété indépendamment comme ci-dessus, et la différence de moitié entre eux peut également l'être. C'est comme retourner le neurone de classe négative et faire la moyenne. Les différences peuvent également donner lieu à une estimation de la probabilité de signification (à l'aide du test T).

Le score de Brier et sa décomposition de Murphy donnent une estimation plus directe de la probabilité qu'une réponse moyenne soit correcte, tandis que l'informité donne la probabilité que le classificateur prenne une décision éclairée plutôt qu'une supposition, ROC AUC donne la probabilité qu'une classe positive soit classée supérieur à une classe négative (par un prédicteur positif), et Kappa donnera un nombre similaire qui correspond à Informedness lorsque prévalence = biais.

Ce que vous voulez normalement est à la fois une probabilité de signification pour le classificateur global (pour vous assurer que vous jouez sur un terrain réel, et non dans un cadre imaginaire de guestimates) et une estimation de probabilité pour un exemple spécifique. Il existe différentes façons de calibrer, notamment en effectuant une régression (linéaire ou non linéaire) en fonction de la probabilité et en utilisant sa fonction inverse pour remapper vers une estimation de probabilité plus précise. Cela peut être vu par l'amélioration du score de Brier, la composante d'étalonnage diminuant vers 0, mais la composante de discrimination restant la même, comme devraient le ROC AUC et Informedness (Kappa est sujet à des biais et peut empirer).

Un moyen non linéaire simple de calibrer les probabilités consiste à utiliser la courbe ROC - lorsque le seuil change pour la sortie d'un seul neurone ou la différence entre deux neurones concurrents, nous traçons les résultats des taux positifs et faux positifs sur une courbe ROC ( les faux et vrais négatifs sont naturellement les compléments, car ce qui n'est pas vraiment positif est négatif). Ensuite, vous balayez la courbe ROC (polyligne) point par point (chaque fois que le gradient change) échantillon par échantillon et la proportion d'échantillons positifs vous donne une estimation de probabilité pour les positifs correspondant au seuil neuronal qui a produit ce point. Les valeurs entre les points de la courbe peuvent être interpolées linéairement entre celles qui sont représentées dans le jeu d'étalonnage - et en fait, tous les mauvais points de la courbe ROC, représentés par des déconvexités (bosses) peuvent être lissés par la coque convexe - interpolation probabiliste entre les extrémités du segment de coque. Flach et Wu proposent une technique qui retourne réellement le segment, mais cela dépend de l'information utilisée dans le mauvais sens et bien qu'elle puisse être utilisée à plusieurs reprises pour une amélioration arbitraire sur l'ensemble d'étalonnage, il sera de plus en plus improbable de généraliser à une situation de test.

(Je suis venu ici à la recherche d'articles que j'avais vus il y a longtemps sur ces approches basées sur le ROC - c'est donc de mémoire et sans ces références perdues.)

10
dmwp

Je serai très prudent dans l'interprétation des sorties d'un réseau de neurones (en fait, tout classificateur d'apprentissage automatique) comme une probabilité. La machine est formée pour discriminer entre les classes, pas pour estimer la densité de probabilité. En fait, nous n'avons pas ces informations dans les données, nous devons les déduire. Pour mon expérience, je ne conseillerais à personne d'interpréter directement les sorties comme des probabilités.

9
user2377833

avez-vous essayé le prof. La suggestion de Hinton de former le réseau avec la fonction d'activation softmax et l'erreur d'entropie croisée?

à titre d'exemple, créez un réseau à trois couches avec les éléments suivants:

linear neurons   [ number of features ]
sigmoid neurons [ 3 x number of features ]
linear neurons   [ number of classes ]

puis entraînez-les avec le transfert softmax d'erreur d'entropie croisée avec votre optimiseur de descente stochastique/iprop plus/descente de grad. Après l'entraînement, les neurones de sortie doivent être normalisés à la somme de 1.

Veuillez voir http://en.wikipedia.org/wiki/Softmax_activation_function pour plus de détails. Le framework Shark Machine Learning fournit la fonctionnalité Softmax en combinant deux modèles. Et prof. Hinton un excellent cours en ligne @ http://coursera.com concernant les détails.

7
Steven Varga

Lorsque vous utilisez ANN pour la classification à 2 classes et que la fonction d'activation sigmoïde logistique est utilisée dans la couche de sortie, les valeurs de sortie peuvent être interprétées comme des probabilités.

Donc, si vous choisissez entre 2 classes, vous vous entraînez en utilisant le codage 1-of-C, où 2 sorties ANN auront des valeurs d'apprentissage (1,0) et (0,1) pour chacune des classes respectivement.

Pour obtenir la probabilité de première classe en pourcentage, multipliez simplement la première sortie ANN par 100. Pour obtenir la probabilité d'une autre classe, utilisez la deuxième sortie.

Cela pourrait être généralisé pour la classification multi-classes en utilisant la fonction d'activation softmax.

Vous pouvez en savoir plus, y compris des preuves d'interprétation probabiliste ici:

[1] Bishop, Christopher M. Réseaux de neurones pour la reconnaissance des formes. Oxford University Press, 1995.

4
krokodil

Je me souviens avoir vu un exemple de réseau neuronal formé à la propagation arrière pour approximer la probabilité d'un résultat dans le livre Introduction à la théorie du calcul neuronal (hertz krogh palmer). Je pense que la clé de l'exemple était une règle d'apprentissage spéciale pour que vous n'ayez pas à convertir la sortie d'une unité en probabilité, mais à la place, vous avez automatiquement obtenu la probabilité en sortie.
Si vous en avez l'occasion, essayez de consulter ce livre.

(au fait, les "machines Boltzman", bien que moins connues, sont des réseaux de neurones conçus spécifiquement pour apprendre les distributions de probabilités, vous pouvez également les vérifier)

4
mic.sca