Volver a los desafíos
Intermedio 0 resueltos 0% de aceptación

Gradientes de una sola neurona

Usa la regla de la cadena para saber cómo cambia la pérdida con cada peso y el sesgo de una neurona sigmoide.

Lo que aprenderás

  • Aplicar la regla de la cadena a una neurona
  • Obtener gradientes de cada peso y del sesgo
  • Entender cómo fluyen las señales de aprendizaje

Problema

Ver original (inglés)

Para entrenar una neurona necesitamos saber cómo afecta cada peso al error. Para un ejemplo de entrenamiento:

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

Por la regla de la cadena, con delta = dL/dz = 2 × (y - target) × y × (1 - y):

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

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

Entrada

inputs, weights: Listas de la misma longitud n.

bias: El sesgo de la neurona.

target: La salida correcta para este ejemplo (entre 0 y 1).

Salida

Devuelve una lista de n + 1 números: el gradiente de cada peso en orden y después el gradiente del sesgo.

Restricciones

1 ≤ n ≤ 100

-10 ≤ cada entrada, peso y sesgo ≤ 10

0 ≤ target ≤ 1

Ejemplos

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

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

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

Salida esperada:
double[] expected = new double[] {-0.25, -0.5, -0.25};

Explicación

z = 1×0.5 + 2×(-0.25) = 0, así que y = 0.5. delta = 2 × (0.5 - 1) × 0.5 × 0.5 = -0.25. Gradientes: [-0.25×1, -0.25×2, -0.25] = [-0.25, -0.5, -0.25].

Ejemplo 2
Entrada:
bias = 0.0
inputs = [3.0]
target = 0.0
weights = [0.0]

Salida esperada:
expected = [0.75, 0.25]
Entrada:
double bias = 0.0;
std::vector<double> inputs = {3.0};
double target = 0.0;
std::vector<double> weights = {0.0};

Salida esperada:
std::vector<double> expected = {0.75, 0.25};
Entrada:
double bias = 0.0;
double[] inputs = new double[] {3.0};
double target = 0.0;
double[] weights = new double[] {0.0};

Salida esperada:
double[] expected = new double[] {0.75, 0.25};

Explicación

z = 0 e y = 0.5. delta = 2 × (0.5 - 0) × 0.5 × 0.5 = 0.25, así que los gradientes son [0.25×3, 0.25] = [0.75, 0.25]. Un gradiente positivo significa que el peso debe bajar.

Cómo abordarlo

Inténtalo primero por tu cuenta y luego abre las pistas una a una.

Pista 1

Empieza calculando la salida sigmoid de la neurona y la derivada de la pérdida respecto a su valor preactivación.

Pista 2

El gradiente de cada peso es el mismo delta escalado por esa entrada, y el sesgo usa solo el delta.

Pista 3

Mantén los gradientes de los pesos en el orden de las entradas y luego añade el gradiente del sesgo al final.

Complejidad esperada

tiempo O(n), espacio extra O(n)

Referencias

Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.