Couches 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 :
- Une couche d’entrée : reçoit les données d’entrée ;
- Couches cachées : traitent les données et extraient des motifs.
- 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 3 entrées et 2 neurones, les poids seront stockés dans une matrice 2×3 W et les biais dans un vecteur 2×1 b, comme suit :
W=[W11W21W12W22W13W23]b=[b1b2]Ici, l’élément Wij représente le poids de la j-ième entrée vers le i-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 bi représente le biais du i-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)où a 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.
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 ...
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 ?
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Awesome!
Completion rate improved to 4
Couches 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 :
- Une couche d’entrée : reçoit les données d’entrée ;
- Couches cachées : traitent les données et extraient des motifs.
- 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 3 entrées et 2 neurones, les poids seront stockés dans une matrice 2×3 W et les biais dans un vecteur 2×1 b, comme suit :
W=[W11W21W12W22W13W23]b=[b1b2]Ici, l’élément Wij représente le poids de la j-ième entrée vers le i-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 bi représente le biais du i-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)où a 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.
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 ...
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 ?
Merci pour vos commentaires !