Problema
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
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].
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.
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.