Zurück zu den Herausforderungen
Mittel 0 gelöst 0% Erfolgsquote

Gradients of a Single Neuron

Use the chain rule to find how the loss changes with each weight and the bias of a sigmoid neuron.

Das lernst du

  • Apply the chain rule to a neuron
  • Get gradients for each weight and the bias
  • Understand how learning signals flow

Problem

Übersetzung anzeigen

To train a neuron we need to know how each weight affects the error. For one training example:

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

By the chain rule, with delta = dL/dz = 2 × (y - target) × y × (1 - y):

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

Implement neuron_gradients(inputs, weights, bias, target).

Input

inputs, weights: Lists of the same length n.

bias: The neuron's bias.

target: The correct output for this example (between 0 and 1).

Output

Return a list of n + 1 numbers: the gradient for each weight in order, then the gradient for the bias.

Einschränkungen

1 ≤ n ≤ 100

-10 ≤ each input, weight and bias ≤ 10

0 ≤ target ≤ 1

Beispiele

Beispiel 1
Eingabe:
bias = 0.0
inputs = [1.0, 2.0]
target = 1.0
weights = [0.5, -0.25]

Erwartete Ausgabe:
expected = [-0.25, -0.5, -0.25]
Eingabe:
double bias = 0.0;
std::vector<double> inputs = {1.0, 2.0};
double target = 1.0;
std::vector<double> weights = {0.5, -0.25};

Erwartete Ausgabe:
std::vector<double> expected = {-0.25, -0.5, -0.25};
Eingabe:
double bias = 0.0;
double[] inputs = new double[] {1.0, 2.0};
double target = 1.0;
double[] weights = new double[] {0.5, -0.25};

Erwartete Ausgabe:
double[] expected = new double[] {-0.25, -0.5, -0.25};

Erläuterung

z = 1×0.5 + 2×(-0.25) = 0, so 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].

Beispiel 2
Eingabe:
bias = 0.0
inputs = [3.0]
target = 0.0
weights = [0.0]

Erwartete Ausgabe:
expected = [0.75, 0.25]
Eingabe:
double bias = 0.0;
std::vector<double> inputs = {3.0};
double target = 0.0;
std::vector<double> weights = {0.0};

Erwartete Ausgabe:
std::vector<double> expected = {0.75, 0.25};
Eingabe:
double bias = 0.0;
double[] inputs = new double[] {3.0};
double target = 0.0;
double[] weights = new double[] {0.0};

Erwartete Ausgabe:
double[] expected = new double[] {0.75, 0.25};

Erläuterung

z = 0 and y = 0.5. delta = 2 × (0.5 - 0) × 0.5 × 0.5 = 0.25, so the gradients are [0.25×3, 0.25] = [0.75, 0.25]. Positive gradients mean the weight should go down.

So gehst du vor

Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.

Hinweis 1

Start by computing the neuron's sigmoid output and the loss derivative with respect to its pre-activation value.

Hinweis 2

The gradient for each weight is the same delta scaled by that input, and the bias uses the delta alone.

Hinweis 3

Keep the weight gradients in input order, then append the bias gradient at the end.

Erwartete Komplexität

O(n) time, O(n) extra space

Referenzen

Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.