このリポジトリには、次の論文のコードとデータが含まれています。
MIXCE:前方と逆のエントロピーを混合して、オートレーフレンシャリング言語モデルをトレーニングする
@inproceedings{zhang2023mixce,
title={MixCE: Training Autoregressive Language Models by Mixing Forward and Reverse Cross-Entropies},
author={Zhang, Shiyue and Wu, Shijie and İrsoy, Ozan and Lu, Steven and Bansal, Mohit and Dredze, Mark and Rosenberg, David},
booktitle={Proceedings of the 61th Annual Meeting of the Association for Computational Linguistics},
year={2023}
}
コード著者: Shiyue Zhang
python -m pip install -r requirements.txtオプション:既存のパッケージとのバージョンの衝突を回避するには、仮想環境でインストールを実行することをお勧めします。
python -m venv yourenv
. yourenv/bin/activate # for bash, might be something else for your particular shell
python -m pip install -r requirements.txtSynthetic.pyは、合成実験を実行するためのスクリプトです。実験を実行するのは非常に簡単です。実行するだけです。
python synthetic.py
構成(シード、音声サイズなど)を指定および変更できます。スクリプト内およびif __name__ == '__main__':
Synthetic.py内には、実行できる合成実験の種類を決定するいくつかの重要な構成があります。
REAL_DATASET :なしでNone 、遷移マトリックスはランダムに初期化されます。または、 'webtext'の場合、遷移マトリックスは、事前に計算された遷移マトリックスからWebtextの初期化されます。
zero_percent :遷移マトリックスの値の数は0です。たとえば、 zero_percent==0.5の場合、遷移行列の50%の確率は0です。
vocab_size :語彙サイズ。 21、51、101、501、または1001をテストします。21は、20の通常のトークン(EOを含む)と1つのパッドトークンがあることを意味することに注意してください。
種子:各実験で5つの種子(7、42、777、4222、99999)を実行します。
loss_func :4つの損失関数をテストします:(1) 'two_xens' :それは私たちの論文でMixce*として示され、Gold Data Distribution PとGumbel SoftMaxを使用します。 (2) 'qlogq_mix' :近似混合損失関数です。 (3) 'two_kls' :2つのkl発散の混合。 (4) 'js' :js発散。
Train_eta :これらの損失関数の混合比。 'two_xens'のtrain_eta==1.0場合、それはmleです。 'two_kls'のtrain_eta==1.0の場合、それはフォワードklです(また等しいmle)。 'two_kls'のtrain_eta==0.0の場合、それは逆KLです。 JSの一般的な定義を使用し(詳細についてはこのペーパーを参照)、JSはtrain_etaまたは1.0に近づくと0に収束します。 Train_eta = 0.5の場合、それはJS発散の通常の定義です。
学習した遷移マトリックスを金遷移マトリックスと比較することにより、合成訓練されたBigRam LMSを評価します。 2つのメトリックを使用します。
(1)平均。 JS :金の各列間のJS発散を計算し、導入行列と列全体の平均を学んだことを計算します。
(2)平均。 0S :金の確率= 0位置で学習したマトリックスから値を取得し、平均します。
Synthetic.pyのcompare_parameters()関数は、これら2つのメトリックの計算に使用されます。
モデルはすべて、 synthetic_logs/ Directoryの下に保存されます。各モデルディレクトリの名前は、実験が実行されたデータタイムから始まります。モデルディレクトリの下には、テンソルボードイベントファイルと、各ミキシング比の最高のメトリックスコアを保存するall_best_metrics.jsonもあります。 Synthetic_logs/の下の例を参照してください。
モデル評価は各エポックの後に行われ、DEVセットの損失に基づいて最適なチェックポイントが選択されます。
最終的には、実験ごとに、5つの種子の結果を平均します。また、各目的で、AVGに基づいて最適な混合比を選択します。 JS。
get_synthetic_results() in sultss.pyは、5つの種子の平均結果と、AVGに容認される異なる混合比の並べ替えの結果に使用される関数です。 JS。
get_synthetic_results()を使用するには、モデルディレクトリを指定するには、まずsynthetic_models.jsonを準備する必要があります。例は、Synthetic_models.jsonに示されています。次に、 get_synthetic_results('webtext', '20', 'two_kls')を実行することにより、webtext初期化された遷移マトリックス、vocab = 20、および2_klsを使用する実験の結果を取得できます。
デコニーザー。最初にMosesからdetokenizer.perlこちらからダウンロードし、次のPythonスクリプトがそれに依存しているため、Path data/detokenizer.perlの下に配置する必要があります。
それから:
cd data
python wikitext_data.py
python webtext_data.py
curl https://dl.fbaipublicfiles.com/fairseq/data/writingPrompts.tar.gz | tar xvzf -
python writingprompts_data.py
前処理されたデータは、 data/wikitext 、 data/webtext 、およびdata/writingPromptsの下で保存されます。
hugging hugging faceによって提供される命令に続いて、 git lfsを使用したクローンGPT-2モデル。
git lfs install
git clone https://huggingface.co/gpt2
GPT2は最小のGPT-2モデルです。また、GPT2-MediumとGPT2-Largeを実験します。 GPT2-LargeはMauveの計算に使用されるため、ダウンロードしてください。
git clone https://huggingface.co/gpt2-medium
git clone https://huggingface.co/gpt2-large
MauveのGPT2-Largeのコピーを作成します。
cp -r gpt2-large gpt2-large-mauve
GPT2-Largeに直接書き込み、Mauve計算に影響するためです。
実験を実行するだけで実行を開始できます。
python run.py
構成は、 run.py内で手動で指定できます。 if __name__ == '__main__'の例を参照してください。
run.pyにはいくつかの重要な構成があります:
Training_size :トレーニングデータサイズ、 '10K' 、 '25K' 、 '50K' 、および'100K'をテストします。デフォルトでは、 '50K'を使用します。
モデル: 'gpt2' 、 'gpt2-meidum' 、または'gpt2-large'にすることができます。
データセット: "wikitext" 、 "webtext" 、または"writingPrompts"にすることもできます。
Mixing_ratio : [0.0, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 0.99, 1.0]を検索し、Dev Set Mauveスコアに基づいて最適なmixing_ratioを選択します。
train_batch_size、蓄積、eval_batch_size :これらの構成は、使用するプラットフォームによって決定される必要があります。 1つのTesla V100 GPU(32Gメモリ)を使用し、この設定で推奨される構成はrun.pyです。
run.pyには1つのdictと3つの関数があります:
data_sets {} :データファイルのパスを保存します。
run_no_trainer() :モデルのトレーニングと評価に使用される関数。
run_no_trainer_eval() :モデル評価のみに使用される関数。
run_no_trainer_turn_topp() :top-pサンプリングのpをチューニングするために使用される関数。
run.py以外に、モデルトレーニングと評価のために他の重要なPythonスクリプトを紹介します。
GPT2.py (最も重要なファイル)には、混合損失関数を実装するGPT2MIXMODELモデルクラスが含まれています。
run_clm_no_trainer.pyは、GPT-2モデルをトレーニングおよび評価するスクリプトです。
run_clm_no_trainer_tune_topp.pyは、 run_clm_no_trainer.pyに似ていますが、トップサンプリングのハイパーパラメーターPの調整にのみ使用されることを除きます。
Metircs.pyには、モデル世代を評価するために使用するメトリックが含まれています。
モデルはtrain/ディレクトリの下で保存されます。
各モデルディレクトリの名前は、実験が実行されたデータタイムから始まります。モデルディレクトリの下で、最適なチェックポイント(開発の損失に基づいて選択)を保存します。
dev/test.sample 、 dev/test.sample1 、 dev/test.sample2 、およびdev/test.humanは、3つの偏見のないサンプリング世代と人間のテキストです。
dev/test_results.json困惑、多様性、繰り返しの結果を保存します。
PトップサンプリングのためにPを調整した後、 dev/test.topp(p=*)は、P値が異なるトップサンプリング世代です。
MauveとCoherenceを計算した後(詳細については次のセクションを参照)、 dev/test_mauve_coherence_*.json最大長のMauveとCoherenceスコアを持っています。
制御されたMauveとCoherenceを計算した後(詳細については次のセクションを参照)、 dev/test_controlled_mauve_coherence_*.json Maxの長さが異なる制御されたMauveおよびCoherenceスコアです。
私たちの論文では、6つのメトリックのスコアを報告します。
困惑はモデルトレーニング/評価とともに計算されます( run_clm_no_trainer.pyを参照)。
Diversityは、 Metircs.pyのdiversity()関数によって実装され、 run_clm_no_trainer.pyのcompute_diversity_repetition()関数を呼び出すことにより、モデルトレーニング/評価とともに計算されます。繰り返しは、私たちが実装した別のメトリックであるが、私たちの論文では報告しなかったことに注意してください。テキストの何パーセントが繰り返しループであるかをチェックし、繰り返しのフレーズの長さも返します。
MauveとCoherenceは、保存された生成ファイルを使用することにより、事後に計算されます。 metrics.pyのcompute_mauve()およびcompute_coherence()は、MauveとCoherenceを計算する2つのヘルパー関数です。それらは、 results.pyのcompute_mauve_coherence()関数によって呼び出されます。 compute_mauve_coherence()を使用するには、最初にmodels.jsonを準備して、評価のためにモデルディレクトリ名を指定する必要があります。
同様に、 results.pyのcompute_controlled_mauve_coherence()関数により、制御されたモーブと制御コヒーレンスを事後に計算することもできます。
| データセット | モデルサイズ | トレーニングデータサイズ | 客観的 | 抱きしめる顔のハブ名 |
|---|---|---|---|---|
| wikitext | gpt2-large | 50k | mle | shiyue/wikitext_train50k_gpt2-large_mix1.0 |
| wikitext | gpt2-large | 50k | ミックス(ETA = 0.1) | shiyue/wikitext_train50k_gpt2-large_mix0.1 |
| webtext | gpt2-large | 50k | mle | shiyue/webtext_train50k_gpt2-large_mix1.0 |
| webtext | gpt2-large | 50k | ミックス(ETA = 0.3) | shiyue/webtext_train50k_gpt2-large_mix0.3 |
| writingprompts | gpt2-large | 50k | mle | shiyue/writingprompts_train50k_gpt2-large_mix1.0 |
| writingprompts | gpt2-large | 50k | ミックス(ETA = 0.7) | shiyue/writingprompts_train50k_gpt2-large_mix0.7 |
次の方法で事前に保護されたモデルを試してみてください。
>>> from gpt2 import GPT2MIXModel
>>> from transformers import GPT2Tokenizer
>>> model = GPT2MIXModel.from_pretrained("shiyue/wikitext_train50K_gpt2-large_mix1.0")
>>> tokenizer = GPT2Tokenizer.from_pretrained('shiyue/wikitext_train50K_gpt2-large_mix1.0')
>>> text = "Hey, how are you?"
>>> encoded_input = tokenizer(text, return_tensors='pt')
>>> model.eval()
>>> out_ids = model.lm.generate(inputs=encoded_input["input_ids"], max_length=50, do_sample=True)
>>> print(tokenizer.batch_decode(out_ids, skip_special_tokens=True))
私たちは寄せ的です。
このプロジェクトで良い経験をしましたか?愛を共有してコードを貢献してみませんか、それともあなたがそれに抱えていた問題について私たちに知らせてみませんか?
ここで問題のレポートを歓迎します。必要な情報を提供してくれることを確認できるように、問題の適切な問題テンプレートを選択してください。
プルリクエストを送信する前に、貢献ガイドラインを必ずお読みください。
次の2つのファイルは、 transformersリポジトリから借用および採用されているため、元の著作権を保持します。
これはもともとhttps://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_clm_no_trainer.pyから拾い上げられています。その上、次の変更を適用しました。
--test_file--reduction--mixing_ratio--max_length--prompt_length--eval_prompt_length--cache_dir--do_train--do_evalpush_to_hub 」オプションの未使用のコードブロックをいくつかコメントしました。DataCollatorWithPadding使用してPaddingを使用します。do_eval 」オプションの評価ロジックを追加し、そのほとんどが新しい関数「 evaluate() 」に入ります。このファイルは、 run_clm_no_trainer.py (上記を参照)からさらに変更されます。TOP_P top_pのチューニングを有効にするためにgenerate()関数が呼び出される方法を変更します。
このプロジェクトは、行動規範を採用しています。コード、またはプロジェクトで経験した動作について懸念がある場合は、[email protected]までお問い合わせください。