Réseaux de neurones invariants par permutation

14

Soit un réseau neuronal qui prend en entrée points de données: . On dit que est invariant par permutation sifnx1,,xnf

f(x1...xn)=f(pi(x1...xn))

pour toute permutation .pje

Quelqu'un pourrait-il recommander un point de départ (article, exemple ou autre article) pour les réseaux de neurones invariants par permutation?

Josef Ondrej
la source
Question interessante. Vous voulez traiter vos entrées comme un ensemble plutôt que comme un vecteur. En supposant que vos entrées sont scalaires ou comparables, avez-vous envisagé de trier vos entrées pour créer une représentation canonique invariante par permutation et de l'alimenter sur un réseau régulier?
mjul
@mjul Mes entrées sont des séries de paris de clients (chaque pari est représenté par un vecteur de quelques variables cathegoriques et continues). Je pourrais les commander chronologiquement par exemple, mais comme l'espacement temporel entre les paris pour chaque client est très différent, cela n'aurait pas beaucoup de sens. Cela pourrait probablement être résolu en utilisant une fonction (fixe ou apprise) du temps qui décomposerait les coefficients pour chaque pari. Mais je pense que la commande n'a pas vraiment d'importance dans ce cas, je voulais donc d'abord essayer les données non ordonnées, ce qui nécessite évidemment de traiter les paris pour chaque client de manière symétrique.
Josef Ondrej
Quelle est la sortie réseau? Si le réseau est invariant par permutation, la sortie sera la même pour n'importe quel ordre d'entrées. c'est ce que tu veux?
BlueMoon93
@ BlueMoon93 Oui, c'est exactement ce que je veux. La sortie peut être n'importe quoi (nombre, vecteur) tant qu'elle ne dépend pas de l'ordre des entrées.
Josef Ondrej
pourquoi voudriez-vous un réseau neuronal invariant par permutation?
kc sayz 'kc sayz'

Réponses:

2

Pour autant que je sache, personne n'a essayé cela, en raison de la structure du réseau. Chaque entrée a un ensemble de poids, qui sont connectés à plus d'entrées. Si les entrées changent, la sortie le sera aussi .

Cependant, vous pouvez créer un réseau qui approche ce comportement. Dans votre ensemble de formation, utilisez l'apprentissage par lots et, pour chaque échantillon de formation, donnez toutes les permutations possibles au réseau de sorte qu'il apprenne à être invariant par permutation. Ce ne sera jamais exactement invariant, il pourrait bien être proche .

Une autre façon de procéder consiste à répliquer les poids pour toutes les entrées. Par exemple, supposons que vous ayez 3 entrées (i0, i1, i2) et que la couche cachée suivante a 2 nœuds (hl0, hl1) et la fonction d'activation F. En supposant une couche entièrement connectée, vous avez 2 poids w0 et w1. Les nœuds hl0 et hl1 de la couche cachée sont donnés respectivement par

  • hl0 = F (i0w0 + i1w0 + i2w0)

  • hl1 = F (i0w1 + i1w1 + i2w1)

Vous donnant ainsi une couche cachée dont les valeurs sont invariantes par permutation depuis l'entrée. A partir de maintenant, vous pouvez apprendre et construire le reste du réseau comme bon vous semble. Il s'agit d'une approche dérivée des couches convolutives.


Hors sujet, cela semble être un projet sympa. Si vous souhaitez coopérer sur un projet de recherche, contactez-moi (consultez mon profil)

BlueMoon93
la source
La première approche suggérée serait irréalisable dans mon cas en raison de la complexité de calcul. Le second en revanche semble peut-être trop restrictif. Mais c'est certainement un bon début. Ce que j'ai trouvé jusqu'à présent est une approche similaire à celle que j'ai trouvée dans cet article: arxiv.org/pdf/1612.04530.pdf . Tout d'abord, je considère toutes les paires (généralement tous les k-tuples) des entrées x_i, x_j, i, j dans 0 ... n et j'applique un réseau de neurones sur chacun d'eux (le même nn sur chaque paire). Cela me donne n ** 2 sorties f (x_i, x_j) et ensuite je les moyenne (ou je prends le maximum) et applique un anoter nn sur le résultat.
Josef Ondrej
Voici ce que j'ai trouvé jusqu'à présent: github.com/josefondrej/Symmetric-Layers
Josef Ondrej
5

En voici quelques-unes qui pourraient être ce que vous recherchez:

elgehelge
la source
3

J'ai implémenté Permutational Layer ici en utilisant Keras: https://github.com/off99555/superkeras/blob/master/permutational_layer.py

Vous pouvez appeler la PermutationalModulefonction pour l'utiliser.

Mis en œuvre à la suite de ce document: https://arxiv.org/pdf/1612.04530.pdf

L'idée est de comparer toutes les paires de N ^ 2 paires de N entrées, d'utiliser le modèle avec des poids partagés, puis d'utiliser la fonction de regroupement N fois sur N entrées. La sortie que vous pouvez utiliser à nouveau le pooling mais dans le papier, ils ne mentionnent pas un autre pooling.

off99555
la source