这是建立在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”中学习。