Retour aux défis
Moyen 0 résolus 0 % de réussite

Gradients d'un seul neurone

Utilisez la règle de dérivation en chaîne pour trouver comment la perte varie avec chaque poids et le biais d'un neurone sigmoïde.

Ce que vous allez apprendre

  • Appliquer la dérivation en chaîne à un neurone
  • Obtenir les gradients de chaque poids et du biais
  • Comprendre comment circulent les signaux d'apprentissage

Problème

Pour entraîner un neurone, il faut savoir comment chaque poids influe sur l'erreur. Pour un exemple d'entraînement :

  • z = inputs · weights + bias
  • y = sigmoid(z) = 1 / (1 + e^(-z))
  • perte L = (y - target)²

Par la règle de dérivation en chaîne, avec delta = dL/dz = 2 × (y - target) × y × (1 - y) :

  • dL/dw_i = delta × x_i
  • dL/dbias = delta

Implémentez neuron_gradients(inputs, weights, bias, target).

Entrée

inputs, weights : des listes de même longueur n.

bias : le biais du neurone.

target : la sortie correcte pour cet exemple (entre 0 et 1).

Sortie

Renvoyez une liste de n + 1 nombres : le gradient de chaque poids dans l'ordre, puis le gradient du biais.

Contraintes

1 ≤ n ≤ 100

-10 ≤ chaque entrée, poids et biais ≤ 10

0 ≤ target ≤ 1

Exemples

Exemple 1
Entrée :
bias = 0.0
inputs = [1.0, 2.0]
target = 1.0
weights = [0.5, -0.25]

Sortie attendue :
expected = [-0.25, -0.5, -0.25]
Entrée :
double bias = 0.0;
std::vector<double> inputs = {1.0, 2.0};
double target = 1.0;
std::vector<double> weights = {0.5, -0.25};

Sortie attendue :
std::vector<double> expected = {-0.25, -0.5, -0.25};
Entrée :
double bias = 0.0;
double[] inputs = new double[] {1.0, 2.0};
double target = 1.0;
double[] weights = new double[] {0.5, -0.25};

Sortie attendue :
double[] expected = new double[] {-0.25, -0.5, -0.25};

Explication

z = 1×0.5 + 2×(-0.25) = 0, donc y = 0.5. delta = 2 × (0.5 - 1) × 0.5 × 0.5 = -0.25. Gradients : [-0.25×1, -0.25×2, -0.25] = [-0.25, -0.5, -0.25].

Exemple 2
Entrée :
bias = 0.0
inputs = [3.0]
target = 0.0
weights = [0.0]

Sortie attendue :
expected = [0.75, 0.25]
Entrée :
double bias = 0.0;
std::vector<double> inputs = {3.0};
double target = 0.0;
std::vector<double> weights = {0.0};

Sortie attendue :
std::vector<double> expected = {0.75, 0.25};
Entrée :
double bias = 0.0;
double[] inputs = new double[] {3.0};
double target = 0.0;
double[] weights = new double[] {0.0};

Sortie attendue :
double[] expected = new double[] {0.75, 0.25};

Explication

z = 0 et y = 0.5. delta = 2 × (0.5 - 0) × 0.5 × 0.5 = 0.25, donc les gradients sont [0.25×3, 0.25] = [0.75, 0.25]. Un gradient positif signifie que le poids doit diminuer.

Comment l'aborder

Essayez d'abord seul, puis ouvrez les indices un par un.

Indice 1

Commence par calculer la sortie sigmoid du neurone et la dérivée de la loss par rapport à sa valeur avant activation.

Indice 2

Le gradient de chaque poids est le même delta multiplié par l’entrée correspondante, et le biais utilise seulement le delta.

Indice 3

Garde les gradients des poids dans l’ordre des entrées, puis ajoute le gradient du biais à la fin.

Complexité attendue

temps O(n), espace supplémentaire O(n)

Références

Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.