Couches de Perceptrons
Perceptron est le nom du réseau de neurones le plus simple, composé d’un seul neurone. Cependant, afin de résoudre des problèmes plus complexes, nous allons créer un modèle appelé perceptron multicouche (MLP). 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 : elle reçoit les données d’entrée ;
- Couches cachées : ces couches 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, vous avez appris à stocker les poids d’un seul neurone sous forme de vecteur et son biais sous forme de scalaire (nombre unique).
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 sous forme de vecteur, dont la longueur est égale au nombre de neurones.
Étant donné une couche avec 3 entrées et 2 neurones, ses poids seront stockés dans une matrice 2×3 W et ses biais seront stockés dans un vecteur 2×1 b, qui sont les suivants :
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, donc la première ligne contient les poids du premier neurone, et la deuxième ligne contient les poids du deuxième 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.
L'initialisation de 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
Can you explain how the weights and biases are initialized in the Layer class?
What is the purpose of the activation function in the forward propagation?
Could you show an example of how to use the Layer class for a simple input?
Awesome!
Completion rate improved to 4
Couches de Perceptrons
Glissez pour afficher le menu
Perceptron est le nom du réseau de neurones le plus simple, composé d’un seul neurone. Cependant, afin de résoudre des problèmes plus complexes, nous allons créer un modèle appelé perceptron multicouche (MLP). 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 : elle reçoit les données d’entrée ;
- Couches cachées : ces couches 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, vous avez appris à stocker les poids d’un seul neurone sous forme de vecteur et son biais sous forme de scalaire (nombre unique).
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 sous forme de vecteur, dont la longueur est égale au nombre de neurones.
Étant donné une couche avec 3 entrées et 2 neurones, ses poids seront stockés dans une matrice 2×3 W et ses biais seront stockés dans un vecteur 2×1 b, qui sont les suivants :
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, donc la première ligne contient les poids du premier neurone, et la deuxième ligne contient les poids du deuxième 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.
L'initialisation de 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 !