IA y Demás Yuyos

Desmenuzando la inteligencia artificial

By Pulga

Trataremos de desmenuzar chuncanamente algunos conceptos de la IA. No por ello es un posteo liviano, de hecho es largo, pero espero que quien lo lea se lleve una visión un poco más iluminada de la caja negra que es la IA.

Este es un posteo de aprendizaje y de prueba, no debe ser usado como guía técnica y puede estar sujeto a errores. Es un posteo generalista por lo que muchos conceptos pueden no ser del todo correctos, dado el recorte realizado para poder leerse en un sólo post y con intención de que sea legible para cualquiera.

TL;DR

Este post busca hablar sobre un tipo en particular de IA, la IA Generativa, esto se hará con un enfoque de divulgación. Hablaremos de LLMs que son a grandes rasgos una función probabilística que procesa información en etapas: primero tokeniza y convierte palabras en vectores numéricos (embeddings), luego usa Self Attention para identificar relaciones entre palabras considerando el contexto, y finalmente genera respuestas. Los LLMs como ChatGPT son modelos decoder-only que funcionan calculando qué palabra es más probable que siga, basándose en patrones aprendidos durante el entrenamiento. Es matemática compleja a una velocidad bestial con una galaxia de datos.

IA

Arranquemos, la IA se llama así “inteligencia artificial” por una cuestión filosófica donde para no ligarla a la inteligencia humana, le pusieron artificial. (Entiéndase esto escrito de forma burda y expres, hay muchísimo de porqué se llama así y de si está bien o no, y demás debate). En lo cotidiano se utiliza el término “IA” para hacer referencia a Agentes de AI o productos que usan modelos de AI y aquí haremos una breve pausa para desarrollar sobre esto.

  • IA: es un campo general, una temática, como quien dice “Construcción”, es toda un área que abarca muchos sub-temas así como en la contrucción pueden ser: Electricidad, Plomería, Albañilería, etc.

  • LLM: La sigla LLM proviene del inglés Large Language Model, o sea “Modelo Grande de Lenguaje”.En esta analogía con la construcción podría ser por ejemplo un albañil. Pero si quisieramos ir un poquito más a lo técnico se lo pueden imaginar como un modelo probabilístico, si esta definición no les suena de nada, entonces tomemos el siguiente ejemplo de a que nos referimos con “modelo probabilístico”: Si vas al kiosko a comprar un fernet y el kioskero te pregunta “vas a llevar coca también?” acá el kioskero estaría haciendo de “modelo probabilístico”, estaría adivinando en base al contexto que ofrecerte. Un LLM hace algo mucho más complejo que esto pero es una buena primera intuición.

  • Agente de IA: Sería el capataz, que puede calcular cuantos ladrillos comprar, cuales paredes levantar primero, cuantos albañiles contratar, esto es; tiene las herramientas y maneja la organización para saber cuando hacer cada cosa. Y un poquitito más tecnico es un programa que tiene la posibilidad de ejecutar otros programas e utiliza LLMs para hacer tareas. Por ejemplo: ChatGPT cuando le pedís que te de lista de precios de algún producto: Primero busca en la web —> luego los lista. Si ChatGPT fuera un LLM a secas no podría buscar en la web e inventaría la respuesta armando una lista de precios ficticios.

Entonces todas estas IAs que conocemos como Claude, Perplexity, Gemini, ChatGPT, etc, no son simplemente LLMs, son productos que integran varios LLMs, por ende son IA. Por eso, cuando decimos “Estoy usando una IA” probablemente estamos hablando de un producto o sistema de IA, y no de un LLM aislado. Muchos de estos productos nombrados son además LLMs “Multimodal” esto es, les podés insertar texto, imagenes, audios, etc.

Resumiendo:

IA –> Campo general. LLM –> Un modelo probabilístico. Agente –> Un programa autónomo que toma decisiones y ejecuta herramientas utilizando LLMs.

Pero por más que haga cosas increíbles sigue siendo por debajo un LLM el cual es una enorme función probabilística que realiza millones de cálculos en poquísimo tiempo, generando construcciones realizadas en base a lo más probable.

La IA en sí no es una función probabilística, los LLM sí, pero aún no definimos qué es un LLM.

Tenemos 3 tipos de “IA”:

  1. Artificial Narrow Intelligence (ANI) - Inteligencia Artificial Estrecha
    La IA que conocemos, sistemas de recomendación como “el algoritmo de netflis”, chatgpt, etc.

  2. Artificial General Intelligence (AGI) - Inteligencia Artificial General
    Es teórica al día de hoy.

  3. Artificial Super Intelligence (ASI) - Superinteligencia Artificial
    Teórica al día de hoy.

Hay más divisiones, dependiendo distintos aspectos.

Ver otros tipos de IA

Por Tipo de Salida

Por ejemplo también puede ser clasificada dependiendo su salida (lo que escupan los bichos estos).

Tipo Ejemplo
Predictiva Predicción de demanda
Clasificatoria Diagnóstico
Generativa Texto / imagen (chatgpt, deepseek, etc.)
Prescriptiva Qué acción tomar
Descriptiva Análisis de datos

Diagrama de la IA

Imagen sacada del post “Introducción a la IA”

Dentro de las ANI podemos dividirlas dependiendo como se las “entrene”:

  • Supervised
  • Unsupervised
  • Semi-supervised
  • Reinforcement learning

Pequeñísimo repaso de historia

Historia de la IA

Imagen tomada del curso “How Transformer LLMs Work” - Jay Alammar, DeepLearning.ai

Esta imagen ilustra la evolución de una tecnología, desde ideas como Bag-of-Words Bolsa de palabras, Word2Vec Palabras a vectores, hasta lo popularmente conocido ChatGPT. Nótese el quiebre de 2017, donde dice Attention, esa fecha fue la publicación de un paper que cambió el paradigma del Deep Learning, paper llamado “Attention Is All You Need”, que está citado en las referencias de este post.

En la imagen se pueden observar distintos tipos de LLMs.

  • Decoder-only (GPT)
  • Encoder-only (BERT)
  • Encoder-Decoder (T5)
Otra forma de clasificarlos según su arquitectura
  • Auto-regressive (GPT)
  • Auto-encoding (BERT)
  • Sequence-to-sequence (T5)

Estas diferencias de “Sólo Decodificador”, “Sólo Codificador” y “Ambos”, son diferencias de Arquitectura, o sea cómo fueron construidos.

Arquitecturas de transformers, encoder-only, decoder-only y encoder-decoder

Fuente: DailyLifeAi

Se pueden observar similitudes entre arquitecturas, pero son diferentes, en el post trabajaremos con la llamada Decoder-only, por lo que pueden observar sus partes que luego desglosaremos.

Vamos a lo nuestro

La IA es un área muy abarcativa aunque al día de hoy se asocie solamente a ChatGPT. Hay una rama dentro de la IA que es llamada Machine Learning (Aprendizaje Automático), dentro de esta rama se encuentra otra rama llamada Deep Learning (Aprendizaje Profundo), y dentro del Deep Learning está la IA Generativa, que es la que utilizamos. (ChatGPT, Claude, DeepSeek, etc).

ANI → Machine LearningDeep LearningGenerative AI.

No todo el machine learning es generativo, no todo deep learning es generativo. La IA generativa es un tipo de modelos de Deep Learning.

Por ejemplo las traducciones, los sistemas de recomendación de compras, o películas, son parte de la IA, pero no es IA generativa. Lo que más usamos son LLMs “Large Language Model”, grandes modelos de lenguaje, reitero: tales como ChatGPT, Claude, DeepSeek, etc, que son un tipo de IA Generativa. Cuando hablamos de LLMs hacemos referencia a lo que se llama “modelo”. ChatGPT, Claude, DeepSeek, etc, son más que sólo un modelo porque son aplicaciones, dentro de ellas podés elegir distintos modelos y hacer más cosas, ustedes que los usan sabrán mejor que yo.

LLMs que permite la interfaz de ChatGPT

Por ejemplo en la imagen podemos ver distintos modelos que nos permite usar ChatGPT: GPT-5.5 y GPT-5.6 son dos modelos distintos.

Se puso jodido el post pero es complejo comentar estas cosas, y además peco de poner cosas “simplificadas” con cosas “complejas” haciendo un posteo generalista.

Basaremos el post analizando sobre un LLM GPT (Generative Pre-Training), o sea un modelo de IA Generativa que es decoder-only, dado que citaremos una página que está muy linda, que permite ver uno de estos modelos paso a paso.

Arquitectura Decoder-only Arquitectura NanoGPT
Transformer Decoder-only Fuente: DailyLifeAi NanoGPT Fuente: LLM Visualization

En la web propuesta se observa un decoder-only con alguna que otra variación respecto a la arquitectura estándar que está a la izquierda en la imagen. Quizás para ubicarse visualizar las “Add & Norm” que son las mismas que las “layer norm” en color amarillo.

Estos bichos tienen dos momentos distintos:

  1. Entrenamiento
  2. Inferencia o uso

Por lo que el posteo será hablar de sus etapas, o capas en el momento de Inferencia/Uso:

  1. Tokenizer/Embedding
  2. Self Attention
  3. MLP/ FeedForward
  4. Output

Hay otras capas adicionales que se utilizan:

  • Normalización (Layer Normalization)
  • Conexión Residual (Residual)
  • Linear
  • Softmax

Estas capas no las explicaremos dado que son bastante teóricas y relacionadas fuertemente con aritmética de computadoras y probabilidad.

Lo primero: Tokenizer/ Embedding

La máquina no entiende como nosotros, por lo que para “entender” necesitamos partir el texto ingresado. Cada “IA” parte el texto en distintas formas. Pueden jugar ingresando distintos textos en el Tokenizer de OpenAI y ver cómo se “tokeniza”/”recorta” dependiendo el modelo.

Usaremos la traducción a la frase de Batty: “Quite an experience to live in fear, isn’t it? That’s what it is to be a slave.”

Cuya traducción un poco a mi forma aprox: “Es una locura vivir con miedo, no? Eso es ser esclavo”.

Modelo Tokenización
GPT-4o Tokenizador con la frase "Es una locura vivir con miedo, ¿no? Eso es ser esclavo."
GPT-3 Tokenizador con la frase "Es una locura vivir con miedo, ¿no? Eso es ser esclavo."

Así es, a partir de ahora introducimos el concepto de tokens que son las divisiones que hará cada tokenizer del modelo para poder “interpretar” nuestras frases. En criollo recortes de nuestra frase, tal como se ve en las imágenes de arriba.

Ver otros tipos de tokenización
  • Tokenización basada en palabras (Word tokenization)
  • Tokenización basada en subpalabras (Subword tokenization)
  • Tokenización basada en caracteres (Character tokenization)
  • Tokenización basada en símbolos (Symbol tokenization)
  • Tokenización basada en frases o unidades lingüísticas más grandes (Phrase tokenization)
  • Byte-level BPE (a nivel de bytes), como usa GPT-2
  • WordPiece, usado por BERT

Se puede ver y leer mucho más sobre esto en el Curso de LLMs de Hugging Face

La misión ahora es tratar de tener en cuenta cada pedacito recortado. Luego convertiremos cada pedacito o token en un vector numérico y lo llamaremos Embedding. Para diferenciar cada token se usan los Token Embeddings y para saber información acerca del orden que aporta cada token se usan los Positional Embeddings. Ya que la compu no sabe (La arquitectura usada no sabe por sí mismo cuál es el orden de un token en la secuencia de tokens). Entonces para cada token hay un Token Embedding, Position Embedding, que cada uno representan: El token en sí, y el orden que ocupa el token en la frase.

Porqué necesitamos el orden? Coherencia.

No es lo mismo decir:

“Mañana tengo que ir al banco a sacar plata.”

Que decir:

“Plata a sacar banco ir al mañana que tengo”

Por lo que es necesario “recordar” con los Position Embeddings el orden de los tokens en la frase. Todo esto está basado fuertemente en la lingüística, proviene del Procesamiento del Lenguaje Natural (NLP).

A partir de ahora trataremos de no utilizar más el término “palabra” y utilizar “tokens”. Dado que un token no es lo mismo que una palabra de nuestro lenguaje natural.

Tokenicemos y embeddiemos una palabra(?

Para que sea más visible la diferencia entre palabras del lenguaje natural, partiremos la palabra en caracteres y tokens utilizaremos “Tokenización basada en caracteres” donde cada token representa un caracter de nuestro lenguaje natural, como vimos debemos convertir cada palabra en un “token”. Tomemos una palabra como ejemplo: “Maradona”

  1. Tokenización → tokens = ["M", "a", "r", "a", "d", "o", "n", "a"]
  2. Asignación de ID → token_ids = [13, 1, 18, 1, 4, 15, 14, 1]
  3. Conversión a embedding → embeddings = [ [0.21, -0.45, 0.87, 0.12], [0.91, -0.33, 1.27, 0.08], [-0.12, 0.64, 0.31, -0.77], [0.91, -0.33, 1.27, 0.08], [0.42, 0.15, -0.63, 0.91], [-0.54, 0.72, 0.18, -0.26], [0.33, -0.81, 0.44, 0.57], [0.91, -0.33, 1.27, 0.08] ]

Resultado:

  • Palabra: “Maradona”
  • Tokens: [“M”, “a”, “r”, “a”, “d”, “o”, “n”, “a”]
  • Token ID: identificador numérico único para cada caracter [13, 1, 18, 1, 4, 15, 14, 1]. Notar como el caracter “a” posee siempre el mismo id=1.
  • Embedding: representación vectorial numérica de cada token.

Estos tokens id y embeddings utilizados son ficticios y solamente sirven para ilustrar el proceso. En un modelo real, el vocabulario, los IDs y los embeddings son definidos y luego aprendidos por el sistema de tokenización y el modelo.

El modelo no entiende de tokens, sólo entiende de embeddings.

Sucede una gran magia en los embeddings que es media compleja asi que no la explicaremos acá, y esa transformación a un vector seguro les pierda porque falta explicar una parte, pero quedense con lo visto.

  • Token Embedding: va a representar qué token es.
  • Positional Embedding: va a representar dónde está el token en la frase.

Buscamos entonces sumar ambos vectores generando así el Input Embedding.

\[\text{Input Embedding} = \text{Token Embedding} + \text{Positional Embedding}\]

Como si fuera ArtAttack nos quedaremos con este resultado sacado sin fundamento, pero para que se vea qué es lo que se enviará a la primer etapa del transformer.

Si el Token Embedding del caracter “M” era: [0.21, -0.45, 0.87, 0.12, -0.54, 0.62]

Y el Positional Embedding de la posición 0 era: [0.10, 0.27, 0.29, 0.36, 0.07, -0.01]

Entonces el Input Embedding será:

\[("M", posición 0) = [0.31, -0.18, 1.16, 0.48, -0.47, 0.61]\]

Dado que este es el resultado de realizar la adición de:

\[[0.21, -0.45, 0.87, 0.12, -0.54, 0.62] + [0.10, 0.27, 0.29, 0.36, 0.07, -0.01]\]

Por lo que el Input Embedding resultante de “Maradona” será una matriz de 8x6:

[
  [0.31, -0.18, 1.16, 0.48, -0.47, 0.61],    ← M
  [ ... ],                                   ← a
  [ ... ],                                   ← r
  [ ... ],                                   ← a
  [ ... ],                                   ← d
  [ ... ],                                   ← o
  [ ... ],                                   ← n
  [ ... ]                                    ← a
]

Bueno pero retomemos nuestro ejemplo con la frase de Batty, donde no se utiliza la tokenización por caracter:

Tokenización de la frase de Batty

Ahora ya sabemos que los “Embeddings” son los tokens vectorizados, o sea los tokens convertidos en vectores de números, que nos permiten capturan la información semántica y sintáctica de las palabras que representan dichos tokens.

Self Attention

Es la parte más densa de la lectura

Esta parte es donde se trata de identificar que relación hay entre cada token, por ello es un cálculo de cuánto afecta la representación de un embedding contra todos los otros embeddings. Permite capturar significados y relaciones entre tokens. A esto se le suele sumar Multi-Head Attention, lo cual son varias “cabezas de atención” lo que sería comparable con la idea de prestarle atención a distintas partes de la frase, con la aplicación de la multicabeza se puede prestar atención a más patrones, y por ejemplo a dos frases separadas, etc.

Vamos a tomar el ejemplo de Santiago Fiorino:

“Mañana tengo que ir al banco a sacar plata.” / “Nos sentamos en el banco de la plaza a tomar mate.”

Comparativa de embeddings de las dos frases mencionadas

Encima de cada token está su respectivo embedding, notar como el token banco tiene el mismo embedding inicial pero se usa en frases con contextos distintos, donde uno tiene relación con una entidad financiera y el otro con un asiento. Para poder entender dicha situación, el humano interpreta el contexto donde está ubicada cada palabra del lenguaje natural, pero acá no hay palabras hay tokens. Entonces para ello se tiene en cuenta cuánto debería afectar cada token a cada otro token, por ejemplo la relación entre banco y plata debería ser mucho más significante que la relación entre banco y mañana. La magia que sucede con los embeddings es que se les asigna un “peso” inicial, valores iniciales, y en la etapa de entrenamiento de un LLM estos pesos se van recalculando, este proceso es donde se interpreta que el modelo “aprende”. Entonces “banco” comenzará con los mismos embeddings pero al actualizar sus pesos, estos serán distintos tal y como en lenguaje natural interpretamos que son distintos “bancos”.

“Para ello generamos una matriz NxN, donde en cada posición de la matriz estará en un valor numérico la respuesta a cuánto debería influir la palabra ‘i’ a la hora de actualizar la palabra ‘j’” - Santiago Fiorino.

Matriz de Query: representa lo que estamos buscando en los otros tokens

Matriz de Key: representa la “clave”, qué tan importante es un token para el otro token que estamos analizando.

Ejemplo de matriz

Ejemplo de Santiago mostrando cómo se crea la matriz Q⋅K

Entonces esos valores que den se “normalizan”, esto es aplicar una función que se llama “Softmax” para que queden en números entre 0 y 1, (Sí! Transforma esos valores en probabilidades cuya suma es 1) donde si entre dos palabras el valor es 0 entonces no tienen relación entre sí, por lo contrario si el valor es 1, entonces tienen una relación importante entre sí.

Con las anteriores matrices sabemos cuánto tiene que afectar una palabra a otra pero no “como”, por ello viene esta tercer matriz.

Matriz de Value: información real que transmite.

Ejemplo de matriz

Con eso obtenemos una matriz de valores con toda la información necesaria.

Esto tiene una fórmula terrorífica que es:

\[Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V\]

Esto permite realizar un cálculo de relaciones entre todos los tokens, teniendo en cuenta distintos factores, donde además mientras se entrene y reentrene, va a permitir calcular las probabilidades de cuantas veces determinada palabra está “cerca” de otra y bajo un mismo “contexto”. Por lo que estas relaciones permiten que el modelo “aprenda” qué tokens están más relacionadas en diferentes contextos. Esto agregado con la capa de MLP o FeedForward se “recalcula” y de esta forma el modelo “re-ajusta” sus valores, que como vimos no “aprende” sino que calcula.

MLP/ FeedForward

Esto es complejo pero aquí se aplica una red neuronal, que mejora el modelo, y se introducen funciones no lineales como la famosa ReLU (Rectified Linear Unit), esta parte puede ser vista como una minimización de la función de costos (Esto me lo hizo ver ezeluduena). Utilizando el descenso del gradiente. Acá hay mucho para hablar, participan factores muy populares como la entropía, y el error cuadrático medio. Para cualquier persona que no sea de la temática medio que puede saltarse a la próxima etapa que sería la de output, dado que ya “aprendió” como funciona un LLM.

La no-linealidad y ver que estamos buscando una minimización o “maximización” queda más claro al ver esta figura, y por eso el descenso del gradiente es una buena técnica para encontrar esos mínimos.

Función no lineal

Para flasharla un poco más dejo esta filmina de Victoria Peterson

Descenso del gradiente

Y el link al colab que es buenísimo de ella.

Output

Obtendremos una lista de probabilidades para el token siguiente

Salida del modelo

También podemos controlar la suavidad de la distribución mediante un parámetro de temperatura. Una temperatura más alta hará que la distribución sea más uniforme, y una temperatura más baja la concentrará más en los tokens con mayor probabilidad.

Fin

Gracias por leer el post, espero que haya aclarado un poco más esto de los LLMs, y algunas cosas de la IA. Se irán agregando posteos para profundizar en distintos aspectos mencionados en el post. Recomiendo fuertemente las referencias, en particular los links que son interactivos como:

  • Transformers Explainer
  • Generative AI exists because of the transformer
  • LLM Visualization
  • Interactive Variational Autoencoder

Referencias

Share: X (Twitter) Facebook LinkedIn