Volver al portfolio

Mi aprendizaje · IBM / Coursera

Aprender a construir con LLMs

Estoy cursando Generative AI Engineering with LLMs ↗. Aquí comparto lo que voy aprendiendo, con explicaciones y ejemplos para explorar los conceptos de cada curso.

Curso 01 Con ejemplos

Arquitecturas y preparación de datos

Generative AI and LLMs: Architecture and Data Preparation

¿Cómo se convierte una frase en datos?

Un modelo trabaja con números. Para darle una frase como «La IA aprende patrones», primero hay que dividirla en pequeñas piezas y asignarles identificadores. Este curso presenta distintas formas de crear modelos generativos y enseña a preparar el texto para trabajar con él en PyTorch.

Tokens: las piezas del texto
Un token puede ser una palabra, parte de ella o un signo. El tokenizador decide dónde cortar: por eso una frase de cinco palabras puede tener más de cinco tokens.
Vocabulario: un número para cada pieza
Es la tabla que relaciona cada token con un ID. Ese número sirve para encontrarlo, como el número de una ficha. Dos IDs consecutivos no tienen por qué representar palabras parecidas.
Batches: varios ejemplos a la vez
Un batch es un grupo de ejemplos que el modelo procesa juntos. Si agrupamos 32 frases, el batch size es 32. Trabajar así permite aprovechar el cálculo en paralelo.
Padding: completar los huecos
Para agrupar frases de distinta longitud, añadimos tokens de relleno a las más cortas. Ese relleno se llama padding. Una máscara marca qué posiciones son relleno para que el modelo pueda ignorarlas.
Una frase, dividida en tokens

«La IA aprende patrones.»

  1. LaID 1
  2. IAID 2
  3. aprendeID 3
  4. patronesID 4
  5. .ID 5

5 tokens → 5 IDs. Cada ID identifica una pieza en el vocabulario.

Aquí usamos cortes e IDs inventados para ver cómo funciona. Un tokenizador real tiene sus propias reglas para dividir el texto y numerar las piezas.

Para profundizar

Tokenización y vocabulario

De una frase a sus piezas

Tokenizar es dividir un texto en piezas llamadas tokens. Algunas coinciden con palabras completas; otras son fragmentos o signos. Las reglas dependen del tokenizador, así que dos tokenizadores pueden dividir la misma frase de forma distinta.

Después se busca cada pieza en el vocabulario, una tabla que le asigna un número o ID. En el ejemplo interactivo, «La» tiene el ID 1. Ese número solo identifica la pieza: no indica su importancia ni su significado.

El ID permite buscar el embedding del token: una lista de números que el modelo utiliza para hacer sus cálculos. En el segundo curso veremos cómo se aprende esa representación.

Frase → piezas (tokens) → identificadores (IDs)
Cada ID → su lista de números (embedding) → modelo

Usar el tokenizador que espera el modelo

Un modelo ya entrenado viene preparado para un vocabulario concreto. Si en ese vocabulario el ID 42 corresponde a «gato», enviarle el 42 significa pedir la representación de «gato». No importa qué palabra tenga ese número en otra tabla.

Por eso el modelo y su tokenizador deben ir juntos. Los números pueden tener un formato válido y aun así señalar las piezas equivocadas.

Si preparas tu propio vocabulario

En un ejercicio desde cero, puedes construir el vocabulario con los textos de entrenamiento. Después conservas esa misma tabla para comprobar el modelo con textos nuevos.

  • En un vocabulario que lo utilice, <unk> representa una pieza desconocida. Otros tokenizadores pueden descomponerla en piezas más pequeñas.
  • <pad> sirve para completar frases cortas al formar un batch. Hay que conocer su ID; no siempre es 0.
  • Guarda la tabla y las reglas para dividir el texto: necesitarás ambas al volver a usar el modelo.
Datos y clasificación de texto

Del ejemplo al batch

Podemos reunir 32 reseñas y procesarlas juntas. Ese grupo es un batch y su batch size es 32. El tamaño del batch cuenta ejemplos; no cuenta las palabras de cada reseña.

En PyTorch, Dataset permite acceder a cada ejemplo. DataLoader los organiza en batches y puede cambiar su orden entre recorridos de entrenamiento. La función collate_fn prepara los ejemplos para que puedan agruparse.

Qué hacemos cuando las frases miden distinto

Supongamos que tres frases tienen 4, 6 y 2 tokens. Para colocarlas en una tabla con filas del mismo tamaño, completamos las más cortas con padding hasta llegar a 6 posiciones.

Una máscara distingue los tokens reales del relleno. Así podemos indicar al modelo qué posiciones debe ignorar.

Frase A: 4 tokens + 2 de padding
Frase B: 6 tokens + 0 de padding
Frase C: 2 tokens + 4 de padding

Forma de la tabla: [3, 6]
3 frases, con 6 posiciones cada una

Una predicción para toda la reseña

El modelo puede producir una lista de números por token, teniendo en cuenta su contexto. Para clasificar la reseña completa necesitamos reunir esa información en una sola representación.

Una forma sencilla es hacer la media de esas listas de números, posición a posición. Se llama mean pooling. A partir del resultado, una capa final calcula una puntuación para cada categoría: por ejemplo, «positiva» y «negativa».

Representaciones por token
  → media de los tokens reales
  → una representación de la reseña
  → puntuación para cada categoría

El relleno también se excluye de la media

La máscara de atención evita que el modelo use las posiciones de relleno como contexto. Pero, al hacer pooling, también hay que excluirlas de la media: sus valores de salida no tienen por qué ser cero.

Es como calcular la nota media de tres exámenes y añadir dos ceros porque sobraban casillas en la tabla. El relleno cambiaría el resultado aunque no correspondiera a ningún examen.

Comprobar si aprende con reseñas nuevas

Durante el entrenamiento comparamos las puntuaciones del modelo, llamadas logits, con la categoría correcta. Una función de pérdida mide el error y sirve para ajustar los parámetros.

Después probamos con reseñas que no se hayan usado para esos ajustes. Si solo mejora con las que ya conoce, puede estar memorizando ejemplos. Compararlo con un clasificador sencillo ayuda a ver qué aporta un modelo más elaborado.

Curso 02 Con ejemplos

Representaciones y modelos de lenguaje

Gen AI Foundational Models for NLP & Language Understanding

¿Cómo aprende un modelo qué palabras encajan?

Contar palabras da algunas pistas, pero el orden y el contexto cambian lo que dice una frase. Este curso pasa de formas sencillas de representar el texto a embeddings y modelos que aprenden a predecir cómo continúa. La idea es entender qué información conserva cada opción.

Bag of words: contar palabras
Una bolsa de palabras anota cuántas veces aparece cada palabra. Las dos frases del ejemplo tienen los mismos recuentos, aunque en una persigue el gato y en la otra el perro. Para distinguirlas hace falta conservar el orden.
Embeddings: aprender relaciones
Un embedding es una lista de números, o vector, asociada a un token. Esos números se ajustan al entrenar: pueden acercar las representaciones de palabras que aparecen en contextos parecidos.
Contexto: lo que viene antes
Después de «Me he puesto el», varias palabras podrían encajar. Si antes hablamos de frío, «abrigo» parece más probable. Un modelo de lenguaje aprende a asignar probabilidades al siguiente token usando el contexto disponible.
Las mismas palabras, otro significado

El gato persigue al perro.

el
1
gato
1
persigue
1
al
1
perro
1

Cada palabra aparece una vez. Estos números no dicen quién persigue a quién.

En las dos frases aparecen las mismas palabras el mismo número de veces. Para distinguir su significado también necesitamos saber en qué orden están.

Para profundizar

Embeddings

Una lista de números por token

Imagina una tabla con una fila por token. Cada fila contiene varios números: ese es su embedding. Cuando llega un ID, la capa de embeddings busca la fila correspondiente.

Al entrenar, esos números pueden cambiar para ayudar a resolver la tarea. Las palabras que aparecen en contextos parecidos pueden acabar con representaciones cercanas. Un embedding recién creado todavía no ha aprendido esas relaciones.

Si tenemos 3 frases de 6 tokens y usamos 8 números por token, pasamos de una tabla de IDs [3, 6] a una estructura [3, 6, 8]. Esa estructura de números se llama tensor.

IDs:        [3 frases, 6 posiciones]
Embeddings: [3 frases, 6 posiciones, 8 números]

Aprender mirando las palabras de alrededor

Word2Vec aprende representaciones a partir de las palabras vecinas. En una de sus variantes, CBOW, se oculta una palabra y se intenta predecirla a partir de las que la rodean. En la otra, Skip-gram, se parte de una palabra para predecir sus vecinas.

GloVe utiliza recuentos de palabras que aparecen cerca unas de otras en una colección de textos. Son dos maneras de aprovechar el contexto para aprender relaciones.

Estos métodos asignan una representación fija a cada palabra. «Banco» empieza con el mismo vector al hablar de un asiento o de dinero. Para distinguir esos usos, hace falta un paso posterior que tenga en cuenta la frase concreta.

Representar cada token o resumir la frase

En PyTorch, Embedding devuelve una lista de números por token. EmbeddingBag puede reunir varias mediante una suma o una media, algo útil para obtener una representación sencilla de un texto.

Esa media pierde el orden: cambiar de sitio las palabras no cambia la suma. Un modelo que incorpora contexto puede relacionar los tokens antes de reunirlos y conservar información que la media inicial no tenía.

  • IDs cercanos solo indican filas cercanas en una tabla; no garantizan palabras parecidas.
  • Los embeddings se aprenden con datos. Su tamaño, por sí solo, no dice si son buenos.
  • Conserva las representaciones de cada token si tu tarea necesita conocer el orden o las relaciones dentro de la frase.
Contexto y modelos de lenguaje

Predecir la siguiente pieza

Después de «Hoy hace mucho», podrían encajar «frío», «calor» o «viento». El modelo calcula probabilidades a partir del contexto. Para generar texto se elige un token según esas probabilidades y se añade a la frase; el proceso vuelve a empezar.

Un modelo de n-gramas utiliza una cantidad limitada de tokens anteriores. Por ejemplo, un trigrama predice usando los dos anteriores. Es una forma sencilla de trabajar con contexto, aunque deja fuera lo que se dijo antes de esa ventana.

En una versión neuronal, se pueden colocar los embeddings de la ventana uno detrás de otro. Esto se llama concatenar y permite conservar el lugar que ocupa cada token.

Texto disponible → probabilidades → elegir un token
        ↑                                  |
        └──── añadirlo al texto ────────────┘

Una memoria que se actualiza

Una red recurrente, o RNN, recorre el texto paso a paso. En cada paso actualiza una lista de números que resume lo que ha visto. Esa memoria numérica se llama estado oculto.

La memoria tiene un tamaño fijo. Cuanto más largo es el texto, más información tiene que condensar en el mismo espacio; por eso puede costarle conservar detalles lejanos.

Leer una frase y producir otra

En una traducción, la frase de entrada y la de salida pueden tener distinta longitud y orden. Un modelo encoder–decoder reparte el trabajo: el encoder representa la entrada y el decoder genera la salida paso a paso.

Al entrenar, podemos darle al decoder el token anterior correcto para que practique el siguiente paso. Esto se llama teacher forcing. Al generar una traducción nueva, continúa a partir de lo que él mismo ha producido, de modo que un error puede influir en los siguientes.

Las entradas y las respuestas esperadas van desplazadas una posición: con «El gato» se practica predecir «duerme»; con «El gato duerme» se practica lo que viene después. Algunas tareas usan además tokens especiales de inicio y final.

Evaluar un modelo de lenguaje

Practicar y comprobar son pasos distintos

La pérdida es una medida del error que usamos durante el entrenamiento. Ayuda a ajustar los parámetros: por ejemplo, penaliza al modelo cuando da poca probabilidad al token correcto.

La validación comprueba cómo responde a textos que no se han usado para esos ajustes. Es parecido a estudiar con unos ejercicios y comprobar después lo aprendido con otros. Mejorar solo en los ejercicios conocidos no basta.

Perplexity: cuánto sorprende el texto al modelo

La perplexity mide, de forma agregada, cuánta probabilidad daba el modelo a los tokens que aparecen en un texto de prueba. Un valor más bajo significa que ese texto le resultaba más previsible.

Se calcula a partir de la pérdida media de entropía cruzada por token, usando logaritmos naturales. Para comparar valores, hay que mantener los mismos textos y un procedimiento compatible, incluida la tokenización.

Un texto previsible puede contener un error. Por eso una buena perplexity no demuestra que una respuesta sea verdadera o útil.

perplexity = exp(pérdida media por token)

Comparar con una respuesta de referencia

BLEU, frecuente en traducción, compara grupos de palabras con traducciones de referencia y tiene en cuenta la longitud de la respuesta. ROUGE, habitual en resúmenes, mide coincidencias con textos de referencia mediante distintas variantes.

«El gato está durmiendo» y «El gato duerme» pueden transmitir la misma idea con palabras distintas. Una métrica de coincidencias no recoge por sí sola todo ese significado; tampoco detecta todos los errores de una respuesta que comparte muchas palabras.

Mirar también los ejemplos

Las métricas ayudan a comparar resultados, pero conviene leer algunas respuestas y sus errores. Así se ve qué mejora en la práctica y qué problemas siguen apareciendo.

  • Evalúa siempre sobre el mismo conjunto de textos al comparar dos versiones.
  • Elige una métrica relacionada con la tarea: continuar texto, clasificarlo o traducirlo.
  • Revisa respuestas acertadas y fallos concretos, además del número final.
  • Usa una solución sencilla como punto de partida para valorar si la complejidad adicional aporta algo.

Curso 03 Con ejemplos

Transformers y atención

Generative AI Language Modeling with Transformers

¿Cómo se relacionan las palabras de una frase?

En «Me senté en el banco del parque», la palabra «parque» ayuda a interpretar «banco». La atención permite que el modelo combine información de distintos tokens para representarlos en su contexto. Este curso explica cómo lo hace un transformer y cómo se usa para tareas como clasificar textos o traducir.

Posición: dónde está cada token
Las mismas palabras en otro orden pueden decir algo distinto. El transformer incorpora información sobre la posición de cada token para poder tener en cuenta ese orden.
Atención: cuánto aporta cada token
Para actualizar la representación de un token, el modelo calcula cuánto peso dar a la información de los demás tokens disponibles. Esos pesos determinan cómo se combina el contexto.
Máscara: qué información está disponible
Al entrenar un modelo para continuar un texto, ocultamos los tokens futuros: no debe ver la respuesta que está intentando predecir. Esta regla se llama máscara causal. En otras tareas puede utilizarse la frase completa.
¿Qué palabras puede usar el modelo?
  1. ElVisible
  2. gatoVisible
  3. miraVisible
  4. laOculto
  5. lunaOculto

Desde «mira», el modelo puede usar: El, gato, mira.

En este ejemplo cada palabra es un token. Se muestra cuáles están disponibles, sin calcular cuánta importancia da el modelo a cada una.

Para profundizar

Transformers y atención

Saber qué token es y dónde aparece

El embedding da una representación inicial al token. Para tener en cuenta el orden, el modelo también necesita información sobre su posición: primero, segundo, tercero…

Esa información puede aprenderse o construirse con una regla, como las funciones de senos y cosenos usadas en el transformer original. El objetivo es que el modelo pueda distinguir las mismas palabras colocadas de otra manera.

Queries, Keys y Values, paso a paso

Para calcular la atención se crean tres listas de números a partir de cada representación. Se llaman Query, Key y Value. Puedes pensar en la Query como lo que se busca, en la Key como la información con la que se compara esa búsqueda y en el Value como lo que se va a aportar.

El modelo compara la Query de un token con las Keys de los tokens disponibles. Convierte esas puntuaciones en pesos que suman 1 mediante una operación llamada softmax. Después mezcla los Values usando esos pesos: unos contribuyen más que otros.

Estas listas y comparaciones se calculan con parámetros aprendidos. La analogía de la búsqueda ayuda a seguir los pasos, pero el cálculo es una operación entre números.

Query de un token + Keys disponibles
  → puntuaciones
  → pesos que suman 1
  → mezcla de Values según esos pesos

Consultar la misma frase o una distinta

En self-attention, un token consulta información de la misma secuencia. En cross-attention, consulta otra: por ejemplo, mientras genera una traducción, el decoder puede consultar la representación de la frase original.

Multi-head attention hace varias de estas combinaciones en paralelo, cada una con sus propios parámetros. Así el modelo puede aprender distintas relaciones y reunir sus resultados.

Ocultar lo que todavía no se debería ver

Cuando entrenamos un modelo para predecir el siguiente token, la respuesta ya está en el texto de entrenamiento. La máscara causal oculta los tokens futuros para que cada predicción use solo la posición actual y las anteriores.

La máscara de padding tiene otra función: excluye los tokens de relleno que añadimos para igualar longitudes. Ambas máscaras deciden qué posiciones están disponibles; los pesos de atención deciden cuánto aporta cada una de las permitidas.

Qué añade el resto del transformer

La atención reúne información de otros tokens. Después, una pequeña red transforma la representación de cada posición. Un transformer encadena varios bloques como este para seguir elaborando las representaciones.

Las conexiones residuales suman la entrada de una parte del bloque a su resultado, de modo que la información anterior siga teniendo un camino directo. La normalización ayuda a controlar la escala de los valores durante el entrenamiento.

En el esquema, B cuenta los ejemplos del batch, S las posiciones de cada frase y D los números de cada vector. El bloque mantiene esas dimensiones, aunque cambien los valores que contienen.

Entrada: [B, S, D]
  → combinar información con atención
  → transformar cada posición
Salida:  [B, S, D]

Qué comprobar al llevarlo a código

Las dimensiones ayudan a seguir qué representa cada grupo de números. Un cálculo puede ejecutarse sin errores y aun así mezclar ejemplos o posiciones que deberían estar separados.

  • Los pesos de cada Query deben repartirse entre las Keys que puede consultar.
  • Las frases de un batch se procesan juntas, pero no deben intercambiar contexto entre sí.
  • W_K es la matriz de parámetros que produce las Keys; K contiene el resultado para el texto que hemos dado al modelo.
  • Obtener una salida con parámetros recién creados solo comprueba que el cálculo funciona. Aprender requiere entrenamiento.

Curso 04 Conceptos clave

Adaptar un modelo a una tarea

Generative AI Engineering and Fine-Tuning Transformers

¿Qué cambia cuando ajustas un modelo?

El siguiente paso del programa es trabajar con modelos preentrenados: cargarlos, ejecutar inferencia y adaptarlos con ejemplos de una tarea. Introduce el ajuste eficiente de parámetros, con métodos como LoRA y QLoRA, usando Hugging Face y PyTorch.

Inferencia
Se utiliza el modelo para obtener una salida, sin actualizar sus pesos.
Fine-tuning
Los ejemplos de entrenamiento modifican parámetros para adaptar su comportamiento.
LoRA
Se entrenan matrices pequeñas de adaptación mientras los pesos base permanecen congelados.
Las piezas del proceso
  1. Modelo base

    Pesos preentrenados

  2. Adaptación

    Ejemplos de la tarea

  3. Validación

    Datos separados

Adaptar requiere medir: mejorar en los ejemplos de entrenamiento no demuestra una mejora en datos nuevos.