Ejercicio práctico: Carga y preprocesamiento de un dataset de ejemplo

Quiz
30 min~5 min lectura

Quiz Interactivo

Pon a prueba tus conocimientos

Concepto clave

El preprocesamiento de datasets para RLHF (Reinforcement Learning from Human Feedback) es el proceso de transformar datos crudos en un formato estructurado que pueda ser consumido por modelos de lenguaje durante el fine-tuning. Imagina que estás preparando ingredientes para un chef de alta cocina: no le das vegetales sin lavar o carne sin cortar; limpias, cortas y organizas todo para que pueda enfocarse en la cocción. En RLHF, los datos típicamente incluyen prompts, respuestas generadas por el modelo base, y preferencias humanas (rankings) que indican qué respuesta es mejor.

Este proceso es crítico porque los modelos de lenguaje son extremadamente sensibles a la calidad y consistencia de los datos de entrada. Un dataset mal preprocesado puede introducir ruido, sesgos o inconsistencias que degradan el rendimiento del modelo final, similar a cómo un motor de coche falla con combustible contaminado. En RLHF, además, debemos asegurar que las preferencias estén alineadas con el objetivo de fine-tuning (ej., ser útil, honesto, inofensivo) y que los pares de comparación sean balanceados.

Cómo funciona en la práctica

Vamos a desglosar el preprocesamiento para un dataset de ejemplo como Anthropic HH-RLHF, que contiene conversaciones con preferencias humanas. Sigue estos pasos:

  1. Carga del dataset: Usa bibliotecas como Hugging Face Datasets para cargar el dataset desde un repositorio o archivo local. Verifica la estructura con métodos como .info() o .head().
  2. Limpieza de texto: Aplica normalización (ej., minúsculas, eliminación de espacios extra), tokenización básica, y manejo de caracteres especiales. Esto asegura consistencia, similar a estandarizar medidas en una receta.
  3. Formateo para RLHF: Convierte los datos en pares (prompt, respuesta preferida, respuesta rechazada). Por ejemplo, si el dataset tiene rankings, selecciona la respuesta con mayor puntuación como preferida y una con menor como rechazada.
  4. División de datos: Separa en conjuntos de entrenamiento, validación y prueba (ej., 80/10/10) para evaluar el modelo sin sobreajuste.
  5. Tokenización final: Usa el tokenizer del modelo base (ej., GPT-2, LLaMA) para convertir texto en IDs numéricos, truncando o padding a una longitud máxima.
Un dataset bien preprocesado puede mejorar la eficiencia del entrenamiento en hasta un 30%, reduciendo tiempo y costos computacionales.

Caso de estudio

Supongamos que estamos fine-tuning un modelo para asistentes de chat más útiles, usando un dataset simulado de preguntas y respuestas con preferencias. Aquí hay un ejemplo de datos crudos y procesados:

Prompt crudoRespuesta A (preferida)Respuesta B (rechazada)Preferencia humana
"¿Cómo se hace café?""Muele granos, añade agua caliente, filtra.""Compra una máquina."A > B
"Explica la gravedad""Fuerza que atrae objetos con masa.""Algo sobre el espacio."A > B

Después del preprocesamiento, los datos se tokenizan y estructuran en un formato como JSONL, listo para el pipeline de RLHF. En la práctica, usaríamos código para automatizar esto, manejando miles de ejemplos de manera eficiente.

Errores comunes

  • No balancear las preferencias: Si un tipo de respuesta (ej., larga) siempre es preferida, el modelo puede aprender a generar respuestas verbosas sin importar la calidad. Solución: Aleatorizar o usar muestreo estratificado.
  • Ignorar la longitud de contexto: Tokenizar sin truncar puede causar errores de memoria. Solución: Establecer una longitud máxima basada en el modelo y dataset.
  • Contaminación de datos Incluir ejemplos de prueba en el entrenamiento lleva a sobreajuste. Solución: Validar las divisiones con hashes o marcas temporales.
  • Manejo incorrecto de missing values: Eliminar filas con datos faltantes puede sesgar el dataset. Solución: Imputar o usar técnicas como forward-fill para datos secuenciales.
  • No normalizar el texto: Variaciones en mayúsculas o puntuación confunden al modelo. Solución: Aplicar pipeline de limpieza consistente.

Checklist de dominio

  1. He cargado el dataset y verificado su estructura básica (ej., número de filas, columnas).
  2. He limpiado el texto (normalización, manejo de caracteres especiales).
  3. He formateado los datos en pares para RLHF (prompt, respuesta preferida, respuesta rechazada).
  4. He dividido los datos en entrenamiento, validación y prueba sin contaminación.
  5. He tokenizado usando el tokenizer del modelo base, con padding/truncado apropiado.
  6. He guardado el dataset preprocesado en un formato eficiente (ej., Parquet, JSONL).
  7. He documentado los pasos y decisiones para reproducibilidad.

Carga y preprocesamiento de un dataset de RLHF simulado

En este ejercicio, practicarás la carga y preprocesamiento de un dataset simulado para RLHF, similar a los usados en proyectos reales. Sigue estos pasos:

  1. Configura el entorno: Asegúrate de tener instaladas las bibliotecas necesarias: datasets, transformers, y pandas en tu entorno Python.
  2. Carga el dataset: Usa el siguiente código para cargar un dataset simulado desde un archivo CSV local o una URL. El dataset contiene columnas: prompt, response_a, response_b, preference (donde 1 indica que A es preferida, 0 que B es preferida).
    import pandas as pd
    url = "https://ejemplo.com/dataset_rlhf.csv"
    df = pd.read_csv(url)
    print(df.head())
    print(df.info())
  3. Limpia y normaliza: Aplica limpieza de texto: convierte a minúsculas, elimina espacios extra, y maneja valores nulos. Usa funciones como .str.lower() y .dropna() en pandas.
  4. Formatea para RLHF: Crea un nuevo DataFrame con columnas prompt, chosen (respuesta preferida), y rejected (respuesta no preferida), basado en la columna preference.
  5. Divide los datos: Separa en 80% entrenamiento, 10% validación, 10% prueba usando train_test_split de scikit-learn, asegurando aleatoriedad con una semilla.
  6. Tokeniza: Carga un tokenizer de un modelo base (ej., gpt2 de Hugging Face) y tokeniza los textos, truncando a 128 tokens y aplicando padding.
  7. Guarda el resultado: Exporta el dataset preprocesado a un archivo JSONL para uso futuro en fine-tuning.
Pistas
  • Usa la documentación de Hugging Face Datasets para manejar datasets grandes eficientemente.
  • Verifica que no haya sesgo en las preferencias contando cuántas veces A es preferida sobre B.
  • Prueba con un subconjunto pequeño primero para validar tu pipeline antes de escalar.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.