Back to challenges
Easy 0 solved 0% acceptance

Derivatives of Activation Functions

Compute the derivative of sigmoid, ReLU, Leaky ReLU or tanh at each value, the slopes backpropagation needs.

What you'll learn

  • Compute slopes of common activations
  • Reuse the sigmoid output for its derivative
  • Prepare the pieces backpropagation needs

Problem

Backpropagation multiplies gradients by the derivative of each activation function. Implement activation_derivative(name, values) and return the derivative at every value:

namederivative
"sigmoid"s × (1 - s), where s = 1 / (1 + e^(-x))
"relu"1 if x > 0, otherwise 0
"leaky_relu"1 if x > 0, otherwise 0.01
"tanh"1 - tanh(x)²

Input

name: One of "sigmoid", "relu", "leaky_relu" or "tanh".

values: The inputs x of the activation.

Output

Return the derivative at each value, in the same order.

Constraints

1 ≤ length ≤ 1,000

-50 ≤ each value ≤ 50

Examples

Example 1
Input:
name = "sigmoid"
values = [0.0, 2.0]

Expected output:
expected = [0.25, 0.104994]
Input:
std::string name = "sigmoid";
std::vector<double> values = {0.0, 2.0};

Expected output:
std::vector<double> expected = {0.25, 0.104994};
Input:
string name = "sigmoid";
double[] values = new double[] {0.0, 2.0};

Expected output:
double[] expected = new double[] {0.25, 0.104994};

Explanation

At 0, s = 0.5 and the slope is 0.5 × 0.5 = 0.25, the steepest point of the sigmoid. At 2, s ≈ 0.880797 and the slope is about 0.104994.

Example 2
Input:
name = "relu"
values = [-3.0, 0.0, 4.5]

Expected output:
expected = [0.0, 0.0, 1.0]
Input:
std::string name = "relu";
std::vector<double> values = {-3.0, 0.0, 4.5};

Expected output:
std::vector<double> expected = {0.0, 0.0, 1.0};
Input:
string name = "relu";
double[] values = new double[] {-3.0, 0.0, 4.5};

Expected output:
double[] expected = new double[] {0.0, 0.0, 1.0};

Explanation

ReLU is flat for x ≤ 0 (slope 0) and has slope 1 for x > 0, so the result is [0, 0, 1].

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

The derivative depends on the activation type, so handle each function separately for every input value.

Hint 2

For sigmoid and tanh, reuse the activation output or its standard function value instead of recomputing from scratch in a complicated way.

Hint 3

Watch the sign thresholds: ReLU uses a strict positive test, while leaky ReLU keeps a small slope for nonpositive values.

Expected complexity

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

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.