En esta entrada introduciremos las redes neuronales, una pieza clave en el desarrollo de nuestro LLM. En el contexto de este proyecto, su importancia radica en que permiten transformar secuencias de tokens en representaciones internas que capturan patrones y relaciones complejas del lenguaje, muchas de ellas no lineales. Gracias a ello, el modelo puede predecir el siguiente token de forma mucho más flexible y potente que un modelo lineal.
Para ilustrar su relevancia, comenzaremos explicando qué entendemos por red neuronal y luego veremos un componente clave de ellas: las capas. Posteriormente, mediante un ejemplo —el problema XOR—, mostraremos que añadir capas permite construir representaciones internas más ricas, lo que amplía la capacidad del modelo para resolver problemas que un modelo lineal no puede resolver.
Redes neuronales: intro
Siguiendo a Jurafsky y Martin (2026), una red neuronal moderna puede entenderse como una red de pequeñas unidades computacionales, cada una de las cuales recibe un vector de entrada y produce una única salida. El término “neuronal” proviene de la neurona de McCulloch-Pitts, un modelo simplificado de la neurona biológica descrito en términos de lógica proposicional. Sin embargo, las redes neuronales contemporáneas se apartan de esa formulación original y hoy se utilizan sobre todo como modelos computacionales abstractos.
La arquitectura que veremos en esta entrada se llama feedforward network. Como es usual en redes neuronales, esta red estará compuesta por pequeñas unidades computacionales, donde cada unidad tiene la siguiente estructura:
Como ya hemos visto en otras entradas, será la salida, el sesgo, los pesos, y los valores de entrada. Al igual que en otras publicaciones, aplicaremos una función no lineal sobre , y lo que salga de ahí se llamará el valor de activación (a).
En la práctica, existen tres funciones no lineales importantes. Por una parte está :
Luego tenemos la sigmoide:
y finalmente, ReLU (del inglés rectified linear unit):
Tal como explican Jurafsky y Martin (2026), en este contexto las funciones de activación más empleadas son tanh —muchas veces en reemplazo de la sigmoide, porque en la práctica suele funcionar mejor— y ReLU. La función tanh es popular porque es suavemente diferenciable y porque lleva los valores extremos hacia el centro. ReLU, por su parte, es muy utilizada porque conserva ciertas ventajas de las funciones lineales al ser lineal cuando . En este sentido, en funciones como la sigmoide y , valores muy altos en magnitud de hacen que la salida se sature: en la sigmoide hacia 0 o 1, y en hacia -1 o 1. En esas zonas, las derivadas se vuelven muy pequeñas, lo que puede causar un problema conocido como vanishing gradient problem. En cambio, para ReLU, este problema no aparece de la misma forma para valores altos de activación.
En términos visuales, la unidad que mencionamos anteriormente se puede ilustrar de la siguiente forma:

En la práctica, es común utilizar múltiples unidades y múltiples capas. En la siguiente sección veremos esto en detalle.
Añadiendo capas
Anteriormente mostramos una unidad, no obstante, podemos conformar una red uniendo múltiples unidades. La arquitectura estándar para hacer esto se muestra en la siguiente imagen:

Como podemos ver, tenemos una red feedforward totalmente conectada, con una capa de entrada, una capa oculta (), y una de salida. Es totalmente conectada, porque cada se conecta con todos los , y cada con todos los nodos de salida. Además, es feedforward porque la información fluye únicamente desde la entrada hacia la salida, sin ciclos ni retroalimentación. Si deseas profundizar en la intuición, recomiendo que visites el siguiente recurso.
Añadiendo capas: el problema XOR.
En la introducción de esta publicación dijimos que añadir capas permite construir representaciones internas más ricas. Una forma clásica de ilustrar esta idea es mediante el problema XOR, que muestra que un perceptrón no puede computar esta función. La razón es que XOR no es linealmente separable. En cambio, al añadir una capa oculta, la red puede construir una nueva representación de la entrada que sí permite resolver el problema.
Para mostrar brevemente la lógica detrás de este problema, debemos definir qué es un perceptrón, y qué hace la operación AND, OR y XOR.
Un perceptron, es una unidad neuronal con la siguiente estructura:
La operación AND se define como:
la operación OR como:
y XOR como
Luego, siguiendo a Jurafsky y Martin (2026), podemos ver que si elegimos los siguientes pesos,
| 1 | 1 | -1 |
es posible construir la función AND. ¿Cómo? En la siguiente tabla lo hacemos en detalle:
También, con los siguientes pesos,
| 1 | 1 | 0 |
la función OR es representable, tal como lo evidencia la siguiente tabla:
No obstante, sin importar los pesos que elijamos, la función XOR no puede ser replicada, debido a que XOR no es linealmente separable (para una intuición simple, ver Jurafsky y Martin (2026) y para una más compleja, puedes consultar aquí). En cambio, al añadir una capa oculta, la red puede construir una nueva representación de la entrada que sí permite resolver el problema.
En la siguiente imagen, mostramos un esquema en el que la función XOR puede ser resuelta con una capa oculta:

A modo de ejercicio, prueba con los parámetros de la imagen, y verifica que la función XOR se pueda representar con aquellos.
Estructura de una red neuronal
Para ilustrar la estructura de una red neuronal, partiremos con un tipo de red simple llamado feedforward. Aquella, está compuesta por unidades de entrada, unidades ocultas y unidades de salida. Siguiendo la notación de Jurafsky y Martin (2026), denotaremos la capa oculta como , y cada una de sus unidades como . Como en este ejemplo tenemos una red completamente conectada, cada unidad de una capa tomará como entrada las salidas de todas las unidades de la capa anterior. Además, puesto que aquí trabajaremos con una sola capa oculta, será único. En cambio, si la red tuviera múltiples capas ocultas, usaremos una notación indexada por capa, como , para distinguir la activación de cada una de ellas.
Por otra parte, siguiendo Jurafsky y Martin (2026), definiremos una matriz , donde el elemento representa la conexión desde la entrada hasta la unidad oculta y un vector de sesgos. Por ejemplo, para la imagen, la matriz viene dada por:
y X y B por:
Entonces, en este ejercicio, la capa oculta , viene dada por:
es decir,
Luego, aplicamos a cada elemento, para obtener:
Hasta este punto hemos obtenido , no obstante, el objetivo es calcular la salida final . Dependiendo de la aplicación, puede ser un número real, o un vector. Si por ejemplo, la intención del investigador es calificar si algún texto es medieval o no, será un número real que contendrá una probabilidad. Por otra parte, si el objetivo es clasificar si el texto está escrito en español, inglés o portugués, probablemente, será un vector.
En el caso de que es un vector (de dos elementos, e ), y usando la notación de Jurafsky y Martin (2026), definiremos una matriz U que albergará los pesos de salida:
Luego, con la siguiente operación, obtenemos la salida intermedia:
Finalmente, para convertir la salida intermedia en la final, debemos convertir el vector anterior en uno que contenga probabilidades. Para eso, usamos la función softmax:
donde es el tamaño del vector (con para este ejemplo). En este punto, ya estamos listos para calcular los pesos, es decir, la matriz U y W. A continuación, esbozaremos el método para llevarlo a cabo.
Aprendiendo los pesos para cada capa
Tal como lo hemos hecho en otras entradas, el objetivo es aprender los parámetros de la red para que se aproxime lo mejor posible a . Para esto, usábamos una loss function. En este caso, al igual que en la entrada pasada, usamos la cross-entropy loss:
Finalmente, como sabemos, dicha función debe ser minimizada. En este sentido, dado el alcance de esta serie no expondremos la estrategia de minimización, no obstante, un lector interesado puede consultar la sección 6.6.2 de Jurafsky y Martin (2026) para mayor detalle.
Notas finales, y próxima entrada…
En esta entrada introdujimos las redes neuronales y explicamos sus fundamentos teóricos más básicos. Dado que se trata de un tópico central para nuestro proyecto, en la siguiente entrada desarrollaremos un ejemplo práctico.
José Miguel Muñoz Urra – jmunozu@pulki.es