Fundamentos de LLM: Tokenización y Entrenamiento

Fundamentos de LLM: Tokenización y Entrenamiento

Descubre las diferencias clave entre tokenización y embeddings en modelos de lenguaje grandes (LLM) como GPT. Aprende cómo la tokenización descompone el texto en unidades manejables, mientras que los embeddings proporcionan representaciones vectoriales ricas de estos tokens. Comprender estos procesos es crucial para desbloquear el potencial de los LLM en tareas de procesamiento de lenguaje natural.

Introducción

La tokenización y los embeddings son componentes fundamentales de los modelos de lenguaje grandes (LLM) como GPT, cruciales para comprender y generar texto. La tokenización implica descomponer el texto sin procesar en unidades manejables llamadas tokens, mientras que los embeddings proporcionan representaciones vectoriales ricas de estos tokens. Comprender las diferencias entre tokenización y embeddings es esencial para captar las complejidades de cómo los LLM procesan los datos lingüísticos.

¿Qué es la tokenización?

Los tokens se discuten con frecuencia en la investigación de IA, como en el artículo de Llama 2, donde los autores mencionan el entrenamiento con 2 billones de tokens de datos. Los tokens sirven como la unidad fundamental, similar al “átomo”, para los modelos de lenguaje grandes (LLM). La tokenización implica traducir cadenas (es decir, texto) en secuencias de tokens y viceversa.

En el ámbito del aprendizaje automático, un token normalmente no equivale a una sola palabra. En cambio, podría representar una unidad más pequeña, como un carácter o una porción de una palabra, o una más grande, como una frase completa. El tamaño de los tokens varía según el enfoque de tokenización utilizado.

La tokenización generalmente la maneja un componente conocido como “Tokenizer”. Este módulo opera independientemente del modelo de lenguaje grande y tiene su propio conjunto de datos de entrenamiento de texto, que puede diferir completamente de los datos de entrenamiento del LLM.

¿Por qué es importante la tokenización?

La tokenización a menudo subyace a muchas peculiaridades observadas en los modelos de lenguaje grandes (LLM). Si bien algunos problemas podrían parecer inicialmente derivados de la arquitectura de la red neuronal o del LLM mismo, en realidad pueden atribuirse a la tokenización. Aquí hay una lista no exhaustiva de problemas que se remontan a la tokenización:

  • Imprecisiones en la ortografía
  • Dificultad con tareas simples de procesamiento de cadenas, como invertir una cadena
  • Rendimiento inferior en idiomas no ingleses, como el japonés
  • Rendimiento deficiente en operaciones aritméticas básicas
  • Desafíos con tareas de codificación, como Python, que enfrentó GPT-2
  • Problemas como espacios en blanco al final
  • Casos en los que versiones anteriores de GPT mostraban un comportamiento errático al preguntar sobre “SolidGoldMagikarp”
  • Preferencia por YAML sobre JSON en el manejo de datos estructurados

Profundizaremos en cómo la tokenización contribuye a estos problemas en esta publicación.

Detalles de la tokenización

Aquí hay una visión general de los pasos involucrados en la tokenización. Si bien algunos de estos pasos pueden no ser claros de inmediato, los exploraremos con más detalle a medida que avancemos en esta publicación.

Pre-entrenamiento: Establecimiento del vocabulario

  1. Recopilar datos de entrenamiento: Reúne un corpus grande de datos de texto del que el modelo aprenderá.
  2. Tokenización inicial: Emplea métodos de tokenización inicial para dividir el texto en unidades fundamentales, como palabras, subpalabras o caracteres.
  3. Creación del vocabulario: Selecciona un algoritmo de tokenización, como Byte Pair Encoding (BPE), WordPiece o SentencePiece, para generar un conjunto de tokens manejable y eficiente.
  4. Aplicación del algoritmo: Implementa el algoritmo elegido en los tokens iniciales para producir un conjunto de tokens de subpalabras o caracteres que capturen los matices lingüísticos presentes en los datos de entrenamiento.
  5. Asignación de ID: Asigna un ID entero único a cada token en el vocabulario resultante.

Proceso de tokenización en tiempo real

  1. Transforma el texto entrante en tokens basados en el vocabulario establecido, asegurando una cobertura completa de todo el texto.
  2. Asocia cada token con su respectivo ID entero según lo definido en el vocabulario preestablecido.
  3. Incorpora cualquier token especial esencial en la secuencia para cumplir con los requisitos de procesamiento del modelo.

Comprendiendo los desafíos de la tokenización

Siéntete libre de escribir oraciones y observa cómo se generan los tokens (y nota el correspondiente aumento en el recuento de tokens y el precio por prompt).

Pasa el cursor sobre el texto en el lado derecho después de habilitar la casilla “Mostrar espacios en blanco”, y observarás los tokens resaltados. Estos tokens generalmente consisten en “fragmentos” que a menudo incluyen el carácter de espacio al principio.

Aquí hay otro ejemplo:

Observa cómo los fragmentos de tokens y sus representaciones numéricas varían según:

  • La presencia de un espacio antes de la palabra
  • La existencia de signos de puntuación
  • El uso de mayúsculas y minúsculas

El modelo de lenguaje grande (LLM) debe aprender de los datos sin procesar que, a pesar de estas diferencias en los tokens, las palabras representan el mismo concepto o al menos son extremadamente similares. Esta variabilidad puede disminuir el rendimiento.

Otros idiomas humanos

Al comparar el tamaño de los fragmentos para el inglés con otros idiomas, a menudo notarás un número significativamente mayor de tokens utilizados para idiomas distintos del inglés. Esta diferencia surge del hecho de que los fragmentos para otros idiomas tienden a ser más fragmentados, lo que lleva a una longitud de secuencia inflada en los documentos.

En el mecanismo de atención de los transformers de aprendizaje automático, hay una mayor probabilidad de quedarse sin contexto para idiomas no ingleses. Incluso cuando se transmite el mismo mensaje, se consumen más tokens porque los fragmentos son más pequeños. Esta discrepancia está influenciada tanto por el conjunto de entrenamiento utilizado para el tokenizer como por el propio tokenizer.

En última instancia, esta utilización ineficiente de la ventana de contexto para idiomas no ingleses resulta en un rendimiento más pobre por parte del modelo de lenguaje grande (LLM) al manejar consultas en idiomas no ingleses.

Tokenización y código — Python

En el caso de Python, el codificador GPT-2 de OpenAI a menudo gastaba numerosos tokens en caracteres de espacio en blanco individuales utilizados en la sangría de segmentos de código Python. Este comportamiento, similar a los desafíos enfrentados con idiomas no ingleses, conduce a una hinchazón considerable de la ventana de contexto del modelo de lenguaje limitado (LLM) y, en consecuencia, a una caída en el rendimiento.

Configuración: YAML vs. JSON

Se ha descubierto que YAML tiene una mayor densidad en comparación con JSON, requiriendo menos tokens para realizar la misma tarea.

Aquí hay una ilustración sencilla:

JSON: 46 tokens

La hinchazón aumentada para JSON resulta en:

  1. Mayor dificultad para que el LLM lo comprenda (menos densidad, más propenso a exceder la ventana de contexto).
  2. Mayor gasto para los usuarios (ya que básicamente pagan por token durante las llamadas API a OpenAI).

Problemas de tokenización

La tokenización se encuentra en el núcleo de muchas anomalías observadas en los modelos de lenguaje grandes (LLM). Varios problemas que inicialmente podrían parecer relacionados con la arquitectura de la red neuronal o el LLM mismo pueden rastrearse hasta la tokenización. Por ejemplo:

  • Los LLM tienen dificultades para deletrear palabras o ejecutar tareas básicas de procesamiento de cadenas como invertir cadenas.
  • El rendimiento tiende a deteriorarse para idiomas no ingleses.
  • Los LLM muestran un rendimiento deficiente al manejar aritmética simple.
  • GPT-2 encontró desafíos significativos al ser encargado de codificar en Python.
  • Pueden surgir advertencias extrañas sobre espacios en blanco al final.
  • La frase “Solid Gold Magikarp” a menudo lleva a los LLM a desviarse hacia tangentes no relacionadas.
  • Se prefiere YAML sobre JSON al trabajar con LLM.

Tokenización en modelos de lenguaje grandes

En el entrenamiento de modelos de lenguaje grandes (LLM), el proceso implica tomar cadenas y convertirlas en enteros de un vocabulario predefinido. Estos enteros luego se utilizan para recuperar vectores de una tabla de embeddings, que posteriormente se ingresan al modelo Transformer. Este proceso se vuelve intrincado porque no solo necesita admitir el alfabeto inglés básico, sino también acomodar varios idiomas y caracteres especiales como emojis.

Cadenas en Python y puntos de código Unicode

En Python, las cadenas son secuencias inmutables que comprenden puntos de código Unicode. Estos puntos de código son definidos por el Consorcio Unicode dentro del estándar Unicode, que actualmente abarca aproximadamente 150,000 caracteres de 161 escrituras. El estándar Unicode se mantiene activamente, con la última versión, 15.1, lanzada en septiembre de 2023.

Para recuperar el punto de código Unicode de un solo carácter en Python, podemos usar la función ord(). Por ejemplo:

Sin embargo, emplear estos enteros de puntos de código sin procesar para la tokenización no es factible, ya que resultaría en un vocabulario excesivamente grande (150,000+) que también es inestable debido a la evolución continua del estándar Unicode.

Codificaciones de bytes Unicode

En busca de una solución de tokenización más efectiva, observamos las codificaciones de bytes Unicode como ASCII, UTF-8, UTF-16 y UTF-32. Estas codificaciones dictan los métodos para traducir puntos de código Unicode abstractos en bytes tangibles que son adecuados para el almacenamiento y la transmisión.

Codificaciones de bytes Unicode, ASCII, UTF-8, UTF-16, UTF-32

El Consorcio Unicode delineó tres tipos de codificaciones: UTF-8, UTF-16 y UTF-32. Estas codificaciones sirven como los medios para convertir texto Unicode en datos binarios o flujos de bytes.

Entre estas codificaciones, UTF-8 es la más prevalente. Traduce cada punto de código Unicode en un flujo de bytes que va de uno a cuatro bytes, dependiendo del punto de código. Los primeros 128 puntos de código (ASCII) necesitan solo un byte. Los siguientes 1,920 puntos de código necesitan dos bytes para codificar, abarcando la mayoría de los alfabetos de escritura latina. Se requieren tres bytes para los 61,440 puntos de código restantes dentro del Plano Multilingüe Básico (BMP). Cuatro bytes abarcan otros planos Unicode, incluyendo caracteres CJK menos comunes, varias escrituras históricas y símbolos matemáticos.

Usar los bytes UTF-8 sin procesar directamente sería altamente ineficiente para los modelos de lenguaje, resultando en secuencias excesivamente largas con un tamaño de vocabulario restringido de solo 256 valores de bytes posibles. Tal restricción dificulta la capacidad del modelo para atender contextos suficientemente largos.

La solución radica en emplear un algoritmo de codificación por pares de bytes (BPE) para comprimir estas secuencias de bytes de manera variable. Este enfoque permite la representación eficiente de texto con un tamaño de vocabulario más grande pero ajustable.

¿Cuál es la diferencia entre tokenización y embeddings?

La tokenización y los embeddings son procesos separados pero interrelacionados dentro de los modelos de lenguaje grandes (LLM) como GPT, contribuyendo a cómo estos modelos comprenden y generan texto. Aquí hay una breve descripción de cada uno y sus diferencias:

Tokenización en LLM

Objetivo: La tokenización tiene como objetivo transformar el texto sin procesar en una secuencia de tokens, que pueden abarcar palabras, subpalabras o caracteres, dependiendo del enfoque de tokenización elegido.

Procedimiento: Implica dividir el texto en segmentos manejables que el modelo pueda interpretar. Esto puede implicar inicialmente segmentar el texto según espacios y puntuación, seguido de una segmentación adicional en subpalabras o caracteres si están ausentes del vocabulario predefinido del modelo.

Resultado: El resultado es una secuencia de tokens que representa el texto original en un formato propicio para el procesamiento del modelo. A cada token se le asigna un ID entero único correspondiente al vocabulario del modelo.

Embeddings

Objetivo: Los embeddings son representaciones vectoriales continuas, compactas y de baja dimensión de los tokens. Codifican significados semánticos y sintácticos, facilitando la comprensión del modelo de los matices del lenguaje.

Procedimiento: Después de la tokenización, cada token (representado por su ID entero) se asocia con un vector de embedding. Estos vectores se adquieren durante la fase de entrenamiento del modelo y se almacenan en una matriz o tabla de embeddings.

Resultado: Los embeddings funcionan como entrada para las capas de la red neuronal del LLM, lo que permite al modelo realizar cálculos sobre los tokens y discernir relaciones y patrones dentro del conjunto de datos.

Encuentra información más detallada sobre los embeddings de LLM en nuestro blog: Qué son los Embeddings de LLM: Todo lo que Necesitas Saber

upload in progress, 0

Características distintivas

Etapa de procesamiento: La tokenización sirve como un paso de preprocesamiento inicial, convirtiendo el texto en un formato comprensible para el modelo (tokens), mientras que los embeddings ocurren después de la tokenización, traduciendo los tokens en representaciones vectoriales detalladas.

Función: La tokenización se ocupa principalmente de la descomposición estructural y representación del texto, mientras que los embeddings se centran en capturar y aprovechar los significados semánticos y sintácticos incrustados en los tokens.

Representación: La tokenización produce representaciones discretas basadas en enteros de los componentes del texto, mientras que los embeddings transforman estos enteros en vectores continuos que codifican información lingüística.

Conclusión

En conclusión, la tokenización y los embeddings desempeñan roles fundamentales en el funcionamiento de los modelos de lenguaje grandes. Mientras que la tokenización estructura el texto en tokens, los embeddings proporcionan significados semánticos y sintácticos a estos tokens a través de representaciones vectoriales. Al comprender estos procesos, obtenemos información sobre cómo los LLM interpretan y generan texto, contribuyendo a los avances en el procesamiento del lenguaje natural.

novita.ai, la plataforma integral para la creatividad ilimitada que te brinda acceso a más de 100 APIs. Desde generación de imágenes y procesamiento de lenguaje hasta mejora de audio y manipulación de video, con precios de pago por uso económicos, te libera de las molestias del mantenimiento de GPU mientras construyes tus propios productos. Pruébalo gratis.

Lectura recomendada

¿Cuál es la diferencia entre LLM y GPT?

Predicciones del Leaderboard de LLM 2024 Reveladas

Motor de Inferencia LLM de Novita AI: el mayor rendimiento y la inferencia más barata disponible