Esta é uma biblioteca construída nos transformadores de Pytorch e Huggingface para medir a lacuna entre o texto neural e o texto humano com a medida Mauve, introduzida neste artigo Neurips 2021 (prêmio de papel excelente) e este artigo JMLR 2023.
Mauve é uma medida da lacuna entre o texto neural e o texto humano. Ele é calculado usando as divergências Kullback -Leibler (KL) entre as duas distribuições de texto em um espaço de incorporação quantizado de um grande modelo de linguagem. Mauve pode identificar diferenças na qualidade decorrentes dos tamanhos dos modelos e dos algoritmos de decodificação.
Características :
Mais detalhes podem ser encontrados abaixo.
Para os scripts reproduzirem os experimentos no artigo, consulte este repositório.
Para uma instalação direta, execute este comando do seu terminal:
pip install mauve-text
Se você deseja editar ou contribuir para o Mauve, deve instalar a partir da fonte
git clone [email protected]:krishnap25/mauve.git
cd mauve
pip install -e .
Alguma funcionalidade requer mais pacotes. Por favor, veja os requisitos abaixo.
O comando de instalação acima instala os principais requisitos, que são:
numpy>=1.18.1scikit-learn>=0.22.1faiss-cpu>=1.7.0tqdm>=4.40.0Além disso, se você deseja usar a apresentação em Mauve, precisa instalar manualmente:
torch>=1.1.0 : Instruçõestransformers>=3.2.0 : Simplesmente execute pip install transformers após a instalação do Pytorch (instruções detalhadas) Seja p_text e q_text uma lista de strings, onde cada string é uma geração completa (incluindo contexto). Para as práticas recomendadas, o Mauve precisa de pelo menos alguns milhares de gerações cada para p_text e q_text (o artigo usa 5000 cada). Para nossa demonstração, usamos 100 gerações cada para o tempo de execução rápido.
Para demonstrar as funcionalidades deste pacote em alguns dados reais, este repositório fornece algumas funcionalidades para baixar e usar dados de amostra na pasta ./examples (estes não fazem parte do pacote Mauve, você precisa clonar o repositório para eles).
Vamos usar download algumas análises de produtos da Amazon, bem como gerações de máquinas, fornecidas pelo repo do conjunto de dados de saída GPT-2, executando este comando em nosso shell (downloads ~ 17m de tamanho):
python examples/download_gpt2_dataset.py
Os dados são baixados na pasta ./data . Podemos carregar os dados (100 amostras do 5000 disponíveis) em 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 ) # machineAgora podemos calcular o Mauve da seguinte forma (observe que isso requer a instalação dos transformadores Pytorch e HF).
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 primeiro baixa o GPT-2 Large Tokenizer e o modelo pré-treinado (se você ainda não os tiver baixado). Mesmo se você tiver o modelo offline, leva até 30 segundos para carregar o modelo pela primeira vez. out agora contém os campos:
out.mauve : Pontuação Mauve, um número entre 0 e 1. Valores maiores indicam que P e Q estão mais próximos.out.frontier_integral : Frontier Integral, um número entre 0 e 1. Valores menores indicam que P e Q estão mais próximos.out.mauve_star e out.frontier_integral_star : suas versões correspondentes calculadas com a suavização de Krichevsky-Trofimov. Veja este artigo JMLR 2023 sobre por que isso pode ser preferível.out.divergence_curve : um numpy.ndarray de forma (m, 2); Plote -o com matplotlib para ver a curva de divergênciaout.p_hist : uma distribuição discreta, que é uma versão quantizada da distribuição de texto p_textout.q_hist : o mesmo que acima, mas com q_textVocê pode plotar a curva de divergência 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 (em p_text e q_text ), o Mauve usa internamente o estado oculto terimal do GPT-2 grande como uma representação de recursos. Obviamente, LLMs mais recentes também podem ser usados. Geralmente, quanto melhor o recurso incorporação, melhor é o desempenho de Mauve.
Existem várias maneiras de usar este pacote. Por exemplo, você pode usar diretamente os estados ocultos em cache (isso não requer que os transformadores de Pytorch e HF sejam instalados):
# 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 )Observe que esta API pode ser usada para avaliar outras modalidades, como imagens ou áudio com o Mauve.
Você também pode calcular o Mauve usando a representação tokenizada (BPE) usando o vocabulário GPT-2 (por exemplo, obtido do uso de uma chamada explícita para 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 visualizar as mensagens de progresso, passe no argumento verbose=True para mauve.compute_mauve . Você também pode usar formas diferentes como entradas para p e q , por exemplo, p via p_text e q via q_features .
mauve.compute_mauve leva os seguintes argumentos
p_features : numpy.ndarray of Shape (n, d), onde n é o número de geraçõesq_features : numpy.ndarray of Shape (n, d), onde n é o número de geraçõesp_tokens : Lista de comprimento n, cada entrada é tocha.Longtensor of Shape (1, comprimento); o comprimento pode variar entre geraçõesq_tokens : Lista de comprimento n, cada entrada é tocha. o comprimento pode variar entre geraçõesp_text : lista de comprimento n, cada entrada é uma stringq_text : Lista de comprimento n, cada entrada é uma stringnum_buckets : o tamanho do histograma para quantizar as opções P e Q.: 'Auto' (padrão) ou um número inteiropca_max_data : os pontos de dados numéricos a serem usados para redução da dimensionalidade do PCA antes do cluster. Se -1 , use todos os dados. Padrão -1kmeans_explained_var : quantidade de variação dos dados a se manter na redução da dimensionalidade pelo PCA. Padrão 0,9kmeans_num_redo : Número de vezes para refazer o cluster K-Means (o melhor objetivo é mantido). Padrão 5kmeans_max_iter : número máximo de iterações K-means. Padrão 500featurize_model_name : nome do modelo a partir do qual os recursos são obtidos. O padrão 'gpt2-large' usa um dos ['gpt2', 'gpt2-medium', 'gpt2-large', 'gpt2-xl'] .device_id : dispositivo para featurização. Forneça um ID da GPU (por exemplo, 0 ou 3) para usar a GPU. Se nenhuma GPU com este ID for encontrada, use a CPUmax_text_length : número máximo de tokens a serem considerados. Padrão 1024divergence_curve_discretization_size : Número de pontos a serem considerados na curva de divergência. Padrão 25mauve_scaling_factor : "c" do papel. Padrão 5.verbose : se true (padrão), imprimir atualizações de tempo de execuçãoseed : semente aleatória para inicializar as atribuições de cluster de k -means.batch_size : Tamanho do lote para extração de recursos. Nota: p e q podem ter comprimentos diferentes, mas é recomendável que eles tenham o mesmo comprimento.
A melhor maneira de entrar em contato com os autores em caso de perguntas ou esclarecimentos (sobre o pacote ou o artigo) é levantar um problema no Github. Não somos capazes de responder a consultas por e -mail.
Se você encontrar algum bug, por favor, levante um problema no Github. Se você deseja contribuir, envie uma solicitação de tração. Incentivamos e valorizamos muito as contribuições da comunidade.
Alguns recursos que seriam bons de ter são:
Mauve é bem diferente da maioria das métricas de uso comum, então aqui estão algumas diretrizes sobre o uso adequado de Mauve:
Comparações relativas :
model1 e model2 são melhores na geração da distribuição humana, podemos comparar MAUVE(text_model1, text_human) e MAUVE(text_model2, text_human) .MAUVE(text_model1, text_human) pode variar com base nos hiperparâmetros selecionados abaixo, mas as tendências relativas permanecem as mesmas.Número de gerações :
Número de clusters (tamanho da discretização) :
num_buckets para ser 0,1 * o número de amostras.Mauve é muito grande ou muito pequeno :
mauve_scaling_parameter controla o valor absoluto da pontuação do Mauve, sem alterar a ordem relativa entre vários métodos. O principal objetivo deste parâmetro é ajudar na interpretabilidade.mauve_scaling_factor . (Nota: isso também aumenta o desvio padrão por execução de Mauve).mauve_scaling_factor .Mauve leva muito tempo para correr :
num_buckets . O tempo de execução do algoritmo de agrupamento é escala como o quadrado do número de clusters. Uma vez que o número de clusters excede 500, o cluster realmente começa a desacelerar. Nesse caso, pode ser útil definir o número de clusters como 500, substituindo o padrão (que é num_data_points / 10 ; portanto, use isso quando o número de amostras para cada um de P e Q for superior a 5000).kmeans_num_redo como 1 e, se isso não funcionar, kmeans_max_iter como 100 . Isso permite que o cluster seja mais rápido à custa de retornar um agrupamento pior.A variação de Mauve é grande em relação às diferenças que tentamos quantificar :
Se você achar este pacote útil ou usa -o em sua pesquisa, cite os seguintes trabalhos:
@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 trabalho foi suportado pelo NSF DMS-2134012, NSF CCF-2019844, NSF DMS-2023166, o programa DARPA MCS por meio do programa NIWC Pacific (N666001-19-2-4031), o Cifar ", o Cifar em Machines & Breains" Program ", um seguinte.