這是建立在Pytorch和Huggingface Transformers上的圖書館,以淡紫色測量措施來測量神經文本和人類文本之間的差距,該含量是在此Neurips 2021紙中引入的(傑出的紙張獎)和本JMLR 2023紙。
淡紫色是神經文本和人類文本之間差距的衡量標準。它是使用大語言模型的量化嵌入空間中兩個文本分佈之間的kullback -leibler(kl)差異計算的。淡紫色可以識別由模型大小和解碼算法引起的質量差異。
特徵:
可以在下面找到更多詳細信息。
要在論文中復制實驗,請參閱此存儲庫。
對於直接安裝,請從您的終端運行此命令:
pip install mauve-text
如果您想編輯或為紫紅色貢獻,則應從源安裝
git clone [email protected]:krishnap25/mauve.git
cd mauve
pip install -e .
一些功能需要更多的軟件包。請參閱下面的要求。
上面的安裝命令安裝主要要求,該要求是:
numpy>=1.18.1scikit-learn>=0.22.1faiss-cpu>=1.7.0tqdm>=4.40.0此外,如果您想在紫菜中使用特徵,則需要手動安裝:
torch>=1.1.0 :指令transformers>=3.2.0 :安裝了Pytorch後,只需運行pip install transformers (詳細說明) 令p_text和q_text每個字符串列表,其中每個字符串都是完整的一代(包括上下文)。為了獲得最佳實踐,淡紫色至少需要幾千代的p_text和q_text (本文使用5000篇)。對於我們的演示,我們在快速運行時間內使用100代。
為了在某些真實數據上演示此軟件包的功能,該存儲庫提供了一些功能來下載和使用./examples文件夾中的示例數據(這些不是Mauve軟件包的一部分,您需要為此克隆存儲庫)。
讓使用下載一些Amazon產品評論以及機器世代,由GPT-2輸出數據集回購提供,通過在我們的外殼中運行此命令(下載〜17m的大小):
python examples/download_gpt2_dataset.py
數據將下載到./data文件夾中。我們可以在Python中加載數據(可用5000中的100個樣本)
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 ) # machine現在,我們可以按以下方式計算淡紫色(請注意,這需要安裝Pytorch和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首先下載了GPT-2大令牌和預訓練的模型(如果您還沒有下載它們)。即使您有離線模型,也要首次加載模型長達30秒。 out包含這些字段:
out.mauve :淡紫色得分,數量在0到1之間。較大的值表明P和Q更近。out.frontier_integral :邊界積分,數量為0到1。較小的值表示P和Q更近。out.mauve_star and out.frontier_integral_star :使用Krichevsky-Trofimov平滑計算的相應版本。請參閱此JMLR 2023論文,涉及為什麼這是可取的。out.divergence_curve : numpy.ndarray的形狀(m,2);用matplotlib繪製它以查看發散曲線out.p_hist :一個離散分發,是文本發行版的量化版本p_textout.q_hist :與上面相同,但使用q_text您可以使用
# Make sure matplotlib is installed in your environment
import matplotlib . pyplot as plt
plt . plot ( out . divergence_curve [:, 1 ], out . divergence_curve [:, 0 ])對於每個文本(在p_text和q_text中),Mauve內部使用gpt-2大型隱藏狀態作為特徵表示。當然,也可以使用更多的LLM。通常,功能嵌入越好,紫菜的性能越好。
有多種使用此軟件包的方法。例如,您可以直接使用緩存的隱藏狀態(這不需要安裝Pytorch和HF變形金剛):
# 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 )請注意,該API可用於評估其他模式,例如圖像或淡紫色的音頻。
您還可以使用GPT-2詞彙使用令牌化(BPE)表示(例如,使用對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 )要查看進度消息,請傳遞參數verbose=True mauve.compute_mauve 。您還可以使用不同的表格作為p和q p_text p q通過q_features 。
mauve.compute_mauve進行以下參數
p_features : numpy.ndarray (n,d),其中n是世代的數量q_features : numpy.ndarray (n,d),其中n是世代的數量p_tokens :長度為n的列表,每個條目是torch。長度在幾代之間會有所不同q_tokens :長度為n的列表,每個條目是TORCH。形狀的Longtensor(1,長度);長度在幾代之間會有所不同p_text :長度n列表,每個條目都是字符串q_text :長度n列表,每個條目都是字符串num_buckets :量化p和q的直方圖的大小。選項:'auto'(默認)或整數pca_max_data :在聚類之前降低PCA維度的數字數據點。如果-1 ,請使用所有數據。默認值-1kmeans_explained_var :數據的差異數量,以降低PCA的維度。默認為0.9kmeans_num_redo :重做K-Means聚類的次數(保留了最佳目標)。默認5kmeans_max_iter :k均值迭代的最大數量。默認500featurize_model_name :獲得功能的模型名稱。默認的'gpt2-large'使用['gpt2', 'gpt2-medium', 'gpt2-large', 'gpt2-xl'] 。device_id :用於特徵的設備。提供GPU ID(例如0或3)以使用GPU。如果找到此ID的GPU,請使用CPUmax_text_length :要考慮的最大令牌數。默認1024divergence_curve_discretization_size :在差異曲線上要考慮的點數。默認25mauve_scaling_factor :紙上的“ C”。默認5。verbose :如果是true(默認),打印運行時間更新seed :隨機種子初始化K-均值群集分配。batch_size :特徵提取的批量大小。注意: p和q長度可能不同,但建議它們的長度相同。
在任何疑問或澄清(有關包裝或紙張)的情況下,與作者聯繫的最佳方法是在Github上提出問題。我們無法通過電子郵件回複查詢。
如果您發現任何錯誤,請在Github上提出問題。如果您想做出貢獻,請提交拉動請求。我們鼓勵和高度重視社區貢獻。
某些可以擁有的功能是:
淡紫色與大多數普通用途的指標截然不同,因此這裡有一些有關淡紫色適當使用的準則:
相對比較:
model1和model2的哪個更好地生成人類分佈,我們可以比較MAUVE(text_model1, text_human)和MAUVE(text_model2, text_human) 。MAUVE(text_model1, text_human)可能會根據下面選擇的超參數而變化,但相對趨勢保持不變。世代數:
集群數(離散大小) :
num_buckets為0.1 *樣本數。淡紫色太大或太小:
mauve_scaling_parameter控制著淡紫色得分的絕對值,而無需更改各種方法之間的相對排序。此參數的主要目的是幫助解釋性。mauve_scaling_factor的值。 (注意:這還增加了紫紅色的每次標準偏差)。mauve_scaling_factor的值。淡紫色花太長時間運行:
num_buckets減少簇數。聚類算法的運行時間縮放為簇數的平方。一旦簇的數量超過500,聚類確實開始放慢速度。在這種情況下,通過覆蓋默認值(即num_data_points / 10 )將簇數設置為500可能會很有幫助,因此,當P和Q的每個樣本數量超過5000時,請使用此簇。kmeans_num_redo設置為1 ,如果這不起作用,則kmeans_max_iter為100 。這使得聚類可以以返回較差的聚類為代價更快地運行。相對於我們試圖量化的差異,紫菜的方差很大:
如果您發現此軟件包有用,或者在研究中使用它,請引用以下論文:
@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}
}
這項工作得到了NSF DMS-2134012,NSF CCF-2019844,NSF DMS-2023166,通過NIWC Pacific(N66001-19-2-4031)的DARPA MCS計劃,CIFAR,CIFAR,CIFAR,“在機器和Brains中學習”,“在機器和Brains”中學習。