Torna alle sfide
Facile 0 risolte 0% di accettazione

Derivate delle funzioni di attivazione

Calcola la derivata di sigmoid, ReLU, Leaky ReLU o tanh in ogni valore, le pendenze di cui ha bisogno la retropropagazione.

Cosa imparerai

  • Calcolare le pendenze delle attivazioni più comuni
  • Riutilizzare l'output della sigmoide per la sua derivata
  • Preparare i pezzi che servono alla retropropagazione

Problema

La retropropagazione moltiplica i gradienti per la derivata di ogni funzione di attivazione. Implementa activation_derivative(name, values) e restituisci la derivata in ogni valore:

nameDerivata
"sigmoid"s × (1 - s), dove s = 1 / (1 + e^(-x))
"relu"1 se x > 0, altrimenti 0
"leaky_relu"1 se x > 0, altrimenti 0.01
"tanh"1 - tanh(x)²

Input

name: Uno tra "sigmoid", "relu", "leaky_relu" o "tanh".

values: Gli input x dell'attivazione.

Output

Restituisci la derivata in ogni valore, nello stesso ordine.

Vincoli

1 ≤ lunghezza ≤ 1.000

-50 ≤ ogni valore ≤ 50

Esempi

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

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

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

Output atteso:
double[] expected = new double[] {0.25, 0.104994};

Spiegazione

In 0, s = 0.5 e la pendenza è 0.5 × 0.5 = 0.25, il punto più ripido della sigmoide. In 2, s ≈ 0.880797 e la pendenza è circa 0.104994.

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

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

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

Output atteso:
double[] expected = new double[] {0.0, 0.0, 1.0};

Spiegazione

ReLU è piatta per x ≤ 0 (pendenza 0) e ha pendenza 1 per x > 0, quindi il risultato è [0, 0, 1].

Come affrontarlo

Prova prima da solo, poi apri un suggerimento alla volta.

Suggerimento 1

La derivata dipende dal tipo di attivazione, quindi tratta ogni funzione separatamente per ogni valore di input.

Suggerimento 2

Per sigmoid e tanh, riusa l'output dell'attivazione o il suo valore standard invece di ricalcolarlo da zero in modo complicato.

Suggerimento 3

Occhio ai test sul segno: ReLU usa un confronto stretto con zero, mentre leaky ReLU mantiene una piccola pendenza per i valori non positivi.

Complessità attesa

tempo O(n), spazio aggiuntivo O(n)

Riferimenti

Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.

Impara dagli altri

Soluzioni della community

Nessuna soluzione pubblicata. Risolvi questa sfida per condividere la prima.