Contenu principal

Comprendre les structures de données des réseaux peu profonds

Ce sujet aborde l’incidence du format des structures de données en entrée sur la simulation des réseaux. Il s’intéresse dans un premier temps aux réseaux statiques, puis passe aux réseaux dynamiques. Le sujet suivant décrit l’incidence du format des structures de données sur l'apprentissage du réseau.

Il existe deux types fondamentaux de vecteurs d'entrée : ceux qui se produisent de façon concurrente (en même temps ou sans suivre de séquence en particulier) et ceux qui se produisent de manière séquentielle dans le temps. Pour les vecteurs concurrents, l'ordre importe peu et si plusieurs réseaux fonctionnaient en parallèle, vous pourriez présenter un vecteur d'entrée à chacun des réseaux. Pour les vecteurs séquentiels, l'ordre d'apparition des vecteurs est important.

Simulation avec entrées concurrentes dans un réseau statique

La situation la plus simple en matière de simulation d'un réseau est celle où le réseau à simuler est statique (sans rétroaction ni retard). Dans ce cas, peu importe si les vecteurs d'entrée se produisent ou non selon une séquence temporelle particulière. Par conséquent, vous pouvez traiter les entrées comme étant concurrentes. En outre, le problème est encore plus simple en partant de l’hypothèse que le réseau n'a qu'un seul vecteur d'entrée. Utilisez le réseau suivant en guise d’exemple.

A neuron with vector input. The neuron receives input vector p, multiplies each element of p with an element of weight matrix w, sums the results and adds bias b, and then applies the purelin transfer function.

Pour configurer ce réseau linéaire feedforward, utilisez les commandes suivantes :

net = linearlayer;
net.inputs{1}.size = 2;
net.layers{1}.dimensions = 1;

Pour des raisons de simplicité, affectez au réseau la matrice de poids et le biais W = [1 2] et b = [0].

Les commandes correspondant à ces affectations sont les suivantes :

net.IW{1,1} = [1 2];
net.b{1} = 0;

Supposons que le jeu de données de simulation du réseau consiste en Q = 4 vecteurs simultanés :

p1=[12],p2=[21],p3=[23],p4=[31]

Les vecteurs simultanés sont présentés au réseau sous la forme d’une matrice unique :

P = [1 2 2 3; 2 1 3 1];

Vous pouvez à présent simuler le réseau :

A = net(P)
A =
     5     4     8     5

Une matrice unique de vecteurs concurrents est présentée au réseau, qui produit en sortie une matrice unique de vecteurs concurrents. Le résultat serait identique en présence de quatre réseaux fonctionnant en parallèle, si chaque réseau recevait l'un des vecteurs d'entrée et produisait l’une des sorties. L'ordre des vecteurs d'entrée n'a aucune importance car ils n'interagissent pas les uns avec les autres.

Simulation avec des entrées séquentielles dans un réseau dynamique

Lorsqu'un réseau contient des retards, l'entrée du réseau est normalement une séquence de vecteurs d'entrée qui se produisent selon un certain ordre dans le temps. Pour illustrer ce cas, la figure suivante présente un réseau simple qui contient un retard.

A neuron with two-element vector input. The neuron receives input vector p, applies a delay to only one element of p, multiplies each element of p with an element of weight matrix w, sums the results and adds bias b, and then applies the purelin transfer function.

Les commandes suivantes permettent de créer ce réseau :

net = linearlayer([0 1]);
net.inputs{1}.size = 1;
net.layers{1}.dimensions = 1;
net.biasConnect = 0;

Affectez au réseau la matrice de poids W = [1 2].

La commande est la suivante :

net.IW{1,1} = [1 2];

Supposons que la séquence d’entrée soit :

p1=[1],p2=[2],p3=[3],p4=[4]

Les entrées séquentielles sont présentées au réseau sous la forme d’éléments d’un cell array :

P = {1 2 3 4};

Vous pouvez à présent simuler le réseau :

A = net(P)
A = 
    [1]    [4]    [7]    [10]

Vous saisissez un cell array contenant une séquence d'entrées et le réseau génère un cell array contenant une séquence de sorties. L’ordre des entrées est important lorsqu’elles sont présentées sous la forme d’une séquence. Dans ce cas, la sortie actuelle est obtenue en multipliant l'entrée actuelle par 1 et l'entrée précédente par 2 et en additionnant le résultat. Si vous modifiez l'ordre des entrées, les nombres obtenus en sortie changent.

Simulation avec des entrées concurrentes dans un réseau dynamique

Si vous appliquiez les mêmes entrées sous la forme d'un ensemble d'entrées concurrentes au lieu d'une séquence d'entrées, vous obtenez une réponse complètement différente. (Pour autant, pourquoi voudrait-on procéder de la sorte avec un réseau dynamique ?). Cela reviendrait à ce que chaque entrée soit appliquée de façon concurrente à un réseau parallèle distinct. Pour l'exemple précédent, Simulation avec des entrées séquentielles dans un réseau dynamique, si vous utilisez un ensemble d'entrées concurrentes, vous obtenez :

p1=[1],p2=[2],p3=[3],p4=[4]

qui peut être créé avec le code suivant :

P = [1 2 3 4];

Lorsque vous effectuez une simulation avec des entrées concurrentes, vous obtenez :

A = net(P)
A =
     1     2     3     4

Vous obtenez le même résultat que si vous aviez appliqué de façon concurrente chacune des entrées à un réseau distinct et calculé une sortie. Remarque : vous n'avez pas affecté de conditions initiales aux retards du réseau. Nous sommes partis du postulat selon lequel ils étaient égaux à 0. Dans ce cas, la sortie est simplement égale à 1 fois l'entrée, car le poids qui multiplie l'entrée actuelle est égal à 1.

Dans certains cas particuliers, vous pouvez vouloir simuler la réponse du réseau sur plusieurs séquences différentes simultanément. Dans ce cas, vous voudrez présenter au réseau un ensemble de séquences concurrentes. Par exemple, supposons que vous souhaitiez présenter les deux séquences suivantes au réseau :

p1(1)=[1],p1(2)=[2],p1(3)=[3],p1(4)=[4]p2(1)=[4],p2(2)=[3],p2(3)=[2],p2(4)=[1]

L'entrée P doit être un cell array, où chaque élément du cell array contient les deux éléments des deux séquences qui se produisent simultanément :

P = {[1 4] [2 3] [3 2] [4 1]};

Vous pouvez à présent simuler le réseau :

A = net(P);

La sortie du résultat obtenu serait :

A = {[1 4] [4 11] [7 8] [10 5]}

Comme vous pouvez le constater, la première colonne de chaque matrice constitue la séquence de sortie générée par la première séquence en entrée, qui était celle utilisée dans un exemple précédent. La deuxième colonne de chaque matrice constitue la séquence de sortie générée par la deuxième séquence d'entrée. Aucune interaction n’a lieu entre les deux séquences concurrentes. Le résultat serait le même si elles étaient appliquées à des réseaux distincts fonctionnant en parallèle.

Le schéma suivant présente le format général de l'entrée du réseau P en présence de séquences concurrentes Q de pas de temps TS. Il couvre tous les cas comportant un vecteur d’entrée unique. Chaque élément du cell array est une matrice de vecteurs concurrents qui correspondent au même point dans le temps pour chaque séquence. En présence de plusieurs vecteurs d'entrée, on obtient plusieurs lignes de matrices dans le cell array.

Format of the sequences

Dans ce sujet, vous appliquerez des entrées séquentielles et concurrentes à des réseaux dynamiques. Dans Simulation avec entrées concurrentes dans un réseau statique, vous avez appliqué des entrées concurrentes à des réseaux statiques. Il est également possible d’appliquer des entrées séquentielles à des réseaux statiques. La réponse simulée du réseau ne s’en trouve pas modifiée, mais cela peut affecter la manière dont le réseau est entraîné. Cela vous paraîtra plus clair dans Neural Network Training Concepts.

Voir aussi Configure Shallow Neural Network Inputs and Outputs.