Analyse de sensibilité dans les réseaux de neurones profonds

14

Suite à une question à laquelle on a déjà répondu ( Extraire l'importance du poids à partir d'un réseau à action directe à une couche ), je recherche des informations sur la pertinence des entrées dans les réseaux de neurones.

Considérant un réseau profond, où la reconstruction de l'importance de l'entrée en reculant à travers les couches à partir du nœud de sortie d'intérêt peut être difficile ou longue, je me demandais s'il y avait un cadre théorique pour effectuer une analyse de sensibilité pour le réseau de neurones, fondamentalement changer légèrement un entrée et examiner comment le nœud de sortie d'intérêt change.

Existe-t-il un moyen canonique d'effectuer une sorte d'analyse de sensibilité dans les réseaux de neurones?

J'accueillerais vraiment avec plaisir du code Python, s'il y en a

Tommaso Guerrini
la source

Réponses:

12

L'analyse de sensibilité que vous proposez correspond à l'examen des dérivées partielles des sorties par rapport aux entrées. Disons que le vecteur de sortie est donné par , où est le vecteur d'entrée et est la fonction que le réseau implémente. Le jacobien des sorties par rapport aux entrées est: y = f ( x ) x R d fyRmy=f(x)xRdf

Jij(x)=xjfi(x)

Le jacobien donne le taux de variation local de chaque sortie par rapport à chaque entrée, il nous indique donc comment se comportera en réponse à des perturbations infinitésimales. Si nous commençons par l'entrée et ajoutons une valeur infinitésimale à la ème entrée, nous nous attendons à ce que la ème sortie augmente de .x Δ j i Δ J i j ( x )fxΔjiΔJij(x)

Si a une grande amplitude, cela signifie que la sortie est sensible à l'entrée au voisinage de . Parce que est, en général, non linéaire, cette notion de sensibilité dépend de l'entrée; il peut être important dans certaines régions et proche de zéro dans d'autres. Si vous voulez une sorte de mesure récapitulative de la façon dont les sorties dépendent des entrées, vous devez agréger plusieurs valeurs d'entrée. Par exemple, vous pouvez prendre la valeur absolue du jacobien, moyenne sur toutes les entrées de l'ensemble d'apprentissage (qui agit comme substitut de la valeur attendue par rapport à la distribution sous-jacente des entrées). Bien sûr, ce type de résumé finira par jeter des informations, ce qui pourrait être trompeur dans certaines circonstances.i j x fJij(x)ijxf

Vous pouvez utiliser la règle de chaîne pour dériver une expression pour le jacobien, de la même manière que vous dériveriez le gradient de la fonction de perte par rapport aux paramètres à utiliser avec backprop. Vous pouvez également le calculer en utilisant la différenciation automatique, en utilisant une bibliothèque comme Theano, TensorFlow, etc. auquel cas le jacobien n'existe pas).

Quelques mises en garde: si les entrées ont des unités / échelles différentes les unes des autres, les sensibilités auront également des unités / échelles différentes et ne peuvent pas être directement comparées. La standardisation / mise à l'échelle des entrées est une solution possible. Il est également important de garder à l'esprit que ce type d'analyse nous renseigne sur le modèle lui-même, mais pas nécessairement sur la distribution sous-jacente qui a généré les données. Par exemple, si deux entrées sont corrélées, le modèle peut finir par utiliser la première mais pas la seconde. Dans ce cas, nous trouverions que la sensibilité est élevée pour la première entrée et faible pour la seconde, mais ne devrions pas conclure que la première entrée est intrinsèquement plus importante pour prédire la sortie en général.

Cet article devrait être intéressant.

user20160
la source
grande réponse et grand article! si quelqu'un est intéressé par la mise en œuvre de cette méthode, vous pouvez trouver une belle implémentation du calcul jacobien ici: medium.com/unit8-machine-learning-publication/…
pcko1