📖 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
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
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.

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 →
📊
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.

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.

$$\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.

🔬 Widget: 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.

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. J. Physiology.

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!

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:

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.

$$\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

🧠 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| \).

🔬 Widget: 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.

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):

$$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−Vth) 😱 ∂σ̃/∂V ≈ suave ✓

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:

$$\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.
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:

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)

Otras estrategias de entrenamiento

🧬
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.

🔵
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. IEEE Micro.
🔴
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 IC. Science.
🟢
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.
🟡
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. arXiv:2201.11063.
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:

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.

  • Ventajas: CuPy backend para máximo rendimiento, neuromorphic datasets integrados (DVS-CIFAR10, N-MNIST).
  • Repo: github.com/fangwei123456/spikingjelly

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.

Aplicaciones de las Spiking Neural Networks

🤖
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.

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/en/latest/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 Textbook: Schuman, C.D. et al. (2022) — Survey completo del campo.
  • TU Graz SNNs course: materiales del grupo de Wolfgang Maass (creador del concepto de SNNs como 3ª generación).