Dies ist eine Bibliothek, die auf Pytorch- und Hugging -Face -Transformatoren basiert, um die Lücke zwischen neuronalem Text und menschlichem Text mit der Mauve -Maßnahme zu messen, die in diesem Artikel von Neurips 2021 (Outstanding Paper Award) und dieses JMLR 2023 -Papier eingeführt wurde.
Mauve ist ein Maß für die Lücke zwischen neuronalem und menschlichem Text. Es wird unter Verwendung der Kullback -Leibler (KL) -Divergenzen zwischen den beiden Textverteilungen in einem quantisierten Einbettungsraum eines großen Sprachmodells berechnet. Mauve kann Unterschiede in der Qualität identifizieren, die sich aus Modellgrößen und Decodierungsalgorithmen ergeben.
Merkmale :
Weitere Details finden Sie unten.
Damit Skripte die Experimente im Papier reproduzieren können, finden Sie in diesem Repository.
Führen Sie diesen Befehl für eine direkte Installation in Ihrem Terminal aus:
pip install mauve-text
Wenn Sie Mauve bearbeiten oder zu beitragen möchten, sollten Sie aus der Quelle installieren
git clone [email protected]:krishnap25/mauve.git
cd mauve
pip install -e .
Einige Funktionen erfordert mehr Pakete. Bitte beachten Sie die folgenden Anforderungen.
Der obige Installationsbefehl installiert die Hauptanforderungen, nämlich:
numpy>=1.18.1scikit-learn>=0.22.1faiss-cpu>=1.7.0tqdm>=4.40.0Wenn Sie die Featurisation in Mauve verwenden möchten, müssen Sie außerdem manuell installieren:
torch>=1.1.0 : Anweisungentransformers>=3.2.0 : Führen Sie einfach pip install transformers nach der Installation von Pytorch aus (detaillierte Anweisungen) Lassen Sie p_text und q_text jeweils eine Liste von Zeichenfolgen sein, wobei jede Zeichenfolge eine vollständige Generation ist (einschließlich Kontext). Für bewährte Verfahren benötigt Mauve mindestens ein paar tausend Generationen für p_text und q_text (das Papier verwendet jeweils 5000). Für unsere Demo verwenden wir jeweils 100 Generationen für eine schnelle Laufzeit.
Um die Funktionen dieses Pakets für einige reale Daten zu demonstrieren, bietet dieses Repository einige Funktionen zum Herunterladen und Verwenden von Beispieldaten im Ordner ./examples (diese sind nicht Teil des Mauve -Pakets, Sie müssen das Repository dafür klonen).
Verwenden Sie einige Amazon-Produktbewertungen sowie Maschinengenerationen herunter, die vom GPT-2-Ausgangsdatensatz-Repo bereitgestellt werden, indem Sie diesen Befehl in unserer Shell ausführen (Downloads ~ 17m in Größe):
python examples/download_gpt2_dataset.py
Die Daten werden in den Ordner ./data heruntergeladen. Wir können die Daten (100 Proben aus den verfügbaren 5000) in Python laden als
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 ) # machineWir können jetzt Mauve wie folgt berechnen (beachten Sie, dass dies die Installation von Pytorch- und HF -Transformatoren erfordert).
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 Dieser erste Download von GPT-2 Large Tokenizer und vorgebildetem Modell (wenn Sie sie nicht bereits herunterladen lassen). Selbst wenn Sie das Modell offline haben, dauert es bis zu 30 Sekunden, das Modell beim ersten Mal zu laden. out enthält die Felder:
out.mauve : Mauve Score, eine Zahl zwischen 0 und 1. Größere Werte zeigen, dass P und Q näher sind.out.frontier_integral : Frontier Integral, eine Zahl zwischen 0 und 1. Kleinere Werte geben an, dass P und Q näher sind.out.mauve_star und out.frontier_integral_star : ihre entsprechenden Versionen, die mit einer Krichevsky-Trofimov-Glättung berechnet wurden. Sehen Sie sich dieses Papier von JMLR 2023 an, warum dies vorzuziehen sein könnte.out.divergence_curve : a numpy.ndarray von form (m, 2); Zeichnen Sie es mit Matplotlib, um die Divergenzkurve anzuzeigenout.p_hist : Eine diskrete Verteilung, eine quantisierte Version der Textverteilung p_textout.q_hist : gilt wie oben, aber mit q_textSie können die Divergenzkurve verwenden
# Make sure matplotlib is installed in your environment
import matplotlib . pyplot as plt
plt . plot ( out . divergence_curve [:, 1 ], out . divergence_curve [:, 0 ]) Für jeden Text (sowohl in p_text als auch q_text ) verwendet Mauve intern den terimal versteckten Zustand von GPT-2 groß wie eine Merkmalsdarstellung. Natürlich können neuere LLMs auch verwendet werden. Im Allgemeinen ist die Leistung von Mauve, je besser das Merkmal einbettet, desto besser.
Es gibt mehrere Möglichkeiten, dieses Paket zu verwenden. Beispielsweise können Sie direkte versteckte Zustände verwenden (dies erfordert keine Installation von Pytorch- und HF -Transformatoren):
# 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 )Beachten Sie, dass diese API verwendet werden kann, um andere Modalitäten wie Bilder oder Audio mit Mauve zu bewerten.
Sie können Mauve auch unter Verwendung der tokenisierten Darstellung (BPE) unter Verwendung des GPT-2-Vokabulars (z. B. erhalten, die durch die Verwendung eines expliziten Aufrufs bei transformers.GPT2Tokenizer erhalten wurden.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 ) Um die Fortschrittsnachrichten anzuzeigen, geben Sie das Argument aus mauve.compute_mauve verbose=True . Sie können auch verschiedene Formen als Eingänge für p und q , z. B. p über p_text und q über q_features verwenden.
mauve.compute_mauve nimmt die folgenden Argumente ein
p_features : numpy.ndarray von Form (n, d), wobei n die Anzahl der Generationen istq_features : numpy.ndarray von form (n, d), wobei n die Anzahl der Generationen istp_tokens : Liste der Länge N, jeder Eintrag ist Torch.longtensor der Form (1, Länge); Die Länge kann zwischen den Generationen variierenq_tokens : Liste der Länge N, jeder Eintrag ist Torch.longtensor der Form (1, Länge); Die Länge kann zwischen den Generationen variierenp_text : Liste der Länge n, jeder Eintrag ist eine Zeichenfolgeq_text : Liste der Länge n, jeder Eintrag ist eine Zeichenfolgenum_buckets : Die Größe des Histogramms zur Quantisierung von P und Q. Optionen: 'Auto' (Standard) oder eine Ganzzahlpca_max_data : Die Zahlendatenpunkte, die für die Reduzierung von PCA -Dimensionalität vor dem Clustering verwendet werden sollen. Wenn -1 , verwenden Sie alle Daten. Standard -1kmeans_explained_var : Varianz der Daten, um die Dimensionalitätsreduzierung durch PCA zu halten. Standard 0,9kmeans_num_redo : Anzahl der Male, um k-means Clustering zu wiederholen (das beste Ziel wird aufbewahrt). Standard 5kmeans_max_iter : Maximale Anzahl von K-Mittel-Iterationen. Standard 500featurize_model_name : Name des Modells, aus dem Merkmale erhalten werden. Standard 'gpt2-large' Verwenden Sie eine von ['gpt2', 'gpt2-medium', 'gpt2-large', 'gpt2-xl'] .device_id : Gerät zur Funktionierung. Geben Sie eine GPU -ID (z. B. 0 oder 3) zur Verwendung von GPU an. Wenn keine GPU mit dieser ID gefunden wird, verwenden Sie CPUmax_text_length : Maximale Anzahl von Token zu berücksichtigen. Standard 1024divergence_curve_discretization_size : Anzahl der Punkte, die auf der Divergenzkurve zu berücksichtigen sind. Standard 25mauve_scaling_factor : "C" aus dem Papier. Standard 5.verbose : Wenn True (Standard), drucken Sie Laufzeitaktualisierungen druckenseed : Zufälliger Samen zur Initialisierung von k -means Clusterzuweisungen.batch_size : Stapelgröße für die Feature -Extraktion. HINWEIS: p und q können unterschiedliche Längen haben, es wird jedoch empfohlen, dass sie die gleiche Länge haben.
Der beste Weg, um die Autoren im Falle von Fragen oder Klarstellungen (über das Paket oder das Papier) zu kontaktieren, besteht darin, ein Problem auf GitHub zuzubereiten. Wir sind nicht in der Lage, auf E -Mail -Anfragen zu antworten.
Wenn Sie Fehler finden, werfen Sie bitte ein Problem auf GitHub an. Wenn Sie einen Beitrag leisten möchten, senden Sie bitte eine Pull -Anfrage. Wir ermutigen und schätzen die Community -Beiträge.
Einige Funktionen, die gut zu haben wären, sind:
Mauve unterscheidet sich ganz von den meisten Metriken im gemeinsamen Gebrauch. Hier einige Richtlinien für die ordnungsgemäße Verwendung von Mauve:
Relative Vergleiche :
model1 und model2 die menschliche Verteilung besser generieren können, können wir MAUVE(text_model1, text_human) und MAUVE(text_model2, text_human) vergleichen.MAUVE(text_model1, text_human) kann je nach unten ausgewählter Hyperparameter variieren, die relativen Trends bleiben jedoch gleich.Anzahl der Generationen :
Anzahl der Cluster (Diskretisierungsgröße) :
num_buckets zu 0,1 * die Anzahl der Proben.Mauve ist zu groß oder zu klein :
mauve_scaling_parameter steuert den Absolutwert des Mauve -Scores, ohne die relative Reihenfolge zwischen verschiedenen Methoden zu ändern. Der Hauptzweck dieses Parameters besteht darin, bei der Interpretierbarkeit zu helfen.mauve_scaling_factor . (Anmerkung: Dies erhöht auch die starken Standardabweichung von Mauve).mauve_scaling_factor .Mauve dauert zu lange, um zu laufen :
num_buckets zu reduzieren. Die Laufzeit des Clustering -Algorithmus als Quadrat der Anzahl der Cluster. Sobald die Anzahl der Cluster 500 überschreitet, verlangsamt sich das Clustering wirklich. In diesem Fall könnte es hilfreich sein, die Anzahl der Cluster auf 500 zu setzen, indem die Standardeinstellung überschritten wird ( num_data_points / 10 Verwenden Sie dies, wenn die Anzahl der Proben für jedes von P und Q über 5000 liegt).kmeans_num_redo auf 1 , und wenn dies nicht funktioniert, kmeans_max_iter auf 100 . Dies ermöglicht es dem Clustering, auf Kosten für die Rückgabe eines schlechteren Clustering schneller zu laufen.Die Varianz von Mauve ist im Verhältnis zu den Unterschieden, die wir zu quantifizieren versuchen :
Wenn Sie dieses Paket nützlich finden oder es in Ihren Recherchen verwenden, geben Sie bitte die folgenden Arbeiten an:
@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}
}
Diese Arbeit wurde von NSF DMS-2134012, NSF CCF-2019844, NSF DMS-2023166, dem DARPA-MCS-Programm durch NIWC Pacific (N66001-19-2-4031), CIFAR-Lernen in Machines & Brains & Brains-Programm, A-Qualcomm-Innovation Fellow, und FACSICY-Forschungs-Awards-Programmen, A-A-Awards-Programmen und Awards Awards und Aws.