{"id":158,"date":"2026-04-11T18:01:03","date_gmt":"2026-04-11T18:01:03","guid":{"rendered":"https:\/\/pulki.es\/blog\/?p=158"},"modified":"2026-04-11T18:01:03","modified_gmt":"2026-04-11T18:01:03","slug":"large-language-model-llm-from-scratch-neural-networks","status":"publish","type":"post","link":"https:\/\/pulki.es\/blog\/index.php\/2026\/04\/11\/large-language-model-llm-from-scratch-neural-networks\/","title":{"rendered":"Large Language Model (LLM) from scratch. Neural Networks."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">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\u00e1s flexible y potente que un modelo lineal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ilustrar su relevancia, comenzaremos explicando qu\u00e9 entendemos por red neuronal y luego veremos un componente clave de ellas: las capas. Posteriormente, mediante un ejemplo \u2014el problema XOR\u2014, mostraremos que a\u00f1adir capas permite construir representaciones internas m\u00e1s ricas, lo que ampl\u00eda la capacidad del modelo para resolver problemas que un modelo lineal no puede resolver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Redes neuronales<\/em><\/strong>: <em><strong>intro<\/strong><\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Siguiendo a <strong>Jurafsky y Martin (2026)<\/strong>, una red neuronal moderna puede entenderse como una red de peque\u00f1as unidades computacionales, cada una de las cuales recibe un vector de entrada y produce una \u00fanica salida. El t\u00e9rmino \u201cneuronal\u201d proviene de la neurona de McCulloch-Pitts, un modelo simplificado de la neurona biol\u00f3gica descrito en t\u00e9rminos de l\u00f3gica proposicional. Sin embargo, las redes neuronales contempor\u00e1neas se apartan de esa formulaci\u00f3n original y hoy se utilizan sobre todo como modelos computacionales abstractos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La arquitectura que veremos en esta entrada se llama <strong>feedforward network<\/strong>. Como es usual en redes neuronales, esta red estar\u00e1 compuesta por peque\u00f1as unidades computacionales, donde cada unidad tiene la siguiente estructura:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>z<\/mi><mo>=<\/mo><mi>b<\/mi><mo>+<\/mo><mrow><munder><mo movablelimits=\"false\">\u2211<\/mo><mi>i<\/mi><\/munder><\/mrow><msub><mi>w<\/mi><mi>i<\/mi><\/msub><msub><mi>x<\/mi><mi>i<\/mi><\/msub><mi>.<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">z = b + \\sum_{i}w_{i}x_{i}.<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Como ya hemos visto en otras entradas, <math data-latex=\"z\"><semantics><mi>z<\/mi><annotation encoding=\"application\/x-tex\">z<\/annotation><\/semantics><\/math> ser\u00e1 la salida, <math data-latex=\"b\"><semantics><mi>b<\/mi><annotation encoding=\"application\/x-tex\">b<\/annotation><\/semantics><\/math> el sesgo, <math data-latex=\"w_{i}\"><semantics><msub><mi>w<\/mi><mi>i<\/mi><\/msub><annotation encoding=\"application\/x-tex\">w_{i}<\/annotation><\/semantics><\/math> los pesos, y <math data-latex=\"x_{i}\"><semantics><msub><mi>x<\/mi><mi>i<\/mi><\/msub><annotation encoding=\"application\/x-tex\">x_{i}<\/annotation><\/semantics><\/math> los valores de entrada. Al igual que en otras publicaciones, aplicaremos una funci\u00f3n no lineal sobre <math data-latex=\"z\"><semantics><mi>z<\/mi><annotation encoding=\"application\/x-tex\">z<\/annotation><\/semantics><\/math>, y lo que salga de ah\u00ed se llamar\u00e1 el <strong>valor de activaci\u00f3n<\/strong> (a).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En la pr\u00e1ctica, existen tres funciones no lineales importantes. Por una parte est\u00e1 <math data-latex=\"\\tanh()\"><semantics><mrow><mrow><mi>tanh<\/mi><mo>\u2061<\/mo><\/mrow><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">\\tanh()<\/annotation><\/semantics><\/math>:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>a<\/mi><mo>=<\/mo><mi>t<\/mi><mi>a<\/mi><mi>n<\/mi><mi>h<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>z<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><mfrac><mrow><msup><mi>e<\/mi><mi>z<\/mi><\/msup><mo>\u2212<\/mo><msup><mi>e<\/mi><mrow><mo lspace=\"0em\" rspace=\"0em\">\u2212<\/mo><mi>z<\/mi><\/mrow><\/msup><\/mrow><mrow><msup><mi>e<\/mi><mi>z<\/mi><\/msup><mo>+<\/mo><msup><mi>e<\/mi><mrow><mo lspace=\"0em\" rspace=\"0em\">\u2212<\/mo><mi>z<\/mi><\/mrow><\/msup><\/mrow><\/mfrac><\/mrow><annotation encoding=\"application\/x-tex\">a = tanh(z) = \\frac{e^{z} &#8211; e^{-z}}{e^{z} + e^{-z}}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Luego tenemos la sigmoide:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>a<\/mi><mo>=<\/mo><mi>\u03c3<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>z<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><mfrac><mn>1<\/mn><mrow><mn>1<\/mn><mo>+<\/mo><msup><mi>e<\/mi><mrow><mo lspace=\"0em\" rspace=\"0em\">\u2212<\/mo><mi>z<\/mi><\/mrow><\/msup><\/mrow><\/mfrac><\/mrow><annotation encoding=\"application\/x-tex\">a = \\sigma(z) = \\frac{1}{1+e^{-z}}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">y finalmente, ReLU (del ingl\u00e9s<em> rectified linear unit<\/em>):<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>a<\/mi><mo>=<\/mo><mi>R<\/mi><mi>e<\/mi><mi>L<\/mi><mi>U<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>z<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><mrow><mi>max<\/mi><mo>\u2061<\/mo><\/mrow><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mn>0<\/mn><mo separator=\"true\">,<\/mo><mi>z<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mi>.<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">a = ReLU(z) = \\max(0,z).<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Tal como explican <strong>Jurafsky y Martin (2026)<\/strong>, en este contexto las funciones de activaci\u00f3n m\u00e1s empleadas son <strong>tanh<\/strong> \u2014muchas veces en reemplazo de la sigmoide, porque en la pr\u00e1ctica suele funcionar mejor\u2014 y <strong>ReLU<\/strong>. La funci\u00f3n <strong>tanh<\/strong> es popular porque es suavemente diferenciable y porque lleva los valores extremos hacia el centro. <strong>ReLU<\/strong>, por su parte, es muy utilizada porque conserva ciertas ventajas de las funciones lineales al ser lineal cuando <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>z<\/mi><mo>&gt;<\/mo><mn>0<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">z&gt;0<\/annotation><\/semantics><\/math>. En este sentido, en funciones como la sigmoide y <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>t<\/mi><mi>a<\/mi><mi>n<\/mi><mi>h<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">tanh<\/annotation><\/semantics><\/math>, valores muy altos en magnitud de <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>z<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">z<\/annotation><\/semantics><\/math> hacen que la salida se sature: en la sigmoide hacia 0 o 1, y en <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>t<\/mi><mi>a<\/mi><mi>n<\/mi><mi>h<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">tanh<\/annotation><\/semantics><\/math> hacia -1 o 1. En esas zonas, las derivadas se vuelven muy peque\u00f1as, lo que puede causar un problema conocido como <em>vanishing gradient problem<\/em>. En cambio, para <strong>ReLU<\/strong>, este problema no aparece de la misma forma para valores altos de activaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En t\u00e9rminos visuales, la unidad que mencionamos anteriormente se puede ilustrar de la siguiente forma:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"611\" src=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_9ak0zv9ak0zv9ak0-1024x611.png\" alt=\"\" class=\"wp-image-164\" srcset=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_9ak0zv9ak0zv9ak0-1024x611.png 1024w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_9ak0zv9ak0zv9ak0-300x179.png 300w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_9ak0zv9ak0zv9ak0-768x459.png 768w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_9ak0zv9ak0zv9ak0.png 1340w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">En la pr\u00e1ctica, es com\u00fan utilizar m\u00faltiples unidades y m\u00faltiples capas. En la siguiente secci\u00f3n veremos esto en detalle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>A\u00f1adiendo capas<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anteriormente mostramos una unidad, no obstante, podemos conformar una red uniendo m\u00faltiples unidades. La arquitectura est\u00e1ndar para hacer esto se muestra en la siguiente imagen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"657\" src=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-5-1024x657.png\" alt=\"\" class=\"wp-image-168\" srcset=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-5-1024x657.png 1024w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-5-300x193.png 300w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-5-768x493.png 768w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-5.png 1232w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Como podemos ver, tenemos una red <strong>feedforward<\/strong> totalmente conectada, con una capa de entrada, una capa oculta (<math data-latex=\"h\"><semantics><mi>h<\/mi><annotation encoding=\"application\/x-tex\">h<\/annotation><\/semantics><\/math>), y una de salida. Es totalmente conectada, porque cada <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>x<\/mi><mi>i<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">x_i<\/annotation><\/semantics><\/math> se conecta con todos los <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>h<\/mi><mi>j<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">h_j<\/annotation><\/semantics><\/math>, y cada <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>h<\/mi><mi>j<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">h_j<\/annotation><\/semantics><\/math>\u200b con todos los nodos de salida. Adem\u00e1s, es feedforward porque la informaci\u00f3n fluye \u00fanicamente desde la entrada hacia la salida, sin ciclos ni retroalimentaci\u00f3n. Si deseas profundizar en la intuici\u00f3n, recomiendo que visites el siguiente <a href=\"https:\/\/www.3blue1brown.com\/lessons\/neural-networks#title\">recurso<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>A\u00f1adiendo capas: el problema XOR.<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En la introducci\u00f3n de esta publicaci\u00f3n dijimos que a\u00f1adir capas permite construir representaciones internas m\u00e1s ricas. Una forma cl\u00e1sica de ilustrar esta idea es mediante el problema XOR, que muestra que un <strong>perceptr\u00f3n<\/strong> no puede computar esta funci\u00f3n. La raz\u00f3n es que XOR no es linealmente separable. En cambio, al a\u00f1adir una capa oculta, la red puede construir una nueva representaci\u00f3n de la entrada que s\u00ed permite resolver el problema.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para mostrar brevemente la l\u00f3gica detr\u00e1s de este problema, debemos definir qu\u00e9 es un <strong>perceptr\u00f3n<\/strong>, y qu\u00e9 hace la operaci\u00f3n AND, OR y XOR.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un <strong>perceptron<\/strong>, es una unidad neuronal con la siguiente estructura:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>y<\/mi><mo>=<\/mo><mrow><mo fence=\"true\" form=\"prefix\">{<\/mo><mtable><mtr><mtd class=\"tml-left\" style=\"padding-left:0em;padding-right:0em;\"><mrow><mn>0<\/mn><mo separator=\"true\">,<\/mo><\/mrow><\/mtd><mtd class=\"tml-left\" style=\"padding-left:1em;padding-right:0em;\"><mrow><mtext>si&nbsp;<\/mtext><mi>\ud835\udc30<\/mi><mo>\u22c5<\/mo><mi>\ud835\udc31<\/mi><mo>+<\/mo><mi>b<\/mi><mo>\u2264<\/mo><mn>0<\/mn><\/mrow><\/mtd><\/mtr><mtr><mtd class=\"tml-left\" style=\"padding-left:0em;padding-right:0em;\"><mrow><mn>1<\/mn><mo separator=\"true\">,<\/mo><\/mrow><\/mtd><mtd class=\"tml-left\" style=\"padding-left:1em;padding-right:0em;\"><mrow><mtext>si&nbsp;<\/mtext><mi>\ud835\udc30<\/mi><mo>\u22c5<\/mo><mi>\ud835\udc31<\/mi><mo>+<\/mo><mi>b<\/mi><mo>&gt;<\/mo><mn>0<\/mn><\/mrow><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\"><\/mo><\/mrow><\/mrow><annotation encoding=\"application\/x-tex\">y =\n\\begin{cases}\n0, &amp; \\text{si } \\mathbf{w}\\cdot\\mathbf{x} + b \\leq 0 \\\\\n1, &amp; \\text{si } \\mathbf{w}\\cdot\\mathbf{x} + b &gt; 0\n\\end{cases}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">La operaci\u00f3n AND se define como:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mtext>AND<\/mtext><mo>=<\/mo><mspace width=\"2em\"><\/mspace><mtable columnalign=\"center center center\"><mtr><mtd style=\"border-bottom:0.06em solid;padding-left:0pt;padding-right:5.9776pt;\"><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mtd><mtd style=\"border-bottom:0.06em solid;padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><msub><mi>x<\/mi><mn>2<\/mn><\/msub><\/mtd><mtd style=\"border-bottom:0.06em solid;padding-left:5.9776pt;padding-right:0pt;\"><mi>y<\/mi><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><\/mrow><annotation encoding=\"application\/x-tex\">\\text{AND} =\n\\qquad\n\\begin{array}{c c|c}\nx_1 &amp; x_2 &amp; y \\\\\n\\hline\n0 &amp; 0 &amp; 0 \\\\\n0 &amp; 1 &amp; 0 \\\\\n1 &amp; 0 &amp; 0 \\\\\n1 &amp; 1 &amp; 1\n\\end{array}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">la operaci\u00f3n OR como:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mtext>OR<\/mtext><mo>=<\/mo><mspace width=\"2em\"><\/mspace><mtable columnalign=\"center center center\"><mtr><mtd style=\"border-bottom:0.06em solid;padding-left:0pt;padding-right:5.9776pt;\"><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mtd><mtd style=\"border-bottom:0.06em solid;padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><msub><mi>x<\/mi><mn>2<\/mn><\/msub><\/mtd><mtd style=\"border-bottom:0.06em solid;padding-left:5.9776pt;padding-right:0pt;\"><mi>y<\/mi><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>1<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>1<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><\/mrow><annotation encoding=\"application\/x-tex\">\\text{OR} =\n\\qquad\n\\begin{array}{c c|c}\nx_1 &amp; x_2 &amp; y \\\\\n\\hline\n0 &amp; 0 &amp; 0 \\\\\n0 &amp; 1 &amp; 1 \\\\\n1 &amp; 0 &amp; 1 \\\\\n1 &amp; 1 &amp; 1\n\\end{array}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">y XOR como<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mtext>XOR<\/mtext><mo>=<\/mo><mspace width=\"2em\"><\/mspace><mtable columnalign=\"center center center\"><mtr><mtd style=\"border-bottom:0.06em solid;padding-left:0pt;padding-right:5.9776pt;\"><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mtd><mtd style=\"border-bottom:0.06em solid;padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><msub><mi>x<\/mi><mn>2<\/mn><\/msub><\/mtd><mtd style=\"border-bottom:0.06em solid;padding-left:5.9776pt;padding-right:0pt;\"><mi>y<\/mi><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>1<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>1<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>0<\/mn><\/mtd><\/mtr><\/mtable><\/mrow><annotation encoding=\"application\/x-tex\">\\text{XOR} =\n\\qquad\n\\begin{array}{c c|c}\nx_1 &amp; x_2 &amp; y \\\\\n\\hline\n0 &amp; 0 &amp; 0 \\\\\n0 &amp; 1 &amp; 1 \\\\\n1 &amp; 0 &amp; 1 \\\\\n1 &amp; 1 &amp; 0\n\\end{array}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Luego, siguiendo a <strong>Jurafsky y Martin (2026)<\/strong>, podemos ver que si elegimos los siguientes pesos,<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><math data-latex=\"w_{1}\"><semantics><msub><mi>w<\/mi><mn>1<\/mn><\/msub><annotation encoding=\"application\/x-tex\">w_{1}<\/annotation><\/semantics><\/math><\/td><td><math data-latex=\"w_{2}\"><semantics><msub><mi>w<\/mi><mn>2<\/mn><\/msub><annotation encoding=\"application\/x-tex\">w_{2}<\/annotation><\/semantics><\/math><\/td><td><math data-latex=\"b\"><semantics><mi>b<\/mi><annotation encoding=\"application\/x-tex\">b<\/annotation><\/semantics><\/math><\/td><\/tr><tr><td>1<\/td><td>1<\/td><td>-1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">es posible construir la funci\u00f3n AND. \u00bfC\u00f3mo? En la siguiente tabla lo hacemos en detalle:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mtable columnalign=\"center center center center\"><mtr><mtd style=\"border-bottom:0.06em solid;padding-left:0pt;padding-right:5.9776pt;\"><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mtd><mtd style=\"border-bottom:0.06em solid;padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><msub><mi>x<\/mi><mn>2<\/mn><\/msub><\/mtd><mtd style=\"border-bottom:0.06em solid;padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mrow><mi>w<\/mi><mo>\u22c5<\/mo><mi>x<\/mi><mo>+<\/mo><mi>b<\/mi><\/mrow><\/mtd><mtd style=\"border-bottom:0.06em solid;padding-left:5.9776pt;padding-right:0pt;\"><mi>y<\/mi><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mrow><mn>1<\/mn><mo>\u00d7<\/mo><mn>0<\/mn><mo>+<\/mo><mn>1<\/mn><mo>\u00d7<\/mo><mn>0<\/mn><mo>\u2212<\/mo><mn>1<\/mn><mo>\u2264<\/mo><mn>0<\/mn><\/mrow><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mrow><mn>1<\/mn><mo>\u00d7<\/mo><mn>0<\/mn><mo>+<\/mo><mn>1<\/mn><mo>\u00d7<\/mo><mn>1<\/mn><mo>\u2212<\/mo><mn>1<\/mn><mo>\u2264<\/mo><mn>0<\/mn><\/mrow><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mrow><mn>1<\/mn><mo>\u00d7<\/mo><mn>1<\/mn><mo>+<\/mo><mn>1<\/mn><mo>\u00d7<\/mo><mn>0<\/mn><mo>\u2212<\/mo><mn>1<\/mn><mo>\u2264<\/mo><mn>0<\/mn><\/mrow><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mrow><mn>1<\/mn><mo>\u00d7<\/mo><mn>1<\/mn><mo>+<\/mo><mn>1<\/mn><mo>\u00d7<\/mo><mn>1<\/mn><mo>\u2212<\/mo><mn>1<\/mn><mo>&gt;<\/mo><mn>0<\/mn><\/mrow><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><annotation encoding=\"application\/x-tex\">\\begin{array}{c c| c |c}\nx_1 &amp; x_2 &amp; w\\cdot x + b &amp; y \\\\\n\\hline\n0 &amp; 0 &amp; 1 \\times 0 + 1\\times 0-1 \\leq 0 &amp; 0 \\\\\n0 &amp; 1 &amp; 1 \\times 0 + 1\\times 1-1 \\leq 0 &amp; 0 \\\\\n1 &amp; 0 &amp; 1 \\times 1 + 1\\times 0-1 \\leq 0 &amp; 0 \\\\\n1 &amp; 1 &amp; 1 \\times 1 + 1\\times 1-1&gt;0 &amp; 1\n\\end{array}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n, con los siguientes pesos,<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><math data-latex=\"w_{1}\"><semantics><msub><mi>w<\/mi><mn>1<\/mn><\/msub><annotation encoding=\"application\/x-tex\">w_{1}<\/annotation><\/semantics><\/math><\/td><td><math data-latex=\"w_{2}\"><semantics><msub><mi>w<\/mi><mn>2<\/mn><\/msub><annotation encoding=\"application\/x-tex\">w_{2}<\/annotation><\/semantics><\/math><\/td><td><math data-latex=\"b\"><semantics><mi>b<\/mi><annotation encoding=\"application\/x-tex\">b<\/annotation><\/semantics><\/math><\/td><\/tr><tr><td>1<\/td><td>1<\/td><td>0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">la funci\u00f3n OR es representable, tal como lo evidencia la siguiente tabla:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mtable columnalign=\"center center center center\"><mtr><mtd style=\"border-bottom:0.06em solid;padding-left:0pt;padding-right:5.9776pt;\"><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mtd><mtd style=\"border-bottom:0.06em solid;padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><msub><mi>x<\/mi><mn>2<\/mn><\/msub><\/mtd><mtd style=\"border-bottom:0.06em solid;padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mrow><mi>w<\/mi><mo>\u22c5<\/mo><mi>x<\/mi><mo>+<\/mo><mi>b<\/mi><\/mrow><\/mtd><mtd style=\"border-bottom:0.06em solid;padding-left:5.9776pt;padding-right:0pt;\"><mi>y<\/mi><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mrow><mn>1<\/mn><mo>\u00d7<\/mo><mn>0<\/mn><mo>+<\/mo><mn>1<\/mn><mo>\u00d7<\/mo><mn>0<\/mn><mo>+<\/mo><mn>0<\/mn><mo>\u2264<\/mo><mn>0<\/mn><\/mrow><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mrow><mn>1<\/mn><mo>\u00d7<\/mo><mn>0<\/mn><mo>+<\/mo><mn>1<\/mn><mo>\u00d7<\/mo><mn>1<\/mn><mo>+<\/mo><mn>0<\/mn><mo>&gt;<\/mo><mn>0<\/mn><\/mrow><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>1<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>0<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mrow><mn>1<\/mn><mo>\u00d7<\/mo><mn>1<\/mn><mo>+<\/mo><mn>1<\/mn><mo>\u00d7<\/mo><mn>0<\/mn><mo>+<\/mo><mn>0<\/mn><mo>&gt;<\/mo><mn>0<\/mn><\/mrow><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>1<\/mn><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0pt;padding-right:5.9776pt;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mn>1<\/mn><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:5.9776pt;border-right:0.06em solid;\"><mrow><mn>1<\/mn><mo>\u00d7<\/mo><mn>1<\/mn><mo>+<\/mo><mn>1<\/mn><mo>\u00d7<\/mo><mn>1<\/mn><mo>+<\/mo><mn>0<\/mn><mo>&gt;<\/mo><mn>0<\/mn><\/mrow><\/mtd><mtd style=\"padding-left:5.9776pt;padding-right:0pt;\"><mn>1<\/mn><\/mtd><\/mtr><\/mtable><annotation encoding=\"application\/x-tex\">\\begin{array}{c c| c |c}\nx_1 &amp; x_2 &amp; w\\cdot x + b &amp; y \\\\\n\\hline\n0 &amp; 0 &amp; 1 \\times 0 + 1\\times 0+0 \\leq 0 &amp; 0 \\\\\n0 &amp; 1 &amp; 1 \\times 0 + 1\\times 1+0 &gt; 0 &amp; 1 \\\\\n1 &amp; 0 &amp; 1 \\times 1 + 1\\times 0+0 &gt; 0 &amp; 1 \\\\\n1 &amp; 1 &amp; 1 \\times 1 + 1\\times 1+0&gt;0 &amp; 1\n\\end{array}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">No obstante, sin importar los pesos que elijamos, la funci\u00f3n XOR no puede ser replicada, debido a que XOR no es linealmente separable (para una intuici\u00f3n simple, ver <strong>Jurafsky y Martin (2026)<\/strong> y para una m\u00e1s compleja, puedes consultar <a href=\"https:\/\/www.deeplearningbook.org\/contents\/mlp.html\">aqu\u00ed<\/a>). En cambio, al a\u00f1adir una capa oculta, la red puede construir una nueva representaci\u00f3n de la entrada que s\u00ed permite resolver el problema.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En la siguiente imagen, mostramos un esquema en el que la funci\u00f3n XOR puede ser resuelta con una capa oculta:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"676\" src=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-7-1024x676.png\" alt=\"\" class=\"wp-image-172\" srcset=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-7-1024x676.png 1024w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-7-300x198.png 300w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-7-768x507.png 768w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-7.png 1194w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A modo de ejercicio, prueba con los par\u00e1metros de la imagen, y verifica que la funci\u00f3n XOR se pueda representar con aquellos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Estructura de una red neuronal<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ilustrar la estructura de una red neuronal, partiremos con un tipo de red simple llamado <em>feedforward<\/em>. Aquella, est\u00e1 compuesta por unidades de entrada, unidades ocultas y unidades de salida. Siguiendo la notaci\u00f3n de <strong>Jurafsky y Martin (2026)<\/strong>, denotaremos la capa oculta como <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>h<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">h<\/annotation><\/semantics><\/math>, y cada una de sus unidades como <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>h<\/mi><mi>i<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">h_i<\/annotation><\/semantics><\/math>. Como en este ejemplo tenemos una red completamente conectada, cada unidad de una capa tomar\u00e1 como entrada las salidas de todas las unidades de la capa anterior. Adem\u00e1s, puesto que aqu\u00ed trabajaremos con una sola capa oculta, <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>h<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">h<\/annotation><\/semantics><\/math> ser\u00e1 \u00fanico. En cambio, si la red tuviera m\u00faltiples capas ocultas, usaremos una notaci\u00f3n indexada por capa, como <math data-latex=\"a^{[i]}\"><semantics><msup><mi>a<\/mi><mrow><mo form=\"prefix\" stretchy=\"false\" lspace=\"0em\" rspace=\"0em\">[<\/mo><mi>i<\/mi><mo form=\"postfix\" stretchy=\"false\" lspace=\"0em\" rspace=\"0em\">]<\/mo><\/mrow><\/msup><annotation encoding=\"application\/x-tex\">a^{[i]}<\/annotation><\/semantics><\/math>, para distinguir la activaci\u00f3n de cada una de ellas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por otra parte, siguiendo <strong>Jurafsky y Martin (2026)<\/strong>, definiremos una matriz <strong><math data-latex=\"W\"><semantics><mi>W<\/mi><annotation encoding=\"application\/x-tex\">W<\/annotation><\/semantics><\/math><\/strong>, donde el elemento <math data-latex=\"i\"><semantics><mi>i<\/mi><annotation encoding=\"application\/x-tex\">i<\/annotation><\/semantics><\/math> representa la conexi\u00f3n desde la entrada <math data-latex=\"x_{i}\"><semantics><msub><mi>x<\/mi><mi>i<\/mi><\/msub><annotation encoding=\"application\/x-tex\">x_{i}<\/annotation><\/semantics><\/math> hasta la unidad oculta <math data-latex=\"h_{j}\"><semantics><msub><mi>h<\/mi><mi>j<\/mi><\/msub><annotation encoding=\"application\/x-tex\">h_{j}<\/annotation><\/semantics><\/math><strong> <\/strong>y <strong><math data-latex=\"b\"><semantics><mi>b<\/mi><annotation encoding=\"application\/x-tex\">b<\/annotation><\/semantics><\/math><\/strong> un vector de sesgos. Por ejemplo, para la imagen, la matriz viene dada por:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>W<\/mi><mo>=<\/mo><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center center\"><mtr><mtd style=\"padding-left:0em;\"><msub><mi>w<\/mi><mrow><msub><mi>h<\/mi><mn>1<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mrow><\/msub><\/mtd><mtd style=\"padding-right:0em;\"><msub><mi>w<\/mi><mrow><msub><mi>h<\/mi><mn>1<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>x<\/mi><mn>2<\/mn><\/msub><\/mrow><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><msub><mi>w<\/mi><mrow><msub><mi>h<\/mi><mn>2<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mrow><\/msub><\/mtd><mtd style=\"padding-right:0em;\"><msub><mi>w<\/mi><mrow><msub><mi>h<\/mi><mn>2<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>x<\/mi><mn>2<\/mn><\/msub><\/mrow><\/msub><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><mo separator=\"true\">,<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">W=\\begin{bmatrix} w_{h_{1},x_{1}} &amp; w_{h_{1},x_{2}} \\\\ w_{h_{2},x_{1}} &amp; w_{h_{2},x_{2}}\\end{bmatrix},\n<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">y <strong>X<\/strong> y <strong>B<\/strong> por:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>X<\/mi><mo>=<\/mo><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>x<\/mi><mn>2<\/mn><\/msub><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><mspace width=\"1em\"><\/mspace><mi>B<\/mi><mo>=<\/mo><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>b<\/mi><msub><mi>h<\/mi><mn>1<\/mn><\/msub><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><msub><mi>b<\/mi><msub><mi>h<\/mi><mn>2<\/mn><\/msub><\/msub><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><\/mrow><annotation encoding=\"application\/x-tex\">X =\\begin{bmatrix} x_{1}\\\\ x_{2}\\end{bmatrix} \\quad B=\\begin{bmatrix} b_{h_{1}}\\\\ b_{h_{2}}\\end{bmatrix}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Entonces, en este ejercicio, la capa oculta <strong><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>h<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">h<\/annotation><\/semantics><\/math><\/strong>, viene dada por:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>h<\/mi><mo>=<\/mo><mi>\u03c3<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>W<\/mi><mi>x<\/mi><mo>+<\/mo><mi>b<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mi>.<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">h = \\sigma(Wx + b).<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">es decir,<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>h<\/mi><mo>=<\/mo><mi>\u03c3<\/mi><mo fence=\"false\" symmetric=\"true\" minsize=\"2.4em\" maxsize=\"2.4em\">(<\/mo><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><msub><mi>w<\/mi><mrow><msub><mi>h<\/mi><mn>1<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mrow><\/msub><msub><mi>x<\/mi><mn>1<\/mn><\/msub><mo>+<\/mo><msub><mi>w<\/mi><mrow><msub><mi>h<\/mi><mn>1<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>x<\/mi><mn>2<\/mn><\/msub><\/mrow><\/msub><msub><mi>x<\/mi><mn>2<\/mn><\/msub><mo>+<\/mo><msub><mi>b<\/mi><msub><mi>h<\/mi><mn>1<\/mn><\/msub><\/msub><\/mrow><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><msub><mi>w<\/mi><mrow><msub><mi>h<\/mi><mn>2<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mrow><\/msub><msub><mi>x<\/mi><mn>1<\/mn><\/msub><mo>+<\/mo><msub><mi>w<\/mi><mrow><msub><mi>h<\/mi><mn>2<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>x<\/mi><mn>2<\/mn><\/msub><\/mrow><\/msub><msub><mi>x<\/mi><mn>2<\/mn><\/msub><mo>+<\/mo><msub><mi>b<\/mi><msub><mi>h<\/mi><mn>2<\/mn><\/msub><\/msub><\/mrow><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><mo fence=\"false\" symmetric=\"true\" minsize=\"2.4em\" maxsize=\"2.4em\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">h =\\sigma\\bigg(\\begin{bmatrix} w_{h_{1},x_{1}}x_{1} + w_{h_{1},x_{2}}x_{2} + b_{h_{1}}\\\\ w_{h_{2},x_{1}}x_{1} + w_{h_{2},x_{2}}x_{2} + b_{h_{2}}\\end{bmatrix}\\bigg)<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Luego, aplicamos <math data-latex=\"\\sigma(\\cdot)\"><semantics><mrow><mi>\u03c3<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mo form=\"prefix\" stretchy=\"false\">\u22c5<\/mo><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">\\sigma(\\cdot)<\/annotation><\/semantics><\/math> a cada elemento, para obtener:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>h<\/mi><mo>=<\/mo><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center\"><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mi>\u03c3<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><msub><mi>w<\/mi><mrow><msub><mi>h<\/mi><mn>1<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mrow><\/msub><msub><mi>x<\/mi><mn>1<\/mn><\/msub><mo>+<\/mo><msub><mi>w<\/mi><mrow><msub><mi>h<\/mi><mn>1<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>x<\/mi><mn>2<\/mn><\/msub><\/mrow><\/msub><msub><mi>x<\/mi><mn>2<\/mn><\/msub><mo>+<\/mo><msub><mi>b<\/mi><msub><mi>h<\/mi><mn>1<\/mn><\/msub><\/msub><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;padding-right:0em;\"><mrow><mi>\u03c3<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><msub><mi>w<\/mi><mrow><msub><mi>h<\/mi><mn>2<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>x<\/mi><mn>1<\/mn><\/msub><\/mrow><\/msub><msub><mi>x<\/mi><mn>1<\/mn><\/msub><mo>+<\/mo><msub><mi>w<\/mi><mrow><msub><mi>h<\/mi><mn>2<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>x<\/mi><mn>2<\/mn><\/msub><\/mrow><\/msub><msub><mi>x<\/mi><mn>2<\/mn><\/msub><mo>+<\/mo><msub><mi>b<\/mi><msub><mi>h<\/mi><mn>2<\/mn><\/msub><\/msub><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><mi>.<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">h =\\begin{bmatrix} \\sigma(w_{h_{1},x_{1}}x_{1} + w_{h_{1},x_{2}}x_{2} + b_{h_{1}})\\\\ \\sigma(w_{h_{2},x_{1}}x_{1} + w_{h_{2},x_{2}}x_{2} + b_{h_{2}})\\end{bmatrix}.<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Hasta este punto hemos obtenido <math data-latex=\"h_{i}\"><semantics><msub><mi>h<\/mi><mi>i<\/mi><\/msub><annotation encoding=\"application\/x-tex\">h_{i}<\/annotation><\/semantics><\/math>, no obstante, el objetivo es calcular la salida final <strong><math data-latex=\"y\"><semantics><mi>y<\/mi><annotation encoding=\"application\/x-tex\">y<\/annotation><\/semantics><\/math><\/strong>. Dependiendo de la aplicaci\u00f3n, <strong><math data-latex=\"y\"><semantics><mi>y<\/mi><annotation encoding=\"application\/x-tex\">y<\/annotation><\/semantics><\/math><\/strong> puede ser un n\u00famero real, o un vector. Si por ejemplo, la intenci\u00f3n del investigador es calificar si alg\u00fan texto es medieval o no, <strong><math data-latex=\"y\"><semantics><mi>y<\/mi><annotation encoding=\"application\/x-tex\">y<\/annotation><\/semantics><\/math><\/strong> ser\u00e1 un n\u00famero real que contendr\u00e1 una probabilidad. Por otra parte, si el objetivo es clasificar si el texto est\u00e1 escrito en espa\u00f1ol, ingl\u00e9s o portugu\u00e9s, probablemente, <strong><math data-latex=\"y\"><semantics><mi>y<\/mi><annotation encoding=\"application\/x-tex\">y<\/annotation><\/semantics><\/math><\/strong> ser\u00e1 un vector.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En el caso de que <math data-latex=\"y\"><semantics><mi>y<\/mi><annotation encoding=\"application\/x-tex\">y<\/annotation><\/semantics><\/math> es un vector (de dos elementos, <math data-latex=\"y_{1} \"><semantics><msub><mi>y<\/mi><mn>1<\/mn><\/msub><annotation encoding=\"application\/x-tex\">y_{1} <\/annotation><\/semantics><\/math>e <math data-latex=\"y_{2} \"><semantics><msub><mi>y<\/mi><mn>2<\/mn><\/msub><annotation encoding=\"application\/x-tex\">y_{2} <\/annotation><\/semantics><\/math>), y usando la notaci\u00f3n de <strong>Jurafsky y Martin (2026)<\/strong>, definiremos una matriz <strong>U<\/strong> que albergar\u00e1 los pesos de salida:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>U<\/mi><mo>=<\/mo><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mtable columnalign=\"center center\"><mtr><mtd style=\"padding-left:0em;\"><msub><mi>w<\/mi><mrow><msub><mi>y<\/mi><mn>1<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>h<\/mi><mn>1<\/mn><\/msub><\/mrow><\/msub><\/mtd><mtd style=\"padding-right:0em;\"><msub><mi>w<\/mi><mrow><msub><mi>y<\/mi><mn>1<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>h<\/mi><mn>2<\/mn><\/msub><\/mrow><\/msub><\/mtd><\/mtr><mtr><mtd style=\"padding-left:0em;\"><msub><mi>w<\/mi><mrow><msub><mi>y<\/mi><mn>2<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>h<\/mi><mn>1<\/mn><\/msub><\/mrow><\/msub><\/mtd><mtd style=\"padding-right:0em;\"><msub><mi>w<\/mi><mrow><msub><mi>y<\/mi><mn>2<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>h<\/mi><mn>2<\/mn><\/msub><\/mrow><\/msub><\/mtd><\/mtr><\/mtable><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><mo separator=\"true\">,<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">U=\\begin{bmatrix} w_{y_{1},h_{1}} &amp; w_{y_{1},h_{2}} \\\\ w_{y_{2},h_{1}} &amp; w_{y_{2},h_{2}}\\end{bmatrix},\n<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Luego, con la siguiente operaci\u00f3n, obtenemos la salida intermedia:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>z<\/mi><mo>=<\/mo><mi>U<\/mi><mi>h<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">z=Uh<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Finalmente, para convertir la salida intermedia en la final, debemos convertir el vector anterior en uno que contenga probabilidades. Para eso, usamos la funci\u00f3n <strong>softmax<\/strong>:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><msub><mi>y<\/mi><mi>i<\/mi><\/msub><mo>=<\/mo><mi>s<\/mi><mi>o<\/mi><mi>f<\/mi><mi>t<\/mi><mi>m<\/mi><mi>a<\/mi><mi>x<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><msub><mi>z<\/mi><mi>i<\/mi><\/msub><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><mfrac><mrow><mi>e<\/mi><mi>x<\/mi><mi>p<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><msub><mi>z<\/mi><mi>i<\/mi><\/msub><mo form=\"postfix\" stretchy=\"false\" lspace=\"0em\" rspace=\"0em\">)<\/mo><\/mrow><mrow><msubsup><mo movablelimits=\"false\">\u2211<\/mo><mrow><mi>j<\/mi><mo>=<\/mo><mn>1<\/mn><\/mrow><mi>d<\/mi><\/msubsup><mi>e<\/mi><mi>x<\/mi><mi>p<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><msub><mi>z<\/mi><mi>j<\/mi><\/msub><mo form=\"postfix\" stretchy=\"false\" lspace=\"0em\" rspace=\"0em\">)<\/mo><\/mrow><\/mfrac><mo separator=\"true\">,<\/mo><mspace width=\"1em\"><\/mspace><mi>i<\/mi><mo>\u2264<\/mo><mi>i<\/mi><mo>\u2264<\/mo><mi>d<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">y_{i} = softmax(z_{i}) = \\frac{exp(z_{i})}{\\sum_{j=1}^{d}exp(z_{j})}, \\quad i \\leq i \\leq d<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">donde <math data-latex=\"d\"><semantics><mi>d<\/mi><annotation encoding=\"application\/x-tex\">d<\/annotation><\/semantics><\/math> es el tama\u00f1o del vector <math data-latex=\"z\"><semantics><mi>z<\/mi><annotation encoding=\"application\/x-tex\">z<\/annotation><\/semantics><\/math> (con <math data-latex=\"d=2\"><semantics><mrow><mi>d<\/mi><mo>=<\/mo><mn>2<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">d=2<\/annotation><\/semantics><\/math> para este ejemplo). En este punto, ya estamos listos para calcular los pesos, es decir, la matriz <strong>U<\/strong> y <strong>W<\/strong>. A continuaci\u00f3n, esbozaremos el m\u00e9todo para llevarlo a cabo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Aprendiendo los pesos para cada capa<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tal como lo hemos hecho en otras entradas, el objetivo es aprender los par\u00e1metros de la red para que <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mover accent=\"true\"><mi>y<\/mi><mo>^<\/mo><\/mover><\/mrow><annotation encoding=\"application\/x-tex\">\\hat y<\/annotation><\/semantics><\/math> se aproxime lo mejor posible a <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>y<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">y<\/annotation><\/semantics><\/math>. Para esto, us\u00e1bamos una <strong>loss function<\/strong>. En este caso, al igual que en la <a href=\"https:\/\/pulki.es\/blog\/index.php\/2026\/03\/09\/large-language-model-llm-from-scratch-clasificacion\/\">entrada pasada<\/a>, usamos la <strong>cross-entropy loss<\/strong>:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><msub><mi>L<\/mi><mrow><mi>C<\/mi><mi>E<\/mi><\/mrow><\/msub><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mover><mi>y<\/mi><mo stretchy=\"false\" class=\"tml-xshift\" style=\"math-style:normal;math-depth:0;\">^<\/mo><\/mover><mo separator=\"true\">,<\/mo><mi>y<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><mo form=\"prefix\" stretchy=\"false\">\u2212<\/mo><mrow><mi>log<\/mi><mo>\u2061<\/mo><mspace width=\"0.1667em\"><\/mspace><\/mrow><mi>p<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>y<\/mi><mo lspace=\"0.22em\" rspace=\"0.22em\" stretchy=\"false\">|<\/mo><mi>x<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><mo form=\"prefix\" stretchy=\"false\">\u2212<\/mo><mrow><mo fence=\"true\" form=\"prefix\">[<\/mo><mi>y<\/mi><mrow><mspace width=\"0.1667em\"><\/mspace><mi>log<\/mi><mo>\u2061<\/mo><mspace width=\"0.1667em\"><\/mspace><\/mrow><mover><mi>y<\/mi><mo stretchy=\"false\" class=\"tml-xshift\" style=\"math-style:normal;math-depth:0;\">^<\/mo><\/mover><mo>+<\/mo><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mn>1<\/mn><mo>\u2212<\/mo><mi>y<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mrow><mspace width=\"0.1667em\"><\/mspace><mi>log<\/mi><mo>\u2061<\/mo><\/mrow><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mn>1<\/mn><mo>\u2212<\/mo><mover><mi>y<\/mi><mo stretchy=\"false\" class=\"tml-xshift\" style=\"math-style:normal;math-depth:0;\">^<\/mo><\/mover><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo fence=\"true\" form=\"postfix\">]<\/mo><\/mrow><mi>.<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">L_{CE}(\\hat{y}, y) = -\\log p(y \\mid x) = -\\left[y \\log \\hat{y} + (1-y)\\log(1-\\hat{y})\\right].<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Finalmente, como sabemos, dicha funci\u00f3n debe ser minimizada. En este sentido, dado el alcance de esta serie no expondremos  la estrategia de minimizaci\u00f3n, no obstante, un lector interesado puede consultar la secci\u00f3n 6.6.2 de <strong>Jurafsky y Martin (2026)<\/strong> para mayor detalle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Notas finales, y pr\u00f3xima entrada\u2026<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En esta entrada introdujimos las redes neuronales y explicamos sus fundamentos te\u00f3ricos m\u00e1s b\u00e1sicos. Dado que se trata de un t\u00f3pico central para nuestro proyecto, en la siguiente entrada desarrollaremos un ejemplo pr\u00e1ctico.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jos\u00e9 Miguel Mu\u00f1oz Urra \u2013\u00a0<a href=\"mailto:jmunozu@pulki.es\">jmunozu@pulki.es<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-158","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/posts\/158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=158"}],"version-history":[{"count":14,"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/posts\/158\/revisions"}],"predecessor-version":[{"id":184,"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/posts\/158\/revisions\/184"}],"wp:attachment":[{"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}