1. Tokenizing

Tokenizing

Tokenizing es el proceso de descomponer datos, como texto, en piezas más pequeñas y manejables llamadas tokens. A cada token se le asigna un identificador numérico único (ID). Este es un paso fundamental en la preparación del texto para el procesamiento por modelos de aprendizaje automático, especialmente en el procesamiento del lenguaje natural (NLP).

El objetivo de esta fase inicial es muy simple: Dividir la entrada en tokens (ids) de una manera que tenga sentido.

How Tokenizing Works

  1. Splitting the Text:

  • Basic Tokenizer: Un tokenizador simple podría dividir el texto en palabras individuales y signos de puntuación, eliminando espacios.

  • Ejemplo: Texto: "Hello, world!" Tokens: ["Hello", ",", "world", "!"]

  1. Creating a Vocabulary:

  • Para convertir tokens en IDs numéricos, se crea un vocabulario. Este vocabulario enumera todos los tokens únicos (palabras y símbolos) y asigna a cada uno un ID específico.

  • Special Tokens: Estos son símbolos especiales añadidos al vocabulario para manejar varios escenarios:

  • [BOS] (Beginning of Sequence): Indica el inicio de un texto.

  • [EOS] (End of Sequence): Indica el final de un texto.

  • [PAD] (Padding): Se utiliza para hacer que todas las secuencias en un lote tengan la misma longitud.

  • [UNK] (Unknown): Representa tokens que no están en el vocabulario.

  • Ejemplo: Si "Hello" tiene ID 64, "," es 455, "world" es 78, y "!" es 467, entonces: "Hello, world!"[64, 455, 78, 467]

  • Handling Unknown Words: Si una palabra como "Bye" no está en el vocabulario, se reemplaza con [UNK]. "Bye, world!"["[UNK]", ",", "world", "!"][987, 455, 78, 467] &#xNAN;(Suponiendo que [UNK] tiene ID 987)

Advanced Tokenizing Methods

Mientras que el tokenizador básico funciona bien para textos simples, tiene limitaciones, especialmente con vocabularios grandes y el manejo de palabras nuevas o raras. Los métodos avanzados de tokenización abordan estos problemas descomponiendo el texto en subunidades más pequeñas o optimizando el proceso de tokenización.

  1. Byte Pair Encoding (BPE):

  • Purpose: Reduce el tamaño del vocabulario y maneja palabras raras o desconocidas descomponiéndolas en pares de bytes que ocurren con frecuencia.

  • How It Works:

  • Comienza con caracteres individuales como tokens.

  • Fusiona iterativamente los pares de tokens más frecuentes en un solo token.

  • Continúa hasta que no se puedan fusionar más pares frecuentes.

  • Benefits:

  • Elimina la necesidad de un token [UNK] ya que todas las palabras pueden ser representadas combinando tokens de subpalabras existentes.

  • Vocabulario más eficiente y flexible.

  • Ejemplo: "playing" podría ser tokenizado como ["play", "ing"] si "play" y "ing" son subpalabras frecuentes.

  1. WordPiece:

  • Used By: Modelos como BERT.

  • Purpose: Similar a BPE, descompone palabras en unidades de subpalabras para manejar palabras desconocidas y reducir el tamaño del vocabulario.

  • How It Works:

  • Comienza con un vocabulario base de caracteres individuales.

  • Agrega iterativamente la subpalabra más frecuente que maximiza la probabilidad de los datos de entrenamiento.

  • Utiliza un modelo probabilístico para decidir qué subpalabras fusionar.

  • Benefits:

  • Equilibra entre tener un tamaño de vocabulario manejable y representar efectivamente las palabras.

  • Maneja eficientemente palabras raras y compuestas.

  • Ejemplo: "unhappiness" podría ser tokenizado como ["un", "happiness"] o ["un", "happy", "ness"] dependiendo del vocabulario.

  1. Unigram Language Model:

  • Used By: Modelos como SentencePiece.

  • Purpose: Utiliza un modelo probabilístico para determinar el conjunto más probable de tokens de subpalabras.

  • How It Works:

  • Comienza con un gran conjunto de tokens potenciales.

  • Elimina iterativamente los tokens que menos mejoran la probabilidad del modelo de los datos de entrenamiento.

  • Finaliza un vocabulario donde cada palabra está representada por las unidades de subpalabras más probables.

  • Benefits:

  • Flexible y puede modelar el lenguaje de manera más natural.

  • A menudo resulta en tokenizaciones más eficientes y compactas.

  • Ejemplo: "internationalization" podría ser tokenizado en subpalabras más pequeñas y significativas como ["international", "ization"].

Code Example

Vamos a entender esto mejor a partir de un ejemplo de código de https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb:

# Download a text to pre-train the model
import urllib.request
url = ("https://raw.githubusercontent.com/rasbt/LLMs-from-scratch/main/ch02/01_main-chapter-code/the-verdict.txt")
file_path = "the-verdict.txt"
urllib.request.urlretrieve(url, file_path)

with open("the-verdict.txt", "r", encoding="utf-8") as f:
raw_text = f.read()

# Tokenize the code using GPT2 tokenizer version
import tiktoken
token_ids = tiktoken.get_encoding("gpt2").encode(txt, allowed_special={"[EOS]"}) # Allow the user of the tag "[EOS]"

# Print first 50 tokens
print(token_ids[:50])
#[40, 367, 2885, 1464, 1807, 3619, 402, 271, 10899, 2138, 257, 7026, 15632, 438, 2016, 257, 922, 5891, 1576, 438, 568, 340, 373, 645, 1049, 5975, 284, 502, 284, 3285, 326, 11, 287, 262, 6001, 286, 465, 13476, 11, 339, 550, 5710, 465, 12036, 11, 6405, 257, 5527, 27075, 11]

Referencias

Last updated