• Aucun résultat trouvé

2.2.1 Structure arborescente et partitionnement . . . 159

2.2.2 Cas de dimensions non définies . . . 160 2.3 Algorithmes de manipulation de l’espace . . . 161

2.3.1 Ajout de nouveaux éléments . . . 161

2.3.2 Recherche et sélection d’interactions . . . 164

2.3.3 Intégration optimisée . . . 165

2.1

Passage à l’échelle et optimisations

Comme déjà souligné dans la section précédente, les applications restent des démonstrations du modèle plus que des solutions à des problèmes encore non résolus. Autant ces programmes permettent l’exploration des principes théoriques afin d’expliquer l’émergence des comporte- ments, autant leur utilité restera très limitée au niveau ingénierie s’ils ne peuvent s’appliquer à des problèmes de plus grande envergure. Je reste pourtant convaincu que la structure homogène du modèle et les propagations locales d’activité sont facilement extensibles dans des espaces avec une grande densité d’interactions et d’anticipations. Le principal problème est alors computa- tionnel, puisque chaque anticipation doit être mise à jour à chaque instant en intégrant l’activité de toutes les autres. Une telle complexité de l’ordre de n2, avec n le nombre d’interactions, nécessite des optimisations pour une exécution temps réel.

Ajouté à ce parallélisme massif, l’apprentissage par différenciation nécessite la génération d’un grand nombre d’anticipations dérivées, la mise à jour de la confiance accentue encore davan- tage la complexité du système. Des optimisations sont donc requises et peuvent être introduites à deux niveaux :

– Au niveau de conception même du modèle, la sélection des interactions les plus adaptées ou un calcul optimisé des interpolations peuvent réduire les accès mémoire, les temps de calcul et la complexité algorithmique des fonctions.

– L’utilisation de matériel adapté à l’exécution parallèle de processus similaires apporte un gain cumulable. Ainsi, l’utilisation du GPU, de processeurs à jeu d’instruction SIMD, de

processeurs multi-cœur, de FPGA ou d’une grille de calcul scientifique peuvent considéra- blement accélérer les mises à jour du modèle.

Alors que le chapitre suivant va détailler l’utilisation de processeurs vectoriels pour paral- léliser les calculs, celui-ci introduit quelques optimisations simples permettant de grandement limiter les calculs. Ce chapitre concerne donc des modifications à réaliser dans la conception ou l’implémentation du système, alors que le suivant touche principalement à l’exécution du code. Les algorithmes et structures introduits ici ont été utilisés pour le contrôle du système pendule/- chariot qui génère des quantités d’anticipations malgré sa simplicité apparente (de l’ordre de 104 à 105). Même si ces interactions sont simplistes et qu’il n’était pas encore question de propagation

d’activité dans cette version du modèle, l’interpolation à elle seule ne peut s’exécuter en temps réel sur un processeur considéré comme relativement peu puissant en 2008 (Pentium M 1,6GHz).

2 1

(d) Optimisation + parallélisation (c) Optimisation

(b) Parallélisation (a) Version originale

1

2 1

1 Exécution

Figure 2.1 – (a) L’implémentation originale utilise la totalité (rectangle en pointillés) des inter- actions de l’espace (rectangle en trait continu) en un point donné (croix). (b) La parallélisation permet l’exécution parallèle de la fonction (intégration/interpolation) sur deux sous-ensembles par deux processeurs ( et1 ). (c) L’optimisation au niveau du code source permet de ne2

sélectionner que les interactions les plus adaptées. (d) Avec l’optimisation et la parallélisation cumulées, on remarque que l’exécution parallèle s’opère sur des sous-ensembles restreints, le temps d’exécution en est donc doublement réduit.

2.2

Structure adaptée de l’espace

La réflexion qui suit est issue du constat suivant : le lourd coût d’exécution des fonctions d’interpolation et d’intégration vient de la prise en compte de l’intégralité des interactions de l’espace. Or la propagation d’activité est accompagnée d’une atténuation, c’est pourquoi seules les interactions les plus similaires au point de l’espace considéré propageront une activité signi- ficative. De plus, on a déjà noté précédemment qu’un grand nombre d’interactions faiblement assimilées peuvent affaiblir le pouvoir des attracteurs les plus adaptés. Ce phénomène n’est pas souhaitable, puisqu’il conduit à une perturbation dans l’interpolation et dans les actions résul- tantes.

2.2. Structure adaptée de l’espace Les structures et algorithmes décrits ici permettent non seulement de ne considérer que les interactions les plus proches mais également d’éviter la perte de pouvoir des attracteurs les plus adaptés dans un réseau trop dense. La structure initialement présentée dans la classe Space se réduit à de simples listes non triées d’interactions et anticipations. Celles-ci ne permettent pas un accès différencié à des zones arbitraires de l’espace, tout commence donc par une structuration plus fine.

2.2.1 Structure arborescente et partitionnement

La structure utilisée est un arbre BSP multidimensionnel décoré. Sous ce nom barbare se cache l’extension d’un type particulier d’arbres binaires. Initialement, les arbres BSP (Binary Space Partitioning) étaient utilisés pour optimiser l’affichage 2D de polygones représentés dans un espace 3D [Fuchs et al., 1980; Chen and Gordon, 1991]. L’astuce consiste à ordonner les polygones selon qu’ils se trouvent d’un côté ou de l’autre d’un plan de séparation. Le parcours de l’arbre permet ainsi d’aller les polygones les plus lointains aux polygones les plus proches relativement à la caméra. Il peut même être inutile de parcourir certaines branches de polygones totalement occultés par d’autres lors du rendu 2D de la scène 3D. La mise à jour du tam- pon de profondeur53est ainsi accélérée puisqu’un simple parcours de l’arbre suffit sans qu’il soit nécessaire de tester l’ordre des polygones. Le BSP est relativement générique puisqu’il peut s’ap- pliquer dans le même domaine à la division de polygones complexes en polygones plus simples afin d’appliquer l’algorithme du peintre54.

Ici, on souhaite ordonner des interactions et non des polygones. Même si l’algorithme suit le même principe, notre espace possède de nombreuses dimensions. Il est choisi que chaque nœud divise l’espace en deux selon une seule dimension ; les partitions se font donc suivant des hyper- plans orthogonaux. Cela permet de tester rapidement à quel sous arbre appartiennent les inter- actions, une seule comparaison suivant la dimension concernée étant nécessaire (v ∈ [−inf ; val] ou v ∈ [val; +inf ] avec v la valeur cherchée et val la valeur de la frontière). Seules les feuilles stockent les interactions, tous les autres nœuds permettent simplement la découpe de l’espace. On retrouve une représentation d’un espace d’interaction 2D et de l’arbre associé sur la figure2.2. Afin d’accélérer les opérations sur l’arbre et la recherche d’interactions dans celui-ci, chaque nœud est décoré avec des informations supplémentaires. Au niveau de nœuds quelconques de l’arbre, définis par la classe Node, on retrouve :

– Vect min : le vecteur des valeurs minimales sur chaque dimension dans cette branche. – Vect max : le vecteur des valeurs maximales sur chaque dimension dans cette branche. – int nb : nombre d’interactions stockées dans cette branche.

– Vect mean : moyenne sur chaque dimension, mais aussi activité moyenne, confiance moyenne et autres variables qui permettent une approximation de la propagation depuis une zone lointaine, en plus de leur utilité propre pour l’arbre.

En plus de ces informations, chaque nœud non terminal (tous sauf les feuilles) dispose d’attributs supplémentaires :

– Dim dim : la dimension suivant laquelle la partition doit être opérée.

53. Tampon de profondeur ou Z-Buffer = pseudo-image déterminant pour chaque pixel de l’écran la distance entre le point 3D le plus proche et le point 2D projeté.

54. L’algorithme du peintre est une version simplifiée du Z-Buffer pour lequel on considère directement les polygones plutôt que les pixels. Celui-ci ne fonctionne néanmoins pas dans le cas de chevauchements réciproques, d’où l’application d’un BSP pour fractionner les polygones.

a Espace 2D Arbre BSP 5 2 3 4 1 g f e c d b a 2 1 4 3 5 b c a e g f d z y

Figure 2.2 – L’espace 2D (représenté à gauche) est partitionné par les traits pointillés. A chaque division suivant une dimension correspond un nœud dans l’arbre BSP (à droite). Chaque feuille de l’arbre liste alors les interactions présentes dans la zone correspondante de l’espace. Les zones/feuilles bleues contiennent l’ensemble des interactions à l’intérieur du petit cercle de l’espace 2D, alors que l’ensemble bleu ∩ jaune correspond au grand cercle. Le choix d’un sous-ensemble de feuilles permet ainsi de sélectionner un ensemble réduit d’interactions.

– double val : la valeur limite sur la dimension dim définissant deux sous-ensembles. – Node lower : sous-arbre gauche des interactions dont la valeur selon dim est inférieure à

val.

– Node upper : sous-arbre gauche des interactions dont la valeur selon dim est supérieure à val.

Les feuilles stockent quant à elles les interactions :

– ArrayList<Interaction> inters : ensemble des interactions présentes dans la zone de l’espace correspondant à cette feuille.

2.2.2 Cas de dimensions non définies

Cette structure a été conçue alors que les vecteurs d’interaction étaient pleins. Dans le cas des vecteurs creux des versions plus récentes du modèle, il faut donc envisager le cas où la dimension de partitionnement (dim) n’est pas définie pour certaines interactions. Tout d’abord, les vecteurs d’interaction se trouvent dans des espaces différents, il ne s’agit pas de vecteurs majoritairement nuls tels que les vecteurs utilisés en algèbre linéaire creuse. Les techniques standards de manipulation de vecteurs creux ne peuvent donc s’appliquer. Pour néanmoins palier au problème, les solutions suivantes ont été envisagées :

1. Utiliser de multiples arbres qui n’acceptent des divisions que selon un nombre limité de dimensions : cette solution est proche de la séparation en couches, mais impose une crois- sance exponentielle du nombre d’arbres si les interactions sont fortement corrélées. 2. Dupliquer les interactions : si la dimension de partitionnement n’est pas définie, on place

le vecteur dans les 2 sous-arbres. On est ainsi sûr de les sélectionner, quelles que soient les contraintes sur la dimension non définie.

3. On rajoute un fils à chaque nœud pour tous les vecteurs dont la dimension n’est pas défi- nie. On obtient un arbre ternaire, les fils formant trois classes d’interactions selon que la dimension dim est définie supérieure à val, définie inférieure à val ou indéfinie.

2.3. Algorithmes de manipulation de l’espace