これは、PytorchとHuggingfaceトランスの上に構築されたライブラリで、このNeurips 2021 Paper(Out Standinding Paper Award)とこのJMLR 2023ペーパーで導入されたMauve Measureを使用して、神経テキストと人間のテキストのギャップを測定するライブラリです。
Mauveは、神経テキストと人間のテキストの間のギャップの尺度です。大規模な言語モデルの量子化された埋め込み空間で、2つのテキスト分布間のKullback – Leibler(KL)の発散を使用して計算されます。 Mauveは、モデルサイズとデコードアルゴリズムから生じる品質の違いを特定できます。
特徴:
詳細については、以下にご覧ください。
紙の実験を再現するスクリプトについては、このリポジトリを参照してください。
直接インストールするには、端末からこのコマンドを実行します。
pip install mauve-text
Mauveの編集または貢献を希望する場合は、ソースからインストールする必要があります
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さらに、Mauve内で機能を使用する場合は、手動でインストールする必要があります。
torch>=1.1.0 :指示transformers>=3.2.0 :Pytorchがインストールされた後にpip install transformersを実行するだけです(詳細な指示) p_textとq_textをそれぞれ文字列のリストとし、各文字列が完全な生成(コンテキストを含む)です。ベストプラクティスのために、Mauveはp_textとq_textにそれぞれ少なくとも数千世代を必要とします(この論文はそれぞれ5000を使用しています)。デモでは、それぞれ100世代を速い実行時間に使用します。
いくつかの実際のデータでこのパッケージの機能を示すために、このリポジトリは./examples examplesフォルダーにサンプルデータをダウンロードおよび使用する機能を提供します(これらはMauveパッケージの一部ではありません。これらのリポジトリをクローンする必要があります)。
このコマンドをシェルで実行してGPT-2出力データセットリポジトリ(サイズで〜17mダウンロード)を実行して、いくつかのAmazon製品のレビューと機械の世代をダウンロードしましょう。
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これで、Mauveを次のように計算できます(これには、Pytorchと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これにより、GPT-2の大型トークナイザーと事前に訓練されたモデルをダウンロードします(すでにダウンロードしていない場合)。モデルがオフラインである場合でも、モデルを初めてロードするのに最大30秒かかります。 out今、フィールドが含まれています:
out.mauve :Mauveスコア、0から1の間の数。より大きな値は、PとQがより近いことを示しています。out.frontier_integral :フロンティア積分、0から1の間の数。値が小さいことは、pとqがより近いことを示しています。out.mauve_star and out.frontier_integral_star :krichevsky-trofimovothingで計算された対応するバージョン。これが望ましい理由については、このJMLR 2023ペーパーを参照してください。out.divergence_curve : numpy.ndarray of shape(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のTerimal Hidden状態を内部的に使用します。もちろん、より最近のLLMも使用できます。一般的に、特徴が埋め込まれるほど、Mauveのパフォーマンスは優れています。
このパッケージを使用する方法は複数あります。たとえば、キャッシュされた隠された状態を直接使用できます(これには、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は、Mauveを使用した画像やオーディオなどの他のモダリティを評価するために使用できることに注意してください。
また、GPT-2語彙(たとえば、 transformers.GPT2Tokenizerを使用して取得する)を使用して、トークン化(BPE)表現を使用してMauveを計算することもできます。
# 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 )進行状況メッセージを表示するには、引数に渡されます= mauve.compute_mauveにverbose=Trueに渡されます。また、 pおよびq pとしてさまざまqフォームq_features使用することもできますp_text
mauve.compute_mauve 、次の議論を取ります
p_features : numpy.ndarray of shape(n、d)、nは世代の数ですq_features : numpy.ndarray of Shape(n、d)、ここでnは世代の数ですp_tokens :長さnのリスト、各エントリはtorch.longtensor of shape(1、length)です。長さは世代によって異なりますq_tokens :長さnのリスト、各エントリはtorch.longtensor of shape(1、length)です。長さは世代によって異なります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-means反復の最大数。デフォルト500featurize_model_name :機能が取得されるモデルの名前。デフォルト'gpt2-large' ['gpt2', 'gpt2-medium', 'gpt2-large', 'gpt2-xl']のいずれかを使用します。device_id :機能化のためのデバイス。 GPUを使用するには、GPU ID(0または3)を提供します。このIDが見つからない場合は、CPUを使用してくださいmax_text_length :考慮すべきトークンの最大数。デフォルト1024divergence_curve_discretization_size :発散曲線で考慮するポイント数。デフォルト25mauve_scaling_factor :紙からの "c"。デフォルト5。verbose :True(デフォルト)の場合、実行時間の更新を印刷しますseed : K -Meansクラスター割り当てを初期化するランダムシード。batch_size :機能抽出のバッチサイズ。注: pとq長さは異なりますが、同じ長さであることをお勧めします。
質問や説明(パッケージや論文について)の場合に著者に連絡する最良の方法は、GitHubで問題を提起することです。メールでクエリに応答することはできません。
バグが見つかった場合は、GitHubで問題を提起してください。貢献したい場合は、プルリクエストを送信してください。コミュニティの貢献を奨励し、高く評価しています。
良い機能は次のとおりです。
Mauveは、一般的な使用のほとんどのメトリックとはまったく異なるため、Mauveの適切な使用に関するいくつかのガイドラインを次に示します。
相対的な比較:
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スコアの絶対値を制御します。このパラメーターの主な目的は、解釈可能性を支援することです。mauve_scaling_factorの値を増やしてみてください。 (注:これにより、Mauveのランごとの標準偏差も増加します)。mauve_scaling_factorの値を減らしてみてください。モーブは走るのに時間がかかりすぎます:
num_bucketsを使用してクラスターの数を減らすこともできます。クラスターの数の平方としてのクラスタリングアルゴリズムの実行時間はスケーリングされます。クラスターの数が500を超えると、クラスタリングは本当に遅くなり始めます。この場合、デフォルトをオーバーライドすることでクラスターの数を500に設定すると役立つ可能性があります(これはnum_data_points / 10であるため、pとqのそれぞれのサンプルの数が5000を超える場合にこれを使用してください)。kmeans_num_redoを1に設定し、これが機能しない場合はkmeans_max_iter 100になります。これにより、クラスタリングがより悪いクラスタリングを返すために、クラスタリングをより速く実行できます。Mauveの分散は、私たちが定量化しようとする違いに比べて大きい:
このパッケージが役立つ場合、または調査で使用する場合は、次の論文を引用してください。
@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 "Machines&Brains in Brainsの研究プログラム、QUALCOMM Innovation Fellowspyyの研究。