Todos os desafios
Fácil 0 resolvidos 0% de aceitação

Funções de ativação

Aplique sigmoide, ReLU, Leaky ReLU ou tanh a cada valor de uma lista.

O que você vai aprender

  • Implementar as funções de ativação mais comuns
  • Entender por que as redes precisam de não linearidade
  • Evitar estouro na sigmoide

Problema

Ver original (inglês)

Depois que um neurônio soma suas entradas ponderadas, uma função de ativação decide sua saída. Sem ela, uma rede neural só conseguiria aprender linhas retas.

Implemente activate(name, values) e aplique a função indicada a cada valor:

namefórmula
"sigmoid"1 / (1 + e^(-x))
"relu"max(0, x)
"leaky_relu"x se x > 0, senão 0.01 × x
"tanh"(e^x - e^(-x)) / (e^x + e^(-x))

Entrada

name: Um de "sigmoid", "relu", "leaky_relu" ou "tanh".

values: Uma lista de números.

Saída

Retorne uma lista com a ativação aplicada a cada valor, na mesma ordem.

Restrições

1 ≤ tamanho de values ≤ 1.000

-50 ≤ cada valor ≤ 50

Exemplos

Exemplo 1
Entrada:
name = "sigmoid"
values = [0.0, 2.0, -2.0]

Saída esperada:
expected = [0.5, 0.880797, 0.119203]
Entrada:
std::string name = "sigmoid";
std::vector<double> values = {0.0, 2.0, -2.0};

Saída esperada:
std::vector<double> expected = {0.5, 0.880797, 0.119203};
Entrada:
string name = "sigmoid";
double[] values = new double[] {0.0, 2.0, -2.0};

Saída esperada:
double[] expected = new double[] {0.5, 0.880797, 0.119203};

Explicação

sigmoid(0) = 1 / (1 + 1) = 0.5, sigmoid(2) ≈ 0.880797 e sigmoid(-2) ≈ 0.119203. A sigmoide comprime qualquer número no intervalo de 0 a 1.

Exemplo 2
Entrada:
name = "relu"
values = [-1.5, 0.0, 3.0]

Saída esperada:
expected = [0.0, 0.0, 3.0]
Entrada:
std::string name = "relu";
std::vector<double> values = {-1.5, 0.0, 3.0};

Saída esperada:
std::vector<double> expected = {0.0, 0.0, 3.0};
Entrada:
string name = "relu";
double[] values = new double[] {-1.5, 0.0, 3.0};

Saída esperada:
double[] expected = new double[] {0.0, 0.0, 3.0};

Explicação

ReLU mantém os valores positivos e transforma os negativos em 0: [0, 0, 3].

Como abordar

Tente sozinho primeiro e depois abra uma dica de cada vez.

Dica 1

Cada ativação é aplicada independentemente a cada número, então foque em um valor por vez.

Dica 2

Use a fórmula correspondente ao nome dado e monte uma nova lista com os resultados.

Dica 3

Tenha cuidado com entradas negativas, especialmente no ReLU e na inclinação leaky do lado não positivo.

Complexidade esperada

tempo O(n), espaço extra O(n)

Referências

Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.

Aprenda com outros

Soluções da comunidade

Ainda não há soluções publicadas. Resolva este desafio para compartilhar a primeira.