Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Couches de Perceptrons | Réseau de Neurones à Partir de Zéro
Introduction aux Réseaux de Neurones

bookCouches de Perceptrons

Le perceptron désigne le réseau de neurones le plus simple, composé d’un seul neurone. Cependant, afin de résoudre des problèmes plus complexes, un modèle appelé perceptron multicouche (MLP) est utilisé. Un perceptron multicouche se compose d’une ou plusieurs couches cachées. La structure d’un perceptron multicouche est la suivante :

  1. Une couche d’entrée : reçoit les données d’entrée ;
  2. Couches cachées : traitent les données et extraient des motifs.
  3. Couche de sortie : produit la prédiction ou la classification finale.

En général, chaque couche est constituée de plusieurs neurones, et la sortie d’une couche devient l’entrée de la couche suivante.

Poids et biais des couches

Avant de mettre en œuvre une couche, il est important de comprendre comment stocker les poids et biais de chaque neurone qu’elle contient. Dans le chapitre précédent, la méthode de stockage des poids d’un seul neurone sous forme de vecteur et de son biais sous forme de scalaire (nombre unique) a été présentée.

Puisqu’une couche est composée de plusieurs neurones, il est naturel de représenter les poids sous forme de matrice, où chaque ligne correspond aux poids d’un neurone spécifique. Par conséquent, les biais peuvent être représentés par un vecteur, dont la longueur est égale au nombre de neurones.

Pour une couche avec 33 entrées et 22 neurones, les poids seront stockés dans une matrice 2×32 \times 3 WW et les biais dans un vecteur 2×12 \times 1 bb, comme suit :

W=[W11W12W13W21W22W23]b=[b1b2]W = \begin{bmatrix} W_{11} & W_{12} & W_{13}\\ W_{21} & W_{22} & W_{23} \end{bmatrix} \qquad b = \begin{bmatrix} b_1\\ b_2 \end{bmatrix}

Ici, l’élément WijW_{ij} représente le poids de la jj-ième entrée vers le ii-ième neurone, ainsi la première ligne contient les poids du premier neurone et la seconde ligne ceux du second neurone. L’élément bib_i représente le biais du ii-ième neurone (deux neurones – deux biais).

Propagation avant

Effectuer la propagation avant pour chaque couche consiste à activer chacun de ses neurones en calculant la somme pondérée des entrées, en ajoutant le biais, puis en appliquant la fonction d'activation.

Précédemment, pour un seul neurone, vous avez implémenté la somme pondérée des entrées en calculant un produit scalaire entre le vecteur d'entrée et le vecteur de poids, puis en ajoutant le biais.

Puisque chaque ligne de la matrice de poids contient le vecteur de poids d'un neurone particulier, il suffit maintenant d'effectuer un produit scalaire entre chaque ligne de la matrice et le vecteur d'entrée. Heureusement, c'est exactement ce que fait la multiplication matricielle :

Pour ajouter les biais aux sorties des neurones respectifs, il convient également d'ajouter un vecteur de biais :

Enfin, la fonction d'activation est appliquée au résultat — sigmoïde ou ReLU, dans notre cas. La formule résultante pour la propagation avant dans la couche est la suivante :

a=activation(Wx+b)a = activation(Wx + b)

aa est le vecteur des activations (sorties) des neurones.

Classe Layer

Les éléments fondamentaux du perceptron sont ses couches, il est donc logique de créer une classe distincte Layer. Ses attributs incluent :

  • inputs : un vecteur d'entrées (n_inputs correspond au nombre d'entrées) ;
  • outputs : un vecteur de valeurs de sortie brutes (avant l'application de la fonction d'activation) des neurones (n_neurons correspond au nombre de neurones) ;
  • weights : une matrice de poids ;
  • biases : un vecteur de biais ;
  • activation_function : la fonction d'activation utilisée dans la couche.

Comme dans l'implémentation d'un seul neurone, les weights et biases seront initialisés avec des valeurs aléatoires comprises entre -1 et 1 tirées d'une distribution uniforme.

class Layer:
    def __init__(self, n_inputs, n_neurons, activation_function):
        self.inputs = np.zeros((n_inputs, 1))
        self.outputs = np.zeros((n_neurons, 1))
        self.weights = ...
        self.biases = ...
        self.activation = activation_function

Les attributs inputs et outputs seront utilisés ultérieurement lors de la rétropropagation, il est donc pertinent de les initialiser comme des tableaux NumPy remplis de zéros.

Note
Remarque

Initialiser inputs et outputs comme des tableaux NumPy remplis de zéros permet d'éviter les erreurs lors des calculs en propagation avant et arrière. Cela garantit également une cohérence entre les couches, permettant des opérations matricielles fluides sans nécessiter de vérifications supplémentaires.

La propagation avant peut être implémentée dans la méthode forward(), où les outputs sont calculés à partir du vecteur inputs en utilisant NumPy, selon la formule ci-dessus :

def forward(self, inputs):
    self.inputs = np.array(inputs).reshape(-1, 1)
    # Raw outputs
    self.outputs = ...
    # Applying the activation function
    return ...
Note
Remarque

Redimensionner inputs en un vecteur colonne garantit une multiplication matricielle correcte avec la matrice de poids lors de la propagation avant. Cela évite les incompatibilités de dimensions et permet des calculs fluides à travers toutes les couches.

1. Qu'est-ce qui rend un perceptron multicouche (MLP) plus puissant qu'un perceptron simple ?

2. Pourquoi appliquons-nous ce code avant de multiplier inputs par la matrice de poids ?

question mark

Qu'est-ce qui rend un perceptron multicouche (MLP) plus puissant qu'un perceptron simple ?

Select the correct answer

question mark

Pourquoi appliquons-nous ce code avant de multiplier inputs par la matrice de poids ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 3

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Awesome!

Completion rate improved to 4

bookCouches de Perceptrons

Glissez pour afficher le menu

Le perceptron désigne le réseau de neurones le plus simple, composé d’un seul neurone. Cependant, afin de résoudre des problèmes plus complexes, un modèle appelé perceptron multicouche (MLP) est utilisé. Un perceptron multicouche se compose d’une ou plusieurs couches cachées. La structure d’un perceptron multicouche est la suivante :

  1. Une couche d’entrée : reçoit les données d’entrée ;
  2. Couches cachées : traitent les données et extraient des motifs.
  3. Couche de sortie : produit la prédiction ou la classification finale.

En général, chaque couche est constituée de plusieurs neurones, et la sortie d’une couche devient l’entrée de la couche suivante.

Poids et biais des couches

Avant de mettre en œuvre une couche, il est important de comprendre comment stocker les poids et biais de chaque neurone qu’elle contient. Dans le chapitre précédent, la méthode de stockage des poids d’un seul neurone sous forme de vecteur et de son biais sous forme de scalaire (nombre unique) a été présentée.

Puisqu’une couche est composée de plusieurs neurones, il est naturel de représenter les poids sous forme de matrice, où chaque ligne correspond aux poids d’un neurone spécifique. Par conséquent, les biais peuvent être représentés par un vecteur, dont la longueur est égale au nombre de neurones.

Pour une couche avec 33 entrées et 22 neurones, les poids seront stockés dans une matrice 2×32 \times 3 WW et les biais dans un vecteur 2×12 \times 1 bb, comme suit :

W=[W11W12W13W21W22W23]b=[b1b2]W = \begin{bmatrix} W_{11} & W_{12} & W_{13}\\ W_{21} & W_{22} & W_{23} \end{bmatrix} \qquad b = \begin{bmatrix} b_1\\ b_2 \end{bmatrix}

Ici, l’élément WijW_{ij} représente le poids de la jj-ième entrée vers le ii-ième neurone, ainsi la première ligne contient les poids du premier neurone et la seconde ligne ceux du second neurone. L’élément bib_i représente le biais du ii-ième neurone (deux neurones – deux biais).

Propagation avant

Effectuer la propagation avant pour chaque couche consiste à activer chacun de ses neurones en calculant la somme pondérée des entrées, en ajoutant le biais, puis en appliquant la fonction d'activation.

Précédemment, pour un seul neurone, vous avez implémenté la somme pondérée des entrées en calculant un produit scalaire entre le vecteur d'entrée et le vecteur de poids, puis en ajoutant le biais.

Puisque chaque ligne de la matrice de poids contient le vecteur de poids d'un neurone particulier, il suffit maintenant d'effectuer un produit scalaire entre chaque ligne de la matrice et le vecteur d'entrée. Heureusement, c'est exactement ce que fait la multiplication matricielle :

Pour ajouter les biais aux sorties des neurones respectifs, il convient également d'ajouter un vecteur de biais :

Enfin, la fonction d'activation est appliquée au résultat — sigmoïde ou ReLU, dans notre cas. La formule résultante pour la propagation avant dans la couche est la suivante :

a=activation(Wx+b)a = activation(Wx + b)

aa est le vecteur des activations (sorties) des neurones.

Classe Layer

Les éléments fondamentaux du perceptron sont ses couches, il est donc logique de créer une classe distincte Layer. Ses attributs incluent :

  • inputs : un vecteur d'entrées (n_inputs correspond au nombre d'entrées) ;
  • outputs : un vecteur de valeurs de sortie brutes (avant l'application de la fonction d'activation) des neurones (n_neurons correspond au nombre de neurones) ;
  • weights : une matrice de poids ;
  • biases : un vecteur de biais ;
  • activation_function : la fonction d'activation utilisée dans la couche.

Comme dans l'implémentation d'un seul neurone, les weights et biases seront initialisés avec des valeurs aléatoires comprises entre -1 et 1 tirées d'une distribution uniforme.

class Layer:
    def __init__(self, n_inputs, n_neurons, activation_function):
        self.inputs = np.zeros((n_inputs, 1))
        self.outputs = np.zeros((n_neurons, 1))
        self.weights = ...
        self.biases = ...
        self.activation = activation_function

Les attributs inputs et outputs seront utilisés ultérieurement lors de la rétropropagation, il est donc pertinent de les initialiser comme des tableaux NumPy remplis de zéros.

Note
Remarque

Initialiser inputs et outputs comme des tableaux NumPy remplis de zéros permet d'éviter les erreurs lors des calculs en propagation avant et arrière. Cela garantit également une cohérence entre les couches, permettant des opérations matricielles fluides sans nécessiter de vérifications supplémentaires.

La propagation avant peut être implémentée dans la méthode forward(), où les outputs sont calculés à partir du vecteur inputs en utilisant NumPy, selon la formule ci-dessus :

def forward(self, inputs):
    self.inputs = np.array(inputs).reshape(-1, 1)
    # Raw outputs
    self.outputs = ...
    # Applying the activation function
    return ...
Note
Remarque

Redimensionner inputs en un vecteur colonne garantit une multiplication matricielle correcte avec la matrice de poids lors de la propagation avant. Cela évite les incompatibilités de dimensions et permet des calculs fluides à travers toutes les couches.

1. Qu'est-ce qui rend un perceptron multicouche (MLP) plus puissant qu'un perceptron simple ?

2. Pourquoi appliquons-nous ce code avant de multiplier inputs par la matrice de poids ?

question mark

Qu'est-ce qui rend un perceptron multicouche (MLP) plus puissant qu'un perceptron simple ?

Select the correct answer

question mark

Pourquoi appliquons-nous ce code avant de multiplier inputs par la matrice de poids ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 3
some-alt