Ini adalah perpustakaan yang dibangun di atas pytorch dan transformator huggingface untuk mengukur kesenjangan antara teks saraf dan teks manusia dengan ukuran Mauve, diperkenalkan dalam kertas Neurips 2021 ini (Outstanding Paper Award) dan kertas JMLR 2023 ini.
Mauve adalah ukuran kesenjangan antara teks saraf dan teks manusia. Ini dihitung menggunakan divergensi Kullback -Leibler (KL) antara dua distribusi teks dalam ruang embedding terkuantisasi dari model bahasa besar. Mauve dapat mengidentifikasi perbedaan dalam kualitas yang timbul dari ukuran model dan algoritma decoding.
Fitur :
Rincian lebih lanjut dapat ditemukan di bawah.
Agar skrip mereproduksi percobaan di koran, silakan lihat repositori ini.
Untuk instalasi langsung, jalankan perintah ini dari terminal Anda:
pip install mauve-text
Jika Anda ingin mengedit atau berkontribusi ke Mauve, Anda harus menginstal dari sumber
git clone [email protected]:krishnap25/mauve.git
cd mauve
pip install -e .
Beberapa fungsi membutuhkan lebih banyak paket. Silakan lihat persyaratan di bawah ini.
Perintah instalasi di atas menginstal persyaratan utama, yaitu:
numpy>=1.18.1scikit-learn>=0.22.1faiss-cpu>=1.7.0tqdm>=4.40.0Selain itu, jika Anda ingin menggunakan fiturisasi di dalam Mauve, Anda perlu menginstal secara manual:
torch>=1.1.0 : instruksitransformers>=3.2.0 : Cukup jalankan pip install transformers setelah pytorch telah diinstal (instruksi terperinci) Biarkan p_text dan q_text masing -masing menjadi daftar string, di mana setiap string adalah generasi lengkap (termasuk konteks). Untuk praktik terbaik, Mauve membutuhkan setidaknya beberapa ribu generasi untuk p_text dan q_text (makalah ini menggunakan masing -masing 5000). Untuk demo kami, kami menggunakan 100 generasi masing -masing untuk waktu berjalan cepat.
Untuk menunjukkan fungsionalitas paket ini pada beberapa data nyata, repositori ini menyediakan beberapa fungsi untuk mengunduh dan menggunakan data sampel di folder ./examples (ini bukan bagian dari paket Mauve, Anda perlu mengkloning repositori untuk ini).
Biarkan gunakan unduh beberapa ulasan produk Amazon serta generasi mesin, yang disediakan oleh GPT-2 Output Dataset Repo dengan menjalankan perintah ini di shell kami (unduhan ~ 17m dalam ukuran):
python examples/download_gpt2_dataset.py
Data diunduh ke folder ./data . Kami dapat memuat data (100 sampel dari 5000 yang tersedia) di Python sebagai
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 ) # machineKami sekarang dapat menghitung ungu muda sebagai berikut (perhatikan bahwa ini memerlukan pemasangan transformator Pytorch dan 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 Ini pertama mengunduh GPT-2 Tokenizer Besar dan model pra-terlatih (jika Anda belum memilikinya diunduh). Bahkan jika Anda memiliki model offline, dibutuhkan hingga 30 detik untuk memuat model pertama kali. out sekarang berisi bidang:
out.mauve : skor lembah, angka antara 0 dan 1. Nilai yang lebih besar menunjukkan bahwa p dan q lebih dekat.out.frontier_integral : Frontier Integral, angka antara 0 dan 1. Nilai yang lebih kecil menunjukkan bahwa P dan Q lebih dekat.out.mauve_star dan out.frontier_integral_star : Versi yang sesuai dihitung dengan perataan Krichevsky-Trofimov. Lihat kertas JMLR 2023 ini tentang mengapa ini bisa lebih disukai.out.divergence_curve : a numpy.ndarray of Shape (m, 2); plot dengan matplotlib untuk melihat kurva divergensiout.p_hist : distribusi diskrit, yang merupakan versi terkuantisasi dari distribusi teks p_textout.q_hist : sama seperti di atas, tetapi dengan q_textAnda dapat memplot kurva divergensi menggunakan
# Make sure matplotlib is installed in your environment
import matplotlib . pyplot as plt
plt . plot ( out . divergence_curve [:, 1 ], out . divergence_curve [:, 0 ]) Untuk setiap teks (baik dalam p_text dan q_text ), Mauve secara internal menggunakan keadaan tersembunyi terimal dari GPT-2 besar sebagai representasi fitur. Tentu saja, LLMS yang lebih baru juga dapat digunakan. Secara umum, semakin baik embedding fitur, semakin baik kinerja ungu muda.
Ada beberapa cara untuk menggunakan paket ini. Misalnya, Anda dapat menggunakan status tersembunyi yang di -cache secara langsung (ini tidak memerlukan transformer Pytorch dan HF untuk diinstal):
# 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 )Perhatikan bahwa API ini dapat digunakan untuk mengevaluasi modalitas lain seperti gambar atau audio dengan ungu muda.
Anda juga dapat menghitung ungu muda menggunakan representasi tokenized (BPE) menggunakan kosakata GPT-2 (misalnya, diperoleh dari menggunakan panggilan eksplisit ke 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 ) Untuk melihat pesan kemajuan, lulus dalam argumen verbose=True to mauve.compute_mauve . Anda juga dapat menggunakan berbagai bentuk sebagai input untuk p dan q , misalnya p via p_text dan q melalui q_features .
mauve.compute_mauve mengambil argumen berikut
p_features : numpy.ndarray of Shape (n, d), di mana n adalah jumlah generasiq_features : numpy.ndarray of Shape (n, d), di mana n adalah jumlah generasip_tokens : Daftar Panjang N, setiap entri adalah Torch.longtensor bentuk (1, panjang); Panjang dapat bervariasi antar generasiq_tokens : Daftar Panjang N, setiap entri adalah Torch.longtensor bentuk (1, panjang); Panjang dapat bervariasi antar generasip_text : Daftar Panjang N, setiap entri adalah stringq_text : Daftar Panjang N, Setiap entri adalah stringnum_buckets : Ukuran histogram untuk mengukur P dan Q. Opsi: 'Auto' (default) atau integerpca_max_data : Poin data angka yang akan digunakan untuk pengurangan dimensi PCA sebelum pengelompokan. Jika -1 , gunakan semua data. Default -1kmeans_explained_var : Jumlah varian data untuk disimpan dalam pengurangan dimensi oleh PCA. Default 0.9kmeans_num_redo : Jumlah kali untuk mengulangi pengelompokan K-means (tujuan terbaik disimpan). Default 5kmeans_max_iter : Jumlah maksimum iterasi k-means. Default 500featurize_model_name : Nama model dari mana fitur diperoleh. Default 'gpt2-large' menggunakan salah satu ['gpt2', 'gpt2-medium', 'gpt2-large', 'gpt2-xl'] .device_id : Perangkat untuk fitur. Suplai ID GPU (misalnya 0 atau 3) untuk menggunakan GPU. Jika tidak ada GPU dengan ID ini ditemukan, gunakan CPUmax_text_length : Jumlah token maksimum yang perlu dipertimbangkan. Default 1024divergence_curve_discretization_size : Jumlah poin yang perlu dipertimbangkan pada kurva divergensi. Default 25mauve_scaling_factor : "c" dari kertas. Default 5.verbose : Jika benar (default), cetak pembaruan waktu berjalanseed : Benih acak untuk menginisialisasi penugasan kluster k -Means.batch_size : Ukuran batch untuk ekstraksi fitur. Catatan: p dan q dapat memiliki panjang yang berbeda, tetapi disarankan bahwa mereka memiliki panjang yang sama.
Cara terbaik untuk menghubungi penulis jika ada pertanyaan atau klarifikasi (tentang paket atau kertas) adalah dengan mengangkat masalah di GitHub. Kami tidak dapat menanggapi pertanyaan atas email.
Jika Anda menemukan bug, angkat masalah di GitHub. Jika Anda ingin berkontribusi, silakan kirim permintaan tarik. Kami mendorong dan sangat menghargai kontribusi komunitas.
Beberapa fitur yang bagus untuk dimiliki adalah:
Mauve sangat berbeda dari kebanyakan metrik yang digunakan umum, jadi berikut adalah beberapa pedoman tentang penggunaan ungu muda yang tepat:
Perbandingan relatif :
model1 dan model2 yang mana yang lebih baik dalam menghasilkan distribusi manusia, kita dapat membandingkan MAUVE(text_model1, text_human) dan MAUVE(text_model2, text_human) .MAUVE(text_model1, text_human) dapat bervariasi berdasarkan hiperparameter yang dipilih di bawah ini, tetapi tren relatif tetap sama.Jumlah generasi :
Jumlah cluster (ukuran diskritisasi) :
num_buckets menjadi 0,1 * jumlah sampel.Ungu muda terlalu besar atau terlalu kecil :
mauve_scaling_parameter mengontrol nilai absolut dari skor ungu muda, tanpa mengubah pemesanan relatif antara berbagai metode. Tujuan utama dari parameter ini adalah untuk membantu interpretabilitas.mauve_scaling_factor . (Catatan: Ini juga meningkatkan standar deviasi per run dari lembu).mauve_scaling_factor .Mauve membutuhkan waktu terlalu lama untuk dijalankan :
num_buckets . Waktu run algoritma clustering berskala sebagai kuadrat dari jumlah kelompok. Setelah jumlah cluster melebihi 500, pengelompokan benar -benar mulai melambat. Dalam hal ini, dapat membantu untuk mengatur jumlah cluster menjadi 500 dengan menimpa default (yang num_data_points / 10 , jadi gunakan ini ketika jumlah sampel untuk masing -masing p dan q lebih dari 5000).kmeans_num_redo ke 1 , dan jika ini tidak berhasil, kmeans_max_iter ke 100 . Ini memungkinkan pengelompokan untuk berjalan lebih cepat dengan biaya pengembalian pengelompokan yang lebih buruk.Varian Mauve relatif besar terhadap perbedaan yang kami coba kuantifikasi :
Jika Anda menemukan paket ini bermanfaat, atau Anda menggunakannya dalam riset Anda, silakan kutip makalah berikut:
@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}
}
This work was supported by NSF DMS-2134012, NSF CCF-2019844, NSF DMS-2023166, the DARPA MCS program through NIWC Pacific (N66001-19-2-4031), the CIFAR "Learning in Machines & Brains" program, a Qualcomm Innovation Fellowship, and faculty research awards.