📖 Teoría

Spiking Neural Networks

De la neurona biológica a la computación neuromórfica: modelos de neurona spiking (LIF, Izhikevich, Hodgkin-Huxley), codificación temporal, plasticidad sináptica (STDP), entrenamiento con surrogate gradients, hardware neuromórfico (Loihi, TrueNorth, SpiNNaker), frameworks (snnTorch, Norse, SpikingJelly) y aplicaciones reales con código en Python y PyTorch.

De la biología a la computación

Las Spiking Neural Networks (SNNs) son la tercera generación de redes neuronales artificiales. A diferencia de las ANNs clásicas que procesan valores continuos, las SNNs comunican información mediante impulsos eléctricos discretos (spikes), imitando cómo el cerebro biológico realmente funciona.

🧬
1ª Generación
Perceptrón (1958): salidas binarias 0/1. Computación con umbrales. Limitado a funciones linealmente separables.
🔄
2ª Generación
ANNs (backprop, 1986+): salidas continuas, activaciones suaves (sigmoid, ReLU). DNNs, CNNs, Transformers.
3ª Generación
SNNs: comunicación por spikes discretos en el tiempo. Procesan información temporal. Bio-inspiradas y energéticamente eficientes.
🧠 Dato: El cerebro humano tiene ~86 mil millones de neuronas que consumen solo ~20 vatios. Una GPU moderna consume ~300W para ejecutar un modelo que emula una fracción de esa capacidad. Las SNNs buscan cerrar esa brecha.

La neurona biológica

Para entender las SNNs, primero necesitamos entender la neurona real. Una neurona biológica tiene cuatro partes fundamentales:

Dendritas Reciben señales Soma Cuerpo celular Integra señales Hillock ¿Disparar? Axón Sinapsis Transmite Flujo de señal: dendritas → soma → hillock (decisión) → axón (spike) → sinapsis
Estructura simplificada de una neurona biológica. Las señales fluyen de izquierda a derecha: recepción → integración → decisión → transmisión.

Este proceso, repetido miles de millones de veces por segundo en el cerebro, constituye la base de toda computación neuronal. Obsérvese que el spike es un evento discreto y binario, a diferencia de las activaciones continuas (\.g., ReLU, sigmoid) de las redes neuronales artificiales clásicas. Esta diferencia fundamental es la que motiva la investigación en SNNs.

1
Dendritas reciben señales eléctricas de otras neuronas (inputs).
2
Soma (cuerpo celular) integra las señales. El potencial de membrana sube o baja.
3
Axon hillock: si el potencial alcanza un umbral (~−55 mV), la neurona dispara un potencial de acción (spike).
4
Axón transmite el spike como señal eléctrica binaria (todo-o-nada).
5
Sinapsis: libera neurotransmisores que afectan a las dendritas de la siguiente neurona.

El potencial de acción (spike)

El potencial de acción es un pulso eléctrico de ~1 ms de duración que viaja por el axón. Es un evento todo-o-nada: o dispara con amplitud completa, o no dispara en absoluto.

Tiempo (ms) V (mV) −70 −55 +30 Reposo Umbral Spike! Repolarización Hiperpolarización Reposo Umbral
El potencial de acción: reposo → umbral → despolarización rápida (spike) → repolarización → hiperpolarización → vuelta al reposo.
FasePotencialQué ocurre
Reposo~−70 mVLa neurona está en equilibrio. Canales Na⁺ cerrados.
Umbral~−55 mVSi se alcanza, se dispara un potencial de acción.
Despolarización→ +30 mVCanales Na⁺ se abren masivamente. Subida rápida.
Repolarización→ −70 mVCanales K⁺ se abren, Na⁺ se cierran. El potencial cae.
Hiperpolarización~−80 mVPeriodo refractario: la neurona no puede disparar de nuevo brevemente.

Este mecanismo fue descrito en detalle por Hodgkin y Huxley en 1952, quienes recibieron el Premio Nobel en 1963 por su trabajo con el axón gigante del calamar. Su modelo biofísico, basado en ecuaciones diferenciales para los canales iónicos de sodio (Na⁺) y potasio (K⁺), sigue siendo la referencia para entender la electrofisiología neuronal. En la práctica de las SNNs, utilizamos simplificaciones como el modelo Leaky Integrate-and-Fire (LIF), que captura la esencia del disparo sin necesidad de resolver las ecuaciones completas de Hodgkin-Huxley.

Hodgkin, A.L. & Huxley, A.F. (1952). A quantitative description of membrane current and its application to conduction and excitation in nerve. J. Physiology, 117(4), 500–544. DOI

Spike trains: la información está en el tiempo

A diferencia de las ANNs que transmiten valores continuos (como 0.73), las neuronas biológicas transmiten trenes de spikes: secuencias de pulsos en el tiempo. La información se codifica en el patrón temporal de estos spikes.

N₁ alta tasa N₂ baja tasa N₃ bursts Tiempo →
Tres patrones de spike trains: rate coding (N₁), baja frecuencia (N₂) y burst coding (N₃).

La codificación temporal es lo que diferencia fundamentalmente a las SNNs de las redes recurrentes (RNNs): mientras que las RNNs procesan secuencias de valores continuos en pasos discretos, las SNNs operan con spikes binarios donde la información reside en el momento exacto del disparo. Esta representación es intrínsecamente sparse (dispersa), lo que permite eficiencia computacional y energética sin precedentes.

📊
Rate coding
La información se codifica en la tasa de disparo (spikes/s). Más spikes = señal más intensa. Simple pero pierde información temporal.
⏱️
Temporal coding
La información está en el momento exacto de cada spike. Mucha más capacidad de información. Biológicamente más realista.
💥
Burst coding
Ráfagas de spikes consecutivos. Usadas para señales especialmente importantes o para mejorar la fiabilidad de la transmisión.
👥
Population coding
Grupos de neuronas codifican información colectivamente. Cada neurona responde a un rango, juntas representan el espacio completo.

ANN vs SNN: diferencias fundamentales

PropiedadANN (2ª generación)SNN (3ª generación)
SeñalValores continuos (floats)Spikes binarios en el tiempo
ActivaciónReLU, sigmoid, softmaxDinámica del potencial de membrana
Dimensión temporalNo inherente (excepto RNNs)Intrínseca: cada spike tiene un timestamp
ComputaciónMultiply-accumulate (MAC)Accumulate (AC) — solo cuando llega un spike
Consumo energéticoAlto (todas las neuronas activas)Bajo (sparse: solo las que disparan)
Hardware nativoGPUs, TPUsChips neuromórficos (Loihi, TrueNorth, SpiNNaker)
EntrenamientoBackprop (diferenciable)Surrogate gradients, STDP, conversión ANN→SNN
Potencia teóricaAproximador universalTuring-completo (Maass, 1997)
🏆 Maass (1997) demostró que las SNNs son más potentes computacionalmente que las ANNs clásicas: una sola neurona spiking con codificación temporal puede computar funciones que requieren muchas neuronas con activación sigmoidal. Maass, W. (1997). Networks of spiking neurons: The third generation of neural network models. Neural Networks, 10(9), 1659–1671. DOI

En resumen, las SNNs representan un paradigma de computación neuronal que prioriza la eficiencia energética, la dimensión temporal y la plausibilidad biológica. A cambio, su entrenamiento es más complejo que el backpropagation estándar utilizado en MLPs, CNNs o RNNs. En las siguientes secciones exploraremos los modelos de neurona, los mecanismos de aprendizaje y las técnicas de entrenamiento que hacen posible construir SNNs funcionales.

Leaky Integrate-and-Fire (LIF)

El modelo LIF es el caballo de batalla de las SNNs: suficientemente simple para ser eficiente, suficientemente rico para capturar la dinámica esencial del spiking.

El LIF fue introducido por Louis Lapicque en 1907, lo que lo convierte en uno de los modelos computacionales más antiguos de la neurociencia. A pesar de su antigüedad, sigue siendo el modelo más utilizado en SNNs modernas por su excelente balance entre fidelidad biológica y eficiencia computacional. La idea clave es modelar la membrana neuronal como un circuito RC (resistencia-capacitancia): la corriente de entrada carga el condensador (membrana), mientras que la resistencia provoca un "leak" (fuga) gradual que devuelve el potencial al reposo.

$$\tau_m \frac{dV}{dt} = -(V - V_{\text{rest}}) + R \cdot I(t)$$

Donde \( V \) es el potencial de membrana, \( \tau_m \) la constante de tiempo de membrana, \( V_{\text{rest}} \) el potencial de reposo, \( R \) la resistencia de membrana e \( I(t) \) la corriente de entrada.

⚡ Regla de disparo

Cuando \( V(t) \geq V_{\text{th}} \) (umbral):

  1. La neurona emite un spike en el instante \( t \).
  2. El potencial se resetea: \( V \leftarrow V_{\text{reset}} \).
  3. Opcionalmente, entra un periodo refractario \( \Delta t_{\text{ref}} \) donde no puede volver a disparar.

LIF discreto (para simulación)

En la práctica, simulamos con pasos de tiempo discretos \( \Delta t \):

$$V[t] = \beta \cdot V[t-1] + (1 - \beta) \cdot I[t]$$

Donde \( \beta = e^{-\Delta t / \tau_m} \) es el factor de leak (decaimiento). Si \( V[t] \geq V_{\text{th}} \), spike y reset.

El parámetro \( \beta \) controla la memoria temporal de la neurona: un valor cercano a 1 (poco leak) hace que la neurona recuerde entradas pasadas durante muchos pasos temporales, mientras que un valor bajo (mucho leak) hace que solo responda a estímulos recientes. Este trade-off es análogo al de las redes recurrentes (RNNs), donde las constantes de "forget gate" en LSTMs cumplen un rol similar.

🔬 Simulador de neurona LIF

Ajusta los parámetros y observa cómo el potencial de membrana evoluciona y cuándo la neurona dispara.

0.80
0.85
1.00
import torch
import snntorch as snn

# Crear neurona LIF
beta = 0.85  # factor de decaimiento (leak)
lif = snn.Leaky(beta=beta, threshold=1.0)

# Simular 100 pasos de tiempo
num_steps = 100
input_current = torch.ones(num_steps) * 0.3  # corriente constante

# Inicializar estado
mem = lif.init_leaky()  # V = 0
spikes = []
membrane = []

for t in range(num_steps):
    spk, mem = lif(input_current[t], mem)
    spikes.append(spk.item())
    membrane.append(mem.item())

spike_count = sum(spikes)
print(f"Spikes: {spike_count} en {num_steps} pasos")
print(f"Tasa de disparo: {spike_count/num_steps:.2%}")

Otros modelos de neurona spiking

ModeloEcuacionesRealismoCosteUso
IF (Integrate-and-Fire) \( \frac{dV}{dt} = I(t) \) (sin leak) Muy bajo Pruebas teóricas
LIF Con leak exponencial ⭐⭐ Bajo SNNs prácticas, neuromórfico
Izhikevich 2 ecuaciones, 4 parámetros ⭐⭐⭐⭐ Medio Simulaciones a gran escala
AdEx LIF + adaptación exponencial ⭐⭐⭐ Medio Modelado de neocorteza
Hodgkin-Huxley 4 ecuaciones diferenciales ⭐⭐⭐⭐⭐ Muy alto Neurociencia detallada
SRM (Spike Response) Kernel-based (filtros) ⭐⭐⭐ Medio Análisis teórico

El modelo de Izhikevich (2003) es un compromiso brillante: con solo 2 ecuaciones y 4 parámetros reproduce todos los patrones de disparo conocidos (regular, bursting, chattering, etc.):

$$\frac{dv}{dt} = 0.04v^2 + 5v + 140 - u + I$$
$$\frac{du}{dt} = a(bv - u)$$

Con reset: si \( v \geq 30 \): \( v \leftarrow c, \; u \leftarrow u + d \).

Los parámetros (a, b, c, d) determinan el tipo de neurona:

Tipoabcd
Regular spiking0.020.2−658
Intrinsically bursting0.020.2−554
Chattering0.020.2−502
Fast spiking0.10.2−652
Izhikevich, E.M. (2003). Simple model of spiking neurons. IEEE Trans. Neural Networks, 14(6), 1569–1572. DOI

Hodgkin & Huxley (1952) modelaron los canales iónicos del axón gigante del calamar. Premio Nobel en 1963.

$$C_m \frac{dV}{dt} = -g_{Na} m^3 h (V - E_{Na}) - g_K n^4 (V - E_K) - g_L (V - E_L) + I$$

Donde \( m, h, n \) son variables de gating que siguen sus propias ecuaciones diferenciales. Extremadamente preciso pero costoso de simular.

Hodgkin, A.L. & Huxley, A.F. (1952). A quantitative description of membrane current and its application to conduction and excitation in nerve. J. Physiology, 117(4), 500–544. DOI

Sinapsis: conexiones entre neuronas spiking

Cuando una neurona pre-sináptica \( j \) dispara un spike en el instante \( t_j^f \), genera una corriente post-sináptica (PSC) en la neurona \( i \):

$$I_i(t) = \sum_j w_{ij} \sum_{t_j^f} \kappa(t - t_j^f)$$

Donde \( w_{ij} \) es el peso sináptico y \( \kappa(t) \) es el kernel post-sináptico (PSP kernel), típicamente:

$$\kappa(t) = e^{-t/\tau_s} \cdot \Theta(t)$$

con \( \Theta(t) \) la función escalón de Heaviside y \( \tau_s \) la constante de tiempo sináptica.

Excitadora
\( w_{ij} > 0 \): el spike de j aumenta el potencial de i. Lo acerca al umbral.
Inhibidora
\( w_{ij} < 0 \): el spike de j disminuye el potencial de i. Lo aleja del umbral.
💡 Event-driven computing: En una SNN, la computación solo ocurre cuando llega un spike. Si no hay spikes, no hay operaciones. Esto es lo que hace a las SNNs tan eficientes energéticamente — ¡la mayoría de neuronas están en silencio la mayor parte del tiempo!

Este paradigma event-driven es radicalmente distinto al de las ANNs clásicas, donde todas las neuronas se activan en cada forward pass, independientemente de la relevancia de la entrada. En una SNN entrenada para clasificar imágenes, por ejemplo, típicamente solo el 5–15% de las neuronas dispara en un paso temporal dado. Esta sparsity intrínseca es la clave de la eficiencia de los chips neuromórficos como Intel Loihi, que solo consumen energía cuando una neurona recibe un spike.

Codificación de información con spikes

Un reto clave de las SNNs: ¿cómo representar datos del mundo real (imágenes, audio, sensores) como trenes de spikes? Los esquemas principales son:

La elección del esquema de codificación es tan importante como la arquitectura de la red, ya que determina la eficiencia energética, la latencia y la capacidad de información del sistema. A diferencia de las ANNs clásicas, donde la entrada es simplemente un vector de números reales, las SNNs requieren una etapa explícita de conversión dato→spike que afecta directamente al rendimiento.

El valor de la señal se codifica como la frecuencia de disparo: señal alta → tasa de spikes alta.

$$r = \frac{n_{\text{spikes}}}{\Delta T}$$

En la práctica, para convertir un píxel \( x \in [0,1] \) a spike train, cada paso de tiempo se genera un spike con probabilidad \( x \) (proceso de Bernoulli / Poisson).

import snntorch.spikegen as spikegen
import torch

# Imagen MNIST normalizada [0, 1] → spike train
pixel_values = torch.tensor([0.2, 0.8, 0.5, 0.1])
num_steps = 100

# Cada paso: spike con prob = pixel_value
spike_train = spikegen.rate(pixel_values, num_steps=num_steps)
print(f"Shape: {spike_train.shape}")  # (100, 4)
print(f"Tasa real pixel 0.8: {spike_train[:, 1].mean():.2f}")
⚠️ Desventaja: Rate coding necesita muchos pasos de tiempo (típicamente 50–200) para representar la señal con precisión. Esto anula gran parte de la eficiencia energética de las SNNs.

La información se codifica en el tiempo exacto del spike: señal alta → spike temprano; señal baja → spike tardío.

$$t_{\text{spike}} = \tau \cdot \log\left(\frac{x}{x - V_{\text{th}}}\right) \quad \text{para } x > V_{\text{th}}$$

Time-to-first-spike (TTFS) es la variante más popular: solo se necesita un spike por neurona, haciéndolo extremadamente eficiente.

import snntorch.spikegen as spikegen
import torch

pixel_values = torch.tensor([0.9, 0.5, 0.1, 0.7])
num_steps = 50

# Mayor valor → spike más temprano
spike_train = spikegen.latency(
    pixel_values,
    num_steps=num_steps,
    tau=5.0,            # constante de tiempo
    normalize=True,
    linear=False         # codificación logarítmica
)

for i, val in enumerate(pixel_values):
    first = (spike_train[:, i] == 1).nonzero()
    t = first[0].item() if len(first) > 0 else "∞"
    print(f"Pixel {val:.1f} → primer spike en t={t}")

Solo se emite un spike cuando la señal cambia significativamente. Ideal para señales temporales (video, sensores DVS):

$$s(t) = \begin{cases} 1 & \text{si } |x(t) - x(t-1)| > \theta \\ 0 & \text{en otro caso} \end{cases}$$

Las cámaras de eventos (DVS) usan exactamente este principio: solo transmiten cambios de brillo a nivel de píxel, a velocidades de >1 MHz con latencia de μs.

Un valor se codifica distribuyendo la actividad entre un grupo de neuronas, cada una sintonizada a un rango distinto. Inspirada en los campos receptivos del cortex visual:

$$r_i(x) = \exp\left(-\frac{(x - \mu_i)^2}{2\sigma^2}\right)$$

Las neuronas con centro \( \mu_i \) más cercano al valor \( x \) disparan más. Alta precisión y robustez al ruido, pero usa más neuronas.

EsquemaSpikes/neuronaLatenciaEficienciaMejor para
RateMuchosAlta⭐⭐Compatibilidad ANN
Temporal (TTFS)1Baja⭐⭐⭐⭐⭐Clasificación rápida
DeltaVariableMuy baja⭐⭐⭐⭐Señales temporales / DVS
PopulationDistribuidosMedia⭐⭐⭐Alta precisión

STDP: Spike-Timing-Dependent Plasticity

La STDP es la regla de aprendizaje biológico más importante para las SNNs. Descubierta experimentalmente por Bi & Poo (1998), formaliza la regla de Hebb: "neurons that fire together, wire together", pero con una dependencia temporal precisa.

Es importante contextualizar la STDP dentro del panorama de algoritmos de aprendizaje: mientras que el backpropagation clásico requiere propagar errores globales por toda la red (no biológicamente plausible), la STDP es una regla completamente local — cada sinapsis actualiza su peso basandose únicamente en la actividad de sus dos neuronas conectadas. Esto la hace compatible con implementaciones en hardware neuromórfico donde no existe un controlador global de errores.

Bi, G.Q. & Poo, M.M. (1998). Synaptic modifications in cultured hippocampal neurons: dependence on spike timing, synaptic strength, and postsynaptic cell type. J. Neuroscience, 18(24), 10464–10472. DOI
$$\Delta w = \begin{cases} A_+ \exp\left(-\frac{\Delta t}{\tau_+}\right) & \text{si } \Delta t > 0 \;\text{(pre antes que post)} \\ -A_- \exp\left(\frac{\Delta t}{\tau_-}\right) & \text{si } \Delta t < 0 \;\text{(post antes que pre)} \end{cases}$$

Donde \( \Delta t = t_{\text{post}} - t_{\text{pre}} \), y \( A_+, A_- \) son las amplitudes de potenciación/depresión, y \( \tau_+, \tau_- \) las constantes de tiempo (típicamente ~20 ms).

Δt Δw LTP (potenciación) LTD (depresión) pre→post: reforzar post→pre: debilitar 0
Ventana STDP: el cambio de peso sináptico depende del orden temporal relativo entre los spikes pre y post-sinápticos.

🧠 Interpretación intuitiva

  • Pre dispara antes que post (\( \Delta t > 0 \)): la sinapsis se refuerza (LTP). "La neurona pre causó el disparo de la post".
  • Post dispara antes que pre (\( \Delta t < 0 \)): la sinapsis se debilita (LTD). "La neurona pre no contribuyó".
  • Cuanto más cercanos en tiempo, mayor es el cambio \( |\Delta w| \).

🔬 Ventana STDP

Ajusta \( \Delta t \) y observa cómo cambia el peso sináptico.

+10 ms

Más allá de STDP: otras formas de plasticidad

STP (Short-Term Plasticity)
Cambios sinápticos transitorios (ms a segundos). Incluye facilitación (aumento temporal de peso tras spikes rápidos) y depresión a corto plazo (agotamiento de vesículas). Función: filtrado temporal, memoria de trabajo.
⚖️
Plasticidad homeostática
Mecanismos que mantienen la tasa de disparo de la red dentro de rangos estables. Synaptic scaling: si una neurona dispara muy poco, todos sus pesos se incrementan proporcionalmente. Previene saturación y silenciamiento.
🔀
Plasticidad intrínseca
Cambios en los parámetros propios de la neurona (umbral, constante de tiempo). La neurona se vuelve más o menos excitable según su historial de actividad. Complementa la plasticidad sináptica.
🎯
R-STDP (Reward-modulated)
Extensión de STDP donde los cambios de peso son modulados por una señal de recompensa (dopamina). Permite aprendizaje por refuerzo biológicamente plausible: \( \Delta w \propto \text{STDP} \times r(t) \).
🔬 Dato neurocientífico: En el cerebro, STDP, STP, plasticidad homeostática e intrínseca operan simultáneamente a diferentes escalas temporales, creando un sistema de aprendizaje multi-escala extraordinariamente robusto.

La R-STDP (Reward-modulated STDP) es particularmente interesante porque conecta el aprendizaje biológico con el aprendizaje por refuerzo. La señal de recompensa, que en el cerebro es mediada por la dopamina, modula la magnitud de los cambios STDP, permitiendo que la red aprenda asociaciones causales entre acciones y resultados sin necesidad de un supervisor explícito. Este mecanismo es una de las vías más prometedoras para lograr aprendizaje on-chip en hardware neuromórfico.

El problema del gradiente en SNNs

El entrenamiento de SNNs mediante backpropagation tiene un obstáculo fundamental: la función de disparo (spike) es una función escalón de Heaviside, cuyo gradiente es cero en todas partes excepto en el umbral, donde es infinito (delta de Dirac):

Este problema es único de las SNNs y no tiene equivalente directo en las ANNs clásicas, donde las funciones de activación (ReLU, sigmoid, tanh) son diferenciables (o al menos sub-diferenciables en el caso de ReLU en cero). La no-diferenciabilidad de la función de disparo impide el uso directo de la cadena de regla y backpropagation estándar, lo que motivó el desarrollo de varias estrategias alternativas.

$$S(t) = \Theta(V(t) - V_{\text{th}}) = \begin{cases}1 & V \geq V_{\text{th}} \\ 0 & V < V_{\text{th}}\end{cases}$$
$$\frac{\partial S}{\partial V} = \delta(V - V_{\text{th}})$$

Esto hace que el backprop estándar no funcione: los gradientes son exactamente 0 o ∞. ¿Soluciones?

Heaviside (real) Surrogate (sustituta) ∂S/∂V = δ(V−Vₜₕ) 😱 ∂σ̃/∂V ≈ suave ✓
Forward pass: se usa la Heaviside real (izquierda). Backward pass: se sustituye por un surrogate suave (derecha).

Surrogate Gradients

La técnica más exitosa: en el forward pass se usa la función escalón real (Heaviside), pero en el backward pass se sustituye el gradiente por una función suave:

Esta estrategia es una generalización del Straight-Through Estimator (STE) propuesto por Bengio et al. (2013) para redes con cuantización binaria. La idea clave es que, aunque la función real no sea diferenciable, podemos pretender que lo es durante el backward pass sustituyéndola por una aproximación suave. En la práctica, la elección del surrogate concreto tiene un impacto moderado: lo que importa más es que exista un gradiente útil, no la forma exacta de la curva.

$$\frac{\partial S}{\partial V} \approx \tilde{\sigma}'(V - V_{\text{th}})$$
NombreFórmula del surrogate gradientNotas
Fast sigmoid \( \frac{1}{(1 + k|V - V_{\text{th}}|)^2} \) Rápida, popular en snnTorch
Sigmoid \( k \cdot \sigma(k(V-V_{\text{th}})) \cdot (1-\sigma(\cdot)) \) Clásica, buena convergencia
Arctan \( \frac{1}{\pi} \cdot \frac{k}{1 + (k(V-V_{\text{th}}))^2} \) Colas largas, gradientes más suaves
Triangular \( \max(0, 1 - k|V - V_{\text{th}}|) \) Compacta, eficiente
Gaussian \( k \cdot \exp(-k^2(V-V_{\text{th}})^2) \) SpikingJelly, muy localizada

El parámetro \( k \) controla la pendiente: valores altos → más parecida a Heaviside pero gradientes más localizados; valores bajos → más suave pero menos fiel.

Neftci, E.O. et al. (2019). Surrogate Gradient Learning in Spiking Neural Networks. IEEE Signal Processing Magazine, 36(6), 51–63. DOI
import torch
import torch.nn as nn
import snntorch as snn
from snntorch import surrogate

# Usar fast sigmoid como surrogate
spike_grad = surrogate.fast_sigmoid(slope=25)

class SpikingNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(784, 256)
        self.lif1 = snn.Leaky(beta=0.9, spike_grad=spike_grad)
        self.fc2 = nn.Linear(256, 10)
        self.lif2 = snn.Leaky(beta=0.9, spike_grad=spike_grad)

    def forward(self, x, num_steps=25):
        mem1 = self.lif1.init_leaky()
        mem2 = self.lif2.init_leaky()
        spk2_rec = []

        for _ in range(num_steps):
            cur1 = self.fc1(x)
            spk1, mem1 = self.lif1(cur1, mem1)
            cur2 = self.fc2(spk1)
            spk2, mem2 = self.lif2(cur2, mem2)
            spk2_rec.append(spk2)

        # Contar spikes de salida
        return torch.stack(spk2_rec, dim=0)

# La loss: contar spikes por clase
# La clase con más spikes gana
net = SpikingNet()
optimizer = torch.optim.Adam(net.parameters(), lr=1e-3)

Backpropagation Through Time (BPTT) para SNNs

Las SNNs procesan información a lo largo del tiempo, similar a las RNNs. El entrenamiento despliega la red en el eje temporal y aplica BPTT con surrogate gradients:

La conexión con las redes recurrentes (RNNs) es profunda: la dinámica de membrana de una neurona LIF es matemáticamente equivalente a una celda recurrente con un estado oculto (el potencial \( V \)) y una no-linealidad de salida (la función de disparo). La principal diferencia es que en las SNNs la salida es binaria (spike/no spike) en vez de continua, y la "recurrencia" proviene del leak de membrana, no de pesos recurrentes explícitos. Los mismos problemas de vanishing/exploding gradients aplican, y técnicas como truncated BPTT o detach periodos refractarios se usan para estabilizar el entrenamiento.

1
Forward pass: ejecutar T pasos de tiempo. En cada paso, las neuronas LIF integran corriente y generan spikes (con Heaviside).
2
Calcular loss: se puede usar rate-based loss (contar spikes por neurona de salida) o membrane-potential loss (usar \( V_{\text{mem}} \) final como logit).
3
Backward pass: backpropagar gradientes a través de T pasos temporales. Sustituir \( \partial S / \partial V \) por surrogate gradient en cada paso.
4
Actualizar pesos: con Adam/SGD, igual que en redes convencionales. Solo los pesos sinápticos se actualizan (no los parámetros de la neurona LIF típicamente).
💡 Funciones de pérdida para SNNs:
  • Rate loss: CrossEntropy sobre conteo de spikes de salida.
  • Max membrane: CrossEntropy sobre el máximo \( V_{\text{mem}} \) de las neuronas de salida.
  • Latency loss: penalizar tiempo hasta primer spike de la neurona correcta.

Conversión ANN → SNN

Enfoque alternativo al entrenamiento directo: entrenar una ANN convencional y convertirla a SNN post-entrenamiento.

1
Entrenar ANN: red convencional con ReLU (la ReLU ya actúa como un análogo de la tasa de disparo para valores positivos).
2
Normalizar pesos: escalar los pesos para que las activaciones se muevan en rangos compatibles con tasas de disparo realistas.
3
Reemplazar neuronas: sustituir cada ReLU por una neurona LIF con codificación por rate.
4
Simular con T pasos: más pasos = mayor precisión, pero menor eficiencia. Trade-off latencia/accuracy.
AspectoEntrenamiento directoConversión ANN→SNN
Accuracy Alta (con suficientes pasos) Muy alta (hereda de la ANN)
Latencia (pasos temporales) Baja (5–25 pasos) Alta (100–2500 pasos)
Eficiencia energética ⭐⭐⭐⭐⭐ ⭐⭐⭐ (muchos spikes)
Codificación temporal Sí (puede usar TTFS) No (solo rate coding)
Facilidad Complejo (surrogates, BPTT) Simple (usar ANN entrenada)
Biologicidad Mayor Menor (rate-based)

La conversión ANN→SNN ha sido especialmente exitosa con arquitecturas como ResNets y VGGs, donde la equi-valencia ReLU→tasa de disparo está bien fundamentada teóricamente. Sin embargo, la conversión de modelos con batch normalization, max pooling o skip connections requiere técnicas adicionales (threshold balancing, temporal batch norm) que aún son área de investigación activa.

Otras estrategias de entrenamiento

Más allá de surrogate gradients y la conversión ANN→SNN, la comunidad ha explorado múltiples vías alternativas para entrenar SNNs. Cada una ofrece un balance distinto entre plausibilidad biológica, eficiencia y rendimiento, abriendo diferentes caminos hacia la implementación en hardware neuromórfico.

🧬
Algoritmos evolutivos
Optimizar pesos y topología de SNNs mediante evolución (NEAT para SNNs). No requieren gradientes. Útiles para tareas de RL donde la función fitness es el rendimiento del agente. Coste: muchas evaluaciones.
🎲
E-prop (e-propagation)
Bellec et al. (2020): regla de aprendizaje biológicamente plausible que aproxima BPTT usando solo información local en tiempo y espacio. Cada sinapsis mantiene un eligibility trace que se modula por una señal de error global.
🏗️
Hybrid training
Combinar conversión ANN→SNN con fine-tuning directo usando surrogate gradients. Obtiene lo mejor de ambos mundos: alta accuracy inicial de la conversión + eficiencia temporal del entrenamiento directo.
📊
STDP supervisada
Extensiones de STDP que incorporan señales de supervisión: forzar pares spike pre/post para la clase correcta. Más bio-plausible que surrogate gradients pero menor accuracy en benchmarks complejos.

Hardware neuromórfico

Las SNNs alcanzan su máximo potencial cuando se ejecutan en hardware neuromórfico: chips diseñados para emular neuronas y sinapsis directamente en silicio, con eficiencia energética de órdenes de magnitud superior a las GPUs.

A diferencia de la arquitectura von Neumann tradicional (usada en GPUs/CPUs), donde procesamiento y memoria están separados y la comunicación entre ambos crea un cuello de botella (el memory wall), los chips neuromórficos integran computación y memoria en cada neurona. Cada núcleo neuromórfico contiene tanto la lógica de integración/disparo como los pesos sinápticos locales, eliminando transferencias masivas de datos. Este paradigma se denomina in-memory computing y es la razón principal de la eficiencia energética de estos chips.

🔵
Intel Loihi 2
128 cores neuromórficos, hasta 1M neuronas programables. Soporta aprendizaje on-chip (STDP, surrogate gradients). Latencia <1 ms para inferencia. Consumo ~1W. SDK: Lava (open-source).

Davies, M. et al. (2018). Loihi: A Neuromorphic Manycore Processor with On-Chip Learning. IEEE Micro, 38(1), 82–99. DOI
🔴
IBM TrueNorth
4096 cores, 1 millón de neuronas, 256 millones de sinapsis. Consumo: 70 mW. Chip pionero (2014) que demostró computación neuromórfica a escala. Limitado a inferencia (no aprendizaje on-chip).

Merolla, P.A. et al. (2014). A million spiking-neuron integrated circuit with a scalable communication network and interface. Science, 345(6197), 668–673. DOI
🟢
SpiNNaker 2
Universidad de Manchester. Simula mil millones de neuronas en tiempo real. Diseñado para modelado del cerebro a gran escala (proyecto Human Brain Project). 152 chips ARM con aceleradores neuromórficos.

Furber, S. et al. (2014). The SpiNNaker Project. Proc. IEEE, 102(5), 652–665. DOI
🟡
BrainScaleS-2
Universidad de Heidelberg. Hardware analógico que emula neuronas con circuitos analógicos reales. Opera a 1000× velocidad biológica. Soporta plasticidad on-chip. Ideal para exploración rápida de modelos.

Pehle, C. et al. (2022). The BrainScaleS-2 accelerated neuromorphic system with hybrid plasticity. Frontiers in Neuroscience, 16. DOI
ChipNeuronasSinapsisConsumoAprendizaje on-chipTipo
Loihi 21M120M~1W✅ STDP, surrogatesDigital
TrueNorth1M256M70 mW❌ Solo inferenciaDigital
SpiNNaker 2~1B (sim)Variable~10W✅ Flexible (ARM)Digital+ARM
BrainScaleS-2512131K~1W✅ AnalógicaAnalógico
GPU (A100)N/A (software)N/A300WN/Avon Neumann
🌱 Eficiencia energética: Una inferencia de imagen en Loihi consume ~30 μJ, frente a ~5 mJ en GPU. Eso es ~100-1000× más eficiente. Para aplicaciones edge (drones, IoT, robótica), esta diferencia es transformadora.

Frameworks de software para SNNs

Aunque el hardware neuromórfico está en fase de maduración, podemos simular SNNs en GPUs convencionales usando frameworks especializados. Los principales:

La buena noticia es que el ecosistema de software para SNNs ha crecido enormemente desde 2020. Los frameworks modernos se integran nativamente con PyTorch, lo que permite aplicar las técnicas de deep learning ya conocidas (autograd, DataLoader, optimizadores) al mundo spiking. Si ya tienes experiencia con redes neuronales en PyTorch, la curva de aprendizaje para SNNs es sorprendentemente suave.

El framework más popular para investigación en SNNs. Integración nativa con PyTorch, surrogate gradients automáticos, modelos de neurona pre-construidos (LIF, Synaptic, Recurrent, etc.).

  • Ventajas: curva de aprendizaje suave si conoces PyTorch, excelentes tutoriales, activamente mantenido.
  • Repo: github.com/jeshraghian/snntorch
  • Paper: Eshraghian et al. (2023). Training Spiking Neural Networks Using Lessons From Deep Learning.
import torch
import torch.nn as nn
import snntorch as snn
from snntorch import surrogate

spike_grad = surrogate.fast_sigmoid(slope=25)
beta = 0.9

class SpikingCNN(nn.Module):
    def __init__(self):
        super().__init__()
        # Capa convolucional spiking
        self.conv1 = nn.Conv2d(1, 16, 3, padding=1)
        self.lif1 = snn.Leaky(beta=beta, spike_grad=spike_grad)
        self.pool = nn.MaxPool2d(2)

        self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
        self.lif2 = snn.Leaky(beta=beta, spike_grad=spike_grad)

        self.fc = nn.Linear(32 * 7 * 7, 10)
        self.lif3 = snn.Leaky(beta=beta, spike_grad=spike_grad)

    def forward(self, x, num_steps=25):
        mem1 = self.lif1.init_leaky()
        mem2 = self.lif2.init_leaky()
        mem3 = self.lif3.init_leaky()
        spk_out = []

        for _ in range(num_steps):
            spk1, mem1 = self.lif1(self.pool(self.conv1(x)), mem1)
            spk2, mem2 = self.lif2(self.pool(self.conv2(spk1)), mem2)
            spk3, mem3 = self.lif3(self.fc(spk2.flatten(1)), mem3)
            spk_out.append(spk3)

        return torch.stack(spk_out)

model = SpikingCNN()
print(f"Parámetros: {sum(p.numel() for p in model.parameters()):,}")

Framework bio-inspirado con modelos de neurona más detallados (LIF, LI, Izhikevich, etc.) y soporte para codificación temporal avanzada.

  • Ventajas: modelos más biológicos, soporte nativo para recurrencia, buen rendimiento.
  • Repo: github.com/norse/norse
import torch
import norse.torch as norse

# Parámetros de la neurona LIF
params = norse.LIFParameters(
    tau_mem_inv=100.0,  # 1/τ_mem
    v_th=torch.tensor(1.0),
    v_leak=torch.tensor(0.0),
)

# Crear celda recurrente LIF
cell = norse.LIFRecurrentCell(
    input_size=784,
    hidden_size=128,
    p=params
)

# Simular
state = None
for t in range(50):
    x = torch.randn(32, 784)  # batch=32
    output, state = cell(x, state)
    # output contiene spikes (0 o 1)

Desarrollado por OpenI / PKU (Pekín). Optimizado para rendimiento en GPU con backend CUDA custom. Soporta modo step-by-step y multi-step vectorizado.

Frameworks de neurociencia computacional, no de ML. Diseñados para simular modelos biológicos detallados de redes neuronales con alta fidelidad.

  • Brian2: define modelos con ecuaciones en texto plano. Extremadamente flexible. Ideal para investigación.
  • NEST: optimizado para redes masivas (millones de neuronas). Usado en Human Brain Project.
from brian2 import *

# Definir neurona LIF con ecuaciones
eqs = '''
dv/dt = (I - v) / (10*ms) : 1
I : 1
'''

# Crear grupo de 100 neuronas
G = NeuronGroup(100, eqs, threshold='v > 1',
                reset='v = 0', method='exact')
G.I = '0.5 + 1.5 * rand()'  # corriente aleatoria

# Monitor de spikes
M = SpikeMonitor(G)
run(1*second)

print(f"Total spikes: {M.num_spikes}")
print(f"Tasa media: {M.num_spikes/100:.1f} Hz")
FrameworkBackendEnfoqueGPUComplejidad
snnTorchPyTorchML / DL✅ Nativo⭐⭐
NorsePyTorchBio-ML✅ Nativo⭐⭐⭐
SpikingJellyPyTorch+CuPyML rendimiento✅✅ CuPy⭐⭐⭐
BindsNETPyTorchBio-ML✅ Nativo⭐⭐
Brian2NumPy/C++Neurociencia⭐⭐⭐⭐
NESTC++/MPINeurociencia⭐⭐⭐⭐⭐
Lava (Intel)Python/LoihiNeuromórficoLoihi⭐⭐⭐

Datasets neuromórficos

Los datasets convencionales (MNIST, CIFAR) se pueden convertir a spikes, pero existen datasets nativamente event-driven capturados con cámaras de eventos (DVS):

DatasetTipoClasesFuenteTamaño
N-MNISTDígitos (DVS)10Cámara DVS moviendo MNIST70K samples
DVS-CIFAR10Objetos (DVS)10Monitor + cámara DVS10K samples
DVS-GestureGestos manuales11Cámara DVS nativa1.5K samples
SHDAudio (dígitos hablados)20Modelo coclear → spikes10K samples
SSCAudio (comandos)35Modelo coclear → spikes100K samples
N-Caltech101Objetos (DVS)101Cámara DVS moviendo Caltech9K samples
📷 Cámaras de eventos (DVS): cada píxel opera de manera independiente y asíncrona, emitiendo un "evento" (spike) solo cuando detecta un cambio de luminosidad. Resolución temporal: ~1 μs. Rango dinámico: 120 dB (vs 60 dB de cámaras convencionales). Consumo: ~10 mW.

Los datasets neuromórficos son esenciales para evaluar SNNs en condiciones realistas. A diferencia de convertir MNIST a spikes (donde se pierde la ventaja temporal), los datasets DVS capturan información intrínsecamente temporal que las SNNs pueden explotar de forma nativa. Los benchmarks más citados son DVS-Gesture (gestos manuales) y SHD (Spiking Heidelberg Digits), que se han convertido en estándares de facto para comparar métodos de entrenamiento. SpikingJelly incluye cargadores nativos para la mayoría de estos datasets a través de spikingjelly.datasets.

Aplicaciones de las Spiking Neural Networks

Las SNNs no son una curiosidad académica: ya se despliegan en aplicaciones reales donde la baja latencia, el bajo consumo energético y el procesamiento temporal nativo ofrecen ventajas decisivas sobre las ANNs convencionales. Las aplicaciones más maduras se concentran en el edge computing, donde ejecutar un modelo en una GPU remota no es viable por latencia, consumo o privacidad.

🤖
Robótica
Procesamiento sensorial en tiempo real con latencia ultra-baja. Control reactivo de robots con consumo mínimo. Integración con sensores event-driven (tacto, visión DVS). Ejemplo: control de agarre con retroalimentación táctil en <1 ms.
📷
Visión event-driven
Procesamiento de cámaras DVS para detección de objetos, seguimiento, odometría visual. Funciona en condiciones extremas de iluminación (120 dB de rango dinámico) y velocidades de hasta 10,000+ FPS.
🎵
Audio y habla
Procesamiento de señales auditivas con modelos cocleares. Reconocimiento de voz ultra-eficiente para dispositivos siempre-activos (keyword spotting). Ventaja natural: el audio ya es temporal.
📡
IoT / Edge Computing
Inferencia on-device con consumo de μW–mW en sensores inteligentes. Detección de anomalías, clasificación de señales EMG/EEG, monitorización de salud. Ideal para dispositivos alimentados por batería o energy harvesting.
🧠
Neurociencia computacional
Simulación de regiones cerebrales completas. Modelado de enfermedades neurodegenerativas. Interfaces cerebro-computadora (BCI). Proyectos: Human Brain Project (SpiNNaker), BRAIN Initiative (USA).
🚗
Conducción autónoma
Fusión de datos DVS + LiDAR + radar con latencia <1 ms. Detección ultra-rápida de peatones y obstáculos. BMW y otras empresas exploran sensores DVS para ADAS.

SNNs vs ANNs: comparativa exhaustiva

DimensiónANNs (convencionales)SNNs (spiking)
Señal Valores continuos (float32) Spikes binarios (0/1) en el tiempo
Computación MAC (multiply-accumulate) AC (accumulate solo cuando hay spike)
Dimensión temporal No inherente (se añade con RNN) Nativa — los spikes son tiempo
Energía (inferencia) ~5–300 mJ/imagen (GPU) ~10–100 μJ/imagen (neuromórfico)
Latencia ms (limitada por clock GPU) μs–ms (event-driven)
Hardware GPU/TPU Neuromórfico (Loihi, TrueNorth)
Entrenamiento Backprop maduro, bien comprendido Surrogate gradients, STDP (en desarrollo)
Accuracy (ImageNet) ~90%+ (SOTA) ~75–80% (mejorando rápidamente)
Ecosistema Masivo (PyTorch, TF, JAX) Creciente (snnTorch, Norse, Lava)
Biologicidad Baja (inspiración lejana) Alta (emula mecanismos reales)
Mejor para Tareas estáticas, alta accuracy Edge, tiempo real, bajo consumo
🔮 Perspectiva: Las SNNs no buscan reemplazar a las ANNs, sino complementarlas. Los nichos donde las SNNs brillan — edge computing, tiempo real, bajo consumo, sensores event-driven — son precisamente los que las ANNs convencionales no cubren bien. El futuro probablemente sea híbrido.

Es importante notar que la brecha de accuracy entre SNNs y ANNs se está cerrando rápidamente. En tareas como MNIST y DVS-Gesture, las SNNs ya alcanzan rendimiento comparable a las ANNs. En ImageNet, los Spiking Transformers (Spikformer, Spike-driven Transformer) han alcanzado ~78% top-1 accuracy con solo 4 pasos temporales, frente al ~90% de los mejores modelos clásicos — pero consumiendo una fracción de la energía en hardware neuromórfico. Para muchas aplicaciones edge, esta leve pérdida de accuracy es más que compensada por la reducción de 100–1000× en consumo energético.

Estado del arte: resultados recientes

BenchmarkMétodoAccuracyPasos TAño
MNISTSNN directo (snnTorch)99.5%252023
CIFAR-10SEW-ResNet (SpikingJelly)95.5%42022
CIFAR-100Spikformer79.1%42023
ImageNetSpike-driven Transformer78.2%42023
DVS-GestureSNN nativa97.6%162023
SHD (audio)SRNN92.4%1002022
N-Caltech101SNN-ResNet83.7%102022

📈 Tendencia 2023-2024

La brecha de accuracy entre SNNs y ANNs se está cerrando rápidamente, especialmente con Spiking Transformers (Spikformer, SpikingBERT) que combinan la arquitectura transformer con neuronas spiking, alcanzando accuracy competitiva con solo 4 pasos temporales.

Referencias académicas y recursos

📄 Papers fundacionales

PaperAutoresAñoContribución
Networks of spiking neurons: the third generation Maass, W. 1997 Definición formal de SNNs como tercera generación. Prueba de Turing-completitud.
A quantitative description of membrane current Hodgkin, A.L. & Huxley, A.F. 1952 Modelo biofísico completo del potencial de acción. Premio Nobel 1963.
Simple model of spiking neurons Izhikevich, E.M. 2003 Modelo de 2 ecuaciones que reproduce todos los patrones de disparo.
Synaptic modifications in cultured hippocampal neurons Bi, G.Q. & Poo, M.M. 1998 Descubrimiento experimental de STDP.
Surrogate Gradient Learning in SNNs Neftci, E.O. et al. 2019 Tutorial completo sobre surrogate gradients para entrenamiento de SNNs.
A solution to the learning dilemma for recurrent networks of spiking neurons Bellec, G. et al. 2020 E-prop: regla de aprendizaje biológicamente plausible.

📄 Papers recientes destacados

PaperAutoresAñoContribución
Training SNNs Using Lessons From Deep Learning Eshraghian, J.K. et al. 2023 Tutorial snnTorch + mejores prácticas de entrenamiento.
Spikformer: When Spiking Neural Network Meets Transformer Zhou, Z. et al. 2023 Spiking self-attention. SOTA en CIFAR y DVS datasets.
Spike-driven Transformer Yao, M. et al. 2023 Transformer full-spiking para ImageNet. 78.2% top-1.
SEW ResNet Fang, W. et al. 2021 Spike-Element-Wise ResNets. Resolver degradación en SNNs profundas.
Deep Continuous Local Learning (DECOLLE) Kaiser, J. et al. 2020 Aprendizaje local continuo sin BPTT completo.

🔗 Repositorios y recursos

📦
snnTorch
github.com/jeshraghian/snntorch
PyTorch-based. Tutoriales excelentes. +2.5K ⭐
📦
Norse
github.com/norse/norse
Modelos bio-realistas con PyTorch. +800 ⭐
📦
SpikingJelly
github.com/fangwei123456/spikingjelly
Alto rendimiento, CuPy backend. +2.7K ⭐
📦
Lava (Intel)
github.com/lava-nc/lava
Framework oficial para Intel Loihi. +600 ⭐
📦
BindsNET
github.com/BindsNET/bindsnet
ML + aprendizaje biológico (STDP). +1.5K ⭐
📦
Brian2
github.com/brian-team/brian2
Simulador de neurociencia. Ecuaciones en texto. +900 ⭐

📚 Recursos de aprendizaje

  • snnTorch Tutorials: snntorch.readthedocs.io/tutorials — Curso completo de SNNs con PyTorch (8 tutoriales).
  • Neuromatch Academy: compneuro.neuromatch.io — Curso de neurociencia computacional con módulo de SNNs.
  • Neuromorphic Computing Survey: Schuman, C.D. et al. (2022). Opportunities for neuromorphic computing algorithms and applications. Nature Comp. Science. DOI
  • TU Graz SNNs course: materiales del grupo de Wolfgang Maass (creador del concepto de SNNs como 3ª generación).
💡 Contexto dentro de esta web: Para entender cómo se comparan las SNNs con otros paradigmas de redes neuronales, consulta: Perceptrón y MLP (fundamentos de redes feedforward), CNNs (arquitecturas que inspiran las Spiking CNNs), RNNs (el paralelo más directo por su dimensión temporal), Aprendizaje por refuerzo (para entender R-STDP), y Optimización avanzada (las técnicas de entrenamiento clásicas que inspiran los surrogate gradients).