En esta página
Casi todo lo que he escrito en este blog trata sobre redes neuronales artificiales. Capas, funciones de pérdida, optimizadores. Y durante mucho tiempo eso me bastó. Hasta que un día me di cuenta de que podía entrenar un transformer, pero no sabía explicar por qué dispara una neurona de verdad. La palabra “neurona” en mi propio código era prestada, y nunca me había detenido a ver de dónde venía.
Así que me puse un proyecto: aprender neurociencia computacional en serio, y hacerlo de la única forma en que a mí se me queda: construyendo cada modelo, rompiéndolo y comprobando si de verdad lo había entendido.
Esa pequeña traza es donde empezó todo. Es la neurona leaky integrate-and-fire (LIF): el voltaje se carga como un capacitor con fugas, llega a un umbral, dispara y se reinicia. Es casi vergonzosamente simple, y aun así volví a ella más que a cualquier otro modelo.
Dieciocho semanas, a propósito
Quería un plan que de verdad pudiera terminar junto con un trabajo a tiempo completo, así que me quedé con 18 semanas de 5 a 8 horas cada una. El primer bloque trata sobre neuronas individuales (LIF, Hodgkin-Huxley, sinapsis). El segundo pasa a dinámica y redes: puntos fijos, poblaciones que oscilan, memorias de Hopfield, trenes de spikes con ruido. El tercero se enfoca en ajustar modelos a datos, y el último es una especialización y un proyecto final.
La mayor parte del material viene del currículo de Neuromatch Academy, que es gratuito y excelente. Mi ruta solo enlaza a él; el código y los notebooks son mi propia versión de cada tema.
Las figuras que me mintieron
Todas las semanas terminan igual: un script de Python que corre un experimento, dibuja una figura y
luego verifica el resultado con unos cuantos assert. El notebook que ves en GitHub se genera a
partir de ese script, así que hay una sola fuente que mantener al día, y un test falla si ambos se
desincronizan.
Al principio las verificaciones me parecían exageradas. Esa sensación no me duró mucho.
En la semana 4 bloqueé los canales de potasio de una neurona de Hodgkin-Huxley para ver qué le pasaba al potencial de acción. El gráfico mostraba una gran variación de voltaje justo al inicio, antes de cualquier estímulo, y por un rato intenté explicarlo como algo biológico. No lo era. Estaba arrancando la simulación en -65 mV, un potencial de reposo que simplemente no existe una vez que quitas el potasio; el equilibrio real está por encima de -20 mV. La neurona solo estaba cayendo hacia él. En la semana 13, el texto mencionaba errores estándar de un modelo de Poisson que el código nunca calculaba. Ambas cosas se veían perfectamente razonables en la página.
La semana 3 tiene mi tipo de verificación favorito. La tasa de disparo simulada tiene que caer sobre la curva f-I analítica, punto por punto, y nada dispara por debajo de la reobase de 1.5 nA:

Y la semana 8 fue donde la dinámica por fin me hizo clic. El mismo circuito de Wilson-Cowan, las mismas conexiones; solo cambia la entrada, y las poblaciones se quedan en silencio, empiezan a oscilar o se saturan:

Los sliders le ganan a los párrafos
Leer que un sistema “atraviesa una bifurcación de Hopf” me servía de muy poco. Arrastrar un slider hasta que un punto fijo se convierte en una órbita me servía muchísimo. Así que los modelos clave también tienen su propia página: HTML y JavaScript puros, nada que instalar, y funcionan en el celular.

Ahora son nueve:
| Módulo | Para qué lo uso |
|---|---|
| Neurona LIF | Ver cómo el ruido convierte un disparo regular en irregular |
| Hodgkin-Huxley | Ver qué hace cada compuerta durante un spike |
| Sinapsis | Qué tan cerca deben estar dos entradas para sumarse |
| Sistemas lineales 2D | Explorar a punta de clics el plano traza-determinante |
| Wilson-Cowan | Encontrar la entrada donde empiezan las oscilaciones |
| Red de Hopfield | Corromper un recuerdo y ver cómo vuelve |
| Trenes de spikes de Poisson | Cómo un periodo refractario cambia lo “aleatorio” |
| Decisión bayesiana | Mover el prior y la frontera de decisión |
| fNIRS con datos reales | El de más abajo |

Hacer que funcionaran en el celular fue más fastidioso que construirlos. Los gráficos se veían estirados en mi teléfono porque cada redibujado escalaba el canvas por el pixel ratio una vez más. Y ni siquiera podía probar un ancho de celular real en mi laptop, porque Windows no deja que una ventana del navegador sea mucho más angosta que 500 px, así que terminé revisando cada página dentro de un marco de 390 px.
Luego quise datos reales
Las simulaciones solo te llevan hasta cierto punto. En algún momento quieres ver una señal que salió de una cabeza de verdad. Encontré Cedalion, un framework de Python para fNIRS, una técnica que mide cambios en la oxigenación de la sangre a través del cuero cabelludo usando luz infrarroja cercana. Su tutorial usa un experimento clásico: mueves los dedos de una mano dando golpecitos, y la corteza motora del lado opuesto debería recibir más sangre oxigenada.
Analicé a un sujeto en un notebook, usando los primeros 1000 segundos del registro, 8 ensayos por mano. (Con el registro completo, el ajuste del modelo tardaba más de media hora, demasiado para algo que quería volver a correr seguido).
La mano izquierda funcionó de maravilla. Doce canales mostraron un aumento significativo de hemoglobina oxigenada, y 11 de ellos estaban en el hemisferio derecho, justo donde debían estar. El más fuerte alcanzó su pico unos 8 segundos después de empezar los golpecitos, y un simple promedio por bloques, sin ningún modelo, coincidió con la respuesta ajustada con r = 0.88. La mano derecha apuntaba en la misma dirección, pero ningún canal sobrevivió a la corrección por comparaciones múltiples. Con 8 ensayos, esa la dejo abierta.
De lo que más aprendí fue de un error que casi me quedo. El tutorial original compara los golpecitos contra una condición de “Control”, y yo hice lo mismo. La mano derecha salió bilateral, lo cual no tenía sentido. Al mirar con más detalle, la propia condición de Control estaba bajando la oxigenación en 10 canales, así que al restarla esas caídas aparecían como activaciones. Comparar contra el reposo hizo que el patrón desapareciera. Había tratado la elección de la línea base como un detalle de código, y en realidad era parte de la pregunta que estaba haciendo.
Una licencia que casi se me pasa
Cuando quise poner estos datos en una demo pública, leí bien el README del dataset:
Please use only for Cedalion example notebooks. No other use permitted.
Así que el notebook descarga esos datos cuando se ejecuta, y el repositorio nunca los incluye. Para la demo me cambié a un dataset abierto, fNIRS Finger Tapping Data in BIDS Format, de Robert Luke y David McAlpine, con 5 sujetos y 30 ensayos por condición. Un script corre el mismo análisis sobre todos ellos en unos 18 minutos y escribe los resultados en un archivo que la página carga directamente.

Puedes elegir un sujeto o el promedio del grupo y darle play para ver cómo la respuesta se va formando sobre la corteza motora y se desvanece después de los 10 segundos de golpecitos. La lateralización sale contralateral en 9 de las 10 combinaciones de sujeto y mano, lo cual fue un alivio después del drama con un solo sujeto.
Dónde está ahora
Las 18 semanas tienen su script y su notebook, cada uno validado. Las nueve demos están en línea. La extensión de fNIRS tiene su notebook y su demo. Todavía faltan plasticidad sináptica y reinforcement learning, y son lo siguiente en la lista. El código tiene licencia MIT, y cada dataset mantiene sus propios términos.
Nada de esto reemplaza un curso de verdad ni los papers, y la parte de fNIRS es para aprender, no para nada clínico. Pero ahora tengo algo que no tenía cuando empecé: para cada modelo de la ruta, puedo adivinar qué va a hacer un cambio de parámetro, correrlo y descubrir si tenía razón. Casi siempre no la tengo, y esa es la parte útil.
Si quieres darle una mirada:
- Código y notebooks: github.com/HiroForYou/computational-neuroscience
- Módulos interactivos: hiroforyou.github.io/computational-neuroscience/interactive
- El paper del tutorial de Cedalion: Middell, E. et al. (2026), Neurophotonics 13(S3), S32602, doi:10.1117/1.NPh.13.S3.S32602
Comentarios