Du nombre d’entrée à la réponse du réseau
La propagation avant (forward pass en anglais) est le calcul qui mène des entrées d’un réseau de neurones à sa réponse, couche après couche. La refaire à la main montre ce que le réseau répond et pourquoi.
Une station de vélos veut savoir si samedi sera chargé. Elle donne trois nombres au réseau, et la réponse sort de l’autre côté.
À la fin de cette leçon
Remarque
Je peux calculer à la main la sortie d’un petit réseau de neurones.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Propagation avant | le calcul des sorties, couche après couche | |
| Entrée | un nombre donné au réseau | |
| Sortie | le nombre que rend un neurone ou le réseau | |
| Couche dense | une couche dont chaque neurone reçoit toutes les sorties d’avant | |
| Paramètre | un poids ou un biais que l’entraînement règle | |
| ReLU | rend le total s’il est positif, sinon 0 | ReLU(-2) = 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Chaque neurone d’une couche reçoit les mêmes entrées
Dans une couche, chaque neurone a ses propres poids et son propre biais. Tous reçoivent les mêmes entrées. Chacun rend une sortie.
Les sorties de la couche forment une liste. Cette liste devient l’entrée de la couche suivante. Le tableau ci-dessous calcule une couche cachée de trois neurones.
Exemple travaillé : une couche cachée
| Neurone | Poids | Biais | Total pour les entrées 2, 1, 1 | Sortie ReLU |
|---|---|---|---|---|
| N1 | 1, -1, 2 | 0 | 2 - 1 + 2 = 3 | 3 |
| N2 | -1, 2, 0 | 1 | -2 + 2 + 0 + 1 = 1 | 1 |
| N3 | -2, 0, 1 | 1 | -4 + 0 + 1 + 1 = -2 | 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
La couche suivante lit les sorties d’avant
La couche de sortie ne voit pas les entrées de départ. Elle reçoit seulement les trois sorties de la couche cachée : 3, 1 et 0.
Son neurone a pour poids 2, 1 et 5, et pour biais -4. Le total vaut 2 × 3 + 1 × 1 + 5 × 0 - 4, soit 3. ReLU laisse 3. La réponse du réseau est donc 3.
Le même calcul en Python
def relu(x):
if x > 0:
return x
return 0
def neurone(poids, biais, entrees):
total = biais
for n in range(len(poids)):
total = total + poids[n] * entrees[n]
return relu(total)
entrees = [2, 1, 1]
cachee = [neurone([1, -1, 2], 0, entrees),
neurone([-1, 2, 0], 1, entrees),
neurone([-2, 0, 1], 1, entrees)]
print("couche cachée :", cachee)
print("sortie :", neurone([2, 1, 5], -4, cachee))
# Remplacez entrees par [0, 3, 0] puis relancez.
# Notez les deux lignes affichées.
Le calcul entier sur une ligne
docker exec jupyter python3 -c "e = [2, 1, 1]; a = max(0, e[0] - e[1] + 2 * e[2]); b = max(0, -e[0] + 2 * e[1] + 1); c = max(0, -2 * e[0] + e[2] + 1); print(a, b, c, max(0, 2 * a + b + 5 * c - 4))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup passent le total brut à la couche suivante, même négatif. Le réseau donne alors une autre réponse. Appliquez la fonction d’activation à chaque neurone, puis transmettez la sortie : un total de -2 transmet 0.
Un réseau se décrit par ses paramètres
Un réseau 3, 3, 1 a trois entrées, trois neurones cachés et un neurone de sortie. Chaque neurone a un poids par entrée qu’il reçoit, plus un biais.
On compte donc 3 × 3 + 3 × 1 poids, soit 12, et 3 + 1 biais, soit 4. Cela fait 16 paramètres. Les grands réseaux en ont des millions.
Exemple travaillé : compter les paramètres
| Couche | Neurones | Poids par neurone | Poids | Biais |
|---|---|---|---|---|
| Cachée | 3 | 3 | 9 | 3 |
| Sortie | 1 | 3 | 3 | 1 |
| Total | 4 | 12 | 4 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.