直接的な選好最適化戦略を用いたミストラル7bモデルの微調整

直接的な選好最適化戦略を用いたミストラル7bモデルの微調整

翻訳者|朱 仙中

レビュー | Chonglou

導入

通常、事前トレーニング済みの大規模言語モデル (LLM) では、次のトークンの予測しか実行できないため質問に答えることができません。これは、これらの基本モデルが最終的に本当に役立つ人工アシスタントとして機能する前に、指示と回答のペアに基づいてさらに微調整する必要がある理由を説明しています。しかし、このプロセスにはまだ欠陥がある可能性があり、LLM を微調整すると偏った出力有害な出力が生成される可能性があります。ここで、人間からのフィードバックによる強化学習( RLHF )が役立ちます。

具体的には、 RLHFLLM に対してさまざまな回答を提供でき、それらは望ましい動作 (有益、有害など)応じてランク付けされますモデルはこれらの候補から最適な回答を出力するように学習し、それによって私たちが植え付けたい行動を模倣しますこのプロセスは、モデルを監査する方法としてよくられ、最近ではモデルneural - chat - 7b- v3-1などモデルパフォーマンスを効果的に向上できることから人気が高まっています

この記事では、 RLHF のような手法である Direct Preference Optimization (DPO) を使用してモデルOpenHermes-2.5 を調整し NeuralHermes-2.5を作成しますこれを実現するために、好みのデータセットを導入し、DPO アルゴリズムの仕組みを説明し、それをモデルに適用します。オープンソースLLM リーダーボード上のベースモデルのパフォーマンスが大幅に向上することがわかります

いつものように、この記事のサンプルプロジェクトのコードはGitHubGoogle Colab入手できます

嗜好データセット

嗜好データセットは標準化されていませんが、通常は人間がランク付けした一連の回答で構成されます。 RLHF プロセスは LLM を微調整して優先回答を出力するため、このソートは不可欠です。以下は、人気のある嗜好データセット Anthropic/hh-rlhfからのです

著者提供の画像

データセットの構造が単純であることは簡単にわかります。各行には、選択された(優先される)回答と拒否された回答があります。 RLHF の目標は、モデルが推奨される回答を出力するように導くことです。

嗜好データセットは、人間からの手動フィードバックを収集する必要があるため、作成が非常に高価で困難であることが知られています。このフィードバックも主観的なものであり、自信のある(しかし間違った)回答に偏ったり、矛盾が生じたり(注釈者によって値が異なります)する可能性があります。業界では、時間の経過とともに、人間によるフィードバックを人工知能によるフィードバック (RLAIF) に置き換えるなど、これらの問題に対処するためのいくつかのソリューションを提案してきました。

一方、これらのデータセットは、微調整データセットよりもはるかに小さくなる傾向があります。これを文脈に当てはめると、優れたneural-chat-7b-v3–1モデル(リリース時点でOpen LLMリーダーボード最高の 7B パラメータLLM )は、微調整に518kサンプルを使用しますが (Open Orca/SlimOrca)、RLHF (Intel/Orca_dpo_pars) は 12.9k サンプルしか使用しません。この場合、著者らはGPT-4/3.5を使用して回答を生成し、優先回答を作成し、 Llama-2-13b-chatを使用して拒否回答を生成しました。これは、人間からのフィードバックを回避し、さまざまなパフォーマンス レベルのモデルのみに依存する賢い方法です。

直接的な嗜好最適化

RLHF の概念はロボット工学で長い間使用されてきましたが、 OpenAI の論文「人間の好みから言語モデルを微調整する」LLM に一般化されました論文では報酬モデルをトレーニングして人間のフィードバックを近似できるようにするフレームワークを提案していますこの報酬モデルは、近似ポリシー最適化 (PPO )アルゴリズムを使用して、微調整されたモデルのポリシーを最適化するために使用されます。

著者提供の画像

PPO の中心的な概念は、ポリシーを少しずつ更新することを中心に展開されます。大規模な更新は、不安定なソリューションや最適ではないソリューションにつながる可能性があるためです。経験的には、残念ながらこの手法はまだ不安定(損失の発散)で、再現が難しく(ハイパーパラメータの数が多く、ランダムシードに敏感)、計算コストも高くなります。

ここで、直接選好最適化 (DPO) が役立ちます。 DPO は、タスクを分類問題として扱うことで制御を簡素化します。具体的には、トレーニング済みモデル (またはポリシー モデル) と参照モデルと呼ばれるコピーの 2 つのモデルを使用します。トレーニング中の目標は、トレーニングされたモデルが参照モデルよりも高い確率で優先回答を出力するようにすることです。逆に、回答を拒否する確率を低く出力することも望んでいます。これは、LLM に対して、悪い回答に対してはペナルティを与え、良い回答に対しては報酬を与えることを意味します。

著者提供の画像

DPO は、LLM 自体を報酬モデルとして使用し、バイナリ クロスエントロピー目標を採用することで、広範なサンプリング、報酬モデルのフィッティング、複雑なハイパーパラメータの調整を必要とせずに、モデルの出力を人間の好みに効果的に合わせます。そうすることで、より安定した、効率的で、計算負荷の少ないプロセスが実現します

データのフォーマット

このでは教師あり学習のみで微調整された Mistral- 7Bモデルである優れたOpenHermes -2.5-Mistral- 7B モデルを微調整します。これを実現するために、 Intel/orca_dpo_paries データセットを使用してモデルを調整し、パフォーマンスを向上させます。このモデルをNeuralHermes-2.5-Mistral-7Bと呼びます。

具体的には、これを実現するための最初のステップは、次のように必要なライブラリをインストールすることです

 pip install -q datasets trl peft bitsandbytes sentencepiece wandb

それが完了したら、ライブラリのインポート進むことができますまた、 Google Colabシークレットタブを使用して、Hugging Face のロゴ情報を保存しました

 import os import gc import torch import transformers from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, BitsAndBytesConfig from datasets import load_dataset from peft import LoraConfig, PeftModel, get_peft_model, prepare_model_for_kbit_training from trl import DPOTrainer import bitsandbytes as bnb from google.colab import userdata import wandb # 在Google Colab秘密的标签中定义hf_token = userdata.get('huggingface') wb_token = userdata.get('wandb') wandb.login(key=wb_token) model_name = "teknium/OpenHermes-2.5-Mistral-7B" new_model = "NeuralHermes-2.5-Mistral-7B"

OpenHermes-2.5-Mistral-7B はChatMLと呼ばれる特定のチャット テンプレート使用します。このテンプレートを使用してフォーマットされた会話の例を次に示します。

 <|im_start|>system You are a helpful chatbot assistant.<|im_end|> <|im_start|>user Hi<|im_end|> <|im_start|>assistant Hi, how can I help you?<|im_end|>

ご覧のとおり、ChatML はさまざまなロール (システム、ユーザー、アシスタント) を定義し、それらを区別するために特別なマーカー(<|im_start|> と <|im_end|>) を追加します。さらに、DPOTrainer では、 prompt choice およびdeclinedの 3 つの列を含む特定の形式が必要です

データセットには、 system question chatgpt llama2–13b - chat4 つの列が含まれています。システム列と質問列をプロンプト列連結するだけです。また、chatgpt列を「chosen にマッピングし llama2–13b-chatを「 rejected にマッピングします。データセットを信頼性の高い方法でフォーマットするには、すでに ChatML を使用しているトークナイザーapply_chat_template ()関数を使用します

 def chatml_format(example): # 格式化系统列if len(example['system']) > 0: message = {"role": "system", "content": example['system']} system = tokenizer.apply_chat_template([message], tokenize=False) else: system = "" # 格式化指令message = {"role": "user", "content": example['question']} prompt = tokenizer.apply_chat_template([message], tokenize=False, add_generation_prompt=True) # 设置所选答案的格式chosen = example['chosen'] + "<|im_end|>\n" # 格式化拒绝的答案rejected = example['rejected'] + "<|im_end|>\n" return { "prompt": system + prompt, "chosen": chosen, "rejected": rejected, } # 加载数据集dataset = load_dataset("Intel/orca_dpo_pairs")['train'] # 保存列数据original_columns = dataset.column_names # 分词器tokenizer = AutoTokenizer.from_pretrained(model_name) tokenizer.pad_token = tokenizer.eos_token tokenizer.padding_side = "left" # 格式化数据集dataset = dataset.map( chatml_format, remove_columns=original_columns )

ここで、フォーマットされたデータセットの例を印刷して、すべてが正しく動作していることを確認しましょう。

 {'prompt': '<|im_start|>system\nYou are an AI assistant. You will be given a task. You must generate a detailed and long answer.<|im_end|>\n<|im_start|>user\nGenerate an approximately fifteen-word sentence that describes all this data: Midsummer House eatType restaurant; Midsummer House food Chinese; Midsummer House priceRange moderate; Midsummer House customer rating 3 out of 5; Midsummer House near All Bar One<|im_end|>\n<|im_start|>assistant\n', 'chosen': 'Midsummer House is a moderately priced Chinese restaurant with a 3/5 customer rating, located near All Bar One.<|im_end|>\n', 'rejected': ' Sure! Here\'sa sentence that describes all the data you provided:\n\n"Midsummer House is a moderately priced Chinese restaurant with a customer rating of 3 out of 5, located near All Bar One, offering a variety of delicious dishes."<|im_end|>\n'}

プロンプトはシステム指示とユーザー指示の組み合わせであることがわかります。 add_generation_prompt=True パラメータのおかげアシスタントの回答の冒頭も追加されていることに気づくでしょうこの手順をスキップする場合は、前処理済みのデータセットをmlabonne/chatml_dpo_pairsとして直接使用できます

DPOを使用してモデルをトレーニングする

次に、モデルをトレーニングするための LoRA 構成を定義します。 Intel のブログ投稿説明されているように、ランク値を lora_lfa と等しく設定しましたが、これは珍しいことです (一般的な経験則2*rです)。アダプタ付きのすべてのリニア モジュールも考慮する必要があります

 # LoRA配置peft_config = LoraConfig( r=16, lora_alpha=16, lora_dropout=0.05, bias="none", task_type="CAUSAL_LM", target_modules=['k_proj', 'gate_proj', 'v_proj', 'up_proj', 'q_proj', 'o_proj', 'down_proj'] )

これで DPO を使用して微調整するモデルをロードする準備が整いました。この場合、微調整するモデルと参照モデルの 2 つのモデルが必要です。これは主に読みやすさのためです。DPOTrainer オブジェクトは、参照モデルが提供されていない場合は自動的に参照モデルを作成します。

 # 要微调的模型model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.float16, load_in_4bit=True ) model.config.use_cache = False # 参考模型ref_model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.float16, load_in_4bit=True )

最後のステップは、すべてのハイパーパラメータを TrainingArguments と DPOTrainer に提供することです。

  • ベータ パラメーターは、初期ポリシーからの偏差を制御するため、DPO に固有のものです (標準値は 0.1 です)。
  • Intelのブログ投稿に記載されている値と比較して、学習率(5e-4から5e-5)とステップ数(1000から200)を減らしました。トレーニングを安定させ、最良の結果を得るために、数回実行した後、これらの値を手動で最適化しました

これでモデルのトレーニングを開始できます。 A100 GPU が必要であり、トレーニングには1 時間かかることに注意してください。

 # 训练参数training_args = TrainingArguments( per_device_train_batch_size=4, gradient_accumulation_steps=4, gradient_checkpointing=True, learning_rate=5e-5, lr_scheduler_type="cosine", max_steps=200, save_strategy="no", logging_steps=1, output_dir=new_model, optim="paged_adamw_32bit", warmup_steps=100, bf16=True, report_to="wandb", ) # 创建DPO训练器dpo_trainer = DPOTrainer( model, ref_model, args=training_args, train_dataset=dataset, tokenizer=tokenizer, peft_cnotallow=peft_config, beta=0.1, max_prompt_length=1024, max_length=1536, ) # 使用DPO微调模型dpo_trainer.train()

モデルは微調整されました。このプロジェクト重みとバイアスは、 https://wandb.ai/mlabonne/NeuralHermes-2-5-Mistral-7B/runs/axe71gr0?workspace=user- mlabonne で確認できます。分析する上で興味深い指標をいくつか紹介します。

著者提供の画像

興味深いことに、 100 のウォームアップステップを使用しているにもかかわらず、トレーニング損失はすぐにゼロに低下します (50 ステップ前)。一方、他の指標も進化しています。

上の図では、 train/rewards/chosentrain/rewards/rejected のプロットは、トレーニング済みモデルと参照モデルによって出力された対数確率の平均差に対応しています。時間の経過とともに、トレーニングされたモデルが優先される回答を学習するにつれて、それらの回答が分岐していくのは当然のことです。さらに、トレーニング/報酬/マージン プロットには、2 つのプロットの差も表示されます。最後に、トレーニング/報酬/精度のプロットは、優先回答が選択された頻度を示します。トレーニングされたモデルはすぐに完璧な精度スコアに到達しました。これは良い兆候ですが、優先回答と拒否回答の差が大きすぎることを意味する可能性もあります。

トレーニング完了したのでアダプターを元のモデルとマージできます。次に、マージされたモデルとトークナイザーを保存し、Hugging Face ハブにプッシュします。

 #保存所有工作dpo_trainer.model.save_pretrained("final_checkpoint") tokenizer.save_pretrained("final_checkpoint") # 刷新内存del dpo_trainer, model, ref_model gc.collect() torch.cuda.empty_cache() # 在FP16(而不是NF4)中重新加载模型base_model = AutoModelForCausalLM.from_pretrained( model_name, return_dict=True, torch_dtype=torch.float16, ) tokenizer = AutoTokenizer.from_pretrained(model_name) # 将基本模型与适配器合并model = PeftModel.from_pretrained(base_model, "final_checkpoint") model = model.merge_and_unload() # 保存模型和分词器model.save_pretrained(new_model) tokenizer.save_pretrained(new_model) # 然后将其推送到Hugging Face中心model.push_to_hub(new_model, use_temp_dir=False, token=hf_token) tokenizer.push_to_hub(new_model, use_temp_dir=False, token=hf_token)

それでは、実際のテストでモデルがどのように機能するかを見てみましょう。基本的な質問をするようにプロンプ​​トをフォーマットします: 「大規模言語モデルとはですか?

 #格式化提示message = [ {"role": "system", "content": "You are a helpful assistant chatbot."}, {"role": "user", "content": "What is a Large Language Model?"} ] tokenizer = AutoTokenizer.from_pretrained(new_model) prompt = tokenizer.apply_chat_template(message, add_generation_prompt=True, tokenize=False) # 创建管道pipeline = transformers.pipeline( "text-generation", model=new_model, tokenizer=tokenizer ) # 生成文本sequences = pipeline( prompt, do_sample=True, temperature=0.7, top_p=0.9, num_return_sequences=1, max_length=200, ) print(sequences[0]['generated_text'])

モデルによって与えられた回答は次のとおりです

 A large language model is a type of artificial intelligence (AI) system that has been trained on vast amounts of text data. These models are designed to understand and generate human language, allowing them to perform various natural language processing tasks, such as text generation, language translation, and question answering. Large language models typically use deep learning techniques, like recurrent neural networks (RNNs) or transformers, to learn patterns and relationships in the data, enabling them to generate coherent and contextually relevant responses. The size of these models, in terms of the number of parameters and the volume of data they are trained on, plays a significant role in their ability to comprehend and produce complex language structures.

対応する中国語の意味は次のとおりです。「大規模言語モデルは、大量のテキスト データでトレーニングされた人工知能システムです。これらのモデルは、人間の言語を理解して生成するように設計されており、テキスト生成、言語翻訳、質問への回答など、さまざまな自然言語処理タスクを実行できます。大規模言語モデルは通常、リカレント ニューラル ネットワーク (RNN) やトランスフォーマーなどのディープラーニング技術を使用して、データ内のパターンと関係性を学習し、一貫性があり文脈に適した応答を生成できるようにします。これらのモデルのサイズ (パラメーターの数とトレーニングされるデータの量) は、複雑な言語構造を理解して生成する能力に重要な役割を果たします。」

すべてがうまく機能しているようで、結合モデルを評価できるようになりました。これは一般的なモデルなので、 lm 評価ツールを使用して評価できます。このプロセスはリソースを大量に消費するため、評価のためにOpen LLM ランキングWeb サイトに直接送信することもできますこのプロセスには数日かかる場合がありますが、他の OpenHermesモデル比較すると次のようになります

著者提供の画像

NeuralHermes-2–5-Mistral-7B モデルは、元のモデルと比較して平均 6.7 ポイントのスコア向上を達成しました(特に GSM8K の場合)。これは予想外に大きな改善であり、直接的な好みの最適化の威力を実証しています。

結論は

本稿では、DPO を使用して教師あり微調整モデルを微調整し独自のNeuralHermes-2.5 モデルを作成します高品質の嗜好データセットを活用することで、サンプル効率の高い微調整スキームを開発しOpen LLM リーダーボードで大幅な改善を実現しました試してみたい場合は、このモデルの量子化されたバリアントを探すか、 Hugging Face Space実験してみてください

最後に、私たちの微調整スキームはさまざまな方法でさらに改善できることに注意してください。たとえば、使用されている嗜好データセットはまだかなり未加工であり、フィルタリングをさらに行ったり、異なるモデルを使用したりすることで改善できる可能性があります。さらに、多くのハイパーパラメータを調整することで、より良い結果を得ることができます。特により多くのステップでモデルをトレーニングし、より多くの好みデータを注入するために、学習率を下げることもできます。

参考文献

  • Kashif Rasul、Younes Belkada、Leandro von Werra による DPO で Llama 2 を微調整します
  • Kaokao Lv、Wenxin Zhang、Haihao Shen による Intel Gaudi2 での教師あり微調整と直接設定最適化
  • mzbac による llama2-fine-tune

翻訳者紹介

Zhu Xianzhong 氏は、51CTO のコミュニティ エディターであり、51CTO の専門ブロガー兼講師であり、濰坊の大学のコンピューター教師であり、フリーランス プログラミング コミュニティのベテランです。

原題:直接選好最適化によるミストラル 7b モデルの調整、著者: Maxime Labonne

<<:  世界最強のモデルが一夜にして手を変え、GPT-4 の時代は終わりました。クロード3号はGPT-5を上回り、1万語の論文を3秒で読み、理解力は人間に近い。

>>:  Sora では 1 分間のビデオを生成するのに 1 時間以上かかります。これによりユーザー エクスペリエンスにどのような変化がもたらされるのでしょうか?

ブログ    
ブログ    
ブログ    

推薦する

リードし続けてください! Oracle Autonomous Databaseに会話型AI機能が追加

編集者 | Yifeng制作:51CTO テクノロジースタック(WeChat ID:blog) Or...

...

...

...

大好きです!初心者に適した 7 つの高品質 AI プロジェクト

人工知能が本格的に普及しつつあります。AIの知識を学ばなければ、自分が新時代の後継者だと言えるでしょ...

...

ジェネレーティブAIはソフトウェア開発に3つの幻想をもたらす:高速、高品質、そしてより少ない人員

著者 |張開峰ソフトウェア業界は長い間、コスト削減と効率性向上に取り組んできました。長期にわたる開発...

Baidu AIの新インフラが2020 CIFTISでデビュー、最新の人工知能成果をパノラマ展示

新たな科学技術革命と産業変革が起こりつつあり、デジタル技術とインテリジェント技術は我が国のサービス産...

...

...

テレンス・タオ氏の新論文の秘密兵器が明らかに:AIを使ってLaTeXをスムーズに書く

数学の巨匠、テレンス・タオ氏は、論文執筆ツールがついにアップグレードされたと投稿しました。以前は T...

詩人のような機械学習: ML の仕組みについての素晴らしい啓示

機械学習はデータ内のパターンを使用して物事にラベルを付けます。魔法のように聞こえますが、核となる概念...

バイオメディカルホログラフィックイメージング用の RNN が 50 倍高速化

[[407014]]デジタル ホログラフィーは、生物医学イメージングでよく使用される顕微鏡技術です。...

生成的敵対ネットワーク: AI におけるイノベーションの触媒

生成的敵対的ネットワーク (GAN) は、人工知能の分野で強力なツールとなり、イノベーションと研究の...