NumPy allowed · plain Python earns 10 bonus points
θ ← θ − 0.14 · ∂L/∂θ
Derive and compute analytical gradients for convolutional filter weights during reverse-mode automatic differentiation.
Implement conv2d_backward_weights(...). For each kernel weight position (ki, kj) in [0..kernel_size-1] x [0..kernel_size-1]: grad_W[ki][kj] = sum_{i=0..H_out-1, j=0..W_out-1} grad_output[i][j] * input_map[i * stride + ki][j * stride + kj]. Round each value to 4 decimal places.
conv2d_backward_weights(input_map: list[list[float]], grad_output: list[list[float]], kernel_size: int = 3, stride: int = 1) -> list[list[float]]