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.
La neurona biológica
Para entender las SNNs, primero necesitamos entender la neurona real. Una neurona biológica tiene cuatro partes fundamentales:
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.
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.
| Fase | Potencial | Qué ocurre |
|---|---|---|
| Reposo | ~−70 mV | La neurona está en equilibrio. Canales Na⁺ cerrados. |
| Umbral | ~−55 mV | Si se alcanza, se dispara un potencial de acción. |
| Despolarización | → +30 mV | Canales Na⁺ se abren masivamente. Subida rápida. |
| Repolarización | → −70 mV | Canales K⁺ se abren, Na⁺ se cierran. El potencial cae. |
| Hiperpolarización | ~−80 mV | Periodo 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. DOISpike 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.
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.
ANN vs SNN: diferencias fundamentales
| Propiedad | ANN (2ª generación) | SNN (3ª generación) |
|---|---|---|
| Señal | Valores continuos (floats) | Spikes binarios en el tiempo |
| Activación | ReLU, sigmoid, softmax | Dinámica del potencial de membrana |
| Dimensión temporal | No inherente (excepto RNNs) | Intrínseca: cada spike tiene un timestamp |
| Computación | Multiply-accumulate (MAC) | Accumulate (AC) — solo cuando llega un spike |
| Consumo energético | Alto (todas las neuronas activas) | Bajo (sparse: solo las que disparan) |
| Hardware nativo | GPUs, TPUs | Chips neuromórficos (Loihi, TrueNorth, SpiNNaker) |
| Entrenamiento | Backprop (diferenciable) | Surrogate gradients, STDP, conversión ANN→SNN |
| Potencia teórica | Aproximador universal | Turing-completo (Maass, 1997) |
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.
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):
- La neurona emite un spike en el instante \( t \).
- El potencial se resetea: \( V \leftarrow V_{\text{reset}} \).
- 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 \):
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.
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
| Modelo | Ecuaciones | Realismo | Coste | Uso |
|---|---|---|---|---|
| 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.):
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:
| Tipo | a | b | c | d |
|---|---|---|---|---|
| Regular spiking | 0.02 | 0.2 | −65 | 8 |
| Intrinsically bursting | 0.02 | 0.2 | −55 | 4 |
| Chattering | 0.02 | 0.2 | −50 | 2 |
| Fast spiking | 0.1 | 0.2 | −65 | 2 |
Hodgkin & Huxley (1952) modelaron los canales iónicos del axón gigante del calamar. Premio Nobel en 1963.
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. DOISinapsis: 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 \):
Donde \( w_{ij} \) es el peso sináptico y \( \kappa(t) \) es el kernel post-sináptico (PSP kernel), típicamente:
con \( \Theta(t) \) la función escalón de Heaviside y \( \tau_s \) la constante de tiempo sináptica.
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.
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}")
La información se codifica en el tiempo exacto del spike: señal alta → spike temprano; señal baja → spike tardío.
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):
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:
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.
| Esquema | Spikes/neurona | Latencia | Eficiencia | Mejor para |
|---|---|---|---|---|
| Rate | Muchos | Alta | ⭐⭐ | Compatibilidad ANN |
| Temporal (TTFS) | 1 | Baja | ⭐⭐⭐⭐⭐ | Clasificación rápida |
| Delta | Variable | Muy baja | ⭐⭐⭐⭐ | Señales temporales / DVS |
| Population | Distribuidos | Media | ⭐⭐⭐ | 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. DOIDonde \( \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).
🧠 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.
Más allá de STDP: otras formas de plasticidad
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.
Esto hace que el backprop estándar no funcione: los gradientes son exactamente 0 o ∞. ¿Soluciones?
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.
| Nombre | Fórmula del surrogate gradient | Notas |
|---|---|---|
| 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. DOIimport 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.
- 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.
| Aspecto | Entrenamiento directo | Conversió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.
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.
Davies, M. et al. (2018). Loihi: A Neuromorphic Manycore Processor with On-Chip Learning. IEEE Micro, 38(1), 82–99. DOI
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
Furber, S. et al. (2014). The SpiNNaker Project. Proc. IEEE, 102(5), 652–665. DOI
Pehle, C. et al. (2022). The BrainScaleS-2 accelerated neuromorphic system with hybrid plasticity. Frontiers in Neuroscience, 16. DOI
| Chip | Neuronas | Sinapsis | Consumo | Aprendizaje on-chip | Tipo |
|---|---|---|---|---|---|
| Loihi 2 | 1M | 120M | ~1W | ✅ STDP, surrogates | Digital |
| TrueNorth | 1M | 256M | 70 mW | ❌ Solo inferencia | Digital |
| SpiNNaker 2 | ~1B (sim) | Variable | ~10W | ✅ Flexible (ARM) | Digital+ARM |
| BrainScaleS-2 | 512 | 131K | ~1W | ✅ Analógica | Analógico |
| GPU (A100) | N/A (software) | N/A | 300W | N/A | von Neumann |
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.
- 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")
| Framework | Backend | Enfoque | GPU | Complejidad |
|---|---|---|---|---|
| snnTorch | PyTorch | ML / DL | ✅ Nativo | ⭐⭐ |
| Norse | PyTorch | Bio-ML | ✅ Nativo | ⭐⭐⭐ |
| SpikingJelly | PyTorch+CuPy | ML rendimiento | ✅✅ CuPy | ⭐⭐⭐ |
| BindsNET | PyTorch | Bio-ML | ✅ Nativo | ⭐⭐ |
| Brian2 | NumPy/C++ | Neurociencia | ❌ | ⭐⭐⭐⭐ |
| NEST | C++/MPI | Neurociencia | ❌ | ⭐⭐⭐⭐⭐ |
| Lava (Intel) | Python/Loihi | Neuromórfico | Loihi | ⭐⭐⭐ |
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):
| Dataset | Tipo | Clases | Fuente | Tamaño |
|---|---|---|---|---|
| N-MNIST | Dígitos (DVS) | 10 | Cámara DVS moviendo MNIST | 70K samples |
| DVS-CIFAR10 | Objetos (DVS) | 10 | Monitor + cámara DVS | 10K samples |
| DVS-Gesture | Gestos manuales | 11 | Cámara DVS nativa | 1.5K samples |
| SHD | Audio (dígitos hablados) | 20 | Modelo coclear → spikes | 10K samples |
| SSC | Audio (comandos) | 35 | Modelo coclear → spikes | 100K samples |
| N-Caltech101 | Objetos (DVS) | 101 | Cámara DVS moviendo Caltech | 9K samples |
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.
SNNs vs ANNs: comparativa exhaustiva
| Dimensión | ANNs (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 |
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
| Benchmark | Método | Accuracy | Pasos T | Año |
|---|---|---|---|---|
| MNIST | SNN directo (snnTorch) | 99.5% | 25 | 2023 |
| CIFAR-10 | SEW-ResNet (SpikingJelly) | 95.5% | 4 | 2022 |
| CIFAR-100 | Spikformer | 79.1% | 4 | 2023 |
| ImageNet | Spike-driven Transformer | 78.2% | 4 | 2023 |
| DVS-Gesture | SNN nativa | 97.6% | 16 | 2023 |
| SHD (audio) | SRNN | 92.4% | 100 | 2022 |
| N-Caltech101 | SNN-ResNet | 83.7% | 10 | 2022 |
📈 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
| Paper | Autores | Año | Contribució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
| Paper | Autores | Año | Contribució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
📚 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).