SolveConPython

Funciones de activación en Python — por qué una red neuronal sin ellas no puede aprender

En los artículos anteriores construimos dos piezas fundamentales:

  1. La función sigmoide, que transforma números en probabilidades
  2. La neurona artificial, que calcula una suma ponderada: z=XW+bz = XW + bz=XW+b

Ahora viene una pregunta clave:

Si ya tenemos una suma ponderada…
¿por qué necesitamos funciones de activación?

La respuesta es simple y muy importante.

El problema de una red sin funciones de activación

Imagina una red neuronal formada solo por capas lineales:Z1=XW1+b1Z_1 = XW_1 + b_1Z1​=XW1​+b1​ Z2=Z1W2+b2Z_2 = Z_1W_2 + b_2Z2​=Z1​W2​+b2​

Aunque tenga muchas capas, todo sigue siendo una sola operación lineal.

En otras palabras:

Una red sin funciones de activación no es más poderosa que una sola neurona.

No importa cuántas capas añadas:
sin activaciones, la red no puede aprender relaciones complejas.

Qué hace una función de activación (idea clave)

Una función de activación introduce no linealidad.

Eso permite que la red:

  • Aprenda curvas
  • Separe datos no triviales
  • Modele relaciones complejas del mundo real

La activación se aplica después de la suma ponderada:Z=XW+bZ = XW + bZ=XW+b A=f(Z)A = f(Z)A=f(Z)

Donde f es la función de activación.

Visualizando el flujo completo de una neurona

Secuencia mental correcta:

  1. Suma ponderada → Z
  2. Activación → A
  3. A pasa a la siguiente capa

Dos funciones de activación clave (las que usaremos)

En esta serie nos centraremos en dos funciones:

1️⃣ Sigmoide

  • Rango: (0, 1)
  • Ideal para salida en clasificación binaria

σ(x)=11+ex\sigma(x) = \frac{1}{1 + e^{-x}}σ(x)=1+e−x1​

2️⃣ Tangente hiperbólica (tanh)

  • Rango: (−1, 1)
  • Ideal para capas ocultas

tanh(x)=exexex+ex\tanh(x) = \frac{e^x – e^{-x}}{e^x + e^{-x}}tanh(x)=ex+e−xex−e−x​

¿Por qué tanh es mejor que sigmoide en capas ocultas?

La diferencia clave está en el centrado.

  • Sigmoide → salida entre 0 y 1
  • tanh → salida entre −1 y 1

Esto hace que tanh:

  • Converja más rápido
  • Tenga gradientes más equilibrados
  • Funcione mejor en capas internas

Por eso:

Sigmoide se usa al final, tanh en el medio.

Implementar tanh en Python

import numpy as np
def tanh(x):
return np.tanh(x)

Ejemplo rápido:

tanh(0) # 0
tanh(2) # ~0.96
tanh(-2) # ~ -0.96

Comparando sigmoide vs tanh (gráficamente)

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-5, 5, 400)
sig = 1 / (1 + np.exp(-x))
t = np.tanh(x)
plt.plot(x, sig, label="sigmoid")
plt.plot(x, t, label="tanh")
plt.axhline(0)
plt.legend()
plt.title("Sigmoide vs tanh")
plt.show()

Observa:

  • Sigmoide nunca baja de 0
  • tanh está centrada en 0

Uniendo todo: neurona + activación

Ahora juntamos lo aprendido hasta ahora.

def linear_forward(X, W, b):
return X @ W + b
def tanh(x):
return np.tanh(x)
Z = linear_forward(X, W, b)
A = tanh(Z)

Aquí:

  • Z es la salida lineal
  • A es la salida activada
  • A es lo que pasa a la siguiente capa

Esto ya es una capa neuronal completa.

Pieza reutilizable (guárdala)

Esta función será usada en todas las capas ocultas:

def layer_forward(X, W, b, activation):
Z = X @ W + b
return activation(Z)

Uso típico:

A1 = layer_forward(X, W1, b1, np.tanh)

Qué viene después

En el Artículo #4 entraremos en uno de los conceptos más importantes de toda la serie:

La función de pérdida (loss): cómo una red sabe si lo está haciendo bien o mal