Esta es una biblioteca construida sobre los transformadores de Pytorch y Huggingface para medir la brecha entre el texto neuronal y el texto humano con la medida de Mauve, introducida en este documento Neurips 2021 (premio de papel sobresaliente) y este documento JMLR 2023.
Mauve es una medida de la brecha entre el texto neuronal y el texto humano. Se calcula utilizando las divergencias Kullback -Leibler (KL) entre las dos distribuciones de texto en un espacio de incrustación cuantificado de un modelo de lenguaje grande. Mauve puede identificar diferencias en la calidad derivada de los tamaños del modelo y los algoritmos de decodificación.
Características :
Se pueden encontrar más detalles a continuación.
Para que los scripts reproduzcan los experimentos en el documento, consulte este repositorio.
Para una instalación directa, ejecute este comando desde su terminal:
pip install mauve-text
Si desea editar o contribuir a Mauve, debe instalar desde la fuente
git clone [email protected]:krishnap25/mauve.git
cd mauve
pip install -e .
Alguna funcionalidad requiere más paquetes. Consulte los requisitos a continuación.
El comando de instalación anterior instala los requisitos principales, que son:
numpy>=1.18.1scikit-learn>=0.22.1faiss-cpu>=1.7.0tqdm>=4.40.0Además, si desea utilizar la caracterización dentro de Mauve, debe instalar manualmente:
torch>=1.1.0 : instruccionestransformers>=3.2.0 : simplemente ejecute pip install transformers después de que se haya instalado Pytorch (instrucciones detalladas) Deje que p_text y q_text sean una lista de cadenas, donde cada cadena es una generación completa (incluido el contexto). Para las mejores prácticas, Mauve necesita al menos unos pocos miles de generaciones cada una para p_text y q_text (el documento usa 5000 cada uno). Para nuestra demostración, usamos 100 generaciones cada una para un tiempo de ejecución rápido.
Para demostrar las funcionalidades de este paquete en algunos datos reales, este repositorio proporciona algunas funcionalidades para descargar y usar datos de muestra en la carpeta ./examples (estos no son parte del paquete MAUVE, debe clonar el repositorio para estos).
Deje usar algunas reseñas de productos de Amazon, así como generaciones de máquinas, proporcionadas por el repositorio del conjunto de datos de salida GPT-2 ejecutando este comando en nuestro shell (descargas ~ 17m de tamaño):
python examples/download_gpt2_dataset.py
Los datos se descargan en la carpeta ./data . Podemos cargar los datos (100 muestras de los 5000 disponibles) en Python como
from examples import load_gpt2_dataset
p_text = load_gpt2_dataset ( 'data/amazon.valid.jsonl' , num_examples = 100 ) # human
q_text = load_gpt2_dataset ( 'data/amazon-xl-1542M.valid.jsonl' , num_examples = 100 ) # machineAhora podemos calcular Mauve de la siguiente manera (tenga en cuenta que esto requiere la instalación de Pytorch y HF Transformers).
import mauve
# call mauve.compute_mauve using raw text on GPU 0; each generation is truncated to 256 tokens
out = mauve . compute_mauve ( p_text = p_text , q_text = q_text , device_id = 0 , max_text_length = 256 , verbose = False )
print ( out . mauve ) # prints 0.9917 Este primer descarga GPT-2 Tokenizer grande y modelo previamente capacitado (si no los ha descargado). Incluso si tiene el modelo fuera de línea, se necesita hasta 30 segundos para cargar el modelo la primera vez. out contiene los campos:
out.mauve : puntaje de mauve, un número entre 0 y 1. Los valores más grandes indican que P y Q están más cerca.out.frontier_integral : Frontier Integral, un número entre 0 y 1. Los valores más pequeños indican que P y Q están más cerca.out.mauve_star y out.frontier_integral_star : sus versiones correspondientes calculadas con Krichevsky-Trofimov suavizante. Vea este artículo JMLR 2023 sobre por qué esto podría ser preferible.out.divergence_curve : un numpy.ndarray de forma (m, 2); tráfico con matplotlib para ver la curva de divergenciaout.p_hist : una distribución discreta, que es una versión cuantificada de la distribución de texto p_textout.q_hist : igual que el anterior, pero con q_textPuedes trazar la curva de divergencia usando
# Make sure matplotlib is installed in your environment
import matplotlib . pyplot as plt
plt . plot ( out . divergence_curve [:, 1 ], out . divergence_curve [:, 0 ]) Para cada texto (tanto en p_text como q_text ), Mauve usa internamente el estado oculto terimal de GPT-2 grande como representación de características. Por supuesto, también se pueden usar LLM más recientes. En general, cuanto mejor sean las incrustaciones de características, mejor es el rendimiento de Mauve.
Hay varias formas de usar este paquete. Por ejemplo, puede usar estados ocultos en caché directamente (esto no requiere que se instalen Pytorch y HF Transformers):
# call mauve.compute_mauve using features obtained directly
# p_feats and q_feats are `np.ndarray`s of shape (n, dim)
# we use a synthetic example here
import numpy as np
p_feats = np . random . randn ( 100 , 1024 ) # feature dimension = 1024
q_feats = np . random . randn ( 100 , 1024 )
out = mauve . compute_mauve ( p_features = p_feats , q_features = q_feats )Tenga en cuenta que esta API se puede utilizar para evaluar otras modalidades, como imágenes o audio con Mauve.
También puede calcular MAUVE utilizando la representación tokenizada (BPE) utilizando el vocabulario GPT-2 (por ejemplo, obtenido de usar una llamada explícita a transformers.GPT2Tokenizer ).
# call mauve.compute_mauve using tokens on GPU 1
# p_toks, q_toks are each a list of LongTensors of shape [1, length]
# we use synthetic examples here
import torch
p_toks = [ torch . LongTensor ( np . random . choice ( 50257 , size = ( 1 , 32 ), replace = True )) for _ in range ( 100 )]
q_toks = [ torch . LongTensor ( np . random . choice ( 50257 , size = ( 1 , 32 ), replace = True )) for _ in range ( 100 )]
out = mauve . compute_mauve ( p_tokens = p_toks , q_tokens = q_toks , device_id = 1 , max_text_length = 1024 ) Para ver los mensajes de progreso, pase en el argumento verbose=True a mauve.compute_mauve . También puede usar diferentes formularios como entradas para p y q , EG, p a través de p_text y q a través de q_features .
mauve.compute_mauve toma los siguientes argumentos
p_features : numpy.ndarray of Shape (n, d), donde n es el número de generacionesq_features : numpy.ndarray of Shape (n, d), donde n es el número de generacionesp_tokens : lista de longitud n, cada entrada es antorcha. Longtensor de forma (1, longitud); La longitud puede variar entre generacionesq_tokens : lista de longitud n, cada entrada es antorcha. Longtensor de forma (1, longitud); La longitud puede variar entre generacionesp_text : lista de longitud n, cada entrada es una cadenaq_text : lista de longitud n, cada entrada es una cadenanum_buckets : el tamaño del histograma para cuantificar P y Q. Opciones: 'Auto' (predeterminado) o un enteropca_max_data : el número de datos de datos a usar para la reducción de dimensionalidad PCA antes de la agrupación. Si -1 , usa todos los datos. Predeterminado -1kmeans_explained_var : cantidad de varianza de los datos para mantener en la reducción de dimensionalidad por PCA. Predeterminado 0.9kmeans_num_redo : número de veces para rehacer la agrupación de K-means (el mejor objetivo se mantiene). Predeterminado 5kmeans_max_iter : número máximo de iteraciones de K-means. Predeterminado 500featurize_model_name : nombre del modelo del que se obtienen las características. Predeterminado 'gpt2-large' Use uno de ['gpt2', 'gpt2-medium', 'gpt2-large', 'gpt2-xl'] .device_id : dispositivo para caracterización. Suministra una ID de GPU (por ejemplo, 0 o 3) para usar GPU. Si no se encuentra GPU con esta ID, use CPUmax_text_length : número máximo de tokens a considerar. Predeterminado 1024divergence_curve_discretization_size : número de puntos a considerar en la curva de divergencia. Predeterminado 25mauve_scaling_factor : "C" del papel. Predeterminado 5.verbose : si es verdadero (predeterminado), imprima actualizaciones de tiempo de ejecuciónseed : semilla aleatoria para inicializar las asignaciones de clúster k -eans.batch_size : tamaño por lotes para la extracción de características. Nota: p y q pueden ser de diferentes longitudes, pero se recomienda que tengan la misma longitud.
La mejor manera de contactar a los autores en caso de cualquier pregunta o aclaración (sobre el paquete o el documento) es planteando un problema en GitHub. No podemos responder a las consultas por correo electrónico.
Si encuentra algún error, plantee un problema en GitHub. Si desea contribuir, envíe una solicitud de extracción. Fomentamos y valoramos las contribuciones comunitarias altamente.
Algunas características que serían buenas son:
Mauve es bastante diferente de la mayoría de las métricas de uso común, por lo que aquí hay algunas pautas sobre el uso adecuado de Mauve:
Comparaciones relativas :
model1 y model2 son mejores para generar la distribución humana, podemos comparar MAUVE(text_model1, text_human) y MAUVE(text_model2, text_human) .MAUVE(text_model1, text_human) puede variar según los hiperparámetros seleccionados a continuación, pero las tendencias relativas siguen siendo las mismas.Número de generaciones :
Número de grupos (tamaño de discretización) :
num_buckets como 0.1 * el número de muestras.Mauve es demasiado grande o demasiado pequeño :
mauve_scaling_parameter controla el valor absoluto de la puntuación MAUVE, sin cambiar el orden relativo entre varios métodos. El objetivo principal de este parámetro es ayudar con la interpretabilidad.mauve_scaling_factor . (Nota: Esto también aumenta la desviación estándar por ejecución de MAUVE).mauve_scaling_factor .Mauve tarda demasiado en correr :
num_buckets . El tiempo de ejecución del algoritmo de agrupación se escala como el cuadrado del número de grupos. Una vez que el número de grupos excede los 500, la agrupación realmente comienza a disminuir. En este caso, podría ser útil establecer el número de grupos en 500 anulando el valor predeterminado (que es num_data_points / 10 , así que use esto cuando el número de muestras para cada uno de P y Q sea superior a 5000).kmeans_num_redo en 1 , y si esto no funciona, kmeans_max_iter a 100 . Esto permite que la agrupación se ejecute más rápido a costa de devolver una peor agrupación.La varianza de Mauve es grande en relación con las diferencias que intentamos cuantificar :
Si encuentra útil este paquete, o lo usa en su investigación, cite los siguientes documentos:
@article{pillutla-etal:mauve:jmlr2023,
title={{MAUVE Scores for Generative Models: Theory and Practice}},
author={Pillutla, Krishna and Liu, Lang and Thickstun, John and Welleck, Sean and Swayamdipta, Swabha and Zellers, Rowan and Oh, Sewoong and Choi, Yejin and Harchaoui, Zaid},
journal={JMLR},
year={2023}
}
@inproceedings{pillutla-etal:mauve:neurips2021,
title={MAUVE: Measuring the Gap Between Neural Text and Human Text using Divergence Frontiers},
author={Pillutla, Krishna and Swayamdipta, Swabha and Zellers, Rowan and Thickstun, John and Welleck, Sean and Choi, Yejin and Harchaoui, Zaid},
booktitle = {NeurIPS},
year = {2021}
}
@inproceedings{liu-etal:mauve-theory:neurips2021,
title={{Divergence Frontiers for Generative Models: Sample Complexity, Quantization Effects, and Frontier Integrals}},
author={Liu, Lang and Pillutla, Krishna and Welleck, Sean and Oh, Sewoong and Choi, Yejin and Harchaoui, Zaid},
booktitle={NeurIPS},
year={2021}
}
Este trabajo fue respaldado por NSF DMS-2134012, NSF CCF-2019844, NSF DMS-2023166, el programa DARPA MCS a través de NIWC Pacific (N66001-19-2-4031), el "aprendizaje de Machines & Brains" CIFAR en el Programa de Innovación CALCOMM y la Facultad de Investigación Facultiva.