Perplejidad de los modelos de lenguaje

La perplejidad es una métrica de evaluación que mide la calidad de los modelos de lenguaje. En este post hablaremos de qué es la perplejidad y cómo se calcula para el popular modelo GPT2 .
¿Qué es un modelo de lenguaje?
Es posible que ya haya oído hablar de los modelos de lenguaje grande (LLM) como BERT, GPT2, etc., que han cambiado la cara del procesamiento del lenguaje natural. Existen diferentes tipos de modelos de lenguaje, como modelos de lenguaje estadístico y modelos de lenguaje neuronal. Los SLM se basan en estadísticas en el texto dado, mientras que los modelos de lenguaje neuronal se entrenan utilizando arquitecturas de redes neuronales.
En esencia, un modelo de lenguaje (LM) no es más que una distribución de probabilidad sobre un conjunto de palabras que se conoce como vocabulario del modelo. Indica la probabilidad de que ocurra una determinada palabra en el vocabulario dadas todas sus palabras anteriores. Por lo general, cualquier palabra que tenga la máxima probabilidad se selecciona como la siguiente palabra predicha en la secuencia.
Esta probabilidad se puede calcular multiplicando una secuencia de probabilidades condicionales para cada palabra dadas sus palabras anteriores, lo que da la probabilidad de esta secuencia.
Por ejemplo, la probabilidad conjunta de la oración de ejemplo "Es un hermoso día" se escribe como se muestra a continuación. Calcular esta probabilidad nos ayuda a predecir las siguientes palabras o las que faltan en una secuencia y, por lo tanto, el modelo aprende los matices del lenguaje, de ahí el término modelo de lenguaje.
P(It,is,a,beautiful,day) = P(day|beautiful, a, is, it) *
P(beautiful|a, is, it) * P(a|is, it) * P(is|it)
En las siguientes secciones, discutiremos algunos términos importantes que se utilizan para calcular la perplejidad.
entropía
La entropía es una medida que cuantifica la incertidumbre y se obtiene como la inversa de la probabilidad de que ocurra un evento. A mayor probabilidad, menor es la incertidumbre. Por lo tanto, el objetivo del modelo de lenguaje es minimizar la entropía de generar una secuencia de palabras que sean similares a las secuencias de entrenamiento. La fórmula para calcular la entropía es la siguiente, donde P(x) es la probabilidad de la palabra x.

Aquí hay un gran video para entender Entropy con más detalle:https://youtube.com/watch?v=YtebGVx-Fxw
Entropía cruzada
Cross Entropy compara dos distribuciones de probabilidad P(x) y Q(x). En el contexto de los modelos de lenguaje, comparamos la distribución de probabilidad predicha sobre las palabras con la distribución de probabilidad real. Aquí, P(x) es la distribución de probabilidad real y Q(x) es la distribución prevista por el modelo. Luego, la entropía cruzada se calcula como se muestra a continuación, que se puede usar como una función de pérdida para entrenar modelos de lenguaje.

Digamos que tenemos un modelo de lenguaje que ha sido entrenado con un vocabulario de solo 5 palabras “soleado”, “día”, “hermoso”, “paisaje”, “nubes”. Ahora, queremos calcular la perplejidad de la modelo cuando ve la frase “hermoso paisaje”.
Calculemos la entropía cruzada usando un ejemplo simple en PyTorch.
# Get the needed libraries
import torch
from torch.nn import functional as F
Estos logits luego se pasan a una función softmax que normaliza los valores y los convierte en una distribución de probabilidad. Esta es la distribución de probabilidad predicha.
tensor([[-0.7891, 1.3421, 0.4929, 0.0715, -0.0910],
[ 0.9024, -0.8675, 0.8498, -1.0331, 0.5531]])
F.softmax(input, dim = -1)
Predicted:
tensor([[0.0575, 0.4841, 0.2071, 0.1359, 0.1155],
[0.3369, 0.0574, 0.3196, 0.0486, 0.2375]])
Target/Actual: tensor([2, 3])
tensor([[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]])
Loss for First Word:
(((- 0 * log(0.0575)) + (- 0 * log(0.4841)) + (- 1 * log(0.2071)) +
(- 0 * log(0.1359)) + (- 0 * log(0.1155))) = 1.5745535105805986
Loss for Second Word:
(((- 0 * log(0.3369)) + (- 0 * log(0.0574)) + (- 0* log(0.3196)) +
(- 1* log(0.0486)) + (- 0 * log(0.2375))) = 3.024131748075689
Loss = (1.5745535105805986 + 3.024131748075689)/2 = 2.299
loss = torch.nn.CrossEntropyLoss()
output = loss(input, target)
output
Loss: tensor(2.299)
Intuitivamente, perplejidad significa estar sorprendido. Medimos cuánto se sorprende el modelo al ver nuevos datos. Cuanto menor es la perplejidad, mejor es el entrenamiento.
La perplejidad se calcula como exponente de la pérdida obtenida del modelo. En el ejemplo anterior, podemos ver que la perplejidad de nuestro modelo de ejemplo con respecto a la frase “hermoso paisaje” es 9.97. La fórmula de la perplejidad es el exponente de la media de log-verosimilitud de todas las palabras en una secuencia de entrada.

Ahora, comparemos la perplejidad de dos oraciones con GPT2 y veamos cuán perpleja es. Primero cargamos un tokenizador y una cabeza causal para el modelo GPT2 de HuggingFace:
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
inputs = tokenizer("ABC is a startup based in New York City and Paris", return_tensors = "pt")
loss = model(input_ids = inputs["input_ids"], labels = inputs["input_ids"]).loss
ppl = torch.exp(loss)
print(ppl)
Output: 29.48
inputs_wiki_text = tokenizer("Generative Pretrained Transformer is an opensource artificial intelligence created by OpenAI in February 2019", return_tensors = "pt")
loss = model(input_ids = inputs_wiki_text["input_ids"], labels = inputs_wiki_text["input_ids"]).loss
ppl = torch.exp(loss)
print(ppl)
Output: 211.81
La perplejidad generalmente se usa solo para determinar qué tan bien un modelo ha aprendido el conjunto de entrenamiento. Otras métricas como BLEU , ROUGE , etc., se utilizan en el conjunto de prueba para medir el rendimiento de la prueba.
En esta publicación, hemos discutido y calculado la entropía cruzada, la perplejidad de un modelo de lenguaje. En la próxima publicación, hablaremos sobre el punto de referencia GLUE que mide la capacidad general de comprensión del lenguaje de los modelos de lenguaje populares.